
CVE-2026-54121 (Certighost) PoC de suplantación de DC en AD CS. Manejo de SAN corregido + reutilización de cuentas segura para MAQ.
Un fork funcional de la herramienta de prueba de concepto para CVE-2026-54121, también conocida como Certighost. Investigación original y PoC por @H0j3n y @aniqfakhrul, con análisis detallado en:
Este fork corrige el manejo de la SAN que impedía que PKINIT tuviera éxito en CAs que respetan la SAN solicitada, refuerza el análisis de --target-san y reelabora el manejo de la cuenta de equipo para que ya no agote la ms-DS-MachineAccountQuota.
Ejecuta como root porque los servicios LDAP y SMB falsos requieren los puertos privilegiados 389 y 445.
sudo python3 certighost.py -d playground.local -u lowpriv -p 'Password1234' --dc-ip 192.168.1.10
Al completarse correctamente, el certificado objetivo (.pfx) y la caché de Kerberos (.ccache) se escriben en el directorio de trabajo actual.
CERTIGHOST$, creada en la primera ejecución) o utiliza una especificada mediante --computer-name.cdc que apunta a una IP controlada (mediante --listener; opcional, se autodetecta si se omite) junto con un atributo rmd que contiene el nombre DNS del DC objetivo..ccache y el hash NT.El original construía la SAN del certificado tanto desde la extensión subjectAltName de la CSR como desde el atributo de solicitud SAN:dns=, usando el nombre de host del equipo falso en lugar del FQDN del DC objetivo. En una CA que respeta la SAN solicitada, el certificado emitido llevaba por tanto el dNSHostName de la cuenta falsa, por lo que PKINIT lo mapeaba al principal equivocado y fallaba con:
KDC_ERR_CLIENT_NAME_MISMATCH(Reserved for PKINIT)
La SAN ahora usa el dNSHostName del DC objetivo (rmd_value / target_dns), que es sobre lo que PKINIT mapea una cuenta de equipo. El certificado emitido ahora presenta DNS:<dc>.<domain> y la AS-REQ se cierra como el DC.
--target-san más robusto--target-san ahora acepta cualquiera de MEEREEN, MEEREEN$ o el FQDN meereen.essos.local (la coincidencia se realiza por sAMAccountName o dNSHostName), en lugar de solo la forma corta NAME.
El original creaba una nueva cuenta aleatoria GHOST********$ en cada ejecución. Dado que las cuentas de equipo creadas mediante ms-DS-MachineAccountQuota son propiedad de los administradores de dominio (no del creador), un usuario con pocos privilegios no puede eliminarlas, por lo que las ejecuciones repetidas agotaban rápidamente la cuota (10 por defecto) con cuentas huérfanas.
Este fork reutiliza una única cuenta estable (CERTIGHOST$, creada solo si no existe), por lo que la cuota nunca crece y no hay nada que limpiar entre ejecuciones.
Cuando la cuenta se crea por primera vez, el script imprime un aviso indicando que queda en AD:
[!] WARNING: computer account CERTIGHOST$ was created and is left in AD.
La cuenta permanece para reutilizarse en ejecuciones posteriores. Para eliminarla por completo, bórrala con un administrador de dominio (el propietario del objeto):
Get-ADComputer CERTIGHOST | Remove-ADComputer -Confirm:$false
impacketcryptography, pyasn1, asn1crypto, pycryptodomexSolo para pruebas de seguridad autorizadas y fines educativos. Úsalo únicamente contra sistemas en los que tengas permiso explícito para realizar pruebas.