隐藏17年的Office远程代码执行漏洞现POC样本(CVE-2017-11882)

0?wx_fmt=png

2017年11月14日,微软发布了11月份的安全补丁更新,其中比较引人关注的莫过于悄然修复了潜伏17年之久的Office远程代码执行漏洞(CVE-2017-11882)。该漏洞为Office内存破坏漏洞,影响目前流行的所有Office版本。攻击者可以利用漏洞以当前登录的用户的身份执行任意命令。

由于漏洞影响面较广,漏洞披露后,金睛安全研究团队持续对漏洞相关攻击事件进行了关注。11月19日,我们监控到了已有漏洞POC在网上流传,迅速对相关样本进行了分析。目前该样本全球仅微软杀毒可以检测。

 

漏洞影响版本

l Office 365

l Microsoft Office 2000

l Microsoft Office 2003

l Microsoft Office 2007 Service Pack 3

l Microsoft Office 2010 Service Pack 2

l Microsoft Office 2013 Service Pack 1

l Microsoft Office 2016

 

漏洞事件分析

漏洞出现在模块EQNEDT32.EXE中,该模块为公式编辑器,在Office的安装过程中被默认安装。该模块以OLE技术(Object Linking and Embedding,对象链接与嵌入)将公式嵌入在Office文档内。

0?wx_fmt=png

 

图 1 - Microsoft 公式编辑器

 

当插入和编辑数学公式时,EQNEDT32.EXE并不会被作为Office进程(如Word等)的子进程创建,而是以单独的进程形式存在。这就意味着对于WINWORD.EXE, EXCEL.EXE等Office进程的保护机制,无法阻止EQNEDT32.EXE这个进程被利用。

 

由于该模块对于输入的公式未作正确的处理,攻击者可以通过刻意构造的数据内容覆盖掉栈上的函数地址,从而劫持程序流程,在登录用户的上下文环境中执行任意命令。

 

0?wx_fmt=png

 

图 2 - CVE-2017-11882 POC中所执行的命令

 

国外安全厂商0patch对修补前后的相应补丁进行了对比,发现更新补丁后的程序版本是使用汇编方式进行修补的,并据此推测由于年代久远,微软或已丢失相关程序的源代码。再者,当时(2000年)的编译器所编译的程序并不包含ASLR等漏洞缓解措施,因此该模块必将吸引更多黑客对其进行漏洞挖掘。为安全起见,强烈建议用户取消对该模块的注册,解决方案请参考文章结尾部分。

 

0?wx_fmt=png

 

图 3 公式编辑器使用较低版本编译器编写(Visual C++ 3~4版)

0?wx_fmt=png

 

图 4 - EQNEDT32.exe未见任何漏洞环节措施

 

漏洞分析

1)基本信息

截止分析报告撰写时,只发现了RTF类型的CVE-2017-11882漏洞利用文档。触发漏洞的OLE对象加载方式与今年上半年的CVE-2017-0199漏洞类似,使用了\objupdate控制字来保证OLE对象的自动更新和加载 

0?wx_fmt=png

图 5 - RTF标准文档中对\objupdate控制字的说明

 

该OLE对象的类型为“Equation.3”,即公式编辑器3.0类型对象,该公式对象使用了CFB格式进行存储。

 

0?wx_fmt=png

图 6 - 漏洞文档中的OLE数据头

 

对该OLE对象进行提取和分析,可以发现公式的相关内容存放在\x01CompObj流之后。

 

0?wx_fmt=png

图 7 - 公式对象

 

(2)详细分析

公式的内容使用了一种名为MTEF v.3的二进制格式进行存储。该格式的头部为28(0x1C)个字节,定义如下:

struct EQNOLEFILEHDR {

    WORD    cbHdr;      // 格式头长度,固定为0x1C。

    DWORD   version;    // 固定为0x00020000。

    WORD    cf;          // 该公式对象的剪贴板格式。

    DWORD   cbObject;  // MTEF数据的长度,不包括头部。

    DWORD   reserved1; // 未公开

    DWORD   reserved2; // 未公开

    DWORD   reserved3; // 未公开

    DWORD   reserved4; // 未公开

};

 

在漏洞利用文档中,该结构如下所示。

0?wx_fmt=png

 

图 8 - 公式头结构

对上图的解析如下表所示。

偏移量

变量名

说明

0-1

cbHdr

公式头大小

0x001C

2-5

version

版本号

0x00020000

6-7

cf

剪贴板格式

0xC3BE

8-11

cbObject

MTEF数据长度

0x45,即69字节

12-15

reserved1

未公开

0x00000000

16-19

reserved2

未公开

0x00682428

20-23

reserved3

未公开

0x0069A87C

24-27

reserved4

未公开

0x00000000

 

紧随该公式头结构的数据为公式数据。公式数据使用字节流进行存储。

0?wx_fmt=png

 

图 9 - 公式数据

 

MTEF v.3公式数据中,前5个字节为数据头,解析如下表所示。

偏移量

说明

0

MTEF版本号

0x03

1

该数据的生成平台

0x00表示在Macintosh平台生成,0x01表示在Windows平台生成。此处为0x01。

2

该数据的生成产品

0x00表示由MathType生成,0x01表示由公式编辑器生成。此处为0x01。

3

产品主版本号

0x03

4

产品副版本号

0x0A

 

在数据头之后的字节流即为公式数据。

数据0x0A所对应的数据类型为SIZE,只占用一个字节。

数据0x08所对应的数据类型为FONT,文档中数据的解析如下表所示。

数值

解释

0x08

FONT记录标志

0x02

typeface类型

0x81

字体风格

0x636D642E......

字体名(以空字符结尾),即图9中的cmd.exe...字符串

 

而问题正出在对字体名的解析上。该公式编辑器只为字体名分配了36个字节的空间,而处理时并未对字体名的长度做合理性检验,导致了栈溢出的发生。在图9中的一长串"A"之后可以发现一个硬编码的地址0x00430C12。

 

0?wx_fmt=png

图 10 - 漏洞代码

 

通过对下面的两张图进行对比,可以明白栈溢出的触发过程。

0?wx_fmt=png

 

图 11 - 被覆盖前的栈数据

0?wx_fmt=png

 

图 12 - 被覆盖后的栈数据

 

被修改后的函数调用如下图所示,在前文中已经提到,该公式编辑器并没有开启ASLR。这个硬编码的地址0x00430C12对应于对函数WinExec的调用。因而该字体名对应的命令得以执行。

0?wx_fmt=png

 

 

解决方案

(1) 微软已经对此漏洞做出了修复。

l 下载

https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2017-11882更新补丁进行修补

l 开启Windows Update功能,定期对系统进行自动更新

(2) 由于该公式编辑器已经17年未做更新,可能存在大量安全漏洞,建议在注册表中取消该模块的注册。

l 按下Win+R组合键,打开cmd.exe

l 输入以下两条命令:

reg add “HKLM\SOFTWARE\Microsoft\Office\Common\COM Compatibility\{0002CE02-0000-0000-C000-000000000046}” /v “Compatibility Flags” /t REG_DWORD /d 0x400

 

reg add “HKLM\SOFTWARE\Wow6432Node\Microsoft\Office\Common\COM Compatibility\{0002CE02-0000-0000-C000-000000000046}” /v “Compatibility Flags” /t REG_DWORD /d 0x400

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值