一、背景与威胁概述
自 2026 年初,一组高度模块化、工程化程度极高的 .NET C2 框架开始在中东地区定向攻击活动中频繁出现,被业界命名为 Cavern(又名 Cav3rn)。该框架被归因于与伊朗情报与安全部(MOIS)存在关联的 APT 组织 Cavern Manticore,其主要攻击目标集中在以色列政府机构与 IT 服务供应商。在技术指纹层面,Cavern 与已知的伊朗 APT 子集团 MuddyWater 及 Lyceum(即 OilRig / APT34 子组)存在显著重叠,包括相似的初始投递手法、凭据收集偏好以及部分代码风格。
Cavern 框架的基础设施托管具有鲜明的伊朗特征:其核心 C2 域名 hospitalinstallation[.]com 通过伊朗本土托管商 Fars Data 注册,这种"本土托管商 + 仿合法企业域名"的组合是 MOIS 关联组织长期惯用的基础设施运营模式。Cavern 的真正技术亮点并不在于其攻击目标或归属,而在于其工程实现层面的一次性引入了三种截然不同的 .NET 编译格式作为反分析层级,并辅以 AppDomain 隔离、DLL 侧加载伪装与多通道加密通信,构成了一套对逆向工程师极不友好的后渗透体系。
本文将从架构、通信协议、反分析层、反取证机制、流量特征到检测规则,对 Cavern 进行系统性技术拆解。
二、技术架构总览
Cavern 框架完全基于 .NET 技术栈构建,但并未采用单一的编译与部署方式,而是将整个后渗透能力拆分为两大组件与七个核心模块,每个模块根据其敏感性选用了不同的 .NET 编译格式。
2.1 两大组件定位
- Cavern Agent(核心后门 / 模块编排器):负责持久化驻留、维护与 C2 的加密通信通道,并作为"模块编排器"按需动态加载、调用、卸载后渗透模块。Agent 是整个框架的中枢,所有模块的执行都经由它发起与回收。
- Cavern Modules(专用后渗透载荷):一组功能单一、按需加载的专用模块,覆盖文件管理、数据库操作、AD 侦察、网络横向移动与隧道代理等场景。模块本身不主动联网,而是通过 Agent 提供的通信信道回传数据。
2.2 七个核心组件
| 组件 | 内部名称 | 编译格式 | 功能 |
|---|---|---|---|
| Cavern Agent | uxtheme.dll |
Mixed-Mode C++/CLI(.NET 4.7.2,IL + Native) | 核心后门,模块编排器 |
| 通信模块 | n-HTCommp.dll |
NativeAOT(.NET 8,Native-only) | HTTPS / WebSocket 传输,XOR 加密 |
| 文件管理器 | mhm.dll |
.NET Framework 4.7.2(IL-only) | 文件操作、DPAPI 解密 |
| SQL 浏览器 | db.dll |
.NET Framework 4.7.2(IL-only) | 数据库枚举、查询、导出 |
| LDAP 模块 | ode.dll |
.NET Framework 4.7.2(IL-only) | AD 侦察、LDAP 暴力破解 |
| 网络模块 | n-ten.dll |
NativeAOT(.NET 8,Native-only) | 网络侦察、SMB 暴力破解 |
| 隧道模块 | n-sws.dll |
NativeAOT(.NET 8,Native-only) | SOCKS5 代理、WebSocket 隧道 |
2.3 架构关系图
+-----------------------------+
| Cavern C2 Server |
| (hospitalinstallation.com) |
+--------------+--------------+
|
HTTPS / WebSocket | XOR(0x48) + Base64
|
+----------------------------+----------------------------+
| Cavern Agent |
| (uxtheme.dll) |
| Mixed-Mode C++/CLI (.NET 4.7.2) |
| [ 持久化 ] [ 信标 ] [ 模块编排器 ] |
+-----+-------------------+-------------------+------------+
| | |
+---------+---------+ +-------+-------+ +---------+---------+
| n-HTCommp.dll | | AppDomain 隔离 | | config.txt (i,xd) |
| NativeAOT .NET 8 | | 按次创建/卸载 | +-------------------+
| [ 通信传输层 ] | +-------+-------+
+-------------------+ | 动态加载 .NET Assembly
+---------+---------+--------------------+
| | | | |
+----+---+ +---+--+ +---+--+ +---+---+ +----+----+
| mhm.dll| |db.dll| |ode.dll| |n-ten.dll| |n-sws.dll|
| IL-only| |IL-only| |IL-only| |NativeAOT| |NativeAOT|
| 文件/ | |SQL/ | |LDAP/ | |网络/ | |SOCKS5/ |
| DPAPI | |导出 | |AD爆破| |SMB爆破 | |WS隧道 |
+--------+ +------+ +------+ +---------+ +---------+
从架构图可以清晰看到,Cavern 将"通信传输"、"模块编排"与"功能载荷"三层彻底解耦。传输层(n-HTCommp.dll)与部分高风险载荷(n-ten.dll、n-sws.dll)采用 NativeAOT 编译为原生二进制,而文件、SQL、LDAP 等需要大量调用 .NET 类库的模块则保留 IL 形态。这种"按敏感性分配编译格式"的设计,正是其反分析层的核心思想。
三、三编译格式反分析层(核心创新)
Cavern 最值得关注的技术创新,是其在同一框架内混用了三种 .NET 编译格式,使逆向工程师在面对不同模块时被迫切换工具链与心智模型,极大抬高了整体分析成本。这三种格式分别对应不同的可逆向性等级。
3.1 IL-only 格式(低门槛)
mhm.dll、db.dll、ode.dll 三个模块采用传统的 .NET Framework 4.7.2 IL-only 编译。这类程序集保留完整的符号元数据、类型签名与 IL 中间代码,可被 ILSpy、dnSpyEx、dotPeek 等工具直接反编译为接近原始的 C# 源码。这是 .NET 逆向中门槛最低的一类,也是 Cavern 刻意暴露的"诱饵层"——分析者很容易在这些模块上获得成就感,却难以触及真正核心的 Agent 与通信层。
3.2 Mixed-Mode C++/CLI 格式(高门槛)
核心后门 uxtheme.dll 采用 C++/CLI 混合模式编译,运行于 .NET Framework 4.7.2。这种格式的特殊之处在于:单个 PE 文件同时包含托管 IL 代码与原生机器码,托管部分与原生部分可以直接互相调用,跨边界的函数调用通过 C++/CLI 的"双 thunk"机制完成。
对逆向工程师而言,这意味着:
- 纯 .NET 反编译器(ILSpy 等)只能看到 IL 部分,原生部分表现为不可读的外部调用;
- 原生反汇编器(IDA Pro、Ghidra)只能看到原生部分,IL 部分表现为数据段中的元数据 blob;
- 必须同时使用两类工具链,并在两者之间手工关联调用关系,才能还原完整逻辑。
Agent 将关键的 C2 循环入口、模块加载编排逻辑放在原生与托管的交界处,进一步增加了分析难度。
3.3 NativeAOT 格式(最高门槛)
n-HTCommp.dll、n-ten.dll、n-sws.dll 三个模块采用 .NET 8 NativeAOT 编译。NativeAOT 会将整个 .NET 运行时(GC、类型系统、JIT 辅助结构)静态编译进原生 PE,产出 3–6 MB 的纯原生二进制,彻底脱离 IL 形态。
其反分析价值体现在两个层面:
-
静态反编译失效:由于不存在 IL,ILSpy/dnSpyEx 等工具完全无用武之地;IDA/Ghidra 面对的是一个被深度内联、去虚化的原生代码体,且其中混杂着大量运行时基础设施代码,难以区分业务逻辑与运行时样板。
-
P/Invoke 隐身:NativeAOT 二进制中,对 Win32 API 的 P/Invoke 调用不通过传统的 IAT(导入地址表)解析,而是通过运行时内部维护的描述符表(descriptor table)在运行期动态解析。这意味着 API 调用不出现在 PE 导入表中,传统的"看导入表猜功能"的快速研判方法完全失效。
// NativeAOT 模块中 P/Invoke 调用的概念性伪代码(还原自行为分析)
// 注意:以下 API 句柄不在 PE 导入表中,而是通过运行时描述符表解析
typedef struct {
uint32_t api_hash; // API 名称哈希,用于运行时查表
void* resolved_addr; // 运行时填充的实际地址
} NativeApiDescriptor;
// 运行时初始化阶段:构建描述符表
static void ResolveApiTable(NativeApiDescriptor* table) {
for (int i = 0; table[i].api_hash != 0; i++) {
// 通过内部实现的 PEB -> PEB_LDR_DATA 遍历已加载模块
// 按 hash 匹配导出函数,回填 resolved_addr
table[i].resolved_addr = InternalResolveByHash(table[i].api_hash);
}
}
// 实际调用时通过描述符表间接跳转,IDA 中表现为 call qword ptr [rip+xxxx]
// 而非 call kernel32.CreateFileW,从而隐藏了真实 API
void SmbBruteforce(...) {
auto pNetWkstaUserEnum = LookupDescriptor(API_NETWKSTAUSERENUM);
auto pNetApiBufferFree = LookupDescriptor(API_NETAPIBUFFERFREE);
// ... SMB 暴力破解逻辑 ...
}
正是这种"按模块敏感性分配编译格式"的策略,使得 Cavern 在单一框架内构建了三层难度递进的反分析梯度。
四、C2通信协议深度拆解
Cavern 的通信协议设计体现了"够用即可、尽量低调"的实用主义取向:加密强度并不高(固定单字节 XOR),但叠加了多通道传输、固定伪装与自定义头等多层混淆,目的是在降低开发与维护成本的同时,规避基于特征与行为的网络检测。
4.1 加密与编码层
所有 C2 流量在传输前经过两层处理:先以固定密钥 0x48 进行逐字节 XOR 加密,再做 Base64 编码。该过程可逆且对称,C2 服务端采用相同密钥解密。
// 还原自 n-HTCommp.dll 行为的通信编解码逻辑(C# 伪代码)
public static class CavernCodec
{
// 固定 XOR 密钥
private const byte XOR_KEY = 0x48;
// 出站:明文 -> XOR 加密 -> Base64 编码
public static string Encode(byte[] plaintext)
{
byte[] buffer = new byte[plaintext.Length];
for (int i = 0; i < plaintext.Length; i++)
{
buffer[i] = (byte)(plaintext[i] ^ XOR_KEY);
}
return Convert.ToBase64String(buffer);
}
// 入站:Base64 解码 -> XOR 解密 -> 明文
public static byte[] Decode(string encoded)
{
byte[] buffer = Convert.FromBase64String(encoded);
for (int i = 0; i < buffer.Length; i++)
{
buffer[i] = (byte)(buffer[i] ^ XOR_KEY);
}
return buffer;
}
}
需要注意的是,固定单字节 XOR 加密几乎没有密码学强度——256 种密钥空间可在毫秒内穷举。Cavern 选择这种方式的原因更可能是工程便利:单字节 XOR 实现极简,跨 NativeAOT 与 IL 模块的行为完全一致,且 Base64 编码后的载荷可作为合法 JSON 字段或表单值传输,规避对二进制流量的检测。
4.2 双通道传输
通信模块 n-HTCommp.dll 同时支持两条传输通道:
- HTTPS 通道:用于常规命令下发与数据回传,请求路径包含自定义端点(如
cac.aspx)。 - WebSocket 通道:用于维持长连接、低延迟的心跳与实时控制,特别适合隧道模块
n-sws.dll转发交互式流量。
双通道设计赋予了 Cavern 在受限网络环境下的韧性:当 HTTPS 出站被阻断时,可切换至 WebSocket(其外观与正常 WebSocket 应用流量无异);反之亦然。
4.3 请求伪装
Cavern 对 HTTP 请求的伪装做了刻意且固定的配置,这种"固定"既是其隐蔽手段,也构成了检测的特征锚点:
- User-Agent:固定伪装为 Microsoft Edge 浏览器,所有请求保持一致;
- 自定义请求头:携带
X-User-token头,其值始终以00结尾(可能是某种会话标识或校验位的固定填充); - 请求端点:使用
cac.aspx这类带有.aspx扩展名的端点,伪装成合法的 ASP.NET Web 应用。
4.4 信标与心跳特征
Cavern 的信标行为具有明显的流量形态指纹:
- 心跳突发:以约 300ms 的间隔发出约 10KB 的出站数据包突发;
- 这种"高频小包 + 固定大小"的模式与正常浏览行为的随机性形成鲜明对比,是网络层检测的重要依据。
4.5 消息分隔符语法
Cavern 在载荷内部使用一套自定义的分隔符语法来组织字段与参数:
_;;_:分隔不同字段(field separator);_,_:分隔单个字段内的多个参数(parameter separator)。
// 概念性载荷结构示例(已脱敏)
field1_;_field2_;_field3
paramA_,_paramB_,_paramC
这种自定义语法避免了依赖 JSON/XML 等标准格式带来的结构特征,但也因其独特性而成为一种可检测的指纹。
五、AppDomain隔离与反取证机制
Cavern Agent 在模块执行层面采用了一项在恶意软件中相对少见的 .NET 高级特性——AppDomain 隔离,以此实现执行后痕迹的彻底清除。
5.1 隔离执行流程
// Cavern Agent 模块编排逻辑的 C# 伪代码还原
public class ModuleOrchestrator
{
public void ExecuteModule(byte[] moduleAssembly, string entryType, string entryMethod, object[] args)
{
// 1. 为本次执行创建专用 AppDomain,命名带唯一标识
AppDomain sandbox = AppDomain.CreateDomain(
"cavern_" + Guid.NewGuid().ToString("N"));
try
{
// 2. 在新 AppDomain 内加载模块 Assembly
// 使用跨域封送代理对象,避免 Assembly 引用泄漏到主域
MarshalByRefObject proxy = (MarshalByRefObject)sandbox.CreateInstanceFromAndUnwrap(
moduleAssemblyPath, "Cavern.ModuleLoader");
// 3. 通过代理在隔离域内调用目标方法
IModuleInvoker invoker = (IModuleInvoker)proxy;
invoker.Invoke(entryType, entryMethod, args);
}
finally
{
// 4. 执行完毕,卸载整个 AppDomain
// 该域内加载的 Assembly、JIT 代码、对象图一并被回收
AppDomain.Unload(sandbox);
}
}
}
5.2 反取证价值
这一机制的反取证价值体现在三个层面:
- 内存痕迹最小化:模块 Assembly 仅在被调用期间存在于内存,执行后随 AppDomain 卸载被彻底移除,不会在主域的加载器缓存中留下持久引用,显著缩短了可被内存取证(如 dump 后扫描 IL)捕获的时间窗口。
- 隔离稳定性:单个模块崩溃不会拖垮 Agent 主进程,提升整体鲁棒性。
- 规避内存扫描:安全产品若仅扫描主 AppDomain 的已加载 Assembly 列表,将无法发现这些瞬态模块。
六、沙箱陷阱:伪装的艺术
Cavern Agent 以 uxtheme.dll 为名投递,并刻意将其导出表设计成一个高度逼真的"陷阱",专门针对自动化沙箱与快速逆向流程。
6.1 伪装策略
uxtheme.dll 导出 83 个函数,其名称、序号与 Windows 系统主题库 uxtheme.dll 的真实导出高度一致。其中:
- 82 个为空桩(stub):函数体仅包含
ret或返回固定值,不执行任何实质逻辑; - 唯一活跃导出:
EnableThemeDialogTexture(序号 #20),其函数体才是真正的 C2 循环入口点。
// uxtheme.dll 导出表伪装陷阱的概念性 C 伪代码
// 82 个空桩导出(节选)
__declspec(dllexport) void CloseThemeData(void* hTheme) { return; }
__declspec(dllexport) void GetThemeColor(/*...*/) { return; }
__declspec(dllexport) void DrawThemeBackground(/*...*/) { return; }
// ... 其余 79 个空桩 ...
// 唯一活跃导出 —— 序号 #20,C2 真正入口
__declspec(dllexport) int __stdcall EnableThemeDialogTexture(HWND hwnd, DWORD flags)
{
// 沙箱若按导出名批量调用,大多命中空桩而判定无害
// 唯有调用到序号 #20 时,才会触发真实 C2 循环
CavernAgent_RunBeaconLoop(); // 进入信标注册、命令轮询、模块编排
return 1; // 返回"正常"值,维持伪装
}
6.2 对抗效果
这一设计针对的是两类自动化分析:
- 基于导出名指纹的沙箱:许多沙箱会枚举导出表并与已知"良性 DLL"导出名比对。
uxtheme.dll的导出名与系统主题库完全吻合,极易被误判为合法系统组件的副本。 - 基于随机/批量调用导出的行为引擎:若行为引擎随机选取导出函数调用以触发行为,82/83 的概率命中空桩,无法触发真实行为;而依赖固定调用
EnableThemeDialogTexture的合法程序路径极少,沙箱通常不会主动调用它。
结合 DLL 侧加载(见下文检测规则),Agent 通过合法的 WinDirStat.exe 加载伪造的 uxtheme.dll,完整链路具备极强的伪装性。
七、网络流量特征总结
综合通信协议分析,Cavern 的网络流量可归纳出以下可检测特征集,这些特征是构建 Suricata 规则的基础:
| 特征维度 | 取值 / 模式 | 检测价值 |
|---|---|---|
| User-Agent | 固定 Microsoft Edge UA 字符串 | 中(UA 可被合法流量共享,需组合) |
| 自定义头 | X-User-token,值以 00 结尾 |
高(该头高度异常且固定) |
| 请求端点 | cac.aspx |
中高(特定端点 + .aspx 后缀) |
| C2 SNI | hospitalinstallation.com 及子域 |
高(已知恶意域名) |
| 视觉欺骗子域 | google.com.hospitalinstallation.com |
高(子域拼接知名品牌) |
| 心跳节奏 | 约 300ms 间隔的 10KB 出站突发 | 高(行为指纹) |
| 载荷编码 | Base64 + 固定 XOR 0x48 | 中(需解密验证) |
其中,X-User-token 自定义头与 00 结尾的取值是 Cavern 最具辨识度的流量指纹——该头在正常浏览器与常见应用流量中几乎不出现,与固定 UA 组合后误报率极低。
八、检测规则
以下规则集覆盖主机侧(YARA、Sigma)与网络侧(Suricata)三层检测能力,可直接集成至 SOC 流水线。
8.1 YARA 规则
// 规则 1:检测 Cavern Agent(Mixed-Mode C++/CLI,uxtheme.dll 伪装)
rule Cavern_Agent_MixedMode {
meta:
description = "Detects Cavern Agent uxtheme.dll (Mixed-Mode C++/CLI)"
author = "Threat Intel Team"
date = "2026-08-03"
reference = "Cavern / Cav3rn C2 framework"
severity = "high"
strings:
// 互斥锁字符串
$mutex1 = "MYMUTEX123HELLP02" ascii wide nocase
$mutex2 = "MYMUTEX123HELLP04" ascii wide nocase
// 伪装导出名
$export1 = "EnableThemeDialogTexture" ascii wide nocase
// 配置文件键
$cfg_i = "config.txt" ascii wide nocase
// C2 域名片段
$c2_1 = "hospitalinstallation" ascii wide nocase
condition:
// PE 文件且命中互斥锁或导出名 + 配置/域名
uint16(0) == 0x5A4D and
( any of ($mutex*) or $export1 ) and
( $cfg_i or any of ($c2_*) )
}
// 规则 2:检测 Cavern NativeAOT 模块(通信/网络/隧道)
rule Cavern_NativeAOT_Module {
meta:
description = "Detects Cavern NativeAOT modules (.NET 8, native-only)"
author = "Threat Intel Team"
date = "2026-08-03"
severity = "high"
strings:
// 固定 XOR 密钥常量(以指令立即数形式存在)
$xor_key = { 48 00 }
// 自定义头与分隔符
$hdr = "X-User-token" ascii wide nocase
$sep1 = "_;;_" ascii nocase
$sep2 = "_,_" ascii nocase
// WebSocket / SOCKS5 相关字符串
$ws = "websocket" ascii wide nocase
$socks5 = { 05 01 00 }
// 内部模块名特征
$mod_comm = "n-HTCommp" ascii wide nocase
$mod_net = "n-ten" ascii wide nocase
$mod_sw = "n-sws" ascii wide nocase
condition:
uint16(0) == 0x5A4D and
filesize < 8MB and
( any of ($mod_*) ) and
( $hdr or any of ($sep*) or $ws )
}
// 规则 3:检测 Cavern 托管模块(IL-only:文件/SQL/LDAP)
rule Cavern_Managed_Module_IL {
meta:
description = "Detects Cavern IL-only managed modules (mhm/db/ode)"
author = "Threat Intel Team"
date = "2026-08-03"
severity = "high"
strings:
// .NET 元数据标记
$cor20 = "BSJB" ascii
// DPAPI 相关 API 引用
$dpapi1 = "CryptUnprotectData" ascii wide nocase
$dpapi2 = "CryptProtectData" ascii wide nocase
// LDAP / SQL 行为字符串
$ldap = "System.DirectoryServices" ascii nocase
$sql = "System.Data.SqlClient" ascii nocase
// 内部模块名
$mod_file = "mhm" ascii wide nocase
$mod_db = "db.dll" ascii wide nocase
$mod_ldap = "ode" ascii wide nocase
// 分隔符语法
$sep = "_;;_" ascii nocase
condition:
uint16(0) == 0x5A4D and
$cor20 and
( any of ($dpapi*) or $ldap or $sql ) and
( any of ($mod_*) or $sep )
}
8.2 Sigma 规则
# 规则 1:DLL 侧加载 —— WinDirStat.exe 加载伪造 uxtheme.dll
title: Cavern C2 DLL Side-Loading via WinDirStat
id: 9c4a1f2e-7b8d-4e3a-9c1f-2a5b6c7d8e9f
status: experimental
description: >
Detects Cavern Agent execution via DLL side-loading.
The legitimate WinDirStat.exe is abused to load a malicious
uxtheme.dll from C:\ProgramData\WinDir\.
references:
- https://example.com/cavern-c2-analysis
author: Threat Intel Team
date: 2026/08/03
logsource:
product: windows
category: image_load
detection:
selection_process:
Image|endswith: '\WinDirStat.exe'
selection_path:
Image|startswith: 'C:\ProgramData\WinDir\'
selection_dll:
ImageLoaded|endswith: '\uxtheme.dll'
filter_legit:
ImageLoaded|startswith:
- 'C:\Windows\System32\'
- 'C:\Windows\SysWOW64\'
condition: selection_process and selection_path and selection_dll and not filter_legit
falsepositives:
- Rare legitimate WinDirStat installations loading uxtheme.dll from non-system path
level: high
tags:
- attack.defense_evasion
- attack.t1574.001
- attack.t1574
---
# 规则 2:互斥锁创建
title: Cavern C2 Mutex Creation
id: a1b2c3d4-e5f6-4789-9abc-def012345678
status: experimental
description: >
Detects creation of Cavern C2 named mutexes
MYMUTEX123HELLP02 / MYMUTEX123HELLP04.
author: Threat Intel Team
date: 2026/08/03
logsource:
product: windows
category: file_event
detection:
selection_mutex:
TargetFilename|contains:
- 'MYMUTEX123HELLP02'
- 'MYMUTEX123HELLP04'
condition: selection_mutex
falsepositives:
- Unknown
level: critical
tags:
- attack.execution
- attack.t1480
- attack.persistence
---
# 规则 3:C2 域名连接(DNS 查询)
title: Cavern C2 Domain DNS Resolution
id: b2c3d4e5-f6a7-489a-bcde-f01234567890
status: experimental
description: >
Detects DNS queries to known Cavern C2 domains.
author: Threat Intel Team
date: 2026/08/03
logsource:
product: windows
category: dns_query
detection:
selection:
QueryName|endswith:
- 'hospitalinstallation.com'
- 'auth.hospitalinstallation.com'
- 'google.com.hospitalinstallation.com'
- 'adserviceupdate.com'
- 'hygienehistory.com'
condition: selection
falsepositives:
- Unlikely
level: critical
tags:
- attack.command_and_control
- attack.t1071.001
- attack.t1071
8.3 Suricata 规则
# 规则 1:固定 UA + X-User-token 自定义头组合检测
alert http $HOME_NET any -> $EXTERNAL_NET any (
msg:"[Cavern C2] Fixed Edge UA with X-User-token header ending 00";
flow:established,to_server;
http_user_agent; content:"Edg/";
http_header; content:"X-User-token|3a|";
pcre:"/X-User-token\s*:\s*[0-9A-Za-z+\/=]*00\r\n/H";
reference:url,example.com/cavern-c2-analysis;
classtype:trojan-activity;
sid:99000001; rev:1;
)
# 规则 2:C2 域名 SNI 检测
alert tls $HOME_NET any -> $EXTERNAL_NET any (
msg:"[Cavern C2] TLS SNI match to known Cavern C2 domain";
flow:established,to_server;
tls_sni; content:"hospitalinstallation.com";
reference:url,example.com/cavern-c2-analysis;
classtype:trojan-activity;
sid:99000002; rev:1;
)
# 规则 3:cac.aspx 端点访问
alert http $HOME_NET any -> $EXTERNAL_NET any (
msg:"[Cavern C2] Access to cac.aspx C2 endpoint with Edge UA";
flow:established,to_server;
http.uri; content:"/cac.aspx";
http_user_agent; content:"Edg/";
reference:url,example.com/cavern-c2-analysis;
classtype:trojan-activity;
sid:99000003; rev:1;
)
# 规则 4:视觉欺骗子域(google.com.hospitalinstallation.com)
alert http $HOME_NET any -> $EXTERNAL_NET any (
msg:"[Cavern C2] Visual deception subdomain google.com.hospitalinstallation.com";
flow:established,to_server;
http.host; content:"google.com.hospitalinstallation.com";
reference:url,example.com/cavern-c2-analysis;
classtype:trojan-activity;
sid:99000004; rev:1;
)
九、IoC 指标
| 类型 | 指标 | 说明 |
|---|---|---|
| 域名 | hospitalinstallation[.]com |
主 C2 域名(Fars Data 注册) |
| 域名 | auth.hospitalinstallation[.]com |
认证子域 |
| 域名 | google.com.hospitalinstallation[.]com |
视觉欺骗子域(伪装 Google) |
| 域名 | adserviceupdate[.]com |
备用 C2 |
| 域名 | hygienehistory[.]com |
备用 C2 |
| 互斥锁 | MYMUTEX123HELLP02 |
单实例锁 |
| 互斥锁 | MYMUTEX123HELLP04 |
单实例锁 |
| 路径 | C:\ProgramData\WinDir\WinDirStat.exe |
侧加载宿主可执行文件 |
| 配置文件 | config.txt(键:i、xd、int) |
Agent 运行配置 |
| 隐写文件 | .CvnC.png / .CvnA.png / .CvnR.png |
旧版隐写载荷载体 |
| 文件名 | uxtheme.dll |
Agent 伪装名 |
| 文件名 | n-HTCommp.dll / mhm.dll / db.dll / ode.dll / n-ten.dll / n-sws.dll |
各模块内部名 |
SHA-256 哈希等完整样本指纹因篇幅与时效性原因未在本文逐一列出,建议通过所在机构的威胁情报平台以"Cavern"或"Cav3rn"为关键词检索最新哈希集,并结合上述行为指标进行二次关联。
十、MITRE ATT&CK 映射
| 战术 | 技术 | ID | Cavern 对应行为 |
|---|---|---|---|
| 初始访问 | 鱼叉式钓鱼附件 | T1566.001 | 投递伪装文档/载荷 |
| 执行 | 用户执行 | T1204 | 诱导执行 WinDirStat.exe |
| 持久化 | 创建账户 / 计划任务 | T1136 / T1053 | Agent 持久化驻留 |
| 防御规避 | DLL 侧加载 | T1574.001 | WinDirStat.exe 加载伪造 uxtheme.dll |
| 防御规避 | 进程注入 | T1055 | Mixed-Mode 跨域调用 |
| 防御规避 | 混淆文件/信息 | T1027 | XOR + Base64 编码 |
| 凭据访问 | OS 凭据转储(DPAPI) | T1555 | mhm.dll 调用 DPAPI 解密 |
| 发现 | 账户发现 | T1087 | LDAP 模块 AD 枚举 |
| 发现 | 远程系统发现 | T1018 | 网络模块侦察 |
| 发现 | 数据库表枚举 | T1213 | db.dll 数据库枚举 |
| 横向移动 | 暴力破解 | T1110 | LDAP / SMB 暴力破解 |
| 命令控制 | 应用层协议(HTTPS) | T1071.001 | n-HTCommp.dll HTTPS 通道 |
| 命令控制 | 非标准端口/WebSocket | T1071 / T1105 | WebSocket 隧道 |
| 命令控制 | 代理(SOCKS5) | T1090 | n-sws.dll SOCKS5 隧道 |
| 数据外传 | 经 C2 通道外传 | T1041 | 加密回传至 C2 |
十一、总结与防御建议
Cavern 框架的工程价值在于其系统性:它并未在任何单一环节追求极致的密码学强度或零检测率,而是通过"三编译格式反分析梯度 + AppDomain 反取证 + 沙箱陷阱伪装 + 多通道混淆通信"的组合拳,将逆向与检测成本整体抬高。对防御方而言,应对 Cavern 类威胁的关键启示包括:
- 跨工具链分析能力:面对同时使用 IL-only、Mixed-Mode C++/CLI 与 NativeAOT 的样本,分析团队必须具备 .NET 反编译(ILSpy/dnSpyEx)与原生反汇编(IDA/Ghidra)的协同能力,尤其需要训练在 NativeAOT 二进制中识别 P/Invoke 描述符表的能力。
- 网络层特征优先:Cavern 的固定 UA、
X-User-token头、cac.aspx端点与 C2 SNI 构成了高信噪比的检测锚点,应优先在网络侧部署 Suricata 规则进行拦截与告警,而非依赖主机侧样本哈希。 - 行为取证而非静态扫描:AppDomain 瞬态加载使内存扫描窗口极短,建议结合 EDR 的行为链能力(进程创建、模块加载、互斥锁创建、可疑出站连接)构建行为检测,而非依赖单一静态特征。
- 基础设施情报运营:Cavern 的视觉欺骗子域(
google.com.hospitalinstallation.com)与伊朗本土托管商特征,应纳入域名信誉与注册商维度的持续监控。 - 关注"反分析分层"这一新趋势:Cavern 代表了一种值得警惕的演进方向——APT 组织开始像正规软件团队一样,有意识地利用现代编译工具链的特性(NativeAOT、C++/CLI)作为反分析武器。防御方需同步更新对现代 .NET 编译产物的认知与工具链。
威胁在演化,工具链在武器化。理解 Cavern,不仅是理解一个 C2 框架,更是理解现代 APT 如何将软件工程能力转化为对抗优势。希望本文的拆解与规则集能为蓝队的检测建设提供直接可用的参考。
本文基于公开威胁情报与样本分析整理,检测规则经脱敏与逻辑校验,部署前请在测试环境验证误报率。
浙公网安备 33010602011771号