专栏名称: 看雪学苑
致力于移动与安全研究的开发者社区,看雪学院(kanxue.com)官方微信公众帐号。
目录
相关文章推荐
沉默王二  ·  11月跳槽的兄弟注意了。。 ·  4 天前  
沉默王二  ·  11月跳槽的兄弟注意了。。 ·  4 天前  
看雪学苑  ·  以色列支付系统遭DDoS攻击,全国读卡器瘫痪 ·  1 周前  
信安之路  ·  一键检测 17 个蓝凌 OA 历史漏洞 ·  4 天前  
瑞恩资本RyanbenCapital  ·  国富氢能,来自江苏连云港,成功在香港上市,早 ... ·  1 周前  
瑞恩资本RyanbenCapital  ·  国富氢能,来自江苏连云港,成功在香港上市,早 ... ·  1 周前  
51好读  ›  专栏  ›  看雪学苑

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

看雪学苑  · 公众号  · 互联网安全  · 2017-03-03 18:33

正文

前几天,PhysicalDrive0 (恶意软件猎人) 公布了一个新的 word 文档样本,我们在 Morphisec 实验室中检验了这个样本,验证是否我们的产品能够做到立即防御。

如预期的那样,它做到了。当我们打开这个 word 文档的时候,这个恶意文档立即尝试去执行并感染我们的机器,由于我们的 WinWord 应用程序被 Morphisec Protector 所保护,所以这次攻击马上被防护了,并且被围困,看下面:

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

我们决定关闭  Morphisec protection,来验证一下会发生什么。我们很惊讶地发现这个样本完全逃逸了最新版 EMET 5.5 的检测,见下面(现在最新版为 5.5.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 位。

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

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

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

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

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

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

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

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

10. 定义一个函数,查找一个给定系统调用号的函数的调用地址。如果该地址处(正常情况下是 mov reg, system_call_num)被安全产品 HOOK 了,它会继续搜索下一个系统调用,直到发现一个没有被 Hook 的此类函数地址。

此过程中,它会通过 0xC2 特征码,统计被扫描过的 ret 的数量(这代表了有多少个系统函数调用被略过),在它发现一个合理的、没有被 Hook 过的系统调用地址后,它会从自己的调用序号处减去扫描时遇到的系统调用函数的数量。

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

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

今天,人们几乎能在应用程序中嵌入任何东西。如果你打开一个微软 Office 文档,你永远不知道里面是有一个视频,还是图像,亦或是其他东西。

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

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


 热 门 阅 读:


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

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

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

......

更多优秀文章点击左下角“关注原文”查看!

看雪论坛:http://bbs.pediy.com/

微信公众号 ID:ikanxue

微博:看雪安全

投稿、合作:www.kanxue.com