
CVE-2026-54121 (Certighost) AD CS DC-Impersonation PoC. Gepatchte SAN-Verarbeitung + MAQ-sichere Kontowiederverwendung.
Ein funktionsfähiger Fork des Proof-of-Concept-Tools für CVE-2026-54121, auch bekannt als Certighost. Originalforschung und PoC von @H0j3n und @aniqfakhrul, ausführliche Analyse unter:
Dieser Fork behebt die SAN-Verarbeitung, die PKINIT auf CAs, die das angeforderte SAN berücksichtigen, am Erfolg hinderte, härtet das Parsing von --target-san und überarbeitet die Behandlung des Computerkontos, sodass die ms-DS-MachineAccountQuota nicht mehr ausgeschöpft wird.
Als Root ausführen, da die Rogue-LDAP- und SMB-Dienste die privilegierten Ports 389 und 445 benötigen.
sudo python3 certighost.py -d playground.local -u lowpriv -p 'Password1234' --dc-ip 192.168.1.10
Nach erfolgreichem Abschluss werden das Zielzertifikat (.pfx) und der Kerberos-Cache (.ccache) in das aktuelle Arbeitsverzeichnis geschrieben.
CERTIGHOST$, beim ersten Lauf erstellt) oder ein über --computer-name angegebenes verwenden.cdc-Attribut einbettet, das auf eine kontrollierte IP zeigt (über --listener; optional, wird bei Weglassen automatisch erkannt), sowie ein rmd-Attribut, das den DNS-Namen des Ziel-DCs trägt..ccache und den NT-Hash anzufordern.Das Original baute das SAN des Zertifikats sowohl in der CSR-Erweiterung subjectAltName als auch im Anforderungsattribut SAN:dns= aus dem Hostnamen des Rogue-Computers anstelle des FQDN des Ziel-DCs auf. Auf einer CA, die das angeforderte SAN berücksichtigt, trug das ausgestellte Zertifikat daher den dNSHostName des Rogue-Kontos, sodass PKINIT es dem falschen Principal zuordnete und mit folgendem Fehler fehlschlug:
KDC_ERR_CLIENT_NAME_MISMATCH(Reserved for PKINIT)
Das SAN verwendet nun den dNSHostName des Ziel-DCs (rmd_value / target_dns), auf den PKINIT ein Maschinenkonto abbildet. Das ausgestellte Zertifikat präsentiert nun DNS:<dc>.<domain> und die AS-REQ schließt als der DC ab.
--target-san--target-san akzeptiert nun jede der Formen MEEREEN, MEEREEN$ oder den FQDN meereen.essos.local (abgeglichen über sAMAccountName oder dNSHostName), statt nur der kurzen NAME-Form.
Das Original erstellte bei jedem Lauf ein neues zufälliges GHOST********$-Konto. Da über die ms-DS-MachineAccountQuota erstellte Computerkonten Domain-Admins gehören (nicht dem Ersteller), kann ein Benutzer mit geringen Rechten sie nicht löschen, sodass wiederholte Läufe das Kontingent (Standard: 10) schnell durch verwaiste Konten erschöpften.
Dieser Fork verwendet ein einziges stabiles Konto wieder (CERTIGHOST$, wird nur erstellt, wenn es noch nicht existiert), sodass das Kontingent nie wächst und es zwischen den Läufen nichts zu bereinigen gibt.
Wenn das Konto zum ersten Mal erstellt wird, gibt das Skript eine Warnung aus, die darauf hinweist, dass es in der AD zurückbleibt:
[!] WARNING: computer account CERTIGHOST$ was created and is left in AD.
Das Konto bleibt für die Wiederverwendung bei späteren Läufen erhalten. Um es vollständig zu entfernen, löschen Sie es mit einem Domain-Admin (dem Objektbesitzer):
Get-ADComputer CERTIGHOST | Remove-ADComputer -Confirm:$false
impacketcryptography, pyasn1, asn1crypto, pycryptodomexNur für autorisierte Sicherheitstests und zu Bildungszwecken. Verwenden Sie es nur gegen Systeme, für deren Test Sie eine ausdrückliche Genehmigung haben.