作者:Yenn_
原文链接: https://0xdf1001f.github.io/2021/01/19/eps-malware/
EPS
EPS(英文全称:Encapsulated PostScript)是PostScript的一种延伸类型,是目前系统中功能最强的一种图像文件格式。
最近发现一个印度白象组织的样本,样本中使用了CVE 2017-0261的漏洞。
打开Office文档时,FLTLDR.EXE将被用于渲染包含该漏洞的嵌入式EPS文件。该文件是由PostScript语言编写而成,可以被攻击者通过”save-restore”操作利用,其本质为一UAF漏洞。 当用户打开包含格式错误的图形图像的文件时,或者当用户将格式错误的图形图像插入到 Office 文件时,该漏洞可能会受到利用。
样本情况
File Name : Chinese_Pakistani_fighter_planes_play_war_games.docx
File Size : 464,356 Byte
File md5 : 6d63dc5cdb504f3365403c1296e696a0
样本打开后如图:
打开样本后,可以看见启动了子进程FLTLDR.EXE,虽然存活时间很短,至少它启动了。
如何调试恶意代码
.EPS恶意代码存放在Word中的\word\media\目录下,7z打开.doc文件拖出来即可
在调试的时候发现,Word文档的.EPS和韩国HWP的.EPS调试好像不太一样,韩国的HWP可以直接用cerbero_suite_advanced将其中的Shellcode解压出来,但是Word文档不行。
后来在Github找到了一个LoadEPS的软件,https://github.com/pdfswf/eps-CVE-2017-0261
具体使用方法,将样本的.eps恶意文件放入\done\文件夹内覆盖poc.eps,利用loadeps.exe加载恶意.eps,然后使用OD加载loadeps.exe,这里可以用镜像劫持加载,也可以先用OD加载loadeps.exe然后在OD内修改参数
加载后如图:
加载后在4011EE地址处下断,F7步入,Alt+M找到EPSIMP32的加载基址
用IDA打开前面文件内的EPSIMP32.idb,修改基址,定位到closefile的地址
到了closefile_proc的地址,往下找到ROP链执行Shellcode的地方下断
F7步入,可以发现有VirtualProtect函数修改内存页属性为PAGE_EXECUTE_READWRITE,这里的内存地址就是Shellcode存在的地址,可以跟过去调试了
Shellcode
申请内存,获取API地址
硬编码kernel32.dll,ntdll.dll加载并从中获取函数地址
展开系统变量,获取路径%windir%\temp,并在目录内创建一个文件然后又马上删除
检查WINWORD.exe进程,随便点开一个word文档,保存WINWORD进程存在
这里需要F7进去手动修改一下,因为这样本在获取函数地址的时候,没有获取到CreateToolhelp32Snapshot这个函数,导致call edi的时候edi寄存器为0,程序会出错,需要手动修改edi的值为CreateToolhelp32Snapshot的函数地址
遍历进程,判断WINWORD.EXE是否存在
创建文件“C:\Users\sam\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\MSBuild.exe”
将一个PE文件写入创建的MSBuild.exe中
这里PE文件来自于.eps文件中的内容,与老版本不同的是,老版本是直接写在.eps中只需要添加MZ即可,这里是通过XOR 0x16082019的计算后得出,每四字节与key 0x16082019 进行异或计算
这里可以写一个JS代码测试一下,在浏览器console直接运行
function xor(str){
var arr = str.split(" ");
var s = "";
for(var i in arr) s += (parseInt("0x" + arr[i]) ^ 0x16082019).toString(16) + " ";
console.log(s.toUpperCase());
}
再次给样本修复CreateToolhelp32Snapshot的地址,样本会遍历进程查找explorer.exe进程并向其中注入代码
注入的代码也来自于.eps文件中
注入代码的功能是启动前面释放的MSBuild.exe
创建一个隐藏文件
“C:\ProgramData/Microsoft/DeviceSync/Chinese_Pakistani_fighter_planes_play_war_games_to_prove_a_point_to_India.docxt”并将.EPS中的一个Word文档写入
创建进程执行这个释放出的文档然后退出进程
.eps的代码到这里结束,后面的情况就好分析了
本文由 Seebug Paper 发布,如需转载请注明来源。本文地址:https://paper.seebug.org/1509/