IE漏洞利用之信息泄漏技术

为了对抗漏洞利用攻击,从window7开始,微软在IE等程序中应用了ALSR、DEP、GS等保护机制。随着ROP等Bypass技术的出现,微软在Windows8系统使用了更严格的保护机制:HiASLR、anti-ROP、vt_guard以及各种anti-heapspray技术。

本文主要研究IE漏洞利用中的信息泄漏技术,通过泄漏模块地址信息或shellcode地址,绕过ALSR等防御机制。信息泄漏的主体思路是选定某个特殊对象,通过漏洞触发修改该对象的某个字段,增加内存读写范围,从而获取所需信息。

1 修改BSTR对象

IE8下,最简单有效的方法是修改BSTR对象。这种技术是Peter Vreugdenhil在 2010 ?Pwn2Own IE 8 上提出的。

BSTR结构起始4字节为size字段,末尾为两字节的NULL结束符,中间为wide char字符串。修改BSTR的size字段或NULL结束符,即可利用jscript脚本越界读取BSTR相邻内存区域的内容。具体实现过程如下:

step1:内存中喷射BSTR和object。选择合适长度的BSTR,使其占用的内存大小和object相同。

IE漏洞利用之信息泄漏技术1.0

喷射后的内存布局为[s1][s2][b]…[s1][s2][b][s1][s2][b],[s1]和[s2]表示BSTR字符串,[b]表示object对象。

IE漏洞利用之信息泄漏技术1.1图1.1 初始内存布局

step2:释放[s1]。

IE漏洞利用之信息泄漏技术1.2图1.2 释放[s1]后内存布局

step3:触发漏洞,覆盖BSTR结构的size字段或NULL结束符,即可越界读取相邻object对象的虚表指针vtptr,继而获得模块的地址信息。根据模块地址信息构造动态ROP链即可绕过DEP。为了精确写入到BSTR 的Size字段或NULL结束符位置,有时需要放置多个BSTR位于Vulnerable Buffer和object对象之间。

IE漏洞利用之信息泄漏技术1.3

图1.3 溢出后内存布局

能否成功泄漏vtptr,关键是选择大小与Vulnerable Buffer相等的object,形成连续分配的内存布局。如果Vulnerable Buffer Size较大,找不到与之相等的object对象,可以选择读取属性数组AttrArray中的地址信息进行泄漏。

AttrArray属性数组中每个元素大小为0x10字节,结构如下:

IE漏洞利用之信息泄漏技术1.30

假设定义如下select元素,初始化8个属性。调用selob对象的cloneNode方法时,程序创建对应AttrArray数组。

IE漏洞利用之信息泄漏技术1.31

基于AttrArray的泄漏过程如下所示。可以看出,修改size字段后不仅能够获取对象指针objptr以及其虚表指针。还可以获得字符串指针strptr。如果该字符串为shellcode,即可获得shellcode的地址信息。

IE漏洞利用之信息泄漏技术1.4图1.4 基于AttrArray的信息泄漏

2 修改属性数组

从IE9以后,引入了Nozzle技术,禁止喷射BSTR,而且即使绕过Nozzle,分配的BSTR不在同一个堆块中。此时可以选择喷射属性数组AttrArray,通过修改AttrArray中的BSTR指针完成信息泄漏。具体步骤如下:

Step1:创建对象A,将其0x7ffe个属性值初始化为NULL。循环调用该对象的cloneNode方法,在内存中喷射属性数组,其中每个属性数组占用的内存大小为0x80000(0x7ffe*0x10+0x20)。这些属性数组在内存中是连续分布的。

IE漏洞利用之信息泄漏技术2.1图2.1 AttrArrayA内存分布

Step2:遍历所有的AttrArrayA,对每个AttrArrayA:

(1)每间隔0x1000个属性,调用setAttribute方法将属性值设置为字符串“AA…AA”,此时AttrArrayA将获得一个指向该字符串的BSTR指针(如图2.3箭头a所示);

(2)创建一个body元素对象B,对应元素数组AttrArrayB。

IE漏洞利用之信息泄漏技术2.0

选择合适的BSTR长度以及对象B的元素个数,使其占用的内存大小相等,BSTR和AttrArrayB将在内存连续分布,内存布局为[s][a][s][a]…[s][a]。其中[s]表示BSTR,[a]表示数组AttrArrayB。

IE漏洞利用之信息泄漏技术2.2

图2.2  AttrArrayB和BSTR内存分布

Step3:触发漏洞,修改某个AttrArrayA中元素值strptr,使其指向相邻AttrArrayB区域(如图2.3箭头b所示),此时即可成功读取AttrArrayB中的地址信息。

IE漏洞利用之信息泄漏技术2.3

图2.3 溢出前后的内存布局

注:这种泄漏技术适用于IE9、IE10以及IE11。

3 修改Javascript Array对象

Ivan  Fratric在《Exploiting Internet Explorer11 64-bit on Windows 8.1 Preview》中提出通过喷射Javascript Array对象,修改Capacity字段,完成信息泄漏。这种技术同样适用于32位系统下IE11漏洞。

在32位系统中,Javascript Array对象结构如下。

IE漏洞利用之信息泄漏技术3.0

其中?,Array对象Header长度为0x28。数组块ArrayBlock结构如下:

IE漏洞利用之信息泄漏技术3.01

Array对象在内存中的布局由数组长度决定:

(1)当数组长度<=0x40,Array Header和ArrayBlock在内存中是连续分布;

(2)当数组长度>0x40,Array Header和ArrayBlock在内存中分布不连续。

修改Capacity字段,增加Array数组的内存读写范围,即可获得相邻内存区域的地址信息。具体步骤如下:

Step1:在内存中喷射大量的Javascript Array对象(length<=40)。

IE漏洞利用之信息泄漏技术3.1

图3.1: 初始内存布局

Step2:触发漏洞,覆盖某个Array对象的capacity字段。遍历所有Array对象,通过Array.length定位被覆盖的数组ArrayA。越界读取ArrayA,获得ArrayB的虚表地址VtptrB;越界写入ArrayA将ArrayB的capacity设置为0x7fffffff,使得ArrayB获得最大范围的读写权限。

IE漏洞利用之信息泄漏技术3.2

图3.2:capacityA被修改后的越界读写

Step3:在内存中写入shellcode,绕过保护机制,执行任意代码。

(1)选定某个值n,从ArrayB[n]位置所在内存地址开始,将shellcode依次写入。

(2)选定某个值m,从ArrayB[m]位置所在的内存地址开始,将虚表指针指VtptrB指向的虚表函数依次写入,并修改其中两个虚函数的地址为VirtualProtect地址和Shellcode地址。

(3)覆盖VtptrB为fakeVtptr。当程序调用虚函数时,调用VirtualProct函数关闭DEP并成功执行shellcode。

IE漏洞利用之信息泄漏技术3.3

图3.3 :exploit内存布局

(文章来源:启明星辰ADLab)

发表评论

邮箱地址不会被公开。 必填项已用*标注