1.背景
最近收到了一个带word附件的垃圾邮件。office附件基本也玩不出什么花来,一般就是带宏吐PE。所以我平时对这种邮件看都不看就直接删掉了,但是这两天正好闲的蛋疼,就检查下看看有没有什么新姿势。
该word附件名为invoice.doc。打开发现只有如下内容,说该文件是被保护的文档,只有点击“Enable Editing” (允许编辑) 和”enable content” (启用内容)后才能显示正真的内容。
当然,如果点了“启用内容”的话,那就启用宏了,运行宏命令从而让用户电脑被感染。
从截屏上看,这个附件和freebuf前不久的另一文,《PowerWare:勒索软件如何温柔地借刀杀人》, (http://www.freebuf.com/articles/system/101464.html)里介绍的PowerWare是一模一样的。可是,近一步的分析发现他们用的是完全不同的技术。
2.第一阶段:借助RTF文件吐出PE
先用 oledump.py 列出该文档包含的所有数据流。 结果第8和9行显示该行有VBA模块。另外,值得注意的是,12行的数据流虽然没有VBA模块,但是它的内容却长达76.9k。对于就这点内容的文档而言,也太可疑了吧。
remnux@remnux:~/Downloads$ oledump.py -v invoice.doc
1: 114 '\x01CompObj'
2: 284 '\x05DocumentSummaryInformation'
3: 404 '\x05SummaryInformation'
4: 8494 '1Table'
5: 17159 'Data'
6: 483 'Macros/PROJECT'
7: 65 'Macros/PROJECTwm'
8: M 1726 'Macros/VBA/Module1'
9: M 4059 'Macros/VBA/ThisDocument'
10: 2998 'Macros/VBA/_VBA_PROJECT'
11: 563 'Macros/VBA/dir'
12: 76998 'ObjectPool/_1522685681/\x01Ole10Native'
13: 6 'ObjectPool/_1522685681/\x03ObjInfo'
14: 4142 'WordDocument'
于是导出数据流8,9里的VBA代码开始分析,然而代码中的变量名和函数名都被混淆过了。读起来有点麻烦,好在代码不是太长,从AutoOpen()开始debug两遍,基本就明白了,主要有以下3个步骤。
1.用ActiveDocument.SaveAs将当前打开的word文档另存为两个RTF文件,名为“fhew.rtf” and “hrbs.rtf”。文件保存路径是在%TEMP%路径。
2.用CreateObject(“Word.Application”) and Document.Open打开 “fhew.rtf”。
3.在%TEMP%路径下运行一个名为“t2.tmp” 的程序 (Shell(“t2.tmp”,0))
如此看来,“t2.tmp”是个恶意PE文件,该word文档的目的就是将其释放并执行。然而宏代码有执行“t2.tmp” 的部分,却没有释放“t2.tmp” 的部分。那么它是怎么被释放的呢?
考虑到前面的那个奇怪的12号数据流,很可能是一个内嵌的PE文件。试着在里面找找PE签名
(“MZ.”) 果然。。。
remnux@remnux:~/Downloads$ oledump.py -v -s 12 -x invoice.doc | grep "4D 5A 90"
5C 74 32 2E 74 6D 70 00 00 2C 01 00 4D 5A 90 00
把12号数据流dump出来用HexViewer看看,发现该PE以OLE对象的形式嵌在该数据流里。 “0200” 是 OLE 数据头签名,而“00000300” 表示的是该对象是个嵌入式对象。从截图里,你还能看到原始路径,文件名信息等等。
这下就清楚了,攻击者利用RTF会释放临时文件的特性来释放“t2.tmp”。因为一个RTF文件被打开时,该RTF文件所包含的OLE对象将会被自动释放至用户的%TEMP%文件夹下,并保留其原始的文件名。这么做原本的目的是优化性能,比如OLE对象重用,可是也可以被攻击者所利用。攻击者可以通过ActiveX控件包含很容易的把自己的恶意PE嵌入到Doc文件中,并且加上一段宏代码。
当用户打开该恶意Doc文件时, 有5个步骤。
1.宏代码启动
2.宏代码把该Doc文档另存为RTF文档
3.宏代码打开RTF文档
4.作为一个OLE对象,RTF内嵌的恶意PE被自动释放到%TEMP%文件夹下
5.宏代码执行刚释放的恶意PE
3.第二阶段:进程挖空,偷梁换柱
下面就该来分析这个恶意PE文件了,PEiD没有检测出任何已知壳。然而 .rdata 段的熵值高达 7.7,说明了 .rdata 里有大量的随机数据。这些随机数据很可能是加密过的指令,在运行时才会被解开。导入表里面也没有看到什么特别可疑的API , 除了调用一些反调试函数,比如 SetUnhandledExcetionFiler, IsDebugPresent, 等。