【技术分享】ShadowBrokers:针对EnglishmansDentist Exploit的分析

https://p0.ssl.qhimg.com/t01aa5a5dcab35a1552.png

译者:myswsun

预估稿费:200RMB

投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿


0x00 前言

我们继续编写系列文章来剖析2017年4月ShadowBroker公布的漏洞利用。在之前的两篇文章中与SMB漏洞利用有关(EternalChampion和EternalSynergy),这次我们将分析另一个工具,将关注一个名为EnglishmansDentist的漏洞利用,其针对Exchange Server 2003设计。

EnglishmansDentist的目标是Exchange 2003 邮件服务器,会利用Windows Server 2003底层操作系统提供的共享库中的渲染漏洞,该库默认配置为Exchange 2003所用。

新版的操作系统(Win Server 2008及以上)和更新版本的Exchange Server(2007及以上)不受这个漏洞利用的影响。因此对于新平台的用户,不必采取任何措施。

正如之前MSRC博客中宣称的,在考虑到代码已武器化及威胁规模的评估后,微软决定在6月为停止支持的平台(Windows XP和Server 2003)发布更新补丁,以保护那些不能更新新产品的客户。

本文将深入到这个漏洞的根因、微软产品的影响、漏洞利用的方式及在新版操作系统和产品中的现代缓解措施如何破环这种利用。


0x01 概述

这个漏洞的根因是在动态库(OLECNV32.dll)的代码中的一个内存破环的bug,其是用于渲染使用老的文件格式(如QucikDraw PICT)编码的图片的。这个图形库在Windows XP和Server 203上默认存在。Exchange Server 2003使用这个图形库来渲染使用电子邮件附件形式传播的PICT内容。因此,虽然底层bug存在于操作系统中,用于触发漏洞代码的攻击向量是一个Exchange 渲染例程,其通过OLE调用来调用。且使用一个精心构造的电子邮件触发。

当微软安全工程师分析共享组件(如图形库)中的漏洞时,最开始要回答两个非常重要的问题:

一直在支持的哪些产品可能使用或者分发这个有漏洞的共享库?

有漏洞的库的代码是否复制或重用到其他组件中?

对于第一个问题,我们确定有漏洞的OLECNV32.dll的库只存在于停止支持的平台中(如Windows Server 2003和XP),且前者是Exchange Server 2003默认安装平台。在研究了受影响的平台和可能的Exchange Server的安装组合,我们得到下面的矩阵,能帮助理解哪种产品的组合暴露于EnglishmansDentist的威胁中。

Exchange Server 2007不受这次攻击的影响,因为尽管这个库还是可能存在于硬盘上(在Windows Server 2003和Exchange 2007中不太常见),但是图形渲染引擎不再使用OLECNV32.dll库来渲染PICT图片了。新版本的Exchange Server(如2010和2013)也不受这个bug的影响,因此不用考虑他们。

http://p1.qhimg.com/t01504706339d7038c3.png

关于源代码的调查,我们跟踪了停止支持的老版本中的Office中的PICT的有漏洞的代码如何整合并重用的。在这个调查期间,我们很高兴看到,尽管这个bug被开发者复制到Office的一个图形过滤中,但是微软的代码安全检视和模糊测试发现了这个bug,它在2006年就内部修复了。这个例子对于bug冲突很有代表性,内部渗透测试及模糊测试可能会提前扼杀攻击者使用漏洞。

EnglishmansDentist可能开始于2005年之前编写的,因为针对Exchange Server 2003 SP2测试, 这个漏洞利用似乎不能正常工作(会崩溃),并且它只针对32位的操作系统,可能是因为10年前64位的架构还不流行。


0x02 漏洞利用的条件和传播机制

EnglishmansDentist需要攻击者在目标Exchange 2003邮件服务器上至少有一个可靠的邮件账户(用户名和密码)。实际上,漏洞利用首先有一系列验证和检查来确保可靠的账户能登录并成功检查邮件。漏洞利用也需要另一个电子邮件账户(真假皆可),用于发送恶意格式的PICT附件给可靠的账户。

在传播了恶意的PICT附件到目标邮件服务器后,这个工具使用可靠账户的凭据登录并强制Exchange 服务器使用多种可靠协议(OWA, IMAP, POP3)中的任一个来解析并渲染恶意的附件。因为渲染代码在服务端执行,成功利用将导致在Exchange 服务器进程(具有SYSTEM权限)的上下文中执行任意代码。

在漏洞利用后,EnglishmansDentist保持监听模式,以等待连接的shellcode。当这个发生时,工具命令Exchange服务器删除传播漏洞利用的恶意邮件,并移除攻击痕迹。

http://p6.qhimg.com/t011a9ad9176bb9c91e.png


0x03 漏洞:CVE-2017-8487

为了理解这个漏洞,读者必须熟悉PICT图形规范和这个文件格式定义的操作码。在网上有些参考来解析这种老的文件格式。另一个参考是PICT内部操作码的解析代码的细节。

当针对Exchange Server 2003 SP2测试漏洞利用时,我们观察到在我们的测试环境中的崩溃问题;在本文中我们只包含了分析这个漏洞的相关信息和模块,红色标记的是攻击者控制的栈帧,黄色的是感兴趣的函数名。

http://p6.qhimg.com/t013e60a846846ca893.png

从调用堆栈中可以看到,漏洞存在于OLECNV32.dll导出函数QD2GDI()中。这个函数负责转化并渲染QuickDraw图片,它为Exchange Server 2003中“store.exe”进程所用。当读取新邮件时通过OWA解析附件时这个例程被调用;这个解析器的攻击面是到达了OLE32中。

QD2GDI()的内部代码在解析一个LongComment记录(通常用0xA1标识)时有一个内存破环的bug。通过使用一个包含大于32字节的fontName字符串的PP_FONTNAME子记录来创建一个恶意构造的PICT文件能利用这个bug,其将触发固定大小变量的越界读写内存破环。

EnglishmansDensist提供的恶意构造的PICT图片与下面的很相似。

http://p0.qhimg.com/t01c7967fb58b0cb2be.png

这个图片总是以2个硬编码的头开始。一个是用于整合PICT图片到TNEF OLE容器中(通过Exchange使用的邮件附件格式);第二个是表示一个正常的PICT头。两个静态头紧接着标记TxFont记录和触发内存破环的有漏洞的LongComment记录。

恶意的PICT是在EnglishmansDentist中的位于偏移0x404621和0x404650处的两个例程的代码生成的。通过汇编静态头和多个PICT头完成,其中包括恶意构造的0xA1操作码和其他用于传播ROP链和加密的shellcode payload的记录。

http://p1.qhimg.com/t015b03b5585b14f52d.png

解码头,且通过QD2GDI执行记录将立马命中恶意构造的0xA1操作码,并触发漏洞。

http://p5.qhimg.com/t015158aaa7c1e38aac.png

http://p6.qhimg.com/t013bb549182d7cae00.png

正如之前提到的,这个bug在微软内部被发现过。因此函数GetString()多年前已经修改过了,需要调用者传入缓冲区的长度,并加强检查以避免越界读写。


0x04 漏洞利用:缺少缓解措施

不幸的是,在类似Windows Srever 2003的环境中利用越界覆盖的漏洞很容易,因为缺少基本的缓解措施,如ASLR和CFG。在Windows Server 2003中,DEP能简单的被绕过,因为缺少ASLR。没有内存布局随机化,攻击者使用事先计算好的ROP链来调用VirtualAlloc并从shellcode转移到新分配的可执行缓冲区中。

这个漏洞利用首先通过恶意格式的0xA1记录来触发内存破环漏洞,并且越界覆盖来破环存储其他对象的OLECNV32结构体。这个漏洞利用的目标是全局的fontTable()数组中的一个字体条目,稍后会复制到gdiEnv结构体,被哪个能使用覆盖函数指针来控制执行。

下面漏洞利用期间捕获的内存转储表明了fontTable[]数组的例子,一些条目被有漏洞的GetString()引起的内存覆盖破环了。来自PICT文件的恶意形式的数据覆盖fontTable[]是可能的,并且下面红色标记的初始ROP gadget(0x6D8B1CFD)。

http://p5.qhimg.com/t011ee16dd6367b74a8.png

在破环fontTable[]之后,利用解析其他PICT操作码触发更多的漏洞、这将导致OLECNV32做更多的字符串拷贝操作来复制恶意格式的字体信息到OLECNV32!gdiEnv数据结构体中,参加下面代码片段(fontTable[newFont]是恶意形式的,现在被黑客控制了)。

http://p3.qhimg.com/t01606ac4a9ee34b8b9.png

最后的字符拷贝操作将导致函数指针被覆盖,能被攻击者在EnumFonts函数被调用时作为回调来控制。

http://p8.qhimg.com/t01cf6f2d829a38f04d.png


0x05 漏洞利用:针对英文、德文、韩文和中文的ROP链

漏洞利用使用位于Dbghelp.dll中的ROP gadget,它通常会被Exchange Server 的store.exe进程加载到内存空间中。第一个版本的漏洞利用也可以使用OLDCNV32.dll gadget来代替。即使缺少ALSR随机化,得到稳定并通用的漏洞利用也不是立马能办到的,因为Dbghelp.dll是个依赖于语言的库(不同操作系统语言有不同的版本)。在不同的Windows Server 2003版本中这是不同的。

攻击者通过事先计算好了他们感兴趣的每个操作系统版本中的正确的偏移。实际上,配置文件XML包含于EnglishmansDentist包含了针对Windows Server 2003英文版(同时还有德文、韩文、简体中文、繁体中文)开发的ROP链。

https://p5.ssl.qhimg.com/t01eda2f4bba7b3d252.png

解码EnglishmansDentist中配置的ROP gadget将映射到Dbghelp.dll模块中的代码。

https://p0.ssl.qhimg.com/t01025c81102f5f65e8.png

第一个gadget通过覆盖函数指针执行(0x6d8b1cfd),将做一些栈对齐和保持EBP平衡(add 0x1A0),然后使用LEAVE/RET指令的组合转移控制到完整的ROP链中。完整的ROP链(在内存中可见)显示如下。这个ROP很小,用于分配内存来绕过DEP(0x8888字节),并复制这个区域的shellcode(egghunter),其是用于使用SYSTEM权限运行最后的后门payload。

https://p5.ssl.qhimg.com/t01fdd56d766dda8ee6.png


0x06 检测和缓解措施

正如我们之前提到的,Windows Server 2003缺少基本的缓解措施。因为ASLR、CFG和其他的缓解措施,在现代操作系统中(如Windows 10创新者更新或者Windows Server 2016)将变得很难利用。同时,完整性等级和容器(沙箱)的引入,使得微软限制一些图像渲染组件来使得在类似这个解析漏洞中的破环程度最小化。(比如office保护模式,浏览器的AppContainer,和字体渲染的字体沙箱)。

最后,这些天在微软编译器找那个的安全检查和模糊测试的使用能找到并消除类似的bug,从源码级减少bug。

我们提供了一个yara规则来检测通过EnglishmansDentist通过邮件传播的PICT图形。

https://p2.ssl.qhimg.com/t011ecbffad32b9e565.png

(完)