利用Elderwood套件编写漏洞利用程序(第一部分)
漏洞利用的三大障碍
为了成功利用浏览器漏洞(即使在Windows XP等老旧平台上),攻击者必须规避或绕过多项安全防护措施。Elderwood套件提供了一系列工具,使得用户无需深入了解底层实现细节即可突破这些防护。该套件在浏览器漏洞利用方面的历史应用主要集中在Internet Explorer的释放后使用漏洞上。
利用释放后使用漏洞的方法已有系统化文档,快速搜索即可找到多个详细教程。此类漏洞利用需要克服三个主要障碍:
- 堆喷射技术
- DEP绕过
- ASLR绕过
套件的每个组件都封装了突破这些障碍的标准化方法。我们将分析这些组件的工作原理、可靠性、技术复杂度,并说明它们如何向套件用户暴露接口。漏洞利用代码的兼容目标和可靠性直接取决于这些组件的设计与实现决策。
堆喷射与DEP绕过(today.swf)
数据执行保护(DEP)可防止内存被隐式执行。漏洞利用通常会在内存中创建数据形式的载荷,然后尝试执行它。当DEP启用时,攻击者必须将其载荷显式标记为可执行状态。为了绕过此保护,漏洞利用可以利用内存中已存在且标记为可执行的代码。许多漏洞利用会通过链式调用函数来标记载荷为可执行,这种技术常被称为面向返回编程(ROP)。Windows XP及更高版本上的Internet Explorer 8支持DEP,因此必须绕过此防护才能成功执行代码。
Today.swf为用户执行DEP绕过操作。该Flash文档在内存中建立多个ROP链,确保其中一个位于已知地址(通过堆喷射实现)。当Internet Explorer被利用时,ROP链会将堆栈指针转向伪造的堆栈而非合法堆栈。完成堆栈转向后,ROP链会执行一系列指令,创建解密代码的可执行副本(该代码将xsainfo.jpg转换为DLL),并执行它。这一操作可以在Flash插件内完成,因为与Chrome、Safari和Firefox不同,Flash插件与浏览器渲染进程共享相同的内存空间。
SWF文件在JavaScript漏洞利用代码加载之前被引入。当swf加载时,堆喷射代码会自动运行。用户无需了解其所用技术的细节。最终结果是堆中充满了堆栈帧,套件用户可以假定特定地址0x10ab0d0c处存在正确的值。这意味着用户只需知道这一个跳转地址即可:
|
|
对于跟随我们分析的读者,用于混淆漏洞利用中Flash组件的软件可以方便地在Google搜索"SWF Encryption"的第一页结果中找到。DoSWF是首个无需提供电子邮件地址即可下载安装程序的结果,并且额外值得一提的是,它由一家北京的中国公司开发。
与许多公开漏洞利用一样,仅使用浏览器内的JavaScript引擎也可以完成相同的任务。这将消除对第三方插件的依赖。然而,此漏洞利用仅适用于已安装并启用Flash的浏览器。在JavaScript中执行精确堆操作的技术和库已有详细文档,且至少自2007年起就已存在。
ASLR绕过(Microsoft Office和Java 6)
地址空间布局随机化(ASLR)是Windows Vista及更新版本中的一项漏洞利用缓解措施,它随机化内存中代码的位置。ASLR通过使ROP小工具所用代码的位置未知,从而挫败攻击者控制程序流程的能力。绕过ASLR最简单的方法是完全避免它,即定位一个未使用Dynamic Base标志编译的模块(表明不支持此功能)。这使得漏洞利用变得容易得多,并完全消除了该缓解措施带来的优势。一旦这样的模块以固定的虚拟地址加载,攻击者就可以重新利用其中的已知指令序列,就像ASLR不存在一样。
为了绕过ASLR,该套件附带了加载多个未使用Dynamic Base标志编译的模块的代码。具体来说,添加了来自不支持ASLR的Microsoft Office 2007/2010和Java 6插件的模块。这些模块内的内存地址用于构建嵌入Flash文档中的ROP链。
利用此功能绕过ASLR是微不足道的。很可能,套件提供了一个脚本来调用加载正确模块所需的各种插件加载例程。无需额外工作。套件作者利用现有的研究成果和技术来开发这些脚本:例如使用Oracle的示例代码来加载Java以实现ASLR绕过。此示例代码出现在Google搜索"force java 6"的结果中,这一点值得注意,因为作者需要专门加载此版本而不是利用了ASLR的最新版本。
|
|
在尝试加载这些插件后,config.html根据哪些插件加载成功设置一个值。它将"test" div标签的innerHTML设置为true、false、default或cat。Today.swf读取此值以确定加载其内置的哪个ROP链。这意味着today.swf直接依赖于config.html及其加载插件的结果,表明它们很可能是共同开发并提供给套件用户的。
与堆喷射和DEP绕过一样,这些技术依赖于第三方组件才能发挥作用。除非安装并启用了这些插件之一,否则漏洞利用将在Windows 7上失败。该套件依赖于过时的Java版本,因为其当前版本确实利用了ASLR。此问题在2011年7月的Java 6更新中得到解决,而Java 7从未受影响。对于Microsoft Office,此弱点在攻击发生前几个月就在公开教程中被描述,然而,直到攻击发生后它才得到修补。
我们试图测量运行这些插件的浏览器数量,以评估这些ASLR绕过措施的有效性,进而评估整个漏洞利用的效果。我们发现,跟踪浏览器统计信息的流行网站忽略了跟踪Microsoft Office插件的使用情况,而是选择列出更常见的插件,如Silverlight、Google Gears和Shockwave。对于Java 6,如果这是最佳情况且没有次要版本的Java被打补丁,那么大约只有30%的网站访问者可能被成功利用。
结论
Elderwood套件附带了用于开发释放后使用漏洞利用的可重用组件。它提供了通过Adobe Flash进行堆喷射的能力、一组加载不支持ASLR的模块的技术,以及多个用于不同Windows版本以绕过DEP的ROP链。这些工具的用户几乎不需要理解它们所完成的任务。例如,用户无需了解内存布局和堆分配的任何知识,只需使用套件提供的常量地址即可。事实上,阅读至此的读者可能比需要使用这些工具的人对这些组件有更深入的理解。
虽然使用这些工具满足了许多漏洞开发需求,但有些任务特定于发现的漏洞。为了使用SWF放置在内存中的ROP小工具,工具包用户必须能够控制程序流程。这特定于每个漏洞的利用过程,工具包无法帮助用户执行此任务。我们将在下一部分讨论工具包用户针对此问题的具体解决方案。