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

字符串存储结构

  1. ps_obj结构(value2指向索引项)
  2. 索引项指向0x30大小的结构:
    • +0x24: 指向指针的指针(指向0x28结构)
    • +0x2C: 字符串实际大小
  3. 0x28大小结构:
    • +0x4: 存储该结构在索引列表中的地址
    • +0x20: 指向字符串存储位置
    • +0x24: 实际占用内存大小(字符串大小+1)

0x03 漏洞利用分析

利用流程

漏洞利用分为三个阶段触发:

第一阶段触发

  1. 使用/l62 save def保存VM状态
  2. 处理l63变量中的每个字符
  3. l62 restore恢复状态,导致l63内存被释放但指针仍存在

第二阶段触发

  1. 申请0x27大小内存(实际占用0x28)存储l63
  2. l62 restore再次释放内存
  3. 执行l100操作,用释放的内存存储l102字符串的0x28结构
  4. 精心构造字符串内容为第三阶段做准备

第三阶段触发

  1. 申请包含0x37个元素的数组
  2. 循环到第0x34个元素时执行l62 restore
  3. 数组的0x30结构被l193字符串覆盖
  4. 获取第0x36个元素时指向构造的字符串
  5. 构造的数组元素包含:
    • 起始地址为0
    • 大小为0x7FFFFFFF的字符串
  6. 通过该字符串实现任意地址读取

内存读写原语构建

  1. 获取kernel32.dll基址
  2. 搜索关键API地址(如VirtualProtect)
  3. 构造file类型结构实现任意写
  4. 通过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

攻击流程

  1. 执行shellcode恢复堆栈
  2. 申请内存空间
  3. 动态解析API地址(CreateToolhelp32Snapshot等)
  4. 枚举进程查找WINWORD.exe
  5. C:\ProgramData\Microsoft\DeviceSync创建:
    • MSBuild.exe (主payload)
    • vmtools.dll
    • VMwareCplLauncher.exe (白文件)
  6. 注入代码到explorer.exe创建VMwareCplLauncher.exe进程
  7. 最终执行MSBuild.exe中的恶意代码

Payload存储

  • payload_32: MSBuild.exe内容
  • payload_32_f1: VMwareCplLauncher.exe内容
  • payload_32_f2: vmtools.dll内容

0x05 防御建议

  1. 及时安装Microsoft安全更新
  2. 禁用EPS文件支持(通过注册表或组策略)
  3. 启用Office受保护视图
  4. 使用应用程序控制策略限制可疑进程执行
  5. 监控C:\ProgramData\Microsoft\DeviceSync等可疑目录创建

0x06 参考资源

  1. EPS Processing Zero-Days Exploited by Multiple Threat Actors
  2. PostScript LANGUAGE REFERENCE
  3. kcufId's Github POC
  4. 摩诃草组织最新漏洞攻击样本分析

附录:关键数据结构

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)
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对象结构 常见对象类型值: 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操作 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结构布局 0x28结构布局(字符串)