/************************************** /* 作者:kiwiHacker /* 博客:http://www.tyrande000.com/ /* 日期:2015-01-25 16:10 /**************************************0x00 实验环境 操作系统:VMWARE Windows 7 sp1 IE版本:8.0.7601.17514 漏洞DLL:mshtml.dll 调试器:windbg0x01 简述 CVE-2014-1776属于use-after-free漏洞,影响范围不但涉及6/7/8/9,还影响IE10/11浏览器,这几个版本的浏览器被披露出可以远程执行代码的漏洞。漏洞出现在mshtml!CMarkup:IsConnectedToPrimaryMarkup函数。0x02 说明 为了避免黑产,共同维护互联网安全,漏洞中的关键代码段被打上了马赛克,本篇文章只是分析漏洞的起因及对突破WINDOWS保护机制的研究,希望码农们引以为戒,提高软件代码安全性!0x03 漏洞原因 以下是能够触发漏洞并利用的三个文件: 1.html为入口文件,如图: 微软自从Windows XP SP2以后添加了很多安全保护机制,其中DEP/ASLR是我们在这个漏洞中需要突破的2项保护机制,SWF文件就是用来帮助我们突破保护的。 当swf加载时,会先进行Heap Spray,将绕过DEP/ASLR的代码和SHELLCODE放置在我们稍后可控的堆内: 首先对Vector.<uint>((0x1000 – 8) / 4)做个说明,为了使每个s[i]的大小以0x1000字节对齐,我们需要分配(0x1000 – 每个vector的头结构大小8字节) / sizeof(uint)=0x3FE个uint变量,如下图: 在准备工作结束后,会调用ExternalInterface.call(“trigger”);来执行JS中的引发漏洞的代码: 现在让我们开启IE的页堆调试: 找到崩溃点如下: 对应汇编: 可以看到EAX的值来自ESI,推断ESI是一个CMarkup对象指针,现在我们深入剖析一下ESI的由来,我在mshtml!CMarkup::IsConnectedToPrimaryMarkup下断点:bu mshtml!CMarkup::IsConnectedToPrimaryMarkup “!heap -p -a eax;g” 重新运行程序: !heap -p -a 只是截断了最近几条函数调用堆栈,我们需要更深层次的函数调用信息。 对mshtml!CMarkup::~CMarkup下断点,观察函数堆栈,如下图: 结合下面崩溃时的堆栈信息,可以断定函数在CStylement::OnPropertyChange函数尚未返回前,又重新进入CMarkup::IsConnectedToPrimaryMarkup函数重复使用,造成了漏洞的产生,如下:0x04 突破WINDOWS安全保护 为了能够控制UAF对象,我们需要使用和UAF对象同样大小的内存对该段内存占位,以对齐内存,如下图: 再次运行IE: 这时候已经可以成功控制EAX,继续往下步进,看看后面有没有可以进一步与EAX或其他寄存器相关的利用代码,如下: 果不其然,居然找到了可以直接控制EIP的指令,而EDX同时还是我们可控的! 还记得我们最初在SWF中HEAP SPRAY了一大片内存吗,其中包含SHELLCODE,而因为DEP的存在,则需要通过ROP技术绕过这个限制。此刻EAX是指向可控堆的,因此我们如果能在内存空间中(需要利用SWF突破ASLR)找到类似xchg eax, esp;ret;这样的指令就可以控制堆栈,从而调用zwProtectVirtualMemory来修改指定的内存属性来绕过DEP,翻转堆栈后,堆栈布局如下: Shellcode部分我只用了0x90909090举个例子,来说明DEP/ASLR已经被击败了。0x05 总结 外国论坛中有些大牛通过在漏洞中修改VECTOR对象的LENGTH属性,获得对进程内任意地址的读写,通过覆盖一个SOUND对象的虚函数表,来触发DEP绕过,本文采用了另一种方法来叙述。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课