这个漏洞是个典型的栈溢出,主要是使用了不安全的拷贝函数,导致了溢出,随后在公布了POC之后,也在野外看到了攻击样本

1漏洞分析
漏洞位于EQNEDT32.EXE中,这个组件自从编译后已经17年没有变了,会影响当前所有流行的Office版本


我们这里 选用分析的是embedi放出的POC,我们运行后,可以看到完美的弹出了计算器

我们将exploit.rtf 这个rtf文件放入二进制查看工具中可以看到里面的OLE对象,正是这个OLE对象,可以看到设置了OLE对象属性为objupdate 自动更新,这样无需交互,点击文档自动运行,这个对象的objclass 为 Equation.3,即公式编辑器3.0对象

首先通过rtfobj.py将这个OLE对象提取出来


我们将对象放到offvis中进行查看执行 cmd.exe /c calc.exe 以及后面的一个函数地址为00430C12


到IDA中找下这个地址,可见是通过WinExec调用执行 cmd.exe


我们在来看看整个MTEF3.0格式的二进制存储
这MTEF.0格式的头部使用的是28字节的EQNOLEFILEHDR的结构体,第四个字段说明了跟在这个字段的MIEF data的大小


对应的是如下图所示的字节


我们在来看看后面的 MIEF data,对应的是如下的字节,看来是解析 MIEF data的时候发生的问题,第一个字节为03 代表MTEF的版本号,第二个字节01表示在windows平台生成,第三个字节01 表示这个是公式编辑器生成,之后是产品的主版本号03和产品的副版本号


MTEF 字节头定义


之后的字节便是公式数据流,通过文档我们分析得知,之后是一系列的records,这里分别是 0A size record和 08 Font record


我们具体看 font这个字节,分别是 tface和style和name,结合字节我们知道正是name这个字节出现了问题,来动态的调一下


首先需要设置好windbg自动加载


我们附加到 EQNEDT32.EXE后再WinExec 下断点 ,看到


我们通过向上查找返回地址函数的方法,定位到了是这个sub_41160F 这个函数出现了问题


可以看到这个使用了strcpy拷贝函数,没有进行条件限制,整个name长度为 0x30超多了分配的长度,导致溢出

建议打补丁,不过感觉这个模块还会有问题,建议直接在注册表中禁了吧,安全些

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

源链接

Hacking more

...