Eden loader 是一个基于 Crystal Palace 构建的 PoC UDRL(用户自定义反射加载器),适用于 Cobalt Strike。它结合了 Raphael Mudge 的 页面流式技术 与模块化调用门(目前是 Sleepmask-VS Draugr callgate BOF 的 PIC 版本)。
Eden loader 的目标是:
更多关于 Eden loader 的信息,请参阅配套 博客。
注意: Eden 的目的是展示使用 Crystal Palace 组合不同“执行单元”(即能力)以创建自定义加载器的理念。它并非旨在成为一个功能完备的“规避型”加载器,因此设计上刻意缺少一些基本的 OPSEC 特性。例如,它使用 RWX 内存,并且不 跟踪/掩码 Beacon 的堆内存(因此容易受到诸如 此 的 YARA 签名影响)。
注意: 本快速开始指南假设您已 下载/构建 Crystal Palace,并完成了以下 步骤 以配置您的开发环境。
stage {
set sleep_mask "false";
}
WSL 终端,构建 Eden loader:make clean; make。crystalpalace.jar 复制到您的 Cobalt Strike 客户端目录。eden.cna 加载到 Cobalt Strike 客户端中。[14:55:55] [*] Generating Payload: HTTP -- Type: HTTP -- Arch: x64 -- Exit Function: Thread -- System Call: None -- HTTP Library: wininet
[14:55:56] [EDEN] Parsing C:\Users\wb\Desktop\eden\eden.spec...
[14:55:56] [EDEN] Applying eden ldr spec...
[14:55:56] [EDEN] Payload Size: 387060 bytes
[14:55:56] [*] Using user modified reflective DLL! DLLName=resources/beacon.x64.rl0k.dll Arch=x64
注意: Eden 支持 HTTP(S)、DNS 和 Pivot Beacon。
Crystal Palace 在发布时的一个限制是当前仅支持使用 mingw 构建的目标文件。如果您尝试使用 MSVC 或 Clang 构建的 COFF,通常会遇到重定位错误。这可能会令人沮丧,因为 mingw 不直接支持 pdb 文件,因此在编写复杂的 Windows 技术时很难进行调试。但是,您可以在 Makefile 中添加 -g 选项,以在可执行构建中嵌入调试信息。这使得可以在 WinDbg 中单步调试代码。有关此过程的更多信息,建议阅读 Rastamouse 的以下 博客。
本仓库默认使用上述方法构建 Draugr 的调试版本(draugr.x64.exe)和页面流式代码(guardexec.x64.exe)。Draugr 调试版本没有依赖项,因此可直接构建,但如果您希望单步调试页面流式/IAT 挂钩代码,则需要按照以下步骤操作:
1. 导出不带加载器的 Beacon:
debug/export_beacon_with_no_ldr.cna 加载到 CS 客户端中,并将无阶段原始 x64 (HTTP) Beacon 导出到 /eden/debug/ 目录。这将导出一个不带反射加载器的 Beacon DLL,我们可以用它来模拟 guardexec 入口点。$ xxd -i ./beacon_x64.bin > debug_beacon.h2. 从 Crystal Palace 导出 Draugr PIC 存根:
$ ./piclink /<path>/eden/debug/draugr.spec x64 /<path>/eden/debug/draugr.bin 从 WSL 运行 Crystal Palace。这将使用 Crystal Palace 仅输出 Draugr PIC 存根,可用于模拟 guardexec 入口点。$ xxd -i ./draugr.bin > debug_druagr.h3. 在 WinDbg 中开始调试
make clean;makeWinDbg,选择启动可执行文件(/eden/bin/draugr.exe 或 /eden/bin/guardexec.exe)Open source file,然后选择相关的 .c 文件(例如,调试页面流式代码时选择 guardexec.c)。注意: 加载器没有调试可执行文件,因为目前没有明确的方法让 Crystal Palace 为加密的 DLL 及其密钥等导出调试有效载荷。因此,传入模拟的“加密”PIC 缓冲区变得不简单。
Eden loader 主要用于通过组合不同的**“能力”**来演示 Crystal Palace 的强大之处,从而创建一种新颖的加载器。这个想法可以比本仓库中的实现走得更远(例如,一个完全通过 COFF 模块(防护栏、调用门、睡眠混淆等)自定义的“静态”PIC 加载器)。
Eden loader 明确使用 Draugr 的 PIC 版本,以便可以欺骗 Beacon 生命周期的每次调用(即反射加载过程中使用的 VirtualAlloc / LoadLibrary 调用)。在某些情况下,这可能有些过度(例如,EDR 不关心对 LoadLibrary 等的无后盾调用),此时可修改为使用更简单的 Draugr 的 PICO(==“BOF”)版本。
Eden loader 有意保持“调用门”与加载器解耦。这是出于模块化的设计考虑,因为您可以换入换出 BeaconGate/调用门 BOF。因此,Draugr 调用门代码完全包含在其自己的目标文件中。通过将其替换为另一个“能力”,可以显著改变 Eden 的 TTPs。
Eden loader 有意未使用 Crystal Palace 的较新功能。例如,mergelib 可以与 Crystal Palace 的共享库 LibTCG 一起使用。但是,请注意这会导致失去调试代码的能力。
页面流式技术可能会影响某些命令的 Beacon 性能(例如,默认情况下,配置 4 个可见页面时,进程注入将花费 ~1 分钟(!) )。您可以在 guardexec.h 中增加 #define MAXVISIBLE 以解决大多数问题(Eden 的默认值为 6)。一般来说,页面流式技术可能会导致进程注入技术出现问题(尤其是那些依赖时间的技术)。
Eden loader 使用 Crystal Palace (https://tradecraftgarden.org/crystalpalace.html) 构建,并利用了以下项目:
最后,感谢 @rastamouse 关于 Crystal Palace 的 博客 在开发过程中提供的帮助。