作者:Ox9A82
稿费:400RMB
投稿办法:发送邮件至linwei#360.cn,或上岸网页版在线投稿

序言
在前一部分中,我们先容了从IE6到IE11的堆喷射方法,实在堆喷射只是一种手段目的还是为了实现末了的漏洞利用。在这一篇文章中,我们会根据韶光顺序来讲解IE浏览器漏洞利用技能的发展,我们会把紧张精力放在UAF漏洞的利用上面,同时会涉及一些其它类型的漏洞作为赞助以绕过漏洞缓解方法,这篇文章紧张先容技能发展脉络,实际的漏洞调试会放不才一章,期间我阅读了大量的文档、会议PPT和博客文章,在此也对前辈们的分享表示感谢。同时给大家分享两句我很喜好的话,一句来自大家该当都很熟习的陈皓大牛,一句来自charles petzold大家该当都有读过他的书
要理解技能就一定须要理解技能的历史发展和进化路线。由于,你要朝着球运动的轨迹去,而不是朝着球的位置去,要知道球的运动轨迹,你就须要知道它历史上是怎么跑的。
学习技能发展史的主要意义正在于此:追溯的历史越久远,技能的脉络就变得越清晰。因此,我们须要做的便是确定某些关键的历史阶段,在这些阶段,技能最天然、最实质的一壁将清晰可见。
首先大略先容一下本篇文章将要提到的漏洞类型,我们这篇文章紧张会针对两类漏洞进行描述,即越界访问漏洞和开释后重引用漏洞。这两种漏洞的英文名称分别为Out-of-Bound和Use-After-Free,因此我们常日简称这类漏洞为OOB和UAF。
1.越界访问漏洞
越界访问漏洞,个人认为越界访问漏洞该当是按照漏洞造成的效果进行划分的,而不是依照漏洞成因进行的划分。我认为如果是从成因的分类上来讲,像堆溢出、整数溢出、类型稠浊等都可以造成越界访问漏洞。
越界访问,所谓的访问便是指越界读和越界写,在后面我们可以看出越界漏洞是比较随意马虎利用,也是比较好用的一类漏洞,这里好用指的是效果比较好,一样平常通过这种OOB漏洞可以在IE浏览器中轻易的实现绕过ASLR的保护。
而这种漏洞的利用,一个共通点是要进行内存布局(或称为Feng shui技能)。即把一些分外的工具或者构造支配在漏洞工具附近,否则读写都无从谈起,我们会在后面展开来说这些内容。
2.开释重引用漏洞
Use-After-Free漏洞中文名为开释后重引用漏洞,这种漏洞估计大家都比较熟习。
所谓的“开释重引用”是指在一块内存被开释后在某处还保存有指向这块内存的悬垂指针,之后对悬垂指针进行理解引用(所谓的重引用)导致了漏洞的触发。
我们剖析UAF漏洞一样平常要搞清楚几个关键点:
1.是什么工具发生的UAF?
2.UAF工具何时被分配、何时被开释?
3.导致crash的流程是什么?
4.为什么会存在悬垂指针?
但是在早期的UAF漏洞利用来说,一些Hacker们每每只须要知道步骤2、3就可以实现漏洞利用。这是由于早期的UAF一样平常都是通过占位和堆喷射来进行利用的,比较大略粗暴。
1.为什么IE中会存在大量的Use-After-Free漏洞?
我们的第一个问题是IE浏览器中为什么会爆出大量的UAF漏洞?
这个问题的提出并不奇怪,由于其它的软件诸如Office Word的漏洞可能基本上都是一些堆栈溢出,而UAF则是百里挑一。
IE浏览器中并不是没有存在过栈溢出这些类型的漏洞,而是经由了十余年的发展基本都已花费绝迹,但是UAF漏洞“相继而来”的实质缘故原由在于IE浏览器中存在着大量的各种类型的工具和其间相互干联的关系,包括各种标签和各种内部数据构造比如CElement便是代表元素工具的父类,举例来看CButton是CElement的子类代表<Button>标签。
这些html标签和DOM Tree是由IE浏览器中的渲染引擎mshtml(便是所谓的Trident)卖力解析的。html标签在mshtml内部便是由一个个的C++工具来进行表示的,同样DOM树也是通过一些数据构造来进行描述(比如CTreeNode、CTreePos),这些工具之间存在繁芜的相互关系。并且mshtml利用了引用计数的方法来跟踪工具的利用情形。
我们可以通过泄露的IE5.5源代码来不雅观察这一点,虽然IE5.5版本对付我们来说已经是相称的古老了,但是实在一些核心的部分还是相称附近的。
如下是IPrivateUnknown接口,这个接口在我们源码中存在着如下的继续关系CElement->CBase->IPrivateUnknown。
1234567interface IPrivateUnknown
{
public:
STDMETHOD(PrivateQueryInterface)(REFIID riid, void ppv) = 0;
STDMETHOD_(ULONG, PrivateAddRef)() = 0;
STDMETHOD_(ULONG, PrivateRelease)() = 0;
};
在此我推举阅读以下两篇文章,可以匆匆进对IE浏览器的理解:
《IE安全系列:IE浏览器的技能变迁(上)》
http://www.infoq.com/cn/articles/Internet-Explorer-Security1
《IE安全系列:IE浏览器的技能变迁(下)》
http://www.infoq.com/cn/articles/InternetExplorer-Security2
2.如何利用IE中的Use-After-Free漏洞
如何利用UAF漏洞是我们这篇文章的主题,在分门别类的进行谈论之前,我们首先先容一些根本知识。我们在前面先容了UAF漏洞的一些信息,对付UAF漏洞的利用无论在什么期间,一个通用的步骤便是在UAF工具被开释之后立时去分配一个相同大小的内存块,我们称这一步操作为“占位”。占位的事理在于堆分配的机制,当一块堆内存被开释后出于效率的考虑会被保存在一些构造中以便于再次的分配。占位便是利用这一点,通过分配相同大小的堆内存试图重用UAF工具的内存,对Linux堆有理解或是打过CTF的同学该当都比较熟习这一点了。为了成功实现占位,一样平常是多次分配相同大小的内存以担保成功率。
须要解释的一点是,不是所有的UAF漏洞都是可以利用的,由于一些漏洞无法进行占位。比如有的漏洞它的工具开释和重用操作就在同一个函数中,刚刚开释完立时就重用了,这种情形根本没有机会去进行占位,从而无法进行利用。
我们说了这么久的占位,实在占位的目的是为了掌握工具的内容。同样目的的操作,还有挖坑法(make hole),挖坑法是指在布局好的内存中开释一个指定大小的块,好让目的工具落在我们布局的内存中,我们会在后文提到这一点。还有内存未初始化漏洞的利用也与之类似,内存未初始化漏洞是指分配一块内存后未经初始化就直接进行利用,我们为了掌握未初始化工具的内容会先开释一些与之相同大小的已支配好内容的内存,然后让未初始化工具来重用我们的内存。
接下来我们就根据历史发展来谈论利用技能,可以看出随着历史的向前漏洞利用技能有了很大的发展,比较早期的利用技能现在无论是在思路还是在手腕上都是发生了质的飞跃。
3.IE6漏洞利用(史前时期)
我们把IE6作为IE漏洞利用的开端,我们称之为史前时期,说到史前我们可能会想到刀耕火种、茹毛饮血。此时的IE漏洞便是处于这样一个野蛮成长的时期,漏洞利用技能大略粗暴导致网马大量横行。紧张缘故原由在于IE6时期的浏览器版本不支持DEP等漏洞缓解方法(虽然此时操作系统已经支持DEP),导致漏洞利用的本钱低廉,但是也因此流传下来一些“远古神话”,比如经典的0x0C0C0C0C。
这一期间由于Active X插件作者的水平参差不齐,因此大量的控件存在有诸如栈溢出之类的大略漏洞,利用办法也极为大略粗暴合营堆喷就可以实现利用,这些漏洞我们大略略过不再详述。
我们把关注重点放到此时的UAF漏洞上面,通过我们前面对UAF漏洞的大略先容就可以看出,UAF漏洞与栈溢出有着实质不同。栈溢出可以大略直接的掌握返回地址从而挟制实行流程,但是UAF每每是处于堆上并没有直接挟制流程的路子。为了能够在堆上挟制指令实行流程,前辈们想出了挟制虚函数调用的方法。
我们首先大略先容一下虚函数,在C++程序中,如果一个类存在虚函数那么当这个类实例化工具后,工具的前4个字节便是虚函数表的指针,当我们调用虚函数时实际上是到虚函数表中探求函数指针。接下来,我们就通过这一点来进行利用。
我们首先通过占位来掌握UAF工具的内容(如果你不理解这一步,可以往前看一看),掌握了工具的内容就相称于掌握了虚函数表的指针。接下来我们须要一个稳定可达的地址,因此我们利用上一篇文章讲过的堆喷射,然后把虚表指针指向我们喷射的内存地址,这样一旦触发漏洞就会把我们的喷射内存当作虚表来实行了。
为什么一触发漏洞就会把喷射内存当作虚表来实行呢?如果没有调试过IE漏洞可能会提出这个问题,由于我们实际去调试漏洞就会创造事实上UAF漏洞触发后基本都会crash在虚函数调用处,如果你创造windbg停在一个莫名其妙的地方很可能是由于没有开启页堆,可以利用!gflags.exe -i +hpa进行开启,关于页堆可以学习一下张银奎老师的《软件调试》。(此外新手可能会创造明明非常了却没有停下来,可能是没开启子进程调试,紧张是对付IE8往后这种多进程浏览器来说。)
根据我们上面的描述可以看出,我们是在把喷射的内存当成虚表。但是当我们调用虚函数时,每每是下面这个样子的:
12mov eax,[ecx]
call [eax+4]
这两条指令意味着,喷射的内存不仅会被当成虚表还会被当成指令来实行。并且更糟糕的情形是:这里我们不能确定堆喷射的准确分配地址,便是说我们不能确定堆表指针到底喷射在哪里。这时就对我们的喷射提出了哀求,我们须要探求一个既可当作地址阐明又可以当作无意义指令阐明的值。
在这种情形下“上古传说\"大众0x0C0C0C0C就出身了,如果我们利用0x0C0C0C0C作为喷射的内容的话,当mov eax,[ecx]时就会取到0x0C0C0C0C作为指针来进行跳转,call [eax+4]会把0x0C0C0C0C的0x4处偏移取出并call,当然其结果依然为0x0C0C0C0C,这样call 0x0C0C0C0C会实行指令0x0C,而0x0C相称于nop就会终极实行到shellcode了。当年有很多这样的通用地址存在比如0x0D0D0D0D、0x06060606。
这种利用办法大略粗暴却又有效,因此我们称为史前时期,就像TK教主说的一样:
在当年无 DEP 的环境下,险些完备不懂漏洞事理的人,知道去 Heap Spary 0x0C0C0C0C 就能搭积木一样写出 Exploit,而且还很通用。
当然,对付不涉及虚表访问的利用来说,利用0x0c0c0c0c是完备没故意义的。不过这个地址已经成为一个\公众上古神话\公众了,以是我们还是会常常看得到它,乃至于一些安全软件一旦创造这个值就会报警。
4.IE8早期漏洞利用(石器时期)
前面我们说IE6期间是史前期间,由于那时的漏洞利用大略粗暴。比较于当时,IE8时期的利用技能向前走了一大步,不过由于安全体系的问题早期的IE8利用依然只能称为是石器时期,还是相称的原始。
自IE8开始,DEP和ASLR成为浏览器中默认启用的缓解方法,如何bypass ASLR和DEP成为了攻击者紧张面对的问题。我们大略先容一下DEP和ASLR,如果是熟习Linux的同学,那么Linux下的NX保护与DEP是很类似的,都是把一些非代码段内存设为不可实行来阻挡攻击者运行shellcode。在其它的软件中bypass DEP常日利用ROP技能,但是由于IE险些都是基于堆的漏洞不存在直接进行ROP的条件以是并不能通过大略的ROP实现bypass DEP。而ASLR会使得模块装载的地址变得不愿定,对漏洞利用有一些理解的同学肯定知道Rop技能是依赖于一些rop gadgets来进行不断的跳转利用的,ASLR的启用会直接妨碍我们获取rop gadgets。
不过对付早期的利用,ASLR并没有对利用者造成太大的困扰。由于ASLR早就在诸如Office Word之类的软件中启用了,Hacker们直接套用了在这些软件中的做法即利用一些未开启ASLR的模块进行利用。由于当时很多的模块并不支持ASLR因此加载在固定基地址。这种方法也是比较大略粗暴的而且通用性比较差,比如以前在IE中常用的Java6的msvcr71.dll,如果目标并没有安装JRE或者版本不对利用都不能成功。
由于此时仍旧比较原始,以是我们称之为石器时期。事实上,本日的运用程序不支持ASLR的已经非常少见了,想通过不支持ASLR的模块来实现ROP已经不大可能了。以是我们把完全的利用方法放到下一章中详述。
5.IE8浏览器结合信息泄露利用(铁器时期)
听说人类跟动物的差异是人类会利用工具,那么这一期间利用技能的进步堪比从石器进化到铁器。
这一期间的标志事宜是Peter Vreugdenhil在Pwn2Own2010中攻破IE8项目,这一过程中的技能手段对后来的利用技能发展有着重要的浸染。Peter Vreugdenhil利用IE8的手段是把一个OOB漏洞与一个UAF漏洞相互结合,我们首先来说OOB漏洞。Peter Vreugdenhil通过内存布局把BSTR支配在存在OOB的工具后面,目的是进行信息泄露,通过越界写来改变BSTR的长度,实现了越界读。
我们在前面说过BSTR不是大略的Unicode字符串,BSTR的构造由4字节的长度(size)域、2字节的结束符(\x00\x00)加上Unicode字符串构成。通过我们精心布局内存布局,使BSTR工具紧随漏洞工具的后面。之后再在BSTR后面再放置目标工具,这样当触发漏洞工具发生越界访问的时候就可以覆盖掉BSTR构造的size域。一旦我们把size域覆盖为更大的数值,我们就能够使得BSTR发生越界读(由于BSTR只可读不可写)。然后通过js脚本读取BSTR字符串,就能够读到BSTR之后的工具。我们的目的是获取后面对象的虚表地址(首4个字节)。如果你想理解的更详细可以拜会(http://vreugdenhilresearch.nl/Pwn2Own-2010-Windows7-InternetExplorer8.pdf )
为什么得到虚表地址就可以bypass ASLR呢?由于对付C++程序来说虚函数表是被编译在全局数据段的,便是说对付模块的基地址的偏移是固定的。我们通过泄露的虚函数表的地址减去偏移就可以知道工具所处的dll模块的基地址,也就可以利用这个模块中的gadgets了。
这种方法有两个须要办理的问题:第一是如何布局稳定的内存布局使我们上述的内容得以实现。第二是当我们覆盖成功后,如何通过javascript脚本层面上的操作把值获取到。实在我们后面要讲到的方法都面临着这两个问题。
由于这种利用较为大略,可以直接参考泉哥的著作《漏洞战役:软件漏洞剖析精要》里面第三章的CVE-2012-1876的利用剖析,其利用的方法便是通过BSTR进行泄露,我们也会不才一篇中给呈现实的漏洞调试。
单单绕过ASLR是无法实现漏洞利用的,由于DEP的存在我们没有办法在堆上实行指令。为此Hacker们想了很多办法,个中我认为最早实现成功利用的依然是Pwn2Own 2010上Peter Vreugdenhil利用的方法,虽然与我们这里讲的不完备相同,但是我以为是Peter Vreugdenhil方法的进化版。我们忽略Peter Vreugdenhil的方法(感兴趣的可以查看上面的连接),我们利用的手段是stack pivot,所谓stack pivot便是通过mov esp,eax、xchg esp eax等指令来实现把栈转移到堆上,由于一样平常的UAF漏洞触发时我们都可以掌握至少一个寄存器的值。通过把esp指向我们喷射的内存,我们就可以把堆假造成栈,从而像普通的栈溢出一样进行ROP,通过实行ROP终极实当代码实行。
但是这一利用方法首先要确保的是我们要能够精准的打算堆喷射的地址,由于堆不可实行以是我们不能再依赖于用于缓冲的nop指令了。好是我们在前一篇文章中已经讲过准确打算的事理和实现了,这里再大略复述一下。当我们大量分配堆块时可以创造地址的最低几位是一贯不变的,地址改变的熵只是固定的地址高位并且堆块的分配相称的稳定。这样如果我们使偏移都落在地址的高位,那么我们的指向就会是整块进行偏移,从而担保了每次指向的都是打算好的准确的地址。
举个例子:我们可以以每个块为单位打算出ROP链第一条地址的偏移,然后实在我们可以想一下0x0C0C0C0C这个地址还有没有用?在这种利用环境下,第一不须要跳板指令,第二我们跳转目的地址是精确的,那么0x0C0C0C0C这种地址就根本没有存在的代价了。我们要的就只是一个堆喷射可达的稳定的地址。
无堆喷射,通过ANIMATECOLOR工具实现利用
这种方法不须要进行堆喷射就可以实现利用,堆喷射实在并不能说是一种优雅的利用方法,由于分配内存须要一定的韶光,而且如果目标机器的配置较低的话可能会导致卡顿从而被目标察觉。我之前在binvul上看到过一些所谓的“不弹不卡不喷射不风水”的样本实在指的便是这种技能。
ANIMATECOLOR是IE8版本起供应的一种工具,由于这种工具的分外布局以是可以不该用堆喷射来实现利用,我们不才一篇实际漏洞调试时再来进行剖析。
6.结合Flash的利用(中世纪)
到这里浏览器利用技能又是一个飞跃,结合flash利用虽然不能说特殊优雅(由于要依赖第三方),但中世纪是文艺复兴的先声,可以说自此之后利用技能又进入了一个发展的新顶峰。
这种利用技能不是来自于Pwn2Own也不是来自于某次会议的分享,相反,随着韶光的发展,在2013年网上流传出了一些无需多漏洞结合利用,通过单一漏洞就可以bypass缓解方法+实行代码的exp样本,这些exp样本该当是用于实际攻击的武器。其紧张特点是结合了flash进行漏洞利用,这种利用技能最早该当是由李海飞前辈在《Smashing the Heap with Vector:Advanced Exploitation Technique in Recent Flash Zero-day Attack》这文章中提出的(CVE-2013-0634)。
1This is in fact a somehow new technique which leverages the custom heap management on Flash Player to gain highly-reliable exploitation bypassing both the ASLR and DEP.
就像李海飞前辈所说,这完备是一种新技能。并且这种新技能可以只凭借一个单一的漏洞实现bypass全部的缓解方法并且实行终极的shellcode,这一点因此前的exploit所做不到的事情。
我们大略的概括一下利用的方法,我们先忽略漏洞的细节大略的认为它是一个0x90个字节的堆块发生的溢出。我们首先分配一系列0x90大小的Vector工具,对付储存数字的Vector来说每个数字占8个字节,16个数字加上16字节的固定构造恰好知足0x90的大小。
我们在vector工具支配完成之后,通过代码来开释一些0x90大小的vector,再触发漏洞。之后会分配具有溢出的0x90大小的堆块,由于尺寸与我们之前开释的vector尺寸相同,根据堆的特性漏洞堆块会重用我们之前开释的vector工具内存。这一步操作称为挖坑(make holes),挖坑的目的是为了使得漏洞堆块处于vector工具的包围之中。
下一步,我们只须要利用溢出就可以覆盖掉相邻vector工具的“Number_of_elements”域。
覆盖的结果是使得相邻的vector可以发生越界访问,通过操作这个越界的vector我们又可以覆盖下一个vector的“Number_of_elements”域,但这次我们可以直接把“Number_of_elements”域改的很大,从而实现了全体进程地址空间的任意读写。
一旦实现了全体内存空间的进程读写,就可以做到bypass DEP和ASLR了。
如果说这次利用只是由于漏洞本身有比较得当的尺寸便于布局、有直接的溢出便于覆盖构造。那么陈小波前辈发布的《ASLR Bypass Apocalypse in Recent Zero-Day Exploits》中就给出了一个通用的思路,个中提到了很主要的一点便是:如何把一个常规的UAF漏洞往我们上面说的Flash vector越界写上面进行转化。对付这个问题作者供应了如下的思路:以CVE-2013-0634为例,这是一个在IE浏览器中常见的UAF漏洞,在利用这个漏洞时exp作者在代码实行路径上创造了一条指令:
1or dword ptr [esi+8],20000h
个中esi的值是我们可控的(来自UAF工具,可以通过占位进行掌握),作者把它指向支配好了的Vector工具的长度域,在实行了or之后长度域会变大从而使得这个vector可以进行越界操作。之后可以通过这个vector越界写紧邻的下一个vector的长度域从而实现了全体进程地址空间的任意读写。此外还要阐明一下为什么可以知道Vector工具的长度域的地址,
之后的IE浏览器利用从基本思想上发生了转变,攻击者不再追求结合多个漏洞泄露信息再进行堆上ROP,而是继续了flash vector的任意读写转化思路,试图从UAF转化到任意地址读写,再通过任意地址读写来实现绕过缓解方法。
7.UAF转化与Element Attribute(启蒙时期)
之后漏洞利用进入启蒙时期,比较flash利用这一期间的优点是不再依赖于flash模块。这样可以提高漏洞利用的成功率和降落本钱,由于此时一个漏洞就可以实现多个漏洞的利用效果并且在flash利用爆发后安全软件对夹杂flash的页面十分敏感,不依赖flash可以提高漏洞利用的成功率。
在《A BROWSER IS ONLY AS STRONG AS ITS WEAKEST BYTE》这篇文章中,作者以CVE-2013-3147为根本详细讲解了如何从crash地点进行剖析来探求一条得当的代码路径把UAF转化成inc [address](绝对地址加),并且避开虚函数调用以免引发crash。大略的概括便是查找crash附近的代码流程,探求有没有写原语,如果存在这样的原语就想办法知足逻辑条件把实行流程勾引写原语上去。
值得把稳的是作者在利用这个任意地址加的过程中并没有依赖flash vector,而是通过喷射Element Attribute来实现利用。首先大略先容一下Attribute是什么,如果你有看过HTML那么该当知道一些标签是具有属性的,比如每个标签都有id属性用做唯一的标识。对应于底层实现来说,每个DOM元素对应的CElement构造中也会有指针指向Attribute Array,每个属性占个中一项。那么Element Attribute是如何实现利用的呢?
首先我们忽略漏洞的细节,只识破绽导致的效果,经由转化操作这个UAF漏洞可以勾引到如下的路径上
而第二个DWORD的值为属性名的哈希值,第三和第四个值为实际的属性内容,如果属性内容是诸如字符串这样的值,那么它会是一个指针。
作者的核心思路是对第三个DWORD那个指针进行加1操作,由于因此字节为单位进行加1,以是实际的操作效果可能是指针偏移0x1、0x100、0x10000、0x1000000。在这种思路之下作者进行了内存布局,通过布局相同大小的BSTR字符串和一个元向来使得它们彼此相邻的分配(相同大小通过打算可以轻易的得到,而且也正是由于它们大小相同以是才会发生彼此相邻的分配),在布局完成之后对指针进行加1操作就可以读出后面元素的内容,在实际利用过程中布局要更加繁芜一些不过事理是同等的。
实际利用过程中作者一次性创建了含有0x7FFE个属性的元素,然后复制它直到大小为0x800000个字节。然后对这些元素进行遍历,每隔0x1000个属性就把它的值设置为一个0x8A大小的字符串,这个设置会导致在内存等分配0x8A字节的字符串,然后立时创建一个body元素并添加9个默认属性(大小恰好是0x8A)这样就做到了BSTR和元素的紧邻分配。接下来就像我们上面所说的对指针加1就能读到body元素的内容了。由于body默认属性中包含一些域,通过读取它就可以算出mshtml.dll的基地址。
然后作者在这个根本上连续进行改进,由于作者认为mshtml.dll的版本变革比较多对付利用不是很空想,而且现在我们做的还只是泄露操作没有实际的进行实行流挟制,而我们这一阶段的主题便是只通过单个漏洞来实现完全的利用。作者为了实现流程掌握对属性表进行了覆盖操作,但是又会受到低碎片堆机制的限定,为此又要假造堆头构造。可见这种利用方法还是比较麻烦的,但是对Element Attribute构造的利用思路对后来的漏洞利用思路有很大的帮助。
之后在2014年,这个时候Ivan Fratric的《Exploiting Internet Explorer 11 64-bit on Windows 8.1 Preview》发布出来。这篇文章的意义在于,作者针对javascript array工具进行了剖析,然后对array工具进行Feng shui布局并且通过它的capacity域实现了利用。由于js引擎是根据capacity域对数组大小进行判断的,因此我们一旦修改了capacity域就可以对数组进行越界访问。不才一阶段的利用中,我们就会看到array object在漏洞利用中起到的浸染。
此外在2015年的Pwn2Own上,360 vulcan团队便是通过Element Attribute对IE11浏览器进行的利用。不过与我们这里的环境不同,vulcan利用的漏洞恰好便是在处理Element Attribute时涌现的未初始化问题,由于与文章主题无关这里就不赘述了,不过相信读完本文之后你就可以理解古河讲的利用思路了,利用的详情可以查看http://www.ichunqiu.com/course/52149。
8.IE11与针对jscript9引擎的攻击(近当代)
CanSecWest2014上,ga1ois在议题《The Art of Leaks》中谈论了几个很关键的问题。
第一是自IE9往后引入的jscript9引擎——jscript9.dll利用与以前不同的custom heap,而且这个custom heap并没有做任何的分配随机化方法,这一点给我们进行内存布局供应了可能。
第二是从UAF转化为任意地址读写的过程中可能由于虚表访问而导致crash和如何避免发生这种crash。
在IE9之前的版本中,javascript是由javascript解析引擎——jscript.dll卖力解析的,这个dll在分配内存时利用的是系统的进程堆。而在最新的javascript解析引擎——jscript9.dll中,在分配一些工具时引擎会利用custom heap,这个custom heap是由jscript9自己卖力管理和掩护的。并且这个custom heap在分配时没有进行随机化处理,以至于攻击者可以通过布局一些工具(所谓的feng shui技能)来预估出工具所处的地址。
个中直到0xf000之前的都是我们的array object填充数据,而自0xf000起是我们想要的目标工具,这里以int32Array作为目标工具的例子。
由于后续我们还会涉及到int32Array这个工具,以是我们这里详细的先容一下。int32Array属于Typed array的一种,根据MDN的先容Typed array有以下几种
我们知道javascript是一种脚本措辞,是难以像C措辞一样表示一些底层数据类型的,Typed array的设计便是为理解决这个问题。我们虽然可以直策应用new来创建一个Typed array工具,诸如
个中Arraybuffer Data便是直接保存数据的区域,并且这块内存是分配在process Heap上的。
一旦可以预估出工具的地址那么就可以通过把UAF转化为绝对地址写去修改Int32Array工具的长度域,来实现Arraybuffer Data的越界读写。由于Arraybuffer Data是储存在process Heap中的因此须要一个分配在process Heap上的工具来合营利用。这里作者利用的是LargeHeapBlock,由于这个工具处于process Heap中,并且恰好存在得当的域来实现任意地址读写。我们可以看出这种利用jscript9的方法明显比之前的做法要更稳定和易于操作。
至于UAF到读写的转化,与我们前面提过的大体相同便是跟踪漏洞触发附近的实行流程探求有没有得当的转化原语(opcode)。在转化过程中可能会导致crash的问题,成功利用写入原语之后会发生虚函数调用,如果虚表被毁坏的话虚函数调用就会导致crash。对此ga1ois给出理解决方案:
之后,在同年的Hitcon上exp-sky进一步发展了这一技能,代码和文档可以在作者github中找到(https://github.com/exp-sky)。与ga1ois的不同之处在于exp-sky没有利用typed array进行布局,而是将IntArray Object作为目标工具进行布局。这一操作的优点在于IntArray全部都是基于custom heap进行操作的,如果你还记得我们上面讲的内容的话,你该当知道我们在对typed array进行修改操作后进行越界编辑的是Arraybuffer Data,而这块内存是存放于process heap中的,这就意味着我们还要进一步的对process heap进行布局,而这种方法则完备没有这个必要。
把稳这两个构造都处于Custom Heap并且是分配在一起的。
因此喷射IntArray比较前面的方法要更方便也更随意马虎掌握,由于ArrayBuffer工具存在有保存当前缓冲区大小的域(buffer_size),只要通过绝对地址写改写这个域为很大就可以转化为任意内存读写了,之后再修正相邻块的域这一点与前面的技能是相同的。
总体来说,这一期间的利用思路基本都在于喷射一些关键的工具,并结合各种feng shui技能(尤其是jscript9中的)进行布局。然后试图把UAF转化为绝对地址写,来写我们喷射工具的关键域从而实现从UAF到任意地址读写的超过。
一旦得到了任意地址读写就相称于可以让攻击者进行随意利用,这时各种漏洞缓解方法就不再能够阻挡攻击者的脚步了。
这里我利用了一张demi6od在《Smashing the Browser》议题中利用的图,这张图很好的解释了我们所讲的思路。
后记
实在这一系列的文章,我在去年10月份的时候就已经写完了,但是一贯在硬盘里放了近半年都没有投出来。我紧张是考虑到这系列文章涉及的话题太广、内容太多、历史又太悠久,考虑到自己仅是个大二学生水平较低、打仗漏洞方面也不久,唯恐内容中涌现缺点和疏忽。但是做了一番修正后我还是鼓起勇气发出来了,希望大家能够帮忙改动文章中缺点和提出修正建议,可以通过微博私信给我 id:Ox9A82。
Reference
《The Art of Leaks – The Return of Heap Feng Shui》Gaois
https://cansecwest.com/slides/2014/The%20Art%20of%20Leaks%20‐%20read%20version% 20‐%20Yoyo.pdf
《IE 11 0day & Windows 8.1 Exploit》exp-sky
《Smashing the Browser》demi6od
《浏览器漏洞攻防对抗的艺术》仙果
http://bbs.pediy.com/thread-211277.htm
《Exploiting Internet Explorer11 64-bit on Windows 8.1 Preview》
http://ifsec.blogspot.com/2013/11/exploiting-internet-explorer-11-64-bit.html
《ASLR BYPASS APOCALYPSE IN RECENT ZERO-DAY EXPLOITS》
https://www.fireeye.com/blog/threat-research/2013/10/aslr-bypass-apocalypse-in-lately-zero-day-exploits.html
《A BROWSER IS ONLY AS STRONG AS ITS WEAKEST BYTE》
http://blog.exodusintel.com/2013/11/26/browser-weakest-byte/
《A browser is only as strong as its weakest byte – Part 2》
https://blog.exodusintel.com/2013/12/09/a-browser-is-only-as-strong-as-its-weakest-byte-part-2/
《Smashing the Heap with Vector:Advanced Exploitation Technique in Recent Flash Zero-day Attack》
https://sites.google.com/site/zerodayresearch/smashing_the_heap_with_vector_Li.pdf?attredirects=0
《IE安全系列:IE浏览器的技能变迁(上)》
http://www.infoq.com/cn/articles/Internet-Explorer-Security1
《IE安全系列:IE浏览器的技能变迁(下)》
http://www.infoq.com/cn/articles/InternetExplorer-Security2
《攻破Windows 8.1的64位IE - 分享Pwn2Own黑客大赛成果》
《Pwn2Own 2010 Windows 7 Internet Explorer 8 exploit》
http://vreugdenhilresearch.nl/Pwn2Own-2010-Windows7-InternetExplorer8.pdf
《Flash Vector漏洞利用的蜕变》
http://www.cnetsec.com/article/14571.html
《Array Object Heap Spraying》
http://www.cnblogs.com/wal613/p/3958692.html