宏病毒
FB招聘站
分类阅读
专栏
公开课
FIT 2019
企业服务
用户服务
搜索
投稿
登录
注册
一个“特别”的Word宏病毒深度分析 nickchang2016-05-03现金奖励共394344人围观 ,发现 13 个不明物体 系统安全网络安全
* 原创作者:nickchang
1.背景
最近收到了一个带word附件的垃圾邮件。office附件基本也玩不出什么花来,一般就是带宏吐PE。所以我平时对这种邮件看都不看就直接删掉了,但是这两天正好闲的蛋疼,就检查下看看有没有什么新姿势。
该word附件名为invoice.doc。打开发现只有如下内容,说该文件是被保护的文档,只有点击“Enable Editing” (允许编辑) 和”enable content” (启用内容)后才能显示正真的内容。
图片1.png
当然,如果点了“启用内容”的话,那就启用宏了,运行宏命令从而让用户电脑被感染。
图片2.png
从截屏上看,这个附件和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))
图片3.png
如此看来,“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” 表示的是该对象是个嵌入式对象。从截图里,你还能看到原始路径,文件名信息等等。
图片4.png
这下就清楚了,攻击者利用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, 等。
图片5.png
果然,反调试完以后,该程序马上开了一片有 RWE 权限的内存区 (从 009F0000开始). 然后载入crypt32.dll解密,并且将解密的代码写入这片内存,接着让EIP跳入执行。
图片6.png
.text段里面的一部分旧代码也会被替换掉。 新代码里面插入了大量的垃圾数据用来阻止分析人员分析。当然,EIP不会真的跳到垃圾数据里面,但是作者用了大量的”CALL EAX”之类的指令。由于反编译器无法在运行前预知这一刻EAX的值,也就无法知道EIP会跳到哪里去,下一段指令究竟会从哪里开始。导致反编译试图把垃圾数据和正常指令混在一起一并翻译,结果往往产生了一段完全诡异的指令。这给我们的debug,特别是单步运行带来麻烦。
以下是一个例子
CALL EAX 此时 EAX 为 4045E7, 所以EIP会跳转到4045E7
图片7.png
原本4045E7的内容(该PE刚刚被调入内存的时候)
图片8.png
4045E7 的新内容 (EIP 从 A08903跳转过来的时候)
图片9.png
注意新内容里,有些指令前有问号,说明ollyDBG无法理解这些指令,其实它们是垃圾数据。有时单步运行会出错,这时必须修改debugging选项,允许”单步运行未知指令”。
在新指令和垃圾数据的空间里跳转,穿越n次以后, 它终于来到主题: 创建一个explorer.exe 进程。注意创建的时候,该explorer.exe进程被设为挂起状态。
图片10.png
图片11.png
然后它使用进程挖空技术,把该进程里的数据释放掉然后替换恶意代码。进程挖空的主要目的是伪装。比如当用户用进程管理器查看进程的时候,有多少非专业用户会怀疑那些常见的系统进程呢?比如explore.exe和svchost.exe。尤其是这些进程都运行在正确的目录下,windows 或者system32。殊不知我们看到的只是一个进程的”壳子”而已,里面的”心”早就被换掉了。
我们可以看见它先用ZwQueryInformationProcess()查询了explore.exe进程的信息,特别是explore.exe进程PEB的基地址。
图片12.png
接下来,它依次调用 ZwCreateSection(), ZwMapViewOfSection() 和 ZwUnmapViewOfSection()在 explore.exe进程中创建新段,把恶意代码映射到新创建的段中。
图片13.png
最后用ResumeThread让挂起的进程继续执行。
图片14.png
比较一下真假explore.exe。 注意,左边是假的,右边是真的。
图片15.png
图片16.png
图片17.png
接下来的任务就是继续debug这个假的explore.exe进程了。可是问题来了,单步执行resumeThead()以后,explore.exe进程如同流星一样在眼前一闪而过,根本没有时间把进程加到ollydbg里。而explore.exe里的恶意代码是动态生成,映射的,没有本地文件,所以也不能以打开PE文件的形式debug。有两种方法可以解决这个问题。
1.把进程代码dump到本地,然后重建IAT。再用OllyDbg调入。
2.直接修改进程的入口点,改成”CC” (也就是INT3)。然后把OllyDbg设置成即时(just-in-time)调试器,(它会挂接出错程序,并停在程序产生异常的地方)。接下来可以单步resumeThead()。这时explore.exe进程会在入口点执行INT3指令,导致一个异常,系统就会捕捉这个异常从而停在断点处,并弹出一个错误窗口,这时只要我们选择debug,Ollybug便会启动并将其载入。当然我们还需要将断点处的CC指令恢复成原来的指令。然后就可以调试了。
00.png
000.png
如上图所式,我使用了第二种方法,INT3中断。
explorer.exe进程的第一步是毁尸灭迹,删除其父进程的文件以起到隐藏的目的。
图片18.png
它还会创建一个随机名的事件(event),用来和它的子进程通信。
图片19.png
最后它用类似的的进程挖空技术又创建一个假的 “svchost.exe”进程。
图片20.png
图片21.png
svchost.exe进程会用事件和其父进程,exeplore.exe,通信。
图片22.png
它会准备以下域名,发出DNS请求,并且测试连接。
图片23.png
图片24.png
查询注册表和硬盘目录收集系统信息
图片25.png
然后把搜集的信息放在一个字符串里,比如UUID, 操作系统编号,等等。这个字符串被加密了以后,以POST方法发到 C&C 服务器。这些数据每5秒钟发一次,有点像心跳包。
图片26.png
图片27.png
目前 C&C 服务器还可以连接, 但是请求 /h/gate.php 的时候总是返回 404。此次debug就到此为止了。 值得一提的是在debug过程中,该恶意软件没有修改注册表,也没有在系统关键位置比如windows 和system32目录下留下任何文件。只要我们把那个假冒的svchost.exe 结束掉,系统基本就安全了。
4.总结
总的来说,这个恶意软件还是用了不少已知技术,比如利用打开嵌入OLE对象的RTF文件吐出PE文件,进程自己加载新代码运行,把代码和垃圾数据混在一起,以及进程挖空技术。虽然都不是新技术,但是还是蛮有效的。
参考资料
【1】Debugging Hollow Processes, http://hooked-on-mnemonics.blogspot.se/2013/01/debugging-hollow-processes.html
【2】PowerWare:勒索软件如何温柔地借刀杀人http://www.freebuf.com/articles/system/101464.html
【3】Using RTF Files as a Delivery Vector for Malware, http://phishme.com/rtf-malware-delivery/
* 作者:nickchang,本文属FreeBuf原创奖励计划文章,未经许可禁止转载
nickchang
nickchang
10 篇文章
等级: 4级
||
上一篇:小心!别在Github上泄露了你Slack的token下一篇:互联网核心组件NTPD被曝多个漏洞,可致系统时间无法正常同步
这些评论亮了
nickchang (4级)回复
@ intA
不能过360。。。
忘了放文件hash了,正好你提到了 :)
word文件sha1: 3a81e0b834b112e803f407841fa4fbf90b5f7cd1
360报 virus.office.obfuscated.1
瑞星报 PE:Malware.Generic/QRS!1.9E2D [F]
百度江民金山腾讯 过
PE文件sha1: 6cfc7598e913ba358e6c0dd6dfce6deb61ea1934
360报 HEUR/QVM10.1.Malware.Gen
瑞星 PE:Malware.Generic/QRS!1.9E2D [F]
腾旬 Win32.Trojan.Kryptik.Htvn
百度江民金山 过
以上结果来自世界杀毒网 virustotal
)7(亮了
ling林 回复
能提供下这个word样本的下载地址吗,想跟着分析一下。
)6(亮了
a小诺哥哥 回复
啊?
)6(亮了
Dailodik 回复
写得很好啊!不过完全没看懂
)6(亮了
冰河星晨 回复
汗,svchost要一个一个对比,我还以为宏病毒咋灭绝了
)6(亮了
发表评论已有 13 条评论
a小诺哥哥 2016-05-03回复 1楼
啊?
亮了(6)
Dailodik 2016-05-03回复 2楼
写得很好啊!不过完全没看懂
亮了(6)
冰河星晨 2016-05-03回复 3楼
汗,svchost要一个一个对比,我还以为宏病毒咋灭绝了
亮了(6)
李铁军 2016-05-03回复 4楼
转发微博
亮了(4)
intA 2016-05-03回复 5楼
这个能过360吗
亮了(5)
nickchang (4级) 2016-05-03回复
@ intA
不能过360。。。
忘了放文件hash了,正好你提到了 :)
word文件sha1: 3a81e0b834b112e803f407841fa4fbf90b5f7cd1
360报 virus.office.obfuscated.1
瑞星报 PE:Malware.Generic/QRS!1.9E2D [F]
百度江民金山腾讯 过
PE文件sha1: 6cfc7598e913ba358e6c0dd6dfce6deb61ea1934
360报 HEUR/QVM10.1.Malware.Gen
瑞星 PE:Malware.Generic/QRS!1.9E2D [F]
腾旬 Win32.Trojan.Kryptik.Htvn
百度江民金山 过
以上结果来自世界杀毒网 virustotal
亮了(7)
nickchang (4级) 2016-05-03回复
@ intA https://www.virustotal.com/en/file/28aa4befb3975daf2f48ec2427370773506d0dee9d1f07a7d8c8b0b3ffde12dd/analysis/1461218824/
亮了(6)
甲鱼 (2级) 2016-05-03回复 6楼
咦。。。这个样本费那么大劲最后就搜集那点儿信息就完事儿了?
亮了(5)
HundredBai (1级) 2016-05-04回复 7楼
话说没发现特别之处。。。利用Office机制“另存为RTF”释放PE的手法已经出现好久了。话说这个做法针对WINXP是无效的(可能也没有人用WINXP了)。
释放的PE是个AGENT,收集点信息,连接远程服务器,后续还是要下马的,后边马和C&C才是关键。但是目前大多数网上流传的都是半死不活的样本了。
分析的挺不错的,就是费劲了点,Office阶段可以用OfficeMalScanner,真的很方便。PE那里脱个壳可以直接IDA看了,也不费劲。楼主太较真了。
亮了(5)
nickchang (4级) 2016-05-04回复
@ HundredBai 谢谢指点,只用OllyDBG的确很容易管中窥豹,不容易看到全局。准备多花点时间学习IDA :) 原来PE也只是个Agent,难怪没有用任何persistent方法。感觉现在分析个malware也挺麻烦的,n个dropper 套了n个downloader,要分析到最后那个还真不容易。有时候C&C挂了就前功尽弃了。
亮了(6)
ling林 2016-05-05回复 8楼
能提供下这个word样本的下载地址吗,想跟着分析一下。
亮了(6)
Kevin 2016-05-06回复 9楼
楼主写的很不错啊,有些名词刚看到还懵了一把
垃圾数据=花指令 进程挖空技术=进程注入(其中一种方式)
soga
亮了(4)
nickchang (4级) 2016-05-09回复
@ Kevin 谢谢更正
亮了(1)
昵称
请输入昵称
必须您当前尚未登录。登陆?注册邮箱
请输入邮箱地址
必须(保密)表情插图
有人回复时邮件通知我
nickchang
nickchang
这家伙太懒,还未填写个人描述!
10
文章数
58
评论数
最近文章
详解Windows Shim的攻防利用
2016.09.12
让子弹多飞一会:论如何优化DDoS
2016.06.20
一个“特别”的Word宏病毒深度分析
2016.05.03
浏览更多
相关阅读
ShadowBrokers方程式工具包浅析,揭秘方程式组织工具包的前世今生安全科普:密码学之碰撞攻击玩出C&C服务器地址隐身的新花样,看看这个恶意软件怎么做的WAP:一款WEB安全检测工具Guile可以用于编写exploit测试代码
特别推荐
关注我们 分享每日精选文章
活动预告
11月
FreeBuf精品公开课·双11学习狂欢节 | 给努力的你打打气
已结束
10月
【16课时-连载中】挖掘CVE不是梦(系列课程2)
已结束
10月
【首节课仅需1元】挖掘CVE不是梦
已结束
9月
【已结束】自炼神兵之自动化批量刷SRC
已结束
FREEBUF免责声明协议条款关于我们加入我们广告及服务寻求报道广告合作联系我们友情链接关注我们
官方微信
新浪微博腾讯微博Twitter赞助商
Copyright © 2018 WWW.FREEBUF.COM All Rights Reserved 沪ICP备13033796号
css.php 正在加载中...0daybank
文章评论