
Informe de detección con Splunk para CVE-2026-54121 (CertiGhost): abuso del rastreo de certificados en AD CS que conduce al compromiso total del dominio. Detección validada en laboratorio, pasos de triaje e investigación de incidentes contra un DC en vivo.
Este documento describe la detección de Splunk creada para CVE-2026-54121. Sigue el formato estándar de casos de uso de detección para que pueda formar parte de un catálogo de detecciones de la misma manera en que lo mantendría un equipo real de ingeniería de detecciones.
Descripción general
Construcción de la detección
Respuesta y validación
Hoja de ruta
Metadatos
Alerta: Certighost ( CVE-2026-54121 )
Detecta el abuso del mecanismo de persecución de inscripción de certificados de AD CS descrito en CVE-2026-54121. La regla marca eventos del ciclo de vida de certificados en la CA en los que el objetivo de persecución proporcionado por el solicitante (el atributo cdc) no se resuelve al Controlador de dominio legítimo, que es el mecanismo exacto que Certighost utiliza para hacer que la CA emita un certificado que contiene datos de identidad del Controlador de dominio a un solicitante con pocos privilegios, lo que resulta en un compromiso total del dominio y su toma de control.
La detección se basa en el objetivo de persecución cdc en lugar de en la creación de cuentas de equipo porque el aviso de Microsoft para CVE-2026-54121 enumera la condición previa de la cuenta como un valor predeterminado de ms-DS-MachineAccountQuota o una cuenta que el atacante ya controla. Una regla basada en la creación de cuentas pasaría por alto por completo la segunda vía y también dependería de que la creación de la cuenta y la explotación ocurrieran dentro de la misma ventana temporal. La comprobación de cdc cubre ambas vías y no tiene esa dependencia.
Esta regla cubre la etapa de solicitud y emisión de certificados de la cadena de ataque.
| Táctica | Técnica (ID) | Evidencia |
|---|---|---|
| Escalada de privilegios | Abuso del mecanismo de control de elevación (T1548) | Un usuario de dominio con privilegios bajos escala a privilegios de controlador de dominio mediante un certificado AD CS falsificado |
| Acceso a credenciales | Robo o falsificación de certificados de autenticación (T1649) | Núcleo de Certighost: atributos cdc/rmd utilizados para obtener un certificado con material de identidad del DC |
| Acceso a credenciales | Volcado de credenciales del SO: DCSync (T1003.006) | TGT de la cuenta del DC utilizado para realizar la replicación MS-DRSR: extrae krbtgt y todos los hashes de cuentas |
| Acceso a credenciales | Golden Ticket (T1558.001) | Con el hash de krbtgt, el atacante falsifica TGT de Kerberos indefinidamente, sobreviviendo a los restablecimientos de contraseña |
| Evasión de defensas | Uso de material de autenticación alternativo: Pass-the-Ticket (T1550.003) | TGT basado en certificado utilizado para autenticarse como el DC, luego se realiza DCSync con ese TGT |
| Persistencia | Creación de cuenta: cuenta local (T1136.001) | Cuenta de equipo creada mediante ms-DS-MachineAccountQuota para autenticarse en un endpoint LDAP malicioso |
| Movimiento lateral | Uso de material de autenticación alternativo (T1550) | El certificado del DC otorga acceso completo a la red equivalente a la cuenta del controlador de dominio |
| Descubrimiento | Cuenta de dominio (T1087.002) | La enumeración LDAP inicial descubre la CA, el DC, el SID del dominio, el GUID y el valor de MAQ |
4886 (Solicitud de certificado recibida)4887 (Certificado emitido)4888 (Solicitud de certificado denegada)![Orígenes de registro confirmados en vivo en Splunk, host DC01, EventCodes 4886/4887 presentes, objetivo de búsqueda 172[.]66[.]66[.]33 extraído para los 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, luego issued o denied) se muestre como una sola fila.