
GhostHound is a BloodHound OpenGraph extension that surfaces Active Directory tombstone reanimation as a first-class attack path, enumerating deleted objects via SHOW_DELETED, mapping who can restore them, and revealing when a reanimated identity regains privileged group membership.
GhostHound est une extension OpenGraph pour BloodHound dédiée à Active Directory. SharpHound et tous les autres collecteurs AD ignorent CN=Deleted Objects : les objets supprimés (tombstones) sont invisibles pour l'analyse standard des chemins d'attaque de BloodHound, alors même que la Corbeille AD et les mécanismes de réanimation de tombstones peuvent permettre à un principal suffisamment privilégié d'en restaurer un — et de prendre le contrôle de l'identité qu'il représente. GhostHound énumère les tombstones via LDAP avec le contrôle SHOW_DELETED, détermine qui peut réanimer chacun d'eux, et produit une charge utile JSON OpenGraph ainsi qu'une définition d'extension model.json pour que BloodHound CE v8+ puisse l'afficher comme une partie intégrante du graphe.
Usage autorisé uniquement. Cet outil est destiné à la sécurité offensive / aux tests d'intrusion autorisés et à la recherche en laboratoire de détection. Exécutez-le uniquement sur des environnements Active Directory pour lesquels vous avez une autorisation explicite de test.
Administrateurs (ou une délégation explicite d'accès en lecture à CN=Deleted Objects) sur le domaine cible. Les comptes non privilégiés ne peuvent pas voir le conteneur, quelle que soit la méthode d'authentification utilisée — il s'agit d'une restriction imposée par AD, que GhostHound ne peut pas contourner.ghosthound -d ghost.local --dc-ip 10.0.0.10 -u alice -o tombstones.json
Ordre de résolution du mot de passe : --password (à éviter — visible via ps//proc/<pid>/cmdline et l'historique du shell), puis la variable d'environnement LDAP_PASSWORD, puis une invite interactive si aucun n'est défini.
Par défaut, GhostHound se connecte via LDAPS (636) avec vérification du certificat activée. Deux options existent pour les environnements où cela ne convient pas :
--disable-ldaps — revenir au LDAP en clair (389). Le mot de passe de liaison est envoyé en texte clair ; à éviter sauf dans un laboratoire isolé.--insecure-tls — conserver LDAPS (transport chiffré) mais ignorer la vérification du certificat, pour les certificats auto-signés/de laboratoire qui ne sont pas dans votre magasin de confiance. Préférez cette option à --disable-ldaps lorsque le seul problème est le certificat du contrôleur de domaine.--timeout-secs (par défaut 30) limite à la fois la connexion initiale et chaque opération LDAP suivante, de sorte qu'un contrôleur de domaine inaccessible ou une --dc-ip erronée échoue dans cette fenêtre plutôt que de bloquer.
Exécutez ghosthound --help pour la liste complète des options.
GhostHound est construit comme un espace de travail privilégiant la bibliothèque — voir docs/adr/0001-language-rust-library-first.md pour la justification :
bloodhound-opengraph : constructeur JSON OpenGraph pour BloodHound (l'équivalent Rust du bhopengraph Python).ad-secdesc : analyseur syntaxique permissif, écrit à partir de zéro, pour ntSecurityDescriptor/DACL/ACE (voir docs/adr/0003-security-descriptor-parsing-strategy.md pour comprendre pourquoi il ne s'agit pas d'une dépendance au seul équivalent Rust existant, qui est sous licence GPL-3.0).ad-secdesc-oracle : banc d'essai différentiel interne non publié comparant ad-secdesc à cette crate GPL-3.0 en tant qu'oracle en boîte noire — isolé de la construction par défaut et du graphe de dépendances de toutes les crates publiées.ad-tombstone : énumération LDAP SHOW_DELETED, modélisation de l'état de la Corbeille AD et analyse des droits de réanimation.ghosthound : l'interface en ligne de commande qui orchestre le tout.crates/ad-tombstone/model.json pour enregistrer les types de nœuds GhostHound_TombstoneUser/GhostHound_TombstoneComputer/GhostHound_TombstoneGroup et les types de relations GhostHound_CanReanimate/GhostHound_WasMemberOf/GhostHound_SameAs (tous enregistrés comme traversables, afin qu'ils participent aux requêtes de chemin le plus court).crates/ad-tombstone/bridge_shadow_nodes.cypher directement contre Neo4j (la barre de recherche Cypher de BloodHound CE est en lecture seule et le rejettera) :
docker exec -i <graph-db-container> cypher-shell -u neo4j -p <password> < crates/ad-tombstone/bridge_shadow_nodes.cypher
Une fois reliés, le chemin de réanimation apparaît comme un chemin traversable normal — un tombstone qui était membre des Administrateurs du domaine avant la suppression, accessible par tout principal disposant du droit Réanimer les tombstones, relié au vrai nœud Administrateurs du domaine :

Ce projet accorde la priorité à une sécurité élevée dès le premier jour (docs/adr/0005-supply-chain-openssf-posture.md) :
cargo deny pour des interdictions strictes de copyleft/GPL et un audit des vulnérabilités.cargo fuzz pour la sécurité face aux paniques lors de l'analyse de descripteurs binaires bruts.unsafe dans les bibliothèques fondamentales.Le répertoire docs/adr/ enregistre les décisions derrière cette conception (choix du langage, périmètre d'authentification, contrainte de licence ad-secdesc, modèle de données de la Corbeille AD, posture de la chaîne d'approvisionnement), et docs/research/tombstone-viability-findings.md contient la recherche sous-jacente.
docs/adr/0006-opengraph-cross-source-node-identity.mdcrates/ad-tombstone/queries.json et, éventuellement, exécutez une fois crates/ad-tombstone/privilege_zones.cypher pour marquer les tombstones sous les unités d'organisation de niveau zéro comme de grande valeur — cela nécessite également cypher-shell plutôt que la barre de recherche, pour la même raison qu'à l'étape 3 (son SET est également une clause de mise à jour).