0x01简介
实验所属系列:网络安全事件
相关课程及专业: 溢出基础
预备知识
洞描述
CVE编号:CVE-2017-7269
漏洞级别:严重
漏洞影响:Windows Server 2003 r2 IIS6.0
漏洞发现人:Zhiniang Peng和Chen Wu(华南理工大学信息安全实验室,计算机科学与工程学院)
本漏洞只限于开启WebDAV服务的IIS 6.0被爆存在缓存区溢出漏洞导致远程代码执行,目前针对 Windows Server 2003 R2 可以稳定利用,该漏洞最早在2016年7,8月份开始在野外被利用。
本实验环境所用软版本:IIS6.0
相关课程:
缓冲区溢出基础与实践 http://www.hetianlab.com//expc.do?ec=9613f998-8cd2-4981-9bc5-9900c97371de
实战挖掘某FTP服务器溢出漏洞:http://www.hetianlab.com//expc.do?ec=ECID172.19.104.182015091110221500001
参考资料:
Windows Server 2003 R2 CVE-2017-7269 Exploit https://github.com/edwardz246003/IIS_exploit/
IIS 6.0 远程代码执行0day (附PoC):http://bobao.360.cn/learning/detail/3152.html
实验目的
1)漏洞复现
2)漏洞形成分析
3)漏洞修复建议
实验环境
操作系统: Windows Server 2003 R2
IP随机
0x02实验步骤
实验步骤一
漏洞复现
此漏洞由于WebDAV服务的ScStoragePathFromUrl函数存在缓存区溢出漏洞攻击者可以构造恶意请求达到任意代码执行,所以IIS6.0需要开启WebDAV服务才可以成功利用,该服务默认是关闭的(本实验环境已经开启WebDAV)。
打开桌面iis_exploit.py 文件代码如下:如果在测试其他目标,请将sock.connect中,IP替换为目标IP或域名执行即可。
打开“命令提示符”窗口,输入python,然后将桌面iis_exploit.py文件,拖入命令提示符窗口内即可。然后回车即可执行该Python Exp。 如下图所示:

EXP已经执行成功,Exp Shellcode 为弹出calc计算程序,已证明溢出成功达到任意代码执行的效果。攻击者可以修改Shellcode来达到服务器执行攻击者构造的木马病毒等文件,获取服务器控制权限。

下面我们验证Exp执行结果,打开任务管理器,查看可以看到calc.exe已经被调用执行了起来,CVE-2017-7269 IIS6.0 溢出漏洞利用成功。如下图所示:
实验步骤二
漏洞形成分析
IIS 6.0 的 WebDAV 模块 %systemroot%\system32\inetsrv\httpext.dll 的函 数 ScStoragePathFromUrl 存在缓存区溢出漏洞。
当其接收到一个以“If: <http://” 开始的较长 header 头的 PROPFIND 请求时, 没有正确校验长度,将超长的字符串复制到栈中。当 IIS 程序处理 PROPFIND 请求 CPropFindRequest->Execute,然后在调用 HrCheckIfHeader 处理 If 头部 的时候,调用 ScStoragePathFromUrl 将 url 地址转化为本地的地址时没有检查 传入 url 的长度。导致传入过长 url 后造成栈溢出。

在 HrCheckIfHeader 中, ScCanonicalizePrefixedURL(if_url, if_url_wchar, &if_url_len); 这个函数是将局部变量 if_url 中的’If: <http://localhost/aaaaaaaaaaa' 转化为 Windows 上用的宽字节也就是’I\x00f\x00:\x00 <\x00h\x00t\x00t\x00p\x00:\x00/\x00/\x00l\x00o\x00c\x00a\x00l\x00h\x00o \x00s\x00t\x00/\x00a\x00a\x00a\x00a\x00a\x00a\x00’保存在局部变量 if_url_wchar 中

第一次调用仅是释放了一个元素,造成漏洞的是在第二次调用。第二次调用CMethUtil::ScStoragePathFromUrl(a1, if_url_wchar, Str, &if_url_len);将 if_url_wchar 变量中存储的网络地址转化为对应在本机文件系统中的地址, 类似与”c:\inetpub\wwwroot\aaaaaaaaaa”

将网络地址 http://localhost/aaaaa 转为”c:\inetpub\wwwroot\aaaaaaaaaa”的 时候,先将本地路径拷贝到栈中,然后将请求的 URI 也就是 aaaaa 与之前的本 地路径进行字符串拼接。这里没有做长度限制,导致过长的 URI 在拼接的时候 完成栈溢出覆盖栈上其他元素,形成栈溢出漏洞。
由于 Str 指针被覆盖,所以在计算字符串长度时内存越界,通过多次触发漏洞点,改写IEcb对象的虚函数,劫持控制流,获得控制权,执行 ROP。

利用 rsaenh.dll 模块中的构造好的 gadgets 执行 ROP,最终执行 shellcode。
shellcode 是经过编码后的字符串。


