
Analyse de détection Splunk pour CVE-2026-54121 (CertiGhost) : abus de la chasse aux certificats AD CS menant au compromis complet du domaine. Détection validée en laboratoire, étapes de triage et investigation d'incident sur un DC réel.
Ce document décrit la détection Splunk conçue pour CVE-2026-54121. Il suit le format standard de cas d'usage de détection afin de pouvoir figurer dans un catalogue de détections de la même manière qu'une véritable équipe d'ingénierie de détection le maintiendrait.
Vue d'ensemble
Construction de la détection
Réponse et validation
Feuille de route
Métadonnées
Alerte : Certighost ( CVE-2026-54121 )
Détecte l'exploitation du mécanisme de poursuite d'inscription de certificats AD CS décrit dans CVE-2026-54121. La règle signale les événements du cycle de vie des certificats sur l'autorité de certification (CA) lorsque la cible de poursuite fournie par le demandeur (l'attribut cdc) ne correspond pas au contrôleur de domaine légitime, ce qui est exactement le mécanisme utilisé par Certighost pour amener la CA à délivrer un certificat contenant les données d'identité du contrôleur de domaine à un demandeur peu privilégié, aboutissant à une compromission complète du domaine et à sa prise de contrôle.
La détection est ancrée sur la cible de poursuite cdc plutôt que sur la création de comptes machine, car l'avis de Microsoft pour CVE-2026-54121 indique comme précondition de compte soit une valeur par défaut de ms-DS-MachineAccountQuota, soit un compte déjà contrôlé par l'attaquant. Une règle basée sur la création de comptes manquerait entièrement le second chemin, et dépendrait également du fait que la création de compte et l'exploitation se produisent dans la même fenêtre temporelle. La vérification du cdc couvre les deux chemins et ne présente pas une telle dépendance.
Cette règle couvre l'étape de demande et de délivrance de certificat de la chaîne d'attaque.
| Tactic | Technique (ID) | Preuve |
|---|---|---|
| Élévation de privilèges | Abuse Elevation Control Mechanism (T1548) | Un utilisateur de domaine à faibles privilèges obtient les privilèges de contrôleur de domaine via un certificat AD CS falsifié |
| Accès aux identifiants | Steal or Forge Authentication Certificates (T1649) | Cœur de Certighost - attributs cdc/rmd utilisés pour obtenir un certificat avec le matériel d'identité du DC |
| Accès aux identifiants | OS Credential Dumping: DCSync (T1003.006) | TGT du compte DC utilisé pour effectuer la réplication MS-DRSR - extrait le krbtgt et tous les hachages de comptes |
| Accès aux identifiants | Golden Ticket (T1558.001) | Avec le hachage krbtgt, l'attaquant forge indéfiniment des TGT Kerberos, survivant aux réinitialisations de mot de passe |
| Évasion de défense | Use Alternate Authentication Material: Pass-the-Ticket (T1550.003) | TGT basé sur certificat utilisé pour s'authentifier en tant que DC, puis DCSync effectué avec ce TGT |
| Persistance | Create Account: Local Account (T1136.001) | Compte machine créé via ms-DS-MachineAccountQuota pour authentifier un point de terminaison LDAP malveillant |
| Mouvement latéral | Use Alternate Authentication Material (T1550) | Le certificat DC accorde un accès réseau complet équivalent au compte du contrôleur de domaine |
| Découverte | Domain Account (T1087.002) | L'énumération LDAP initiale découvre l'autorité de certification, le DC, le SID de domaine, le GUID et la valeur MAQ |
4886 (Demande de certificat reçue)4887 (Certificat délivré)4888 (Demande de certificat refusée)![Sources de journaux confirmées en direct dans Splunk, hôte DC01, EventCodes 4886/4887 présents, cible de chasse 172[.]66[.]66[.]33 extraite pour les Request IDs 12, 13, 14](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, puis issued ou denied) apparaisse sur une seule ligne.