使用Elderwood工具包编写漏洞利用程序(第一部分) - 堆喷射与DEP/ASLR绕过技术详解

本文深入解析Elderwood漏洞工具包如何通过Flash组件实现堆喷射、利用未启用ASLR的Office/Java6模块绕过内存防护,并构建ROP链对抗DEP保护,揭示高级攻击工具包的技术实现细节。

堆喷射与DEP绕过(today.swf)

数据执行保护(DEP)阻止内存被隐式执行。漏洞利用通常会在内存中创建数据形式的载荷并尝试执行。启用DEP后,攻击者必须明确标记其载荷为可执行状态。为绕过该防护,漏洞可利用内存中已标记为可执行的代码。许多攻击通过链式调用函数来标记载荷可执行,这种技术常被称为面向返回编程(ROP)。Windows XP及更高版本上的IE8采用DEP防护,必须绕过该机制才能成功执行代码。

today.swf为用户执行DEP绕过。该Flash文档在内存中建立多个ROP链,确保其中一个位于已知地址(堆喷射)。当IE被攻击时,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 Encryption"首页找到。DoSWF是首个无需邮箱即可下载安装包的结果,且由北京某中国公司开发。

ASLR绕过(Microsoft Office与Java 6)

地址空间布局随机化(ASLR)是Windows Vista及更新系统的防护机制,会随机化内存中代码位置。ASLR通过使ROP指令位置未知来干扰攻击者对程序流的控制。最简单的绕过方法是定位未编译Dynamic Base标志的模块(表示不支持ASLR)。此类模块以固定虚拟地址加载后,攻击者可复用其中的已知指令序列,如同ASLR不存在。

该工具包提供代码来加载多个未编译Dynamic Base标志的模块,包括Microsoft Office 2007/2010和未支持ASLR的Java 6插件。这些模块中的内存地址用于构建Flash文档中的ROP链。利用此特性绕过ASLR非常简单,工具包可能提供脚本来调用必要的插件加载例程。作者直接使用现成研究技术开发脚本:采用Oracle示例代码加载Java 6实现ASLR绕过(Google搜索"force java 6"可发现此代码)。

1
2
3
4
5
6
7
8
<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链,表明两者可能同步开发并提供给工具包用户。

结论

Elderwood工具包提供可复用组件来开发use-after-free漏洞利用程序,包含通过Adobe Flash实现堆喷射、加载未支持ASLR模块的技术,以及多个Windows版本的DEP绕过ROP链。工具用户几乎不需要理解这些技术的实现原理。例如用户无需了解内存布局和堆分配,直接使用工具包提供的固定地址即可。

虽然这些工具满足多数漏洞开发需求,但某些任务仍需针对具体漏洞实现。例如要使用SWF置于内存的ROP指令,工具用户必须控制程序流——这正是各漏洞利用的特殊之处。我们将在下一章节讨论工具用户解决该问题的具体方案。

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