【技术探索】EPS文件利用如何逃逸 EMET

前几天,PhysicalDrive0

(恶意软件猎人) 公布了一个新的 word 文档样本,我们在 Morphisec

实验室中检验了这个样本,验证是否我们的产品能够做到立即防御。

如预期的那样,它做到了。当我们打开这个 word

文档的时候,这个恶意文档立即尝试去执行并感染我们的机器,由于我们的 WinWord 应用程序被 Morphisec Protector

所保护,所以这次攻击马上被防护了,并且被围困,看下面:

【技术探索】EPS文件利用如何逃逸 EMET_第1张图片

这个方法相当聪明。我打算深入看一下,并研究了来自 Morphisec interception 的日志。我们发现相当有趣的是:恶意行为来自 EPS(image) 文件的处理过程。

我们决定关闭  Morphisec protection,来验证一下会发生什么。我们很惊讶地发现这个样本完全逃逸了最新版 EMET 5.5 的检测,见下面(现在最新版为 5.5.2)

【技术探索】EPS文件利用如何逃逸 EMET_第2张图片

需要指出的是,关于这个特别的漏洞,CVE-2015-2545,“微软畸形

EPS(Encapsulated Post Scrip) 文件漏洞”,从 2015年11月开始(MS15-099),一个补丁已经被发布,可以用来修复这个漏洞。所以任何已经打了这个补丁的系统都可以被保护。但鉴于无止境地打打补丁既浪费时间又会对系统造成损害,许多系统还会有很长一段时间处于没有打补丁的环境中。

与我们的研究同时进行的 @r41p41 ,在博客里公布了他对这个利用的发现(基于一个稍微有些不同的样本)。鉴于

@r41p41 已经描述了逃逸 EMET 的具体细节(我想感谢 @r41p41

对于我们这次研究的贡献),我决定采用另一种更高级的方式做研究,以一种不同的视角进行说明。

我们对 PostScript 抽象层的研究

这里我将通过描述 PostScript 文件里面对于 ROP 的搜索(在一些反混淆之后)来研究  PostScript 抽象层。

我们分析的这个样本的哈希值是: 23368088b183a8b7dc59f33413a760daa06fa0e027a1996677c97db2aeec22b8

在接下来的技术描述中,我主要关注 32位 程序(的利用)。当然,这个利用也可以在 64位程序上工作。这些代码片段代表已经去混淆的代码。

值得一提的是几乎所有已存在的这个利用的样本都包含相同的 EPS文件,只是稍微做了一些修改,因此完全理解它是如何工作的,非常重要。

1. 首先,触发一次漏洞,目的是为了判断操作系统是 32 位 还是 64 位。

【技术探索】EPS文件利用如何逃逸 EMET_第3张图片

2. 接着,再次触发漏洞去破坏一个新的 vector。

【技术探索】EPS文件利用如何逃逸 EMET_第4张图片

3. 然后,进行堆喷射,以 64KB 对齐将堆喷内容写入。

【技术探索】EPS文件利用如何逃逸 EMET_第5张图片

4. 随后,定义一系列辅助函数。

【技术探索】EPS文件利用如何逃逸 EMET_第6张图片

5. 定义一个函数,来查找从模块泄露出来的地址对应的"MZ"的基地址,这个函数以 64KB 的步进回退搜索,直到发现 "MZ" 头部,并且校验 NT 头。

【技术探索】EPS文件利用如何逃逸 EMET_第7张图片

6. 查找从 EPSIMP32 模块中泄露的地址,然后用之前定义的函数搜索 "MZ"。

【技术探索】EPS文件利用如何逃逸 EMET_第8张图片

7. 定义一个函数,用来查找 EPSIMP32 的导入表中的一个模块名,然后返回相关的导入信息。

【技术探索】EPS文件利用如何逃逸 EMET_第9张图片

8. 定义一个函数,用来查找给定模块的导入表中的特定函数,然后返回函数地址。

【技术探索】EPS文件利用如何逃逸 EMET_第10张图片

9. 定义一个函数,返回导入表中给定模块名的模块基地址。

10. 定义一个函数,查找一个给定系统调用号的函数的调用地址。如果该地址处(正常情况下是

mov reg, system_call_num)被安全产品 HOOK 了,它会继续搜索下一个系统调用,直到发现一个没有被 Hook

的此类函数地址。此过程中,它会统计被扫描过的 ret 的数量(通过 0xC2

特征码)(这代表了有多少个系统函数调用被略过),在它发现一个合理的没有被 Hook

过的系统调用地址后,它会从自己的调用序号处减去扫描时遇到的系统调用函数的数量。

【技术探索】EPS文件利用如何逃逸 EMET_第11张图片

11.在上述所有函数被定义之后,构造主 ROP:

找到 stack pivoting 和 ret gadgets

执行 VirtualProtect 系统调用(通过使用 NtCreateEvent + 0x5, 但使用 NtVirtualProtect 函数的调用号)

写入 ShellCode ,该 ShellCode 会加载 plugin.dll,该 dll 利用了一个内核提权漏洞(CVE-2015-1701)。

译者注:这个样本使用了组合漏洞 — CVE-2015-2545 + CVE-2015-170 有样本的同学可以在虚拟机里面看到一个具有 system 权限的 winword.exe

【技术探索】EPS文件利用如何逃逸 EMET_第12张图片

正如你可以看到的那样,黑客使用了一个聪明的方法:通过在 word 文档内嵌入一个带有漏洞的

EPS文档,使之在人们的终端间传播。

今天,人们几乎能在应用程序中嵌入任何东西。如果你打开一个微软 Office

文档,你永远不知道里面是有一个视频,还是图像,亦或是其他东西。

原文链接:http://blog.morphisec.com/exploit-bypass-emet-cve-2015-2545

本文由看雪翻译小组 银雁冰 编译

热 门 阅 读:

软件漏洞分析入门(一)引子

软件漏洞分析入门(二)—初级栈溢出A_初识数组越界

软件漏洞分析入门(三)初级栈溢出B_系统栈原理

......

你可能感兴趣的:(【技术探索】EPS文件利用如何逃逸 EMET)