首页
社区
课程
招聘
[原创]CVE-2017-0261及利用样本分析
发表于: 2020-8-14 07:36 5354

[原创]CVE-2017-0261及利用样本分析

erfze 活跃值
12
2020-8-14 07:36
5354

影响版本: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

图片1 加载EPSIMP32.FLT

之后调用ImportGr开始加载EPS文件:

图片2 ImportGr

于此处直接F7跟进,然后就可以成功断在EPSIMP32.FLT内所设断点。

在进入正题之前,先来铺陈下Postscript对象结构。

其中不同type对应数值如下:

以字符串为例,阐述其存储结构。对forall函数设置断点,便可以进一步查看其如何处理字符串(如何定位forall函数,可参阅https://paper.seebug.org/368/)。

图片3 字符串存储结构

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):

漏洞第一次触发:

图片4 第一次

首先是将VM状态保存在l62变量内,之后对于l63变量内每一字符调用l61——>>l59——>>l56处理过程;l62 restore恢复之前的状态,如此一来,/l62 save def语句后面l63申请的内存空间会被释放,从而成为悬挂指针。

图片5 l95-l99

l95-l99变量决定了后续流程,其值均为0(即32位):

图片6 exch_proc

漏洞第二次触发,首先是申请0x27大小(实际会占用0x28)的内存空间存储l63

图片7 l63

之后l62 restore恢复之前的状态,导致l63申请的内存空间被释放,从而成为悬挂指针;接下来执行l100,之前l63所占用内存空间会用来存储l102(即l136)字符串的0x28结构(这就解释了l63为何会申请0x27大小内存空间):

图片8 l102

分别获取该结构0x4、0x20、0x24位置的数值:

图片9 获取值

最后修改l136字符串内容(图中仅展示了部分修改之处):

图片10 构造字符串

这些修改内容是精心构造的,会于第三次触发漏洞时用到。

漏洞第三次触发,申请包含0x37个元素的数组,之后在循环到第0x34个元素时执行l62 restore

图片11 第三次触发流程

执行完restore之后,数组的0x30结构被l193字符串内容覆盖:

图片12 覆盖内容

如此一来,最后一次(0x36)forall过程所执行的对象便成为上图中0x30结构,而获取其第0x36个元素便会来到第二次漏洞触发时所精心构造的字符串处:

图片13 获取数组元素

而其获取到的数组元素是一大小为4的数组,该数组首元素是一起始地址为0,大小为0x7FFFFFFF的字符串:

图片14 数组元素内容

该数组会存储在l159变量中,其首元素——起始地址为0,大小为0x7FFFFFFF的字符串会存储在l201变量中,之后便可通过l201变量获取任意地址的值。

获取kernel32.dll基址:

图片15 获取基址-1

图片16 获取基址-2

如此一来,l314变量内存储的便是EPSIMP32.FLT基址。

图片17 获取基址-3

注:search命令语法如下:

图片18 search

查找指定gadget:

图片19 gadget-1

图片20 gadget-2

构造file类型结构:

图片21 构造file type

l492地址(l491+0x32)处写入构造数据:

最后,执行closefile指令时跳转至Shellcode:

图片22 closefile

EPS利用脚本位于\word\media目录下,解压之后即可看到。该漏洞利用样本除Shellcode部分,其余基本一致,故以Patchwork组织某样本为例进行分析。

文件名:Cyber_Secure_Pakistan.docx

MD5:DD89BBB916A2C909630EC78CBB0E13E5

跳转到Shellcode,恢复堆栈:

图片23 恢复堆栈

申请内存:

图片24 VirtualAlloc

获取函数调用地址:

图片25 函数调用地址

调试过程中,可能是因为环境问题导致CreateToolhelp32Snapshot函数调用地址未成功获取:

图片26 CreateToolhelp32Snapshot

手动填入地址并打开Word以继续分析。枚举进程,查找WINWORD.exe:

图片27 枚举进程

C:\ProgramData\Microsoft\DeviceSync目录下创建一名为MSBuild.exe的程序:

图片28 创建MSBuild.exe

写入文件内容,其内容存储于EPS脚本的payload_32变量内:

图片29 WriteFile

图片30 payload_32

创建vmtools.dll文件:

图片31 创建vmtools.dll

写入文件内容,其内容存储于EPS脚本的payload_32_f2变量内:

图片32 WriteFile

图片33 payload_32_f2

创建VMwareCplLauncher.exe文件:

图片34 创建VMwareCplLauncher.exe

其内容存储于EPS脚本的payload_32_f1变量内:

图片35 payload_32_f1

该文件是具有Vmware签名的白文件:

图片36 Vmware签名

注入如下内容到explorer.exe中:

图片37 注入explorer.exe

其功能为创建VMwareCplLauncher.exe进程:

图片38 创建VMwareCplLauncher.exe进程

之后流程于360此篇报告有提及,本文暂不涉及其分析部分:

图片39 流程

有兴趣的读者可以进一步阅读该报告。

注:该漏洞的利用样本基本相似,不同之处在于最后的MSBuild.exe载荷,其存储于EPS脚本的payload_32变量内,可直接dump出来,填补完DOS文件头之后便可以拖进IDA分析。

 
 
 

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2020-8-19 22:13 被erfze编辑 ,原因:
收藏
免费 7
支持
分享
打赏 + 2.00雪花
打赏次数 1 雪花 + 2.00
 
赞赏  kanxue   +2.00 2020/08/14
最新回复 (1)
雪    币: 26205
活跃值: (63302)
能力值: (RANK:135 )
在线值:
发帖
回帖
粉丝
2
感谢分享~
2020-8-14 09:06
0
游客
登录 | 注册 方可回帖
返回
//