CVE-2017-11882漏洞分析
分析环境
- 环境 W7 x64 Office2013
- 工具 windbg IDA Pro
漏洞描述
CVE-2017-11882是微软公布的一个远程执行漏洞,通杀目前市面上的所有office版本及Windows操作系统(包括刚刚停止支持的Office 2007)。该漏洞的成因是EQNEDT32.EXE进程在读入包含MathType的ole数据时,在拷贝公式字体名称时没有对名称长度进行校验,从而造成栈缓冲区溢出,是一个非常经典的栈溢出漏洞。上次出现这么典型的office栈溢出漏洞是著名的CVE-2012-0158。
漏洞成因
该漏洞出现在模块EQNEDT32.EXE中, 该模块为windows的公式编辑器。由于该模块对于输入的公式未做正确的处理,攻击者可以通过刻意构造的数据内容覆盖掉栈上的函数地址,从而劫持程序流程,执行任意命令
**模块路径:**C:\Program Files\Common Files\microsoft shared\EQUATION
文件信息
如图可以发现,程序发布于2000年,编译器使用VC++4.2
受漏洞影响的版本
- Office 365
- Microsoft Office 2000
- Microsoft Office 2003
- Microsoft Office 2007 Service Pack 3
- Microsoft Office 2010 Service Pack 2
- Microsoft Office 2013 Service Pack 1
- Microsoft Office 2016
漏洞分析
获取poc
https://github.com/Ridter/CVE-2017-11882
复现漏洞
- 搭建漏洞环境(安装Office 2003 sp3),执行漏洞poc
- 由于漏洞出现在EQNEDT32.EXE 进程 首先需要确认是否存在公式编辑器
- 菜单->插入->对象 找到公式3.0
- 如果没有则说明Office安装不完全
- 打开exploit.rtf,弹出计算器
漏洞分析
定位漏洞模块
通过ProcessMonitor查看计算器的父进程,发现是EQNEDT32.EXE,且EQNEDT32.EXE并不会作为WINWORD的子进程创建,而是以单独的形式存在。这就意味着Office的进程保护机制,无法阻止EQNEDT32.EXE这个进程被利用。
定位漏洞函数
因为弹出计算器的时候创建了新进程,所以我们可以认为是由WinExec或者CreateProcess创建的。用windbg附加EQNEDT32.EXE,然后下API断点
打开poc,程序断下,分析WinExec的返回地址和参数
接着查看一下参数的内容
看到了通过cmd命令来开启计算器
接着查看一下当前的调用堆栈,看是谁调用了WinExec这个函数
接着用ub命令查看这个返回地址之前的汇编代码,然后在IDA中查看这些函数
在IDA中找到sub_4115A7这个函数,进去F5查看
只有这么一小段代码,继续跟进查看sub_41160F
这里的字符串拷贝函数没有使用安全版本的,会导致栈溢出,那么这个函数就是触发漏洞的函数了
定位漏洞触发点
重新运行windbg,在0x4115D3这个触发漏洞的函数下断点
此时程序断下
查看堆栈的参数,参数的内容就是poc中构造的恶意参数
接着进入函数,一直单步到这一条rep指令
此时我们查看ebp+4的内容和edi以及esi的内容,这里可以看到返回地址即将被0x430c12这个地址覆盖
步过这条指令,再次查看ebp+4的内容,发现此时返回地址已经被覆盖,这样我们就确定了漏洞触发点
解决方案
-
微软已经对此漏洞做出了修复
- 下载https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2017-11882 更新补丁进行修补
- 开启Windows Update功能,定期对系统进行自动更新
-
由于该公式编辑器已经17年未做更新,可能存在大量安全漏洞,建议在注册表中取消该模块的注册
- 按下Win+R组合键,打开cmd.exe
- 输入以下两条命令:
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