_______ ______ _____ _ _ ____ _
| ____\ \/ / ___| ____| | _ __ | |_| _ \ ___ _ __ _ _| |_
| _| \ / | | _| | | | '_ \| __| | | |/ _ \| '_ \| | | | __|
| |___ / \ |___| |___| |___| | | | |_| |_| | (_) | | | | |_| | |_
|_____/_/\_\____|_____|_____|_| |_|\__|____/ \___/|_| |_|\__,_|\__|
作者 @JoeLeonJr (@FortyNorthSec)
EXCELntDonut 是一个 XLM (Excel 4.0) 宏生成器。从 C# 源代码(EXE)开始,最终生成一个可在内存中执行代码的 XLM (Excel 4.0) 宏。XLM (Excel 4.0) 宏可以保存为 .XLS 文件。
chmod +x install.sh
./install.sh
安装了什么?
如果你希望仅将 EXCELntDonut 作为 Python 脚本运行,你需要设置一个包含“pandas”和“donut-shellcode”两个包的虚拟环境。此外,你还需要通过 apt-get 安装 mono-complete,并使用 python3 调用 drive.py 脚本。我们建议直接使用 ./install.sh bash 脚本,但由你决定。
用法:
$ EXCELntDonut -f exe_source.cs -r System.Windows.Forms.dll --sandbox --obfuscate
参数:
(必选)
-f C# 源代码文件的路径(仅限 exe)
-r 编译 C# 代码所需的引用(与在 Linux 上使用 mcs 编译时相同)
(例如: -r 'System.Management')
(可选)
-o 输出文件名
--sandbox
执行基本的沙箱检测。随着新方法的发现,此项会更新。
--obfuscate
执行基本的宏混淆。
你提供一个包含有效负载的 C# 文件(例如一个包含 Main 方法、可执行 Cobalt Strike 信标有效负载的 EXE)。该 C# 文件使用 MCS 编译成两个 .NET 程序集:x86 和 x64。编译后,优秀的工具 Donut(用于 x86)和 CLRvoyance(用于 x64)将每个程序集转换为位置无关的 shellcode。接着,所有空字节被移除,因为 XLM (Excel 4.0) 宏对空字节不友好,并且有效负载被分割成每行不超过 255 个字符(x86)或 10 个字符(x64)。
一旦 shellcode 准备好,它会与基本的进程注入函数(VirtualAlloc、WriteProcessMemory 和 CreateThread)以及一个架构检查函数(用于确定在目标系统上运行哪个有效负载 x86 或 x64)合并。如果你选择执行沙箱检测或基本混淆,则这些函数会更新你的宏。最后,输出结果放入一个 CSV 文件(保存为 .txt)。
获得 EXCELntDonut 的输出文件后,在文本编辑器中打开输出文件,并复制全部内容(Ctrl-A, Ctrl-C)。在 Windows 虚拟机中打开 Excel,右键点击“Sheet 1”,选择“插入”。选择“MS Excel 4.0 宏”。转到单元格 A1,粘贴 EXCELntDonut 的输出。所有数据很可能会粘贴到一列中。数据以分号 “;” 分隔。转到“数据”选项卡,点击“分列”。选择“分隔符号”,在下一步中选择“分号”,然后点击“完成”。宏将分配到相应的列和行。
(注意 - 如果你选择了“--obfuscate”参数,你需要水平滚动相当远才能找到实际代码,因为混淆逻辑的一部分会将宏移动到工作表的随机区域)。
此时我们建议做两件事:
保存文件 (.xls) 并尝试打开。它应该会自动执行你的有效负载。
这些检测基于实际威胁攻击者在其恶意软件中使用的技术。
=FORMULA(D3&D23&D54&D23&D44,E45)
FORMULA 函数允许我们将一个公式放置到另一个单元格中,稍后可执行。因此,在这种情况下,我们将进程注入指令放入,然后使用 FORMULA 函数将实际函数放入另一个单元格执行。这避免了防御者在静态分析中看到诸如“VirtualAlloc”之类的内容。
root@excelntdonut-test:/opt# EXCELntDonut -f test.cs
_______ ______ _____ _ _ ____ _
| ____\ \/ / ___| ____| | _ __ | |_| _ \ ___ _ __ _ _| |_
| _| \ / | | _| | | | '_ \| __| | | |/ _ \| '_ \| | | | __|
| |___ / \ |___| |___| |___| | | | |_| |_| | (_) | | | | |_| | |_
|_____/_/\_\____|_____|_____|_| |_|\__|____/ \___/|_| |_|\__,_|\__|
作者 @JoeLeonJr (@FortyNorthSec)
[i] 正在生成 x86 .NET 程序集。
警告 CS8001: 无法解析 SDK 路径
test.cs(2,14): 错误 CS0234: 命名空间“System”中不存在类型或命名空间名称“Management”。是否缺少程序集引用?
此错误很可能意味着你在使用 mono 编译时缺少引用程序集。要修复,只需将提到的命名空间通过 -r 参数传入。在这个案例中,我们在命令行中添加 -r 'System.Management'。新命令为:
root@excelntdonut-test:/opt# EXCELntDonut -f test.cs -r 'System.Management'
root@excelntdonut-test:/opt# EXCELntDonut -f test.cs -r System.Management
_______ ______ _____ _ _ ____ _
| ____\ \/ / ___| ____| | _ __ | |_| _ \ ___ _ __ _ _| |_
| _| \ / | | _| | | | '_ \| __| | | |/ _ \| '_ \| | | | __|
| |___ / \ |___| |___| |___| | | | |_| |_| | (_) | | | | |_| | |_
|_____/_/\_\____|_____|_____|_| |_|\__|____/ \___/|_| |_|\__,_|\__|
作者 @JoeLeonJr (@FortyNorthSec)
[i] 正在生成 x86 .NET 程序集。
警告 CS8001: 无法解析 SDK 路径
错误 CS0006: 找不到元数据文件“System.Management”
[x] 使用 MCS 生成 x86 .NET 程序集时出错。请参阅上面的错误信息。
此错误应该不会出现,除非你未使用 install.sh bash 脚本运行 EXCELntDonut。在这种情况下,你需要手动安装 mono-complete。这将下载相关依赖项。你可以使用 apt 安装,如下所示:
apt-get install mono-complete
root@kali:~/Desktop# EXCELntDonut -f test.cs
_______ ______ _____ _ _ ____ _
| ____\ \/ / ___| ____| | _ __ | |_| _ \ ___ _ __ _ _| |_
| _| \ / | | _| | | | '_ \| __| | | |/ _ \| '_ \| | | | __|
| |___ / \ |___| |___| |___| | | | |_| |_| | (_) | | | | |_| | |_
|_____/_/\_\____|_____|_____|_| |_|\__|____/ \___/|_| |_|\__,_|\__|
作者 @JoeLeonJr (@FortyNorthSec)
[i] 正在生成 x86 .NET 程序集。
错误 CS5001: 程序“_excelntdonut_GJAoNuVPMcX.exe”不包含适合入口点的静态“Main”方法
[x] 使用 MCS 生成 x86 .NET 程序集时出错。请参阅上面的错误信息。
目前,EXCELntDonut 只允许包含 Main 函数有效负载的 C# 文件。
以下是 @InQuest 提供的一些 Yara 规则:
查找非常隐藏的工作表
https://github.com/InQuest/yara-rules/blob/master/Excel_Hidden_Macro_Sheet.rule
查找 Auto_Open 字符串
https://github.com/Neo23x0/signature-base/blob/master/yara/general_officemacros.yar
有很多关于使用 OLEDUMP.py 审查 XLM 文件的文章。考虑这篇:
https://clickallthethings.wordpress.com/2020/04/06/covid-19-excel-4-0-macros-and-sandbox-detection/
如果没有 Outflank (@outflanknl) 团队出色的工作,我们甚至不会意识到这个领域。特别感谢 @StanHacked 在本项目中的见解。同样,本项目离不开 Donut(@TheWover 和 @odzhan)以及相关的 Python 库(@byt3bl33d3r)。此外,Accenture 团队创建了 CLRvoyance,解决了我们无法用 Donut + XLM 4.0 宏解决的某些 x64 问题。最后,感谢 Cybereason 的 Philip Tsukerman 在使 XLM 宏与 64 位版 Excel 兼容方面所做的出色研究。
我们对本工具的滥用不承担任何责任。本工具是为教育和授权测试目的而生成的,用于演示如何使用 XLM (Excel 4.0) 宏将 C# 源代码注入内存。本项目的最终目标是 (1) 为红队提供另一种钓鱼有效负载选项,以模拟实际对手当前使用的技术,以及 (2) 为防御者提供构建分析方法和缓解措施的参考框架。如果我们不能快速生成这类有效负载的工具,我们认为防御者将无法充分应对实际威胁。请负责任地使用。
请参阅此文件夹中的许可证文件。请注意,本工具整合了另外两个开源工具:Donut 和 CLRvoyance。