CVE-2017-11882-analyze

首先

我今天才拿到样本,尝试稍微分析一下下


这个漏洞是基于offcie公式编辑器的一个栈溢出。由于该公式编辑器已经有17年没有进一步更新,而且这个公式编辑器并不是直接依托于office,所以office一些软件保护,这个公式编辑器事实上是不存在的

分析

组件位置位于 C:\Program Files (x86)\Common Files\microsoft shared\EQUATION\EQNEDT32.EXE

漏洞位置


004164FA地址的功能主要是从内部表单复制以空字符结尾的字符串作为第一个参数发送给它的缓冲区

程序可以从另外两个程序中调用。他们都将固定长度的堆栈数据传递给它。这两个过程更重要的是容易受到缓冲区溢出的影响。发现第一个调用与EqnFrameWinProc函数中处理的某个窗口消息有关。换句话说,利用这个电话是不平凡的任务。

第二个调用又与处理从等式二进制形式复制的字体名称有关。调用可以通过调用IPersistStorage :: Load来执行。但是,直接使用该函数是不可能的,因为如果溢出了,就会调用另一个溢出的过程。第一个函数的缓冲区太大,会覆盖第二个函数的所有参数,在执行的时候会访问无效的内存位置。因此,组件进程将会崩溃,直到攻击者控制的代码被执行。为了方便起见,在研究范围内,我们将其命名为LogfontStruct_Overflow。该函数具有00421774地址,并在LOGFONTA结构中溢出缓冲区

利用

在这种情况下,ret2libc需要执行任意代码。来自EQNEDT32.EXE的已知设置地址的第一个字节是零字节。这就是为什么不可能从可执行文件复制由小工具构建的ROP链(组件中也存在潜在的漏洞)。

组件的过时导致以下结果:
EQNEDT32.EXE开发人员要求WinExec函数有一些未知的原因。
最后描述的功能原来是一个完美的适合WinExec。
第2点是可能的,因为引起缓冲区溢出的函数是溢出函数的第一个参数。第二个参数是NULL。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
struct EQNOLEFILEHDR {

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

DWORD version; // 固定为0x00020000。

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

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

DWORD reserved1; // 未公开

DWORD reserved2; // 未公开

DWORD reserved3; // 未公开

DWORD reserved4; // 未公开

};

攻击者可能溢出的数组大小为36个字节)。而且,可以使用v12变量和保存的EBP的空间,这又增加了8个字节。

通过插入多个利用所述漏洞的OLE,可以执行任意命令序列(例如,从Internet上下载任意文件并执行它)。

解决方案:

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

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

(2)开启Windows Update功能,定期对系统进行自动更新
2、由于该公式编辑器已经17年未做更新,可能存在大量安全漏洞,建议在注册表中取消该模块的注册。

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

l 输入以下两条命令:

1
2
3
4
5
6
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