
Splunk-Erkennungsbericht für CVE-2026-54121 (CertiGhost): Missbrauch der AD-CS-Zertifikatsverfolgung, der zur vollständigen Domänenkompromittierung führt. Laborvalidierte Erkennung, Triage-Schritte und Incident-Untersuchung gegen einen Live-DC.
Dieses Dokument beschreibt die für CVE-2026-54121 entwickelte Splunk-Erkennung. Es folgt dem Standardformat für Detection Use Cases, sodass es auf dieselbe Weise in einem Detection-Katalog geführt werden kann, wie es ein echtes Detection-Engineering-Team pflegen würde.
Überblick
Aufbau der Erkennung
Reaktion & Validierung
Roadmap
Metadaten
Alert : Certighost ( CVE-2026-54121 )
Erkennt den Missbrauch des AD CS-Mechanismus zur Verfolgung von Zertifikatsanmeldungen (Certificate Enrollment Chase), der in CVE-2026-54121 beschrieben wird. Die Regel markiert Zertifikats-Lebenszyklusereignisse auf der CA, bei denen das vom Antragsteller angegebene Chase-Ziel (das cdc-Attribut) nicht auf den legitimen Domain Controller auflöst – genau der Mechanismus, den Certighost nutzt, damit die CA einem gering privilegierten Antragsteller ein Zertifikat ausstellt, das Identitätsdaten des Domain Controllers enthält, was zur vollständigen Kompromittierung und Übernahme der Domäne führt.
Die Erkennung stützt sich auf das cdc-Chase-Ziel und nicht auf die Erstellung von Computerkonten, da Microsofts Advisory zu CVE-2026-54121 als Kontovoraussetzung entweder einen Standardwert von ms-DS-MachineAccountQuota oder ein Konto nennt, das der Angreifer bereits kontrolliert. Eine Regel, die auf die Kontoerstellung abzielt, würde den zweiten Pfad vollständig verfehlen und zudem davon abhängen, dass Kontoerstellung und Ausnutzung innerhalb desselben Zeitfensters stattfinden. Die cdc-Prüfung deckt beide Pfade ab und hat keine solche Abhängigkeit.
Diese Regel deckt die Phase der Zertifikatsanforderung und -ausstellung in der Angriffskette ab.
| Taktik | Technik (ID) | Nachweis |
|---|---|---|
| Rechteausweitung | Missbrauch von Elevation-Control-Mechanismen (T1548) | Domänenbenutzer mit geringen Rechten eskaliert über ein gefälschtes AD CS-Zertifikat zu Domänencontroller-Rechten |
| Zugangsdatenzugriff | Stehlen oder Fälschen von Authentifizierungszertifikaten (T1649) | Kern von Certighost – cdc/rmd-Attribute werden genutzt, um ein Zertifikat mit Identitätsmaterial des DC zu erhalten |
| Zugangsdatenzugriff | OS Credential Dumping: DCSync (T1003.006) | TGT für das DC-Konto wird zur Durchführung der MS-DRSR-Replikation verwendet – extrahiert krbtgt und alle Konto-Hashes |
| Zugangsdatenzugriff | Golden Ticket (T1558.001) | Mit dem krbtgt-Hash fälscht der Angreifer unbegrenzt Kerberos-TGTs, die Passwortzurücksetzungen überstehen |
| Verteidigungsumgehung | Verwendung alternativen Authentifizierungsmaterials: Pass-the-Ticket (T1550.003) | Zertifikatsbasiertes TGT wird zur Authentifizierung als DC verwendet, anschließend wird DCSync mit diesem TGT durchgeführt |
| Persistenz | Konto erstellen: Lokales Konto (T1136.001) | Maschinenkonto wird über ms-DS-MachineAccountQuota erstellt, um sich an einem bösartigen LDAP-Endpunkt zu authentifizieren |
| Laterale Bewegung | Verwendung alternativen Authentifizierungsmaterials (T1550) | Das DC-Zertifikat gewährt vollständigen Netzwerkzugriff, der dem Domänencontroller-Konto entspricht |
| Entdeckung | Domänenkonto (T1087.002) | Die anfängliche LDAP-Enumeration entdeckt CA, DC, Domänen-SID, GUID und MAQ-Wert |
4886 (Zertifikatsanforderung empfangen)4887 (Zertifikat ausgestellt)4888 (Zertifikatsanforderung abgelehnt)![Protokollquellen live in Splunk bestätigt, Host DC01, EventCodes 4886/4887 vorhanden, Verfolgungsziel 172[.]66[.]66[.]33 für Request-IDs 12, 13, 14 extrahiert](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"

received, dann issued oder denied) als eine einzige Zeile angezeigt wird.