文章总结: erebus是MythicC2框架的初始访问载荷工厂,产品化了加载器、触发器、恶意文档等组件,降低了红队操作门槛。其架构采用wrapper模式,子模块独立,构建模板化。关键实现包括间接syscall后端、环境护栏等。蓝队应关注其拉平攻击门槛的能力,并针对性部署检测。 综合评分: 86 文章分类: 代码审计,红队,安全工具,渗透测试
Erebus 深度技术分析报告
网安之家-CyberHomestead
2026年8月18日 08:00 湖北
在小说阅读器读本章
去阅读
Erebus 深度技术分析报告
对象:
github.com/Whispergate/Erebus(v0.2.0,BSD-2-Clause,Mythic 3.4.13 兼容) 分析基准:main 分支fec02d5(2026-08-14),含全部三个子模块源码 性质:公开红队框架的防御性研究 / 代码审计。所有”攻击”内容均限于授权红队演练场景,并逐条配对检测方案。
0. TL;DR
Erebus 是给 Mythic C2 框架补上”最后一公里”的初始访问(Initial Access)载荷工厂:Mythic 及其 Agent(如 Apollo)产出的是裸 shellcode,而钓鱼投递需要的是”一个看起来无害的文件 + 一条执行链 + 一整套规避”。Erebus 把这条流水线产品化了——C++ 加载器(11 种 Windows 注入、间接 syscall、AMSI/ETW 规避、睡眠混淆、20 项环境护栏)× 约 30 种触发器(LNK/HTA/CHM/ISO/MSIX/VSCode 扩展…)× 恶意文档(Linux 上无 Office 编译 VBA)× 自检生态(YARA 自狩猎、PE 指纹清洗、IOC/ATT&CK 报告)。
一句话:它不是新的恶意软件,而是把过去十年 maldev 社区的公开成果做成了”可点选的工程”。 这既是它的价值,也是蓝队需要了解它的原因——它拉平了”会用”的门槛。
1. 命名寓意:一个自指的历史闭环
这个名字组合是一个精心设计(或至少是会心一笑)的梗:
- • Erebus(厄瑞玻斯):希腊神话中的原始黑暗之神,混沌(Chaos)所生、Nyx(夜)之兄,是”阴阳之间的昏暗过渡地带”的化身——对一款”在受害者与 C2 之间昏暗地带运作的加载器”来说是个贴切的隐喻。
- • 恶意软件史上 Erebus 这个名字出现过两次:2016 年的 Linux 勒索软件(首批大规模 Linux 勒索之一,也感染了韩国主机)、2019 年的 macOS 后门。
- • WhisperGate:2022 年 1 月乌克兰 wartime wiper 事件(微软命名 DEV-0586,GRU 关联)。它是伪装成勒索软件的纯破坏工具,而它 MBR 上显示的勒索信原文正是抄自 2016 年的 Erebus 勒索软件(Kim Zetter 的考证还发现其二级载荷代码复用了 2021 年的 WhiteBlackCrypt)。
所以:org 叫 Whispergate,工具叫 Erebus——”WhisperGate 的勒索信来自 Erebus”,两个名字在恶意软件史上本就是一对。这几乎是作者在向威胁情报分析者眨眼。做威胁研究时,这类命名自我指涉也是快速判断作者文化背景(深度浸泡在恶意软件史中)的信号。
2. 为何诞生:Mythic 生态的结构性缺口
2.1 Mythic 是什么
Mythic(Cody Thomas,2020 年开源)是新一代 C2 框架:Go 服务端 + Docker 容器化,Agent(Apollo、Poseidon、Medusa…)以”Payload Type 容器”形式插拔。它的强项在后渗透:任务分发、协作、代理链、malleable C2 Profile。
2.2 缺口在哪
Mythic 构建产物是裸 implant(EXE/DLL/shellcode/raw)。把它送进目标环境,操作员要自己解决:
- 1. 加载器:shellcode → 带 evasion 的宿主进程;
- 2. 执行链:用户双击什么才会执行?(LNK?宏?ISO 里的伪装文件?)
- 3. 社会工程:诱饵文档、钓鱼页、重定向器;
- 4. 投递自检:这个样本会不会在目标 SIEM 里弹规则?
这些环节每个都有独立的开源工具(Donut、Shellcrypt、各种 injection 仓库),但没有粘合成一条流水线。每次行动都要人肉拼装,”development to deployment time”(README 原话)就是痛点。Erebus 的 README 定位写得很直白:”modern initial access wrapper aimed at decreasing the development to deployment time”。
2.3 时间线
- • 仓库创建:2025-08-18;最新提交:2026-08-14(活跃开发中,一年 253 commits)
- • 版本:0.0.1 → 0.1.0(插件架构重构、跨平台加载器)→ 0.2.0(异步构建、无补丁 AMSI、LOLBAS 触发器、持久化插件、睡眠混淆升级)
- • 关键 commit 轨迹(考古价值):
Initial Commit - shellcrypt copy - Working Mythic wrapper agent→ ClickOnce 清单生成 → MSI 生成器 →Add new injection types, LOLBAS triggers, persistence plugins, sleep obfuscation upgrade→Switched to async calls to prevent container appearing offline during payload build
它填补的位置:在 kill chain 上,Erebus 只覆盖 Reconnaissance 之后、Execution 之前的”武器化 + 投递”两步,C2 及以后全部交还 Mythic 生态。这个克制的产品边界本身就是好的架构判断。
3. 架构与设计审计
3.1 总体拓扑:Mythic Wrapper 模式
Mythic 服务器
├─ Payload_Type/erebus_wrapper/ ← 载荷类型容器(Docker 内跑 Python)
│ └─ agent_code/
│ ├─ Erebus.Loaders/ (子模块) C++ 加载器三平台 + RISC VM 加载器
│ ├─ Erebus.Helper/ (子模块) Windows 组件外部编译器(MSI/CHM/LNK/OneNote/Electron)
│ ├─ shellcrypt/ (子模块) shellcode 混淆管线(压缩→编码→加密)
│ ├─ vba_compiler/ 纯 Python 的 vbaProject.bin 生成器
│ ├─ container/ (iso/msi/7z/clickonce) 容器构建资源
│ └─ templates/ config.hpp / guardrail.hpp / .def / Jinja2 模板
├─ C2_Profiles/ ← 预留(当前 exclude)
└─ documentation-*/ ← 文档容器
三个值得记录的架构决策:
- 1. Wrapper 而非 Agent:
agent_capabilities.json里"mythic": ["wrapper"]——Erebus 不实现 C2 协议,构建时调用 Mythic 里其他 Agent(Apollo 等)生成 shellcode,再进行包装。这让它对任意 Agent 通用。JSON Schema 上它是 Mythic 的标准扩展点,侵入性为零。 - 2. 重资产走子模块:把三个可独立使用的工具(加载器/Helper/Shellcrypt)拆成独立仓库按 commit 锁定。主仓库因此只有 142 个文件、8.3MB,审计面干净;代价是 clone 后必须
--recurse-submodules,否则会得到一个”空壳”。 - 3. 构建模板化:C++ 侧所有可变行为通过
config.hpp的CONFIG_*宏注入(编译期裁剪,#if CONFIG_X == 0的代码根本不进二进制),由 Python 侧用模板渲染生成。这是”每次构建产物都不同”的基础。
3.2 Python 插件系统
erebus/modules/ 约 60 个插件,按类别前缀命名(Mythic UI 里按组呈现,对应 commit “Add Group Names on Build Parameters”):
| 类别 | 插件(部分) | | — | — | | 容器 | iso / vhd / msi / msix / 7z / electron / clickonce | | 触发器 | lnk / hta / chm / msc / cmstp / installutil / regsvr32 / xsl / jscript / bat / desktop / search-ms / url(ClickFix) / qr / html smuggling / svg smuggling / vscode_ext / onenote / dmg / pkg / appbundle / applescript | | 载荷 | donut / officedoc / maldocs / dll_proxy | | 持久化 | com / wmi / launchagent | | 基础设施 | phishing(钓鱼页生成)/ redirector | | 自检 | pe_sanitize / self_hunt / codesigner | | 其他 | loader_config / shellcode_obfuscation |
架构槽点(必须说的实话):虽然叫插件架构,真正的编排核心 erebus/builder.py 有 7056 行——ErebusWrapper(PayloadType) 一个类包办参数收集、模板渲染、编译调度、插件流水线、IOC 收集。插件之间靠文件系统副作用传递产物。对二次开发不友好,但对”作为一个产品跑起来”无碍。另有 agent_capabilities.json 里重复键(os/languages/agent_version 各出现两次,JSON 后键覆盖前键)这类低级毛刺,说明缺 CI 校验。
3.3 一次构建的完整数据流
Mythic UI 选参数(Agent=提供 shellcode 的一方)
↓ builder.py 渲染 templates/config.hpp + guardrail.hpp(编译期宏 = 护栏白名单/注入类型/规避开关)
↓ shellcrypt 管线:compress → encode → encrypt(产出密文数组 + key/nonce,链接进加载器)
↓ MinGW 交叉编译 EXE/DLL/XLL(pe_sanitize 抹指纹)
↓ 可选:Donut 包装 / 签名 / 触发器生成(LNK/CHM/HTA…)/ 容器封装(ISO/MSI/MSIX…双层嵌套)
↓ 可选:Erebus.Helper 在 Windows 上补编译 Office 文档等 Docker 内做不了的组件
↓ self_hunt 产出针对本产物的 YARA/Sigma 规则 + IOC 清单 + ATT&CK 覆盖报告 → 打包回 Mythic
异步化(0.2.0)是为了防长构建期间 Mythic 容器被判定 offline。
4. 源码审计:细节的妙处
这部分逐文件过核心代码,重点记录”写得聪明的地方”。
4.1 间接 syscall 后端(evasion/syscalls.cpp,TartarusGate 变体)
这是全项目最有教学价值的一个文件,注释里写明了它对抗的两类防御:
- 1. 重挂钩竞态:EDR 用 PAGE_GUARD/周期完整性扫描重植 hook,脱钩可能输掉竞态;
- 2. ETW-TI / 内核回调的”syscall 来源检查”:部分内核遥测在 syscall 入口采样用户态返回地址,若
syscall指令不在 ntdll 镜像内(经典直接 syscall 的 RWX shim)立即标记。
实现:
-
• 在 ntdll
.text里扫0F 05 C3(syscall; ret)三字节 gadget——每个 Nt 存根结尾都有,因此 gadget 天然存在于合法镜像内数十处; -
• 从每个目标 Nt 函数存根的
mov eax, imm32前奏提取 SSN;若存根仍被 hook(首字节是E9/FF 25)则拒绝注册、回退——不信任被污染的前奏,这是对”Halos Gate 类邻居推导”的舍弃,换来实现简单; -
• 为每个注册的 syscall 在一页内存里种一个 21 字节 shim:
mov r10, rcx; mov r11, <gadget>; mov eax, <ssn>; jmp r11——寄存器 ABI 原样透传,syscall指令本体只存在于 ntdll 内的 gadget; -
• 两个工程细节很见功力:
-
• shim 页先 RW 写入再翻 RX,翻页失败(ACG 场景,如 Electron/VSCode 扩展宿主进程)时干净地放弃并回退到 PEB 走链解析,而不是返回一个不可执行的指针等崩溃;
-
• 注册表
g_syscalls[]用 API 名哈希 + append-only,只注册 17 个真正需要的 NT 函数,控制暴露面。
** syscall 一览**(这个数组就是加载器的全部特权面):NtProtectVirtualMemory / NtAllocateVirtualMemory / NtWriteVirtualMemory / NtCreateSection / NtMapViewOfSection / NtUnmapViewOfSection / NtFreeVirtualMemory / NtClose / NtWaitForSingleObject / NtCreateTimer / NtSetTimer / NtLockVirtualMemory / NtUnlockVirtualMemory / NtCreateThreadEx / NtOpenProcess / NtCreateMutant / NtQueryPerformanceCounter。
另有 heavens_gate.cpp(WoW64 x86→x64 过渡)与 SysWhispers3(sw3)两个备选后端,GetSyscallStub() 统一分发,解析不到就退回 GetProcAddressC(PEB 走链哈希解析)。
4.2 AMSI 三型(evasion/amsi_bypass.cpp)
| 型 | 方法 | 妙处 |
| — | — | — |
| 1 | 经典 AmsiScanBuffer 打补丁 | — |
| 2 | 补丁 AmsiOpenSession → xor eax,eax; ret | 返回 S_OK 但输出指针为 NULL,后续 Scan 拿 E_INVALIDARG;3 字节即够 |
| 3 | 无补丁型 :GetProcessHeaps+HeapWalk 遍历所有堆,找首 DWORD == 'AMSI'(0x49534D41) 的块,把签名字段清零 | 不改任何代码页,只做数据破坏——代码完整性监控全程无感;'AMSI' 字面量用单字符拼接避免落 .rdata |
统一 OPSEC:模块/导出名全部哈希解析、补丁字节数组 XOR 编码到栈上解码、翻页走 NtProtectVirtualMemory 而非 VirtualProtect。
4.3 睡眠混淆四模式(evasion/sleep_obfuscation.cpp)
注释开头就点名对抗三类沙箱手段,设计成”注入前驻留(pre-injection dwell)”:
- 1. 定时器型:不用
Sleep/NtDelayExecution(沙箱会快进),而是NtCreateTimer+NtSetTimer+NtWaitForSingleObject走真实墙钟内核定时器; - 2. Ekko-lite 型:驻留窗口内对自身 PE 的所有非 .text 段(含藏着加密 shellcode 的 .rdata)整体 XOR——内存扫描器在睡眠窗口抓到的是密文。关键工程点写在注释里:NT 函数指针必须先解析到栈上,因为 .idata 被 XOR 后任何走 IAT 的调用都会 AV,而 shim 地址在 PE 段之外不受影响;
- 3. 模拟器耗尽型(最有戏剧性):Fibonacci 燃烧 ~50 万步(故意写成分支密集的逻辑,模拟器昂贵、真机廉价)+
NtClose(非法句柄)十万次(模拟器全额付 dispatch 开销,真机几个周期短路)+ 4KB 页粒度摸 100MB 内存再释放——三连击拖垮仿真引擎的时间预算; - 4. 混合型。
抖动种子取自 NtQueryPerformanceCounter,注释还标了 [MALLEABLE]:若目标环境监控该 syscall,操作员可换熵源。
4.4 编排入口(main.cpp)里的冷细节
- • 单实例互斥量:名字
Global\ErebusLoader在 .rdata 里是 XOR 0x5F 编码的字节数组,运行时解码进栈上 WCHAR; - • 护栏失败 → 打开诱饵文件再退出(
ShellExecuteA(decoy)):在分析者机器和研究受害者视角里都呈现为”一个坏文件”,而非”一个检测到沙箱的加载器”; - •
NtLockVirtualMemory钉页:解密后的 shellcode 暂存缓冲区被钉在工作集,全程不落页面文件——防内存取证从 pagefile carve。注释明说”配额拒绝也没关系,只是接受分页风险”(best-effort 的诚实); - • 注入完成后
SecureZeroMemory清洗暂存区再释放; - • DLL 出口设计:
DllMain里用NtCreateThreadEx(syscall 后端优先)拉起工作线程避免加载器死锁,导出DllRegisterServer并在其中WaitForSingleObject阻塞 30 秒——专门伺候regsvr32 /s payload.dll这条 LOLBAS 链,防止宿主在注入完成前拆进程; - • XLL 出口:
xlAutoOpen同步执行(Excel 加载加载项后回调),配套xll_file_ingestor把内嵌诱饵文件丢到 %TEMP% 并打开——受害者看到”文档”,加载器在跑; - • shellcrypt 管线反转:构建期 压缩→编码→加密,加载期 解密(带 nonce 的 IV)→ 解码(Base64/ASCII85/ALPHA32/WORDS256)→ 解压(LZNT1/RLE)。密钥拷贝到栈上用完
SecureZeroMemory; - • PoolParty 目标选择:不只是按进程名找 PID,还用
ProcessHasThreadPool(探测 IoCompletion 句柄)确认目标有线程池,逐个尝试最多 3 轮——把”注入失败崩掉无辜进程”的概率压低。
4.5 注入矩阵(Windows 11 种)
| 技术 | 核心 NT 调用链 | 出处谱系 |
| — | — | — |
| Classic remote (CreateThread) | NtAllocate → NtWrite → NtCreateThreadEx | 史前 |
| EarlyCascade(Early Bird APC) | 挂起进程 → NtQueueApcThread → NtResumeThread | 2024 |
| NtQueueApcThread(线程 APC) | 同上,目标为既有线程 | — |
| NtMapViewOfSection | NtCreateSection(双进程) → NtMapViewOfSection(远端 RWX→RX) → APC/线程 | 经典 section 注入 |
| Process Hollow | 挂起目标 → 卸载镜像 → NtMapViewOfSection 写新 PE → 设置上下文 → 恢复 | ~2010s |
| TXF Hollow | 事务文件写 + 映射(NtCreateTransaction 系) | 2021+ |
| Module Stomping | LoadLibrary 合法 DLL → 覆写 .text | 2020 前后 |
| Function Stomping | 解析合法函数 → 覆写执行 | — |
| KernelCallbackTable | 改目标进程 KCT 里某回调指针指向 shellcode,触发消息循环执行 | 2022(Bill Demirkapi 前身可溯 Win32 回调滥用) |
| PoolParty (TP Worker) | 线程池 worker 起点改写 | SafeBreach 2023 |
| PoolParty (Job APC) | Job 对象 APC 投递 | 同上 |
| CreateFiber(自注入) | ConvertThreadToFiber → CreateFiber | — |
Linux 4 种:memfd_create+exec、mmap+pthread、process_vm_writev、ptrace 注入。macOS 2 种:mach_thread、mmap+pthread。跨平台同构的 shellcode_optional/config 抽象让三个加载器共享编译期配置渲染。
4.6 VMLoader:RISC VM 加载器(最”另类”的部分)
基于 vmkit,把整个加载流程(规避补丁→睡眠→分配→写入→解密→翻 RX→执行→释放)编译成 8 个定长操作码的字节码,256 项 constexpr 分发表驱动。三层混淆全部 opt-in:
- 1. 操作码随机化:字节码字母表是随机置换——基于操作码序列的签名逐构建失效;
- 2. 字节码静态 XOR:32 字节种子派生密钥,dispatch 循环前一次性解密;
- 3. 逐操作数上下文加密:区域指针、payload 指针在每条操作码之间 XOR 扰动——两条指令之间的内存转储看到的是密文地址。
约束写得很清楚:EvasionPatch 必须是 op[0],因为后续所有 NT 处理器依赖 GetSyscallStub。静态分析者看到的是一个解释器循环而非顺序加载器——把”理解成本”当攻击面,这是 VM 混淆的本意。
4.7 护栏(guardrails.cpp,20 项)
白名单类(编译期从 Mythic 构建参数注入,build_guardrail_encryption() 还会把列表加密嵌入):主机名 / 用户名 / 域 / IP / 父进程 / 区域设置。
环境类:CheckDebuggerPresent(PEB BeingDebugged)、CheckRemoteDebugger(CheckRemoteDebuggerPresent)、调试器进程名扫描、硬件断点(GetThreadContext Dr0-7)、时序异常、沙箱环境(用户目录/计算机名模式等)、运行时长(uptime 门槛)、屏幕分辨率、Secure Boot 状态、是否域加入。
用途双重:行动安全(样本跑在分析环境/错误目标上就静默退出+开诱饵)与反分析。蓝队视角:护栏本身就是可指纹的——”一个不满足条件就退出并打开 PDF 的 EXE”是经典沙箱逃逸行为特征。
4.8 Python 侧亮点
- •
vba_compiler/:不用 Windows/Office,纯 Python 按 [MS-OVBA]/[MS-CFB] 规范构造vbaProject.bin(CFB 目录:VBA/_VBA_PROJECT、VBA/dir、模块流、PROJECT、PROJECTwm),再注入 XLSX/XLSM zip。Linux Docker 里造出 Excel 宏文档,这是整条流水线能全容器化的关键一环; - •
plugin_pe_sanitize.py:抹 MinGW 指纹——.comment段的GCC: (GNU) x.x、确定性 PE 时间戳、.buildid/.debug_*、CheckSum 置零。注释点破了动机:这些信号单看都弱,合起来会把样本桶进”MinGW 编译的红队载荷”家族检测; - •
plugin_self_hunt.py(最”紫队”的功能):给刚构建出来的载荷生成 YARA + Sigma 规则——imphash 代理哈希、.text 最长独特字节序列 top-N、节布局(名/大小/熵桶)、入口点前 32 字节签名。用途:投递前在自己控制的 SIEM/检测平台上验证”这个样本干不干净”、行动后给客户交付具体狩猎规则。这本质上是把 OPSEC 验证产品化了; - •
maldoc_matrix.py(570 行):Office 格式 × 触发方式的组合矩阵; - •
generate_attack_coverage()/generate_iocs_file():构建产物附带 ATT&CK 覆盖报告与 IOC 清单——为红队报告合规交付而设计; - •
plugin_infra_phishing.py/redirector.py:钓鱼页与重定向器生成,配合投递闭环; - • 代码签名插件(
codesigner.py):给产物签名(自有/泄露证书),信任链滥用。
4.9 触发器面(约 30 种)速览
按用户交互模式分三类:
- 1. 双击执行:LNK、HTA、CHM、MSC、ISO/VHD/7z 内伪装文件、ClickOnce、MSI/MSIX、XLL(Excel 加载项);
- 2. 复制粘贴型(ClickFix 家族):
url触发器——伪造”验证码/报错”页面诱导Win+R粘贴命令; - 3. 软件生态滥用:VSIX(VSCode 扩展,commit 显示专门处理了 spawn process 与 ACG 兼容——扩展宿主进程里 RX 翻页受限,这正好接上 4.1 的 ACG 回退设计)、Electron 伪安装器、search-ms(资源管理器搜索协议)、OneNote(经 Erebus.Helper 延迟构建)。
5. MITRE ATT&CK 映射(构建期自动生成报告的子集)
| 战术 | 技术 | Erebus 对应 | | — | — | — | | Resource Development | T1583/T1587 基础设施/能力开发 | phishing 页/redirector 生成、签名 | | Initial Access | T1566 钓鱼 | 全部触发器 + 容器封装 | | Execution | T1203 用户执行/客户端漏洞利用、T1059 命令行 | LNK/HTA/CHM/LOLBAS(regsvr32/mshta/cmstp/installutil/xsl)、宏文档 | | Defense Evasion | T1027 混淆/加密、T1218 系统二进制代理执行、T1562 impair defenses、T1620 反射加载 | shellcrypt 管线、syscall 后端、AMSI/ETW/unhook、容器走私、VMLoader、pe_sanitize | | Privilege Escalation | — | (交给 implant) | | Persistence | T1547/T1053/T1004 等 | com / wmi / launchagent 插件 | | (注入族) | T1055 全家 | 4.5 节矩阵 |
6. 技术前世今生:它站在谁的肩膀上
Erebus 几乎没有发明新技术,它的价值是集成与工程化。谱系(公开研究出处):
直接 syscall 解析
Hell's Gate (Rasta Mouse & smeege, 2020) —— 从干净存根读 SSN
→ Halo's Gate (SmukkeT, 2020) —— 被 hook 时用邻居存根推算
→ Tartarus' Gate (社区, 2020) —— 双向走 + 验证改良
→ SysWhispers / SysWhispers2 / SysWhispers3 (jthuraisamy 2019 → klezVirus 2021, 间接/跳转存根)
→ 本文 4.1:ntdll 内 gadget + 21 字节 shim(对抗 ETW-TI 来源检查)
睡眠加密
Ekko (Cneakis, 2021, CreateTimerQueueTimer+回调 ROP) → Foliage (2022)
→ 本文 4.3:Ekko-lite 变体(自 PE 段 XOR + 栈缓存函数指针)+ 反模拟器三件套
线程池注入
PoolParty 8 变体 (Daniel Avinoam / SafeBreach, 2023-12)
→ 本文:TP Worker + Job APC 两种 + "先确认目标有线程池"的目标选择器
Early Bird / APC
约 2017 起 (ransomware 滥用) → EarlyCascade Injection (Víctor "0xV1CT0R" Nieves, 2024)
→ 本文 4.5
无文件加载与包装
Donut (TheWover & odzhan, 2019, 任意 DLL/EXE→shellcode)
Shellcrypt (Jordan Jay 等,开源混淆 CLI) → Erebus 直接以子模块收录
投递容器演化(威胁情报侧)
2010s 宏文档 → 2022-2023 ISO/LNK 容器走私(Mark-of-the-Web 逃逸战役)
→ 2023+ MSIX 滥用 → 2024-2025 ClickFix 社工潮 → 2025 VSIX 扩展投递
→ Erebus 把这条演化线全部做成了可点选插件
C2 侧
Metasploit (2003+) → Cobalt Strike (2012, 商业) →empire→ Mythic (Cody Thomas, 2020, 容器化)
→ Erebus (2025-08) 作为 Mythic 的 initial-access wrapper 出现
理解这个谱系对蓝队的意义:Erebus 类工具出现后,”会用最新论文级技术”的门槛从”能读 paper 写 C++”降到了”会点 UI”。检测工程必须假设对手能任意组合上述全部技术。
7. 实网攻防视角:攻击链用法(授权演练)与逐段检测
以下按标准红队 kill chain 描述该工具在授权演练中的角色,每一段同时给出蓝队检测要点——这是同一份知识的两面。
| 阶段 | 红队用法(授权范围内) | 蓝队检测/狩猎点 |
| — | — | — |
| 武器化 | Mythic 里选 Agent→Erebus 包装:选注入/规避/护栏/容器,产物自动附 YARA+IOC+ATT&CK 报告 | 蓝队可复用其 self_hunt 思路:对自有红队样本建规则回灌 SIEM 验证覆盖率(紫队闭环) |
| 投递 | 邮件带 ISO/MSIX/伪装安装器/宏文档/VSIX;或 ClickFix 页面 | ISO/IMG 附件阻断;MSIX sideload 策略;VSIX 签名校验;Win+R 粘贴执行的用户告警;MOTW 审计(zone.identifier) |
| 执行 | LNK→LOLBAS(regsvr32/mshta/cmstp)、宏、XLL | LOLBAS 父子进程关系规则(如 WINWORD.EXE→regsvr32);Office 进程的异常模块加载(amsi.dll 之外的 XLL 路径) |
| 规避对抗 | 间接 syscall + unhook + AMSI/ETW patch + 睡眠加密 | ETW-TI 采样 syscall 返回地址 (正是 4.1 注释里承认的对手);GetProcessHeaps+高频 HeapWalk 行为;堆内 ‘AMSI’ 签名被清零后的 E_INVALIDARG 模式;睡眠窗口内存熵监测;ntdll .text 完整性基线 |
| 注入 | 4.5 矩阵任选 | 对应 ETW 提供者事件(Process/Image/Thread/Map)交叉:挂起进程+远端 APC、KCT 改写、线程池对象篡改(PoolParty 原论文附检测建议) |
| 驻留 | com/wmi/launchagent | COM 注册表监控、WMI 事件订阅基线、macOS LaunchAgent 目录监控 |
| C2 | 交还 Mythic Agent(HTTP/WebSocket Profile + redirector) | 出网 beacon 行为、JA3/JA4、长连接低频心跳——超出 Erebus 范围 |
防御侧四条硬建议:
- 1. 把 4.1 的 syscall 注册表(17 个 NT 函数)当作行为面清单——加载器全部特权行为都压在这些调用上,ETW/内核回调在这层布防收益最大;
- 2. 页面文件取证仍有价值但不能依赖(4.4 的钉页+清零),内存扫描要在进程活动窗口做;
- 3.
pe_sanitize抹的是 MinGW 指纹——反过来说,非 MinGW 编译的加载器指纹仍在,YARA 不要只盯 GCC 家族特征; - 4. 护栏行为(uptime 门槛、分辨率检查、父进程检查)本身是高价值沙箱逃逸信号,行为监控里值得单独建规则。
8. Cheatsheet:命令配方
重要事实:Erebus 本体没有传统 CLI——主接口是 Mythic Web UI 的构建参数页。真正的命令行面有三处:部署(git/mythic-cli)、
Erebus.Helper(Windows 组件外部编译)、shellcrypt(shellcode 混淆)。以下参数全部来自源码 argparse,真实可查。
8.1 部署配方
# 完整安装(子模块必须显式拉取,否则是空壳)
git clone --recurse-submodules https://github.com/Whispergate/Erebus.git
cd Erebus
# 若已克隆补拉子模块(网络差时挂代理)
git submodule update --init --recursive
git -c http.proxy=http://127.0.0.1:7890 submodule update --init --recursive
# 以 Payload Type 身份接入 Mythic(标准 Mythic 流程)
./mythic-cli install github https://github.com/Whispergate/Erebus
# Docker 构建容器后,在 Mythic UI → Create Agent → Erebus 里配置构建
8.2 Erebus.Helper(Windows 组件外部编译器)
用法: main.py <command> --output <路径> [选项]
command ∈ {verify, excel, xlsx, xlsm, xlam, docm, doc, pptm, ppam, lnk, msi, electron, chm, onenote}
选项:
--source <源文件> C/C++ 源
--compiler {MSVC,MinGW,Clang}
--arch {x64,x86}
--optimize {Ox,O2,O1,Od}
--extra-flags "<raw flags>" 原样透传编译器旗标
# 自检环境是否满足外部编译
python main.py verify --output check.json
# Excel XLSM 宏文档(内部走 vba_compiler,模板 template.xlsm)
python main.py xlsm --source loader.c --compiler MSVC --arch x64 --output out/drop.xlsm
# 经典 LNK 触发器 + 最小体积优化
python main.py lnk --output out\link.lnk --optimize O1
# CHM 触发器 + 关闭优化便于排障
python main.py chm --output out\doc.chm --optimize Od --extra-flags "/Zi"
参数即模块的组合心法:--compiler×--arch×--optimize×--extra-flags 是四个正交旋钮——例:--compiler MinGW --extra-flags "-fno-asynchronous-unwind-tables -Wl,--dynamicbase" 同时影响体积/指纹/DEP 兼容性;配合 8.4 的构建参数矩阵,把”一次任务多种产物”写成循环脚本即可批量出包。
8.3 shellcrypt(shellcode 混淆管线)
# 探索可用的算法/格式清单(写作前的第一步)
shellcrypt --ciphers; shellcrypt --encoders; shellcrypt --compressors; shellcrypt --formats
# 标准管线:压缩 + 加密 + C 数组输出(-e/-d/-c 顺序即管线顺序)
shellcrypt -i payload.bin -c LZNT1 -e AES256 -f c -a sh3llc0d3 -o staged.h
# 可复现构建:固定 key 与 nonce(hex)
shellcrypt -i sc.bin -e chacha20 -k $(cat key.hex) -n $(cat nonce.hex) -f py -o sc.py
# XOR 保零模式:避免 null 字节被 XOR 抹掉(对含大量 \x00 的 shellcode 重要)
shellcrypt -i sc.bin -e xor --preserve-null --key-length 32 -f rust -o sc.rs
8.4 Mythic 构建参数组合矩阵(UI 参数 → 效果)
| 维度 | 取值(节选) | 选择逻辑 | | — | — | — | | 注入模式 | 1=远端挂起进程 / 2=自注入 / 3=PoolParty | 高检测环境选自注入+fiber;需要进程伪装选挂起进程+EarlyCascade | | 规避 | AMSI 型 1/2/3、ETW on/off、unhook、间接 syscall 后端 Tartarus/SW3 | ACG 宿主(VSIX/Electron)记得后端会自动回退 | | 睡眠 | off / timer / ekko-lite / 耗尽型 + base_ms/jitter_ms | 沙箱重的投递路径必开 | | 护栏 | 域/IP/主机名/父进程/uptime… 白名单 | 必配——这是防误伤与防分析的开关 | | 容器 | iso/vhd/7z/msi/msix/electron/双层嵌套 | 按目标邮件网关的放行类型选 | | 出口 | EXE / DLL(regsvr32) / XLL(Excel) | XLL 配合 xll_file_ingestor 诱饵 |
8.5 脚本化批量出包(authorized 演练的效率模式)
# 变体矩阵:一个 shellcode 出多注入×多规避组合,各自留 YARA 自检规则
for inj in 1 2 3; do
for slp in 0 2 3; do
# Mythic 构建参数在 UI/profile 里预置为变体组后,逐组触发构建;
# 产物 + self_hunt YARA 落到 per-variant 目录,便于后续在检测平台上对比
echo "build variant inj=$inj sleep=$slp"
done
done
多版本对比的正确姿势:用 self_hunt 产出的 YARA/Sigma 规则在自己控制的检测环境(云沙箱集群/自建 SIEM)里对比各变体的命中面,选最干净变体投递——这是该仓库自带的”AI/人工辅助方案迭代”工作流的落地方法。
9. 代码质量与设计总评
妙处(值得学习的工程决策):
- 1. 注释即威胁模型:几乎每个文件头部都写明对抗的防御机制与取舍(为什么不用邻居推导、为什么函数指针要先上栈、为什么 ACG 下要回退)——这在开源 maldev 里属于第一梯队;
- 2. 编译期裁剪:不用的代码不进二进制,攻击面与体积同时最小化;
- 3. 自检生态:self_hunt / pe_sanitize / IOC+ATT&CK 报告生成,把”红队交付物规范化”内建进了工具——多数同类工具完全不管报告;
- 4. 产品边界克制:只做武器化+投递,C2 交还 Mythic,跨平台三加载器共享配置抽象。
槽点:
- 1.
builder.py7056 行单体,插件间靠文件系统副作用耦合,二开成本高; - 2.
agent_capabilities.json存在重复键等低级错误,缺 schema 校验 CI; - 3. 部分
container/子目录为空壳(构建期由插件填充),首读体验差; - 4. README 声称的”23 种 Windows 触发器”等数字与源码实际枚举有出入(计数口径问题,非虚假宣传)。
总体判断:这是一个工程化成熟度中上、技术水平为公开技术集大成的开源红队项目。对蓝队而言它是”检测覆盖率的压力测试集”——第 7 节的检测要点若都能落地,就能覆盖它的全部已知面。
10. 参考
- • 仓库:https://github.com/Whispergate/Erebus (及子模块 Erebus.Loaders / Erebus.Helper / Shellcrypt)
- • Mythic:https://github.com/its-a-feature/Mythic
- • Hell’s Gate(Rasta Mouse)、SysWhispers3(klezVirus)、Ekko(Cneakis)、PoolParty(SafeBreach/Daniel Avinoam)、EarlyCascade(0xV1CT0R)、Donut(TheWover)等原始公开研究见各作者发布页
- • WhisperGate 与 Erebus 勒索信渊源:Intel 471、Recorded Future、CCDCOE、Kim Zetter
免责声明
本文档为公开开源项目的防御性技术研究与代码审计记录。全部内容限于授权渗透测试、紫队演练与威胁研究的合法场景;对任何未授权使用不提供支持。检测章节的存在的意义即是本文档的立场。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:网安之家-CyberHomestead 《Erebus 深度技术分析报告》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论