本文档描述了为 CVE-2026-54121 构建的 Splunk 检测。它遵循标准检测用例格式,因此可以像真实检测工程团队维护检测目录那样,将其纳入检测目录中。
概述
检测构建
响应与验证
路线图
元数据
告警:Certighost ( CVE-2026-54121 )
检测对 CVE-2026-54121 中描述的 AD CS 证书注册追踪机制的滥用。该规则会标记 CA 上的证书生命周期事件,其中请求方提供的追踪目标(cdc 属性)无法解析到合法的域控制器,这正是 Certighost 所使用的确切机制,使 CA 向低权限请求方签发包含域控制器身份数据的证书,从而导致完全域沦陷和接管。
该检测锚定在 cdc 追踪目标上,而不是计算机账户创建上,因为 Microsoft 针对 CVE-2026-54121 的公告 将账户前提条件列为默认 ms-DS-MachineAccountQuota 值或攻击者已控制的账户。以账户创建为键的规则会完全漏掉第二条路径,并且还依赖于账户创建和利用发生在同一时间窗口内。cdc 检查覆盖两条路径,且没有这种依赖关系。
该规则覆盖攻击链中的证书请求和签发阶段。
| 战术 | 技术(ID) | 证据 |
|---|---|---|
| 权限提升 | 滥用提权控制机制 (T1548) | 低权限域用户通过伪造 AD CS 证书提升至域控制器权限 |
| 凭据访问 | 窃取或伪造身份验证证书 (T1649) | Certighost 的核心 - 使用 cdc/rmd 属性获取包含 DC 身份材料的证书 |
| 凭据访问 | OS 凭据转储:DCSync (T1003.006) | 使用 DC 账户的 TGT 执行 MS-DRSR 复制 - 提取 krbtgt 及所有账户哈希 |
| 凭据访问 | 黄金票据 (T1558.001) | 利用 krbtgt 哈希,攻击者可无限期伪造 Kerberos TGT,在密码重置后仍能存活 |
| 防御规避 | 使用替代身份验证材料:传递票据 (T1550.003) | 使用基于证书的 TGT 以 DC 身份进行身份验证,然后使用该 TGT 执行 DCSync |
| 持久化 | 创建账户:本地账户 (T1136.001) | 通过 ms-DS-MachineAccountQuota 创建机器账户,用于对恶意 LDAP 端点进行身份验证 |
| 横向移动 | 使用替代身份验证材料 (T1550) | DC 证书授予等同于域控制器账户的完整网络访问权限 |
| 发现 | 域账户 (T1087.002) | 初始 LDAP 枚举发现 CA、DC、域 SID、GUID 及 MAQ 值 |
4886(收到证书请求)4887(证书已颁发)4888(证书请求被拒绝)![日志源已在 Splunk 中确认实时可用,主机 DC01,存在 EventCodes 4886/4887,已为请求 ID 12、13、14 提取追踪目标 172[.]66[.]66[.]33](images/log-sources.png)
index=wineventlog-lab sourcetype=WinEventLog source="WinEventLog:Security"
(EventCode=4886 OR EventCode=4887 OR EventCode=4888) cdc
| fields _time EventCode Request_ID Requester Attributes Subject host Message
| rex field=Message "(?m)^cdc:(?<chase_cdc>\S+)"
| where isnotnull(chase_cdc) AND lower(chase_cdc)!="dc01.atlasvec.lab"
| stats min(_time) as _time
values(Requester) as requester
values(Attributes) as template
values(chase_cdc) as chase_target
values(Subject) as cert_subject
values(EventCode) as codes
values(host) as ca_host
by Request_ID
| eval status = case(mvfind(codes,"4887")>=0,"ISSUED",
mvfind(codes,"4888")>=0,"DENIED",
true(),"PENDING")
| eval severity = "critical"
| sort - _time
| rename ca_host as "CA Host", Request_ID as "Request ID",
requester as "User Requester", template as "Certificate Template",
chase_target as "Chase Target (cdc)", cert_subject as "Issued Subject",
status as "Outcome", severity as "Severity",
_time as "Timestamp"
| table "Timestamp" "CA Host" "Request ID" "User Requester" "Certificate Template" "Chase Target (cdc)" "Issued Subject" "Outcome" "Severity"

事件按 Request ID 分组,因此一次恶意请求的完整生命周期(received,随后 issued 或 denied)会显示为单行。
此检测的初始版本将 Event ID 4741(计算机账户已创建)作为前置条件,依据是公开的概念验证展示了账户创建作为攻击链的一部分。然而,Microsoft 针对 CVE-2026-54121 的公告将机器账户前置条件列为默认的 ms-DS-MachineAccountQuota 值或攻击者已控制的机器账户。
攻击者若走第二条路径,会使用其已控制的机器账户,不会生成 4741 事件。该规则已更新为仅锚定 cdc chase 目标,从而在设计上覆盖两种利用路径。
这也消除了对账户创建与证书滥用发生在同一时间窗口内的依赖。攻击者可以在利用尝试之前或之后数天创建机器账户,规则仍会触发。
基础搜索范围限定为 DC01 上的 AD CS 安全审计事件(4886、4887、4888),并预筛选出包含字面字符串 "cdc" 的事件,因为只有 chase 滥用尝试才会在 Message 字段中携带该属性。
对于每个匹配事件,搜索会从 Message 字段的 cdc: 行中提取 chase 目标。该值缺失或匹配合法 DC FQDN(dc01.atlasvec.lab)的事件会被排除。
cdc 值指向任何其他目标的事件会被标记,因为这正是 CA 被指示在合法 DC 基础设施之外执行 chase 的确切条件,也是此 CVE 的核心利用点。
严重 - 固定值,直接设置在搜索逻辑中。不按等级计算,此规则产生的每个匹配都被视为严重,因为它检测的条件(CA 跟随请求者控制的 chase 到非 DC 目标)本身就是利用原语。
已针对本实验室于 2026-08-02 捕获的真实请求生命周期数据进行验证:

上述 PoC 运行端到端确认了完整攻击链,从恶意服务器搭建到证书请求再到凭据提取。下方的 Splunk 证据显示了在 CA 侧捕获的同一请求生命周期。
![请求 ID 12、13、14 的原始事件 4887:cdc:172[.]66[.]66[.]33,主题 CN=DC01.atlasvec.lab 颁发给每个 GHOST 账户](images/raw-events-malicious.png)
ATLASVEC\Administrator)显示追踪目标为 DC01.atlasvec.lab,即合法的 DC,并且正确地未触发该规则。
![告警输出表:请求 ID 12、13、14 被标记,追踪目标 172[.]66[.]66[.]33,结果 ISSUED,严重性 critical](images/alert-output.png)
完整的测试方法、已检查的前置条件以及更多截图单独记录在文档 2:检测验证报告中。
与该检测一同构建了一个配套的监控仪表板。它通过两个视图覆盖 Certighost 攻击链:一个 DC 监控选项卡,跟踪 AD CS 证书事件、DCSync 指标和机器账户活动;以及一个 SOC 概览选项卡,按严重性展示所有已触发的告警。
利用前的 DC 监控选项卡。所有四个 KPI 均为零:未触发任何与 DC 相关的告警,无追踪证书事件,无 DCSync 复制,未创建机器账户。

