CVE-2017-0261及利用样本分析
字数 2148 2025-08-20 18:17:31
CVE-2017-0261 EPS漏洞分析与利用技术详解
0x01 漏洞概述
漏洞编号:CVE-2017-0261
漏洞类型:Use-After-Free (UAF)
影响组件:EPSIMP32.FLT (Encapsulated PostScript解释器)
影响版本:
- Microsoft Office 2010 Service Pack 2
- Microsoft Office 2013 Service Pack 1
- Microsoft Office 2016
漏洞原理:当用户打开包含恶意EPS文件的Office文档时,FLTLDR.EXE会加载EPSIMP32.FLT来渲染EPS内容。攻击者可以通过PostScript语言的"save-restore"操作序列触发UAF漏洞,最终实现任意代码执行。
0x02 技术背景
EPS文件结构
EPS(Encapsulated PostScript)文件是基于PostScript语言的图像描述文件,Office文档可以嵌入EPS图像。渲染时由EPSIMP32.FLT解释器处理。
PostScript对象结构
struct PostScript_object {
dword type; // 对象类型标识
dword attr; // 属性标志
dword value1; // 值1
dword value2; // 对于数组类型,指向存储数组对象的userdict
};
常见对象类型值:
- 0x0: nulltype
- 0x3: integertype
- 0x5: realtype
- 0x8: booleantype
- 0x10: operatortype
- 0x20: marktype
- 0x40: savetype
- 0x300: nametype
- 0x500: stringtype
- 0x900: filetype
- 0x30000: arraytype
- 0xB0000: packedarraytype
- 0x70000: packedarraytype
- 0x110000: dicttype
- 0x210000: gstatetype
字符串存储结构
- ps_obj结构(value2指向索引项)
- 索引项指向0x30大小的结构:
- +0x24: 指向指针的指针(指向0x28结构)
- +0x2C: 字符串实际大小
- 0x28大小结构:
- +0x4: 存储该结构在索引列表中的地址
- +0x20: 指向字符串存储位置
- +0x24: 实际占用内存大小(字符串大小+1)
0x03 漏洞利用分析
利用流程
漏洞利用分为三个阶段触发:
第一阶段触发:
- 使用
/l62 save def保存VM状态 - 处理l63变量中的每个字符
l62 restore恢复状态,导致l63内存被释放但指针仍存在
第二阶段触发:
- 申请0x27大小内存(实际占用0x28)存储l63
l62 restore再次释放内存- 执行l100操作,用释放的内存存储l102字符串的0x28结构
- 精心构造字符串内容为第三阶段做准备
第三阶段触发:
- 申请包含0x37个元素的数组
- 循环到第0x34个元素时执行
l62 restore - 数组的0x30结构被l193字符串覆盖
- 获取第0x36个元素时指向构造的字符串
- 构造的数组元素包含:
- 起始地址为0
- 大小为0x7FFFFFFF的字符串
- 通过该字符串实现任意地址读取
内存读写原语构建
- 获取kernel32.dll基址
- 搜索关键API地址(如VirtualProtect)
- 构造file类型结构实现任意写
- 通过closefile指令跳转到shellcode
关键PostScript操作
/l62 save def # 保存状态
/l62 restore # 恢复状态(触发UAF)
forall # 遍历数组/字符串
get_dword # 读取DWORD数据
put_data_to_array # 写入数据到数组
my_add/my_sub # 加减运算
0x04 实际样本分析
样本信息:
- 文件名:Cyber_Secure_Pakistan.docx
- MD5:DD89BBB916A2C909630EC78CBB0E13E5
攻击流程:
- 执行shellcode恢复堆栈
- 申请内存空间
- 动态解析API地址(CreateToolhelp32Snapshot等)
- 枚举进程查找WINWORD.exe
- 在
C:\ProgramData\Microsoft\DeviceSync创建:- MSBuild.exe (主payload)
- vmtools.dll
- VMwareCplLauncher.exe (白文件)
- 注入代码到explorer.exe创建VMwareCplLauncher.exe进程
- 最终执行MSBuild.exe中的恶意代码
Payload存储:
- payload_32: MSBuild.exe内容
- payload_32_f1: VMwareCplLauncher.exe内容
- payload_32_f2: vmtools.dll内容
0x05 防御建议
- 及时安装Microsoft安全更新
- 禁用EPS文件支持(通过注册表或组策略)
- 启用Office受保护视图
- 使用应用程序控制策略限制可疑进程执行
- 监控
C:\ProgramData\Microsoft\DeviceSync等可疑目录创建
0x06 参考资源
- EPS Processing Zero-Days Exploited by Multiple Threat Actors
- PostScript LANGUAGE REFERENCE
- kcufId's Github POC
- 摩诃草组织最新漏洞攻击样本分析
附录:关键数据结构
0x30结构布局
+0x0 dword
+0x4 dword
+0x8 dword
+0xc dword
+0x10 dword
+0x14 dword
+0x18 dword
+0x1c dword
+0x20 dword
+0x24 dword pp_struct // 指向0x28结构的指针的指针
+0x28 dword
+0x2c dword size // 字符串实际大小
0x28结构布局(字符串)
+0x0 dword
+0x4 dword // 索引列表中对应项地址
+0x8 dword
+0xc dword
+0x10 dword
+0x14 dword
+0x18 dword
+0x1c dword
+0x20 dword ptr_object // 字符串存储位置
+0x24 dword size // 实际占用大小(字符串大小+1)