攻击者可以使用这种方法用良性代码或随机代码,隐藏恶意的源代码。通过VBA stomping,当你查看宏代码,以为没有恶意代码而启动宏的时候,就会运行攻击者恶意的源代码了
0x00 什么是VBA stomping?
VBA stomping 是指破坏 Microsoft Office 文档中的 VBA 源代码,只在文档文件中留下称为 p-code 的宏代码的编译版本。攻击者可以通过良性代码或随机字节,覆盖VBA源代码位置,同时通过保留先前编译的恶意p-code,隐藏恶意VBA代码。
0x01 实现方式
实现VBA stomping有两种方式,一种是手动修改,一种是通过工具Evil Clippy。
手动修改
-
测试所需环境
- Windows 10
- Office2016
- 解压缩软件
- 十六进制编辑器
创建宏
新建Excel文件,创建宏,可以通过点击视图-->宏-->查看宏-->输入宏名,创建
也可以通过文件-->选项-->自定义功能区-->勾选开发工具--确定
然后点击开发工具-->Visual Basic创建宏
编辑宏代码
这里我双击的Sheet1,然后编辑宏代码,实现弹窗显示ABC
Sub test()
MsgBox "ABC"
End Sub
代码编辑完成后,然后保存,这个时候如果提示“无法在未启用宏的工作簿中保存以下功能”
点击否,会弹出另存文件的框,将保存类型选择为“Excel启用宏的工作簿”,点击保存即可
运行宏代码,测试下
VBA stomping
选中刚创建的Excel文件,右键选择压缩软件,将该文件解压缩
打开开解压缩后的文件夹,找到xl文件下的vbaProject.bin。
PS:这个vbaProject.bin是默认文件名,但是可以重命名。
将文件用十六进制编辑器打开,找到源代码。
将ABC改成XYZ并保存。注意:修改代码的时候,点击需修改的内容,比如A,然后输入新的内容就行,会自动覆盖掉ABC
然后选中我们的Excel文件,右键选择压缩软件,打开压缩包
进入xl文件夹,用修改后的vbaProject.bin将文件进行替换
替换完成后,打开Excel文件,显示“宏已被禁用,启动内容”,注意:这个时候先别点启用内容,先去看看宏代码
点击开发工具-->Visual Basic,可以看到原来的MsgBox "ABC"
变成了MsgBox "XYZ"
这个时候我们再启用宏,运行宏代码,结果弹出来的是ABC
再打开宏代码进行查看,又变成了MsgBox "ABC"
为什么会这样?
这是因为存储在文档中的 p-code就是实际执行的代码,只要它与系统上当前的 VBA 版本兼容。而宏编辑器在未启用内容前显示的是解压缩的VBA源代码,在启用内容后,显示的不是解压缩的 VBA 源代码,而是反编译的p-code。
有一个需要注意的点:只能使用用于创建文档的相同 VBA 版本来执行 VBA Stomping 的恶意文档。
因为在不同版本的 Word(使用不同的 VBA 版本)中打开文档, p-code将无法重用,所以会强制将 VBA 源代码解压缩并重新编译为p-code。可以理解为:你将原有的vbaProject.bin文件中的MsgBox "ABC"
修改成MsgBox "XYZ"
并替换后,此时你VBA的源代码是MsgBox "XYZ"
,p-code是编译后的MsgBox "ABC"
。但用不同版本的VBA打开,就会将VBA 源代码解压缩并重新编译为p-code,所以会将你VBA的源代码中MsgBox "XYZ"
重新编译成p-code,那么你再启动宏,运行的是p-code,也就是重新编译后的MsgBox "XYZ"
。
因此,攻击者生成恶意文档之前,会对目标进行侦察,来确定要使用的适当 Office 版本或通过生成具有多个 Office 版本的恶意文档并将它们喷洒到目标来解决此限制。
Evil Clippy
下载工具
下载链接:
生成可执行文件
下载后解压缩,使用VS打开该文件夹
使用VS打开文件夹后,选中并右键-->在终端中打开,打开开发者窗口
在开发者窗口中输入命令,生成可执行文件
csc /reference:OpenMcdf.dll,System.IO.Compression.FileSystem.dll /out:EvilClippy.exe *.cs
在窗口中输入.\EvilClippy -h
,就可以查看参数信息
VBA stomping
创建一个xlsm文件(也就是上述提到的,启动宏的工作簿),写上宏代码MsgBox "ABC"
;接着创建一个vba文件,写上宏代码MsgBox "XYZ"
在开发者窗口中使用工具EvilClippy.exe执行命令,将会生成VBA stomping后的1_EvilClippy.xlsm文件
PS:以下命令根据自己的文件路径来,比如EvilClippy.exe在test文件夹的上级目录,所以我这里写成..\EvilClippy
. ..\EvilClippy -s abc.vba 1.xlsm
打开生成的1_EvilClippy.xlsm文件,同样的先不要启用内容
查看宏代码,显示的是MsgBox "XYZ"
然后我们再运行宏看看,发现弹出的却是ABC
此时再查看宏代码,也变成了MsgBox "ABC"
0x02 总结
攻击者可以使用这种方法用良性代码或随机代码,隐藏恶意的源代码。通过VBA stomping,当你查看宏代码,发现没有恶意代码而启动宏的时候,就会运行攻击者恶意的源代码了。
- 本文作者: 鹿柴
- 本文来源: 奇安信攻防社区
- 原文链接: https://forum.butian.net/share/1570
- 版权声明: 除特别声明外,本文各项权利归原文作者和发表平台所有。转载请注明出处!