如何调试分析Office EPS漏洞样本?

  • A+
所属分类:逆向工程

前言

最近某APT组织又开始使用Office EPS漏洞样本进行攻击,由于EPS语法采用逆波兰表示法,所以静态理解起来比较困难,本文分享一下笔者对EPS漏洞动态调试的一些经验。

3个EPS漏洞

Office EPS组件的漏洞一共出现过3个,分别是CVE-2015-2545CVE-2017-0261CVE-2017-0262,随后微软禁用了EPS组件,不再有新的EPS漏洞出现。

 

这些EPS漏洞之所以受攻击者青睐是因为:EPS是一种脚本语言,具有和JavaScript等脚本语言相似的特性,在PoC编写、堆喷射、缓解机制绕过、Shellcode编写方面都较传统的Office漏洞更为方便。

 

微软早已意识到EPS解析组件的危险性,所以在Office 2010及以上版本中会启动fltldr.exe这个沙箱进程(fltldr.exe进程为low权限,无法进行常规的文件写入等操作)去加载epsimp32.flt动态库。因此,攻击者如果要借助EPS漏洞攻击Office 2010及以上的用户,就需要在Shellcode中配套使用一个内核提权漏洞进行沙箱逃逸。

 

目前已经观察到的Office EPS漏洞+内核提权漏洞的组合有如下这些:

  • CVE-2015-2545 + CVE-2015-2546

  • CVE-2017-0261 + CVE-2016-7255

  • CVE-2017-0261 + CVE-2017-0001

  • CVE-2017-0262 + CVE-2017-0263

  • CVE-2017-0261 + CVE-2019-0808

 

如何调试分析Office EPS漏洞样本?

EPS组件在不同版本office上的区别

漏洞利用的区别

EPS组件在Office 2007Office 2010下的区别主要在于有无沙箱机制,所以利用的区别主要在于是否有配套的内核提权程序。理论上,如果一个EPS漏洞样本只攻击office 2007用户,则无需内嵌一个内核提权组件。目前观察到的实际攻击样本大多内嵌内核提权漏洞,所以可推测攻击目标以office 2010及以上版本为主。


调试的区别

以笔者的经验来看,Office 2010下调试EPS漏洞是一件比较麻烦的事情,主要是因为fltldr.exe进程的沙箱机制,附加调试器到fltldr.exe进程进行调试存在诸多不便。

 

由于大多数CVE-2017-0261样本在Office 2007上都能完整触发,所以碰到CVE-2017-0261漏洞样本可以优先在Office 2007上进行调试。但也有例外情况,最近观察到某APT的一个CVE-2017-0261样本在Office 2010下与Office 2007下行为表现不一致(Office 2010下运行时释放了一个额外的内核提权组件)

如何在内存中定位shellcode起始点

定位处理函数地址(IDA)

Office负责解析EPS文件的模块叫epsimp32.flt,尽管后缀名为.flt,这其实是一个动态库。以Office 2007不打补丁的版本为例,将epsimp32.flt拖进IDA中进行逆向,在Strings界面可以定位到许多PostScript语法关键字,对这些关键字进行交叉引用就可以定位到一系列虚函数调用入口:

如何调试分析Office EPS漏洞样本?


通过这一级入口就可以找到相关PostScript语法的处理函数。


定位epsimp32.flt的加载

这里笔者以office 2007 + windbg为例,为了对epsimp32.flt模块内的汇编代码下断点,首先需要定位到epsimp32.flt的加载处:

如何调试分析Office EPS漏洞样本?

成功断下后windbg界面显示如下:

如何调试分析Office EPS漏洞样本?



定位虚函数调用劫持点

调试一个漏洞样本时,其最终目的是找到其执行的shellcode,下面笔者分享如何在内存中定位EPS漏洞shellcode入口的一些经验。在已出现的EPS漏洞的攻击样本中,多是借助虚表劫持的方式来切换控制流,目前观察到的虚表劫持处有两个:

如何调试分析Office EPS漏洞样本?


如果在加载epsimp32.flt后对上述地址下断点,有比较大的概率会断在漏洞触发后的虚函数调用劫持点,比如最近的某CVE-2017-0261样本(md5:7e74d8708c118c133e6e591ae0fac33b)就是通过epsimp32+0x30197处的虚函数调用最终进行控制流切换的:

如何调试分析Office EPS漏洞样本?



定位ROP gadgets

EPS漏洞样本在成功劫持虚函数调用后,一般先从xchg指令进行栈帧切换开始,下面借助某CVE-2017-0261样本(md5:7e74d8708c118c133e6e591ae0fac33b)具体举一个例子:

如何调试分析Office EPS漏洞样本?


上述指令的目的是为了替换原有的eps寄存器值,dps看一下伪造的栈(此刻存储在eax)中存储了哪些信息:

如何调试分析Office EPS漏洞样本?


可以看到栈上的返回地址都是一些rop gadgets的地址:

如何调试分析Office EPS漏洞样本?



定位shellcode

执行完上述最后一个ret 0c指令后,rop链就会调用kernel32!VirtualProtectStub函数将shellcode的地址设为可执行:

如何调试分析Office EPS漏洞样本?


对照VirtualProtect函数的声明来看一下每个参数:

如何调试分析Office EPS漏洞样本?


很明显,shellcode起始地址为0x6feee0,下断点命中后即得到了shellcode起始地址:

如何调试分析Office EPS漏洞样本?

通过上述方法,就定位到了上述样本的shellcode起始处,此时对虚拟机做个快照,后面的任务就转化为如何调试shellcode了。

LoadEps

笔者前段时间读了看雪论坛的一篇CVE-2017-0261的分析文章(https://bbs.pediy.com/thread-261442.htm),意外发现Github上有一个LoadEps的加载程序(https://github.com/kcufId/eps-CVE-2017-0261)比较有意思。简单来说,LoadEps的作者用汇编语言写了一个EPS组件加载器,这个文件会直接调用EPS文件进行解析,这样,在没有安装Office的环境中也可以调试EPS样本,给这方面的调试工作带来了一些简化。


适用于LoadEps的样本

笔者下载试用了一下LoadEps,发现它可以正常加载许多从之前的样本中提取出来的EPS文件,比如这个弹hello world对话框的样本(md5:845ca93dd2f8d74614d687d52b3eee24)和这个弹计算器的样本(md5:2734e3655a1d30b8948c186b361ffb72)。方法是在原项目的done文件夹中,将LoadEps的后缀名改为.exe,将eps.poc文件替换为本次需要加载的eps文件并且重命名为eps.poc,当然也可以手动改动LoadEPS源码并重新编译。

 

如果LoadEPS可以加载当前EPS文件,调试任务就转化为调试LoadEPS进程中加载的epsimp32.flt模块,这在没有安装Office的环境中也可进行,从而简化了调试场景。然后就可以借助windbg等调试器加载LoadEps来调试EPS文件,但要注意的是,如果直接用作者编译好的LoadEps.exe,需要在调试器中手动设置一下启动目录,不然LoadEps按照默认的目录枚举方式无法找到eps.poc,也就无法正常加载eps文件:

如何调试分析Office EPS漏洞样本?


不适用于LoadEps的样本

不过,笔者在实验中发现LoadEps无法正常加载今年出现的一些CVE-2017-0261样本(md5:7e74d8708c118c133e6e591ae0fac33b)中内嵌的EPS文件,在用LoadEPS加载相关样本时,发现会崩溃在一个注册回调处点,笔者仔细看了下LoadEps源码,发现作者并未实现EPS加载中可能涉及到的部分回调:

如何调试分析Office EPS漏洞样本?

 

对这些无法通过LoadEps加载的EPS文件,读者只能借助安装了Office的环境去加载相应的docx文件并手动调试。

调试思路总结

综上,笔者建议可采用如下步骤分析此类EPS漏洞:

如何调试分析Office EPS漏洞样本?

 

目前已经观察到部分EPS漏洞样本无法在VMWare虚拟机内正常触发,但可以在Hyper-V或者QEMU虚拟机内触发,读者有时候如果遇到当前虚拟机内无法触发的情况,可以考虑多试几种不同虚拟机产品。

参考链接

CVE-2015-2545

https://www.fireeye.com/content/dam/fireeye-www/blog/pdfs/twoforonefinal.pdf

https://www.fireeye.com/blog/threat-research/2015/12/the_eps_awakens.html

http://blog.morphisec.com/exploit-bypass-emet-cve-2015-2545

 

CVE-2017-0261/CVE-2017-0262

https://www.fireeye.com/blog/threat-research/2017/05/eps-processing-zero-days.html

https://bbs.pediy.com/thread-261442.htm

 

LoadEps

https://github.com/kcufId/eps-CVE-2017-0261

 

如何调试分析Office EPS漏洞样本?

注:本文由E安全编译报道,转载请注原文地址 

https://www.easyaq.com

推荐阅读:


▼点击“阅读原文” 查看更多精彩内容


如何调试分析Office EPS漏洞样本?

喜欢记得打赏小E哦!

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: