
GhostHound è un'estensione di BloodHound OpenGraph che mette in evidenza la riattivazione dei tombstone di Active Directory come percorso di attacco di prima classe, enumerando gli oggetti eliminati tramite SHOW_DELETED, mappando chi può ripristinarli e rivelando quando un'identità riattivata riacquista l'appartenenza a un gruppo privilegiato.
GhostHound è un'estensione OpenGraph per Active Directory di BloodHound. SharpHound e tutti gli altri collezionisti AD saltano CN=Deleted Objects: gli oggetti eliminati (tombstones) sono invisibili all'analisi standard dei percorsi di attacco di BloodHound, anche se il Cestino di AD e i meccanismi di riattivazione dei tombstones possono permettere a un'entità con privilegi sufficienti di ripristinarne uno — e assumere l'identità che rappresenta. GhostHound enumera i tombstones su LDAP con il controllo SHOW_DELETED, determina chi può riattivare ciascuno, e produce un payload JSON OpenGraph più una definizione di estensione model.json in modo che BloodHound CE v8+ possa renderizzare questo come una parte di prima classe del grafo.
Solo per uso autorizzato. Questo è uno strumento di sicurezza offensiva / red-team pensato per test di penetrazione autorizzati e ricerca in laboratori di rilevamento. Eseguilo solo su ambienti Active Directory che sei esplicitamente autorizzato a testare.
Administrators (o una delega esplicita di accesso in lettura a CN=Deleted Objects) sul dominio di destinazione. Gli account non privilegiati non possono vedere affatto il contenitore, indipendentemente dal metodo di autenticazione utilizzato — questa è una restrizione imposta da AD, non qualcosa che GhostHound può aggirare.ghosthound -d ghost.local --dc-ip 10.0.0.10 -u alice -o tombstones.json
Ordine di risoluzione della password: --password (da evitare — visibile via ps//proc/<pid>/cmdline e cronologia della shell), poi la variabile d'ambiente LDAP_PASSWORD, poi un prompt interattivo se nessuno dei due è impostato.
Per impostazione predefinita GhostHound si connette su LDAPS (636) con verifica del certificato attiva. Esistono due flag per ambienti in cui ciò non è adatto:
--disable-ldaps — torna a LDAP in chiaro (389). La password di bind viene inviata in testo chiaro; evitare questo tranne che in un laboratorio isolato.--insecure-tls — mantiene LDAPS (trasporto crittografato) ma salta la verifica del certificato, per certificati autofirmati/di laboratorio che non sono nel tuo trust store. Preferire questo a --disable-ldaps ogni volta che il problema è solo il certificato del DC.--timeout-secs (default 30) limita sia la connessione iniziale che ogni successiva operazione LDAP, quindi un DC irraggiungibile o un --dc-ip errato falliscono entro quella finestra invece di rimanere in attesa.
Esegui ghosthound --help per l'elenco completo dei flag.
GhostHound è costruito come un workspace incentrato sulle librerie — vedere docs/adr/0001-language-rust-library-first.md per la motivazione:
bloodhound-opengraph: costruttore JSON OpenGraph di BloodHound (la controparte Rust del bhopengraph di Python).ad-secdesc: parser da zero con licenza permissiva per ntSecurityDescriptor/DACL/ACE (vedi docs/adr/0003-security-descriptor-parsing-strategy.md per il motivo per cui questa non è una dipendenza dall'unico equivalente Rust esistente, che è GPL-3.0).ad-secdesc-oracle: test harness differenziale interno e non pubblicato che confronta ad-secdesc con quella crate GPL-3.0 come oracolo black-box — messo in quarantena fuori dalla build predefinita e dal grafo delle dipendenze di ogni crate pubblicato.ad-tombstone: enumerazione LDAP SHOW_DELETED, modellazione dello stato del Cestino di AD e analisi dei diritti di riattivazione.ghosthound: la CLI che orchestra quanto sopra.crates/ad-tombstone/model.json una volta per registrare i tipi di nodo GhostHound_TombstoneUser/GhostHound_TombstoneComputer/GhostHound_TombstoneGroup e i tipi di relazione GhostHound_CanReanimate/GhostHound_WasMemberOf/GhostHound_SameAs (tutti registrati come traversabili, quindi partecipano alle query sul percorso più breve).crates/ad-tombstone/bridge_shadow_nodes.cypher direttamente contro Neo4j (la barra di ricerca Cypher di BloodHound CE è di sola lettura e lo rifiuterà):
docker exec -i <graph-db-container> cypher-shell -u neo4j -p <password> < crates/ad-tombstone/bridge_shadow_nodes.cypher
docs/adr/0006-opengraph-cross-source-node-identity.md. Questo script li collega in modo che i percorsi siano effettivamente traversabili. Sicuro da rieseguire dopo ogni importazione.Una volta collegati, il percorso di riattivazione viene visualizzato come un normale percorso traversabile — un tombstone che era un membro di Domain Admins prima dell'eliminazione, raggiungibile da ogni entità con il diritto Reanimate-Tombstones, collegato al nodo reale di Domain Admins:

Questo progetto dà priorità alla sicurezza ad alta affidabilità fin dal primo giorno (docs/adr/0005-supply-chain-openssf-posture.md):
cargo deny per divieti rigorosi di copyleft/GPL e audit delle vulnerabilità.cargo fuzz per la sicurezza in caso di panico nell'analisi di descrittori binari grezzi.unsafe nelle librerie fondamentali.La directory docs/adr/ registra le decisioni alla base di questo progetto (scelta del linguaggio, ambito di autenticazione, il vincolo di licenza di ad-secdesc, il modello dati del Cestino di AD, postura della supply chain), e docs/research/tombstone-viability-findings.md contiene la ricerca sottostante.
crates/ad-tombstone/queries.json e, opzionalmente, esegui crates/ad-tombstone/privilege_zones.cypher una volta per contrassegnare i tombstones nelle OU di Tier Zero come ad alto valore — anche questo richiede cypher-shell invece della barra di ricerca, per lo stesso motivo del punto 3 (anche il suo SET è una clausola di aggiornamento).