利用Elderwood套件编写漏洞利用程序(第一部分)——堆喷射与DEP/ASLR绕过技术解析

本文深入解析Elderwood漏洞利用套件如何通过Flash实现堆喷射技术、使用ROP链绕过数据执行保护(DEP),以及利用未启用ASLR的Office和Java插件绕过地址空间布局随机化(ASLR)的技术细节。

利用Elderwood套件编写漏洞利用程序(第一部分)

Elderwood与劳工部黑客攻击

在我们三部曲系列的第二部分中,我们研究了Elderwood套件提供的工具,用于从发现的漏洞开发漏洞利用程序。

浏览器漏洞利用的缓解措施绕过

即使是在Windows XP这样古老的平台上,要利用浏览器漏洞也必须避免或绕过多个缓解措施。Elderwood提供了工具来克服这些障碍,几乎不需要了解它们的底层实现。

历史上,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不同。

SWF在JavaScript漏洞利用代码加载之前包含。当swf加载时,堆喷射代码自动运行。用户不需要了解其所用技术的细节。最终结果是堆充满了堆栈帧,套件用户可以假设特定地址0x10ab0d0c将有正确的值。这意味着用户只需要知道跳转到的单个值。

1
window.location = unescape("%u0d0c%u10abhttps://www.google.com/settings/account");

对于跟随我们分析的读者,用于混淆漏洞利用的Flash组件的软件方便地位于Google搜索“SWF加密”的第一页结果中。DoSWF是第一个不需要电子邮件地址即可下载安装程序的结果,并且作为额外的好处,它是由北京的一家中国公司开发的。

与许多公开的漏洞利用一样,仅使用浏览器内的JavaScript引擎也可以执行相同的任务。这将消除对第三方插件的依赖。然而,此漏洞利用仅适用于安装并启用了Flash的浏览器。在JavaScript中执行精确堆操作的技术和库有详细记录,并且至少自2007年以来就已存在。

ASLR绕过(Microsoft Office和Java 6)

地址空间布局随机化(ASLR)是Windows Vista及更新版本中存在的一种漏洞利用缓解措施,它随机化代码在内存中的位置。ASLR通过使用于ROP小工具的代码位置未知以供重用,挫败了攻击者控制程序流的能力。绕过ASLR的最简单方法是完全避免它,通过定位未使用动态基址标志编译的模块,表明缺乏对此功能的支持。这使得利用显著更容易,并完全消除了这种缓解措施带来的优势。一旦这样的模块以固定的虚拟地址加载,攻击者可以重新利用其中的已知指令序列,就像ASLR不存在一样。

为了绕过ASLR,套件附带了加载几个未使用动态基址标志编译的模块的代码。在这种情况下,添加了来自Microsoft Office 2007/2010和不支持ASLR的Java 6插件的模块。来自这些模块的内存地址用于构建嵌入在Flash文档中的ROP链。

利用此功能绕过ASLR是微不足道的。很可能,套件提供了一个脚本来调用加载正确模块所需的各种插件加载例程。不需要进一步的工作。套件作者使用现有的现成研究和技术来开发这些脚本:使用Oracle的示例代码加载Java以进行ASLR绕过。此示例代码使用搜索“force java 6”在Google中出现,这很显著,因为作者需要专门加载此版本而不是最新版本,后者利用了ASLR。

1
2
3
4
5
6
7
8
9
<script type="text/javascript" src="deployJava.js"></script>

try {
	location.href = 'ms-help://'
} catch (e) {}

try {
	var ma = new ActiveXObject("SharePoint.OpenDocuments.4");
} catch(e) {}

尝试加载这些插件后,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小工具,工具包用户必须控制程序流。这特定于每个漏洞的利用,工具包无法帮助用户执行此任务。我们将在下一节讨论工具包用户对此问题的具体解决方案。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计