欢迎进入全国高校网安联赛!

X-NUCA’17第二期靶场评测专题赛解题思路

X-NUCA’17第二期线上赛主题为“靶场评测”,以Windows7专业版操作系统(64位)上的发行版、SP1版、全补丁版,以及IE、Firefox、Chrome三大浏览器的组合作为目标。每个参赛队伍的评测环境包含9个靶标和一个助攻服务器。参赛者需要通过开发含有恶意代码的网页,突破浏览器和操作系统的防护,从靶机上获取包含flag的文件,系统验证flag合格则参赛者解题成功。

我们以“Windows7专业版操作系统64位发行版+IE9 9.0.8112.16421”为例介绍一下针对该靶机的解题思路。该靶机的补丁号是KB3078071,查了下这个补丁是2015年8月11日发布的,如图1所示,也就是说可以用的漏洞基本得找2016年以后的了。


图1 补丁版本发布时间

IE9生存周期不长,2016年以后好用的漏洞并不多,测了很多描述上影响IE9到IE11的漏洞发现都只在IE11等一些常见的版本才好用。试了一些漏洞之后决定用CVE-2016-0189来完成利用,图2。


图2 CVE-2016-0189漏洞详情

这个漏洞在github上有完整的exp,相对来说比较好用,漏洞的利用代码链接是:https://github.com/theori-io/cve-2016-0189。exp的作者也给出了相对完整的writeup,如图3。链接为http://theori.io/research/cve-2016-0189


图3 CVE-2016-0189漏洞PoC

完整的exp包括4个文件,分别为exploit目录下的vbscript_bypass_pm.html和vbscript_godmode.html,support目录下的ielocalserver.dll和ieshell32.dll。其中两个dll均给出了源代码,可以自己修改后编译测试。

vbscript_bypass_pm.html用于绕过保护模式、加载dll,vbscript_godmode.html用于提权并执行最后需要的payload。ieshell32.dll用于修改环境变量以加载ielocalserver.dll ,ielocalserver.dll用于辅助提权。

这个exp的思想和袁哥的vbs safemode基本一样,最开始利用一个越界读写,覆写safe mode,就可以执行一些vbscript中本来被禁止执行的代码,比如创建Scripting.FileSystemObject、WScript.Shell对象等操作。有这个作为基础,就可以想办法执行二进制代码了。

在有一定权限之后,用ajax的方式拉取需要的两个dll,ieshell32.dll和ielocalserver.dll,这两个dll会被存到IE的一个cache文件夹里面。而后,用Scripting.FileSystemObject在文件夹中找到之前下载的dll,继续用Scripting.FileSystemObject创建一个名为System32的文件夹,把ieshell32.dll移动过来,命名为shell32.dll。

接下来通过WScript.Shell修改SystemRoot环境变量为之前创建System32的上级文件夹。然后创建一个Shell对象,这个时候会自动加载之前创建的shell32.dll。但是这个dll会在随后被unload,所以利用代码并没有写在这个dll中,而是通过shell32.dll,挂载ielocalserver.dll,执行其中代码。

需要注意的是,在这个时候,IE是低完整性权限,能做的操作有限,所以这个exp选择起一个localhost server,而某些版本的IE认为localhost是intarnet,访问时会有中等的完整性级别,在这里就可以执行shell,进行后面的读取文件,上传ftp等操作了。这个洞本来是Win10 + IE11的,找了个Win10 IE11的环境下测试可以拿到shell,但是随后在题目环境中测试失败了。用process explorer 看了下,目标靶机的环境在file协议或者在受信任的站点下,确实是中等完整性级别,而在localhost下,仍然是低完整性。

后来找到了微软的说明,这个漏洞应该是后面就补上了。之前用来测试的IE11版本比较低,而这里补丁基本是接近2016年的补丁了,所以这个技巧就不能用了。不过第一步的漏洞是可以用的。

但是这里还有一个问题容易被忽略,之前提到是把文件下载到本地,从缓存中取出以达到获取文件的目的。但是各版IE的缓存路径并不一致,而这里payload则并没有对IE9的缓存路径做出处理,需要修改vbscript_bypass_pm.html代码中82行的cacheDIr (如图4)改为"%LOCALAPPDATA%"\Microsoft\Windows\Temporary Internet Files\Low\Content.IE5。

修改之后的exp修改safe mode、加载dll并执行的部分就能正常使用,获取以低权限任意执行代码的权限,在这之后就是想办法提权了。


图4 路径修改

Windows7之后的提权洞还是比较多,测试了下CVE-2016-7255、CVE-2017-0213都是可以提权到管理员的,但是这里用dll执行代码的方式相对不好调试,利用起来有比较麻烦。于是再换一个思路,之前提到,低权限是可以起socket的,想到可以用MS17-010“永恒之蓝”,dll和本地的smb服务通信,通过smb执行下一步的payload,这样就绕过了沙箱的限制。于是找了下永恒之蓝的测试脚本,尝试执行了shellcode发现可行。

然后就是修改之前exp中的部分了,因为localserver仍然是低权限,所以之前的跳转就可以去掉了。另外一个需要修改的地方就是ielocalserver.dll,这里就基于之前利用Git仓库(图5)中给出的源代码进行修改了。把之前起socket的部分换成通过socket进行交互,把永恒之蓝的exp硬编码到dll中,而后通过shell32.dll挂载执行,即可成功。


图5 修改socket代码

在虚拟机中抓取本地流量比较麻烦,在测试的时候先把流量发送至本机的447端口,使用nc监听。图6为监听到的测试结果。


图6 监听测试结果

“永恒之蓝”利用成功后,接下来完成读取flag,上传至ftp的方式很多,不再赘述。

至此,我们可以看到整个解题思路中用到了多个漏洞的组合,而对于这些漏洞,防护的方式主要在于及时更新微软官方的补丁,以免自己的电脑数据遭到不必要的损失。文中提到的相关补丁信息如下,请没有打补丁的用户尽早修复漏洞:

https://technet.microsoft.com/library/security/MS16-051

https://technet.microsoft.com/library/security/ms16-135

https://technet.microsoft.com/library/security/ms07-026

https://technet.microsoft.com/library/security/MS17-010