影响版本:Microsoft Office 2010 Service Pack 2、Microsoft Office 2013 Service Pack 1、Microsoft Office 2016
POC:kcufId's Github
笔者在网上寻找许久,并未找到包含EPSIMP32.FLT的Office安装包。幸而kcufId师傅提供了一LoadEps.exe用以加载EPS文件,感谢kcufId师傅。
LoadEps.exe
先是加载EPSIMP32.FLT
:
之后调用ImportGr
开始加载EPS文件:
于此处直接F7跟进,然后就可以成功断在EPSIMP32.FLT内所设断点。
在进入正题之前,先来铺陈下Postscript对象结构。
其中不同type
对应数值如下:
以字符串为例,阐述其存储结构。对forall
函数设置断点,便可以进一步查看其如何处理字符串(如何定位forall
函数,可参阅https://paper.seebug.org/368/)。
1号图片对应ps_obj
,其value2
项指向索引列表中所对应项(2号图片);索引项指向一大小为0x30的结构,该结构0x24位置保存一指向大小为0x28结构(5号图片)的指针的指针,0x2C位置保存字符串大小(3号图片);5号图片中结构0x4位置存储该结构于索引列表中对应项的地址(即4号图片的0x01DB5E94),0x20位置指向字符串最终存储位置(6号图片),0x24位置为实际所占内存大小——字符串大小+1。
大小为0x30结构:
大小为0x28结构(换作数组,该结构大小为0x2C,且0x28位置指向数组元素,每一元素都是ps_obj
):
漏洞第一次触发:
首先是将VM状态保存在l62
变量内,之后对于l63
变量内每一字符调用l61
——>>l59
——>>l56
处理过程;l62 restore
恢复之前的状态,如此一来,/l62 save def
语句后面l63
申请的内存空间会被释放,从而成为悬挂指针。
l95-l99
变量决定了后续流程,其值均为0(即32位):
漏洞第二次触发,首先是申请0x27大小(实际会占用0x28)的内存空间存储l63
:
之后l62 restore
恢复之前的状态,导致l63
申请的内存空间被释放,从而成为悬挂指针;接下来执行l100
,之前l63
所占用内存空间会用来存储l102
(即l136
)字符串的0x28结构(这就解释了l63
为何会申请0x27大小内存空间):
分别获取该结构0x4、0x20、0x24位置的数值:
最后修改l136
字符串内容(图中仅展示了部分修改之处):
这些修改内容是精心构造的,会于第三次触发漏洞时用到。
漏洞第三次触发,申请包含0x37个元素的数组,之后在循环到第0x34个元素时执行l62 restore
:
执行完restore
之后,数组的0x30结构被l193
字符串内容覆盖:
如此一来,最后一次(0x36)forall
过程所执行的对象便成为上图中0x30结构,而获取其第0x36个元素便会来到第二次漏洞触发时所精心构造的字符串处:
而其获取到的数组元素是一大小为4的数组,该数组首元素是一起始地址为0,大小为0x7FFFFFFF的字符串:
该数组会存储在l159
变量中,其首元素——起始地址为0,大小为0x7FFFFFFF的字符串会存储在l201
变量中,之后便可通过l201
变量获取任意地址的值。
获取kernel32.dll基址:
如此一来,l314
变量内存储的便是EPSIMP32.FLT基址。
注:search
命令语法如下:
查找指定gadget:
构造file
类型结构:
向l492
地址(l491
+0x32)处写入构造数据:
最后,执行closefile
指令时跳转至Shellcode:
EPS利用脚本位于\word\media
目录下,解压之后即可看到。该漏洞利用样本除Shellcode部分,其余基本一致,故以Patchwork组织某样本为例进行分析。
文件名:Cyber_Secure_Pakistan.docx
MD5:DD89BBB916A2C909630EC78CBB0E13E5
跳转到Shellcode,恢复堆栈:
申请内存:
获取函数调用地址:
调试过程中,可能是因为环境问题导致CreateToolhelp32Snapshot
函数调用地址未成功获取:
手动填入地址并打开Word以继续分析。枚举进程,查找WINWORD.exe:
于C:\ProgramData\Microsoft\DeviceSync
目录下创建一名为MSBuild.exe的程序:
写入文件内容,其内容存储于EPS脚本的payload_32
变量内:
创建vmtools.dll文件:
写入文件内容,其内容存储于EPS脚本的payload_32_f2
变量内:
创建VMwareCplLauncher.exe文件:
其内容存储于EPS脚本的payload_32_f1
变量内:
该文件是具有Vmware签名的白文件:
注入如下内容到explorer.exe中:
其功能为创建VMwareCplLauncher.exe进程:
之后流程于360此篇报告有提及,本文暂不涉及其分析部分:
有兴趣的读者可以进一步阅读该报告。
注:该漏洞的利用样本基本相似,不同之处在于最后的MSBuild.exe载荷,其存储于EPS脚本的payload_32
变量内,可直接dump出来,填补完DOS文件头之后便可以拖进IDA分析。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2020-8-19 22:13
被erfze编辑
,原因: