Les origines de RustHound-CE
Retex sur le collecteur BloodHound écrit en Rust, pourquoi je l'avais créé à l'origine, et pourquoi le virage de BloodHound vers la Community Edition m'a amené à sortir RustHound-CE.
Sommaire
English version here.
TL;DR
Il y a quelques années (en début d'année 2021, déjà plus de 5 ans..), j'ai développé RustHound, un collecteur de données Active Directory pour BloodHound, en Rust. L'idée était simple, un seul binaire, multiplateforme, à déposer sur n'importe quelle cible. Depuis, BloodHound a pris un virage majeur avec sa Community Edition, et le modèle de données a changé. Du coup, j'ai sorti RustHound-CE, la version compatible avec cette nouvelle version. Cet article, c'est un petit retex sur le pourquoi de l'outil à l'origine, et sur ce que change ce passage à la CE.
C'est quoi RustHound, déjà ?
Pour ceux qui découvre RustHound-CE, un petit rappel. RustHound est un collecteur de données Active Directory via LDAP. Pour faire simple, il interroge l'annuaire d'un domaine (utilisateurs, groupes, machines, ACL, relations d'approbation...) et génère des fichiers JSON que BloodHound ingère ensuite pour cartographier le tout sous forme de graphe.
BloodHound est créé et maintenu par la société SpecterOps, et cet outil utilise la théorie des graphes pour mettre en évidence les mauvaises configurations d'un AD et tracer des chemins d'attaque. C'est un outil utile autant à une Red Team, pour trouver comment grimper jusqu'au Domain Admin, qu'à une Blue Team, pour voir ses propres failles avant les autres. On peut même dire que c'est aujourd'hui une référence et un outil incontournable au cours d'un audit interne orienté Active Directory.
Le collecteur officiel, c'est SharpHound, écrit en C#. Il existe aussi BloodHound.py développé par @_dirkjan en Python et depuis très peu de temps une version Golang TUI nommée flashingestor développée par @MacmodSec. RustHound, comme son nom l'indique, c'est la même idée mais en Rust. Et ce choix de langage n'est pas anodin.
Pourquoi RustHound à l'origine
À l'époque, chez Armature Technologies (devenu Opencyber, puis NeverHack), on tombait régulièrement sur les mêmes galères en mission, et c'est ce qui a motivé le projet.
Premier cas, un test d'intrusion externe où l'on avait compromis un serveur Web dont l'authentification était basée sur un annuaire Active Directory. Depuis ce serveur Linux compromis, impossible d'avoir une connexion sortante, donc pas de proxy SOCKS ni de port forwarding. Dans ce scénario, SharpHound.exe est inutilisable, il est pensé pour Windows. L'alternative, BloodHound.py, s'appuie sur impacket et demande un paquet de dépendances Python pour tourner. Sans python3 installé sur le serveur et sans possibilité d'installer quoi que ce soit, c'était impossible, et frustrant de ne pas pouvoir récupérer le contenu de l'annuaire depuis cet environnement pour le grapher.
Deuxième cas, après compromission d'un poste Windows 10, SharpHound.exe se faisait tout simplement bloquer. Sa signature est connue, son comportement aussi. N'importe quel antivirus le détecte, et un SOC repère facilement son utilisation sur un SI.
Et à l'époque, je n'avais pas les connaissances nécessaires pour facilement packer et contourner les protections en place (AV, EDR...).
Et troisième raison, plus personnelle, un collègue adore le Rust et m'avait mis au défi de m'y mettre. J'ai accepté le challenge, et RustHound est né de tout ça.
D’ailleurs, petite anecdote : un peu plus et c’était un GoHound ! J’avais hésité à me mettre au Golang plutôt qu’au Rust début 2021, héhé.
Et maintenant je fais tout en Rust pour mes missions Red Team, donc merci Charles !
Le virage BloodHound Community Edition
Là où ça devient intéressant pour cet article. En 2023, SpecterOps a sorti BloodHound Community Edition. Ce n'est pas une mise à jour cosmétique, c'est une réécriture de fond en comble, sur la même base de code que BloodHound Enterprise. Nouvelle architecture, multi-utilisateur, API, authentification, une vraie interface web, bref un autre monde que le BloodHound « Legacy » qu'on connaissait. J'ai eu beaucoup de retour d'auditeur qui hésitaient à passer à cette nouvelle version.
Qui dit nouvelle plateforme dit nouveau modèle de données côté ingestion. Et c'est là que ça coince pour un collecteur : les fichiers produits pour le BloodHound d'avant ne rentrent plus tels quels dans la Community Edition. Il fallait donc un collecteur qui parle le langage de la CE.
RustHound-CE, ce qui change
Plutôt que de casser l'existant, j'ai choisi de produire un nouveau projet.
Le RustHound d'origine reste maintenu sur le git NeverHack et sert le BloodHound Legacy. Et RustHound-CE, cible BloodHound Community Edition. Il génère les JSON au format attendu par la CE, et il n'est compatible qu'avec elle. Si vous êtes passés à BloodHound CE, c'est RustHound-CE qu'il vous faut.
La philosophie, elle, ne bouge pas. Toujours du Rust, toujours un binaire unique, cross-compilé pour Linux, Windows et macOS, à déposer sur la cible sans dépendances à installer. Ce qui faisait l'intérêt de RustHound au départ reste le cœur de RustHound-CE.
Ce qu'il sait faire aujourd'hui
RustHound-CE fait aujourd'hui bien plus qu'une simple collecte LDAP.
S'authentifier, de toutes les façons utiles
En mission, on ne part jamais avec le même matériel. RustHound-CE couvre donc large :
- Simple bind identifiant / mot de passe, avec possibilité de le saisir au prompt.
- Pass-the-Hash NTLM, quand on a le hash NT et pas le mot de passe en clair.
- Kerberos, via un ticket en cache.
- Pass-the-Certificate (PFX ou PEM), RustHound-CE sait s'authentifier directement avec un certificat et sa clé privée. C'est d'ailleurs la même brique d'auth que j'ai sortie en standalone avec PassTheCert-rs.
- Le tout sur LDAP (389) ou LDAPS (636).
Ce qu'il collecte
Au-delà des objets classiques (utilisateurs, groupes, machines, OU, GPO, conteneurs, domaines), RustHound-CE ramène aussi tout ce qui touche à AD CS, ce qui est précieux vu la surface d'attaque autour des certificats, les autorités (root, enterprise, AIA), les modèles de certificats, les politiques d'émission et le NTAuthStore. Le tout empaqueté dans un .zip prêt pour BloodHound CE.
Les modules et collecteurs
C'est là qu'il a bien grossi :
- LAPS : récupération automatique des mots de passe administrateur local, quand le compte a les droits de lecture.
- FQDN resolver (
--fqdn-resolver) : résolution DNS des machines pour afficher leurs IP. - Sessions : collecte des sessions utilisateur via SRVSVC, WKSSVC et WINREG.
- GPO depuis SYSVOL : analyse des GptTmpl.inf, Groups.xml et GPOChanges.
- Groupes locaux via SAMR.
- Probe WebClient/WebDAV (utile pour les scénarios de relais) et détection des endpoints d'enrôlement HTTP d'AD CS.
La méthode de collecte se pilote avec -c (All par défaut, ou DCOnly/LdapOnly pour ne faire que du LDAP et rester discret).
Les relations qui comptent
Côté graphe, les ACE qui dessinent les beaux chemins d'attaque sont là : GenericAll, GenericWrite, WriteDacl, WriteOwner, Owns, AllExtendedRights, AddKeyCredentialLink, les droits DCSync (GetChanges, GetChangesAll, GetChangesInFilteredSet) et les droits liés aux autorités de certification (Enroll, AutoEnroll, ManageCA, ManageCertificates).
Pour donner un ordre d'idée, la couverture tourne autour de 86% des attributs par rapport à SharpHound v2.16, et ça continue de monter.
Et en bonus, une bibliothèque
RustHound-CE peut aussi être utilisé comme bibliothèque Rust, pour réutiliser sa brique de collecte dans vos propres outils. C'est d'ailleurs ce qui m'a servi de base pour d'autres projets. Plus d'information sur son intégration à vos projets Rust ici.
La liste complète et à jour est dans le HELP.md et la ROADMAP.md du dépôt.
Exemples d'usage
Quelques commandes concrètes (ici sur le lab GOAD) :
# Collecte complète, sortie en zip prêt pour BloodHound CE
rusthound-ce -d north.sevenkingdoms.local -u 'jeor.mormont@north.sevenkingdoms.local' -p '_L0ngCl@w_' -o /tmp/demo -z
# Mode DCOnly, plus discret (LDAP uniquement)
rusthound-ce -c DCOnly -d north.sevenkingdoms.local -u 'jeor.mormont@north.sevenkingdoms.local' -p '_L0ngCl@w_' -o /tmp/demo -z
# En ciblant directement l'IP du DC
rusthound-ce -d north.sevenkingdoms.local -i 192.168.56.11 -u 'jeor.mormont@north.sevenkingdoms.local' -p '_L0ngCl@w_' -o /tmp/demo -z
# En LDAPS sur un port custom
rusthound-ce -d north.sevenkingdoms.local --ldaps -P 3636 -u 'jeor.mormont@north.sevenkingdoms.local' -p '_L0ngCl@w_' -o /tmp/demo -z
# Authentification Kerberos via ticket en cache
export KRB5CCNAME="/tmp/jeor.mormont.ccache"
rusthound-ce -d sevenkingdoms.local -f kingslanding -k -z
# Avec résolution FQDN des machines
rusthound-ce -d essos.local -u 'daenerys.targaryen@essos.local' -p 'BurnThemAll!' -o /tmp/demo --fqdn-resolver -z
# Authentification LDAPS (636), PEM cert + key
rusthound-ce -d ESSOS.LOCAL -f MEEREEN.ESSOS.LOCAL --crt daenerys.crt --key daenerys.key -o /tmp/demo --ldaps -c All -z -v
Installation la plus simple : cargo install rusthound-ce. Sinon, make release depuis les sources, ou le Dockerfile fourni qui embarque toutes les dépendances.
Les binaires sont également disponibles en version pré-compilées sur le GitHub.
Voici un exemple d'utilisation avec authentificaiton par Certificat :

Red & Blue
BloodHound a toujours été un outil à double lecture, et RustHound-CE ne change rien à ça.
Côté Red Team, c'est le collecteur qu'on dépose pour cartographier l'AD et trouver les chemins vers les comptes à privilèges, même dans les scénarios tordus (Linux sans sortie, poste Windows où le collecteur officiel se fait bloquer).
Côté Blue Team, deux choses à garder en tête. D'abord, utilisez-le sur votre propre annuaire, voir son AD comme un attaquant le voit, c'est le meilleur moyen de prioriser les corrections. Ensuite, côté détection, une collecte BloodHound génère un volume important de requêtes LDAP en peu de temps. C'est précisément ce genre de motif qu'un bon monitoring LDAP peut faire remonter. Le mode -c DCOnly est plus discret que le mode complet, mais reste une rafale de requêtes annuaire inhabituelle pour un compte lambda.
Un mot d'honnêteté sur l'évasion AV, à sa sortie, l'intérêt de RustHound était notamment de ne pas avoir la signature ni le comportement réseau de SharpHound. Mais ça, ça vit dans le temps. Ne considérez jamais un collecteur comme « indétectable » par principe, testez dans votre contexte et sur vos lab. Mais au aujourd'hui en octobre 2026 rusthound-ce.exe reste non identifié comme malveillant au dépot sur un poste avec Defender à jour.
Crédits et liens
-
RustHound-CE (compatible BloodHound CE) : github.com/g0h4n/RustHound-CE
-
RustHound d'origine (BloodHound Legacy), maintenu côté NeverHack : github.com/NeverHack/RustHound
-
BloodHound Community Edition, par SpecterOps : github.com/SpecterOps/BloodHound
-
SharpHound, le collecteur officiel : github.com/SpecterOps/SharpHound
-
BloodHound.py, le collecteur Python par dirkjanm : github.com/dirkjanm/BloodHound.py
-
Flashingestor, un collecteur TUI en Golang par MacmodSec : github.com/Macmod/flashingestor
-
GOAD, le lab AD pour s'entraîner : github.com/Orange-Cyberdefense/GOAD
-
Podcast Hack'n Speak : 0x1A - @g0h4n | Retour sur la création de RustHound, l'outil crossplateforme plus rapide que..
Et pour l'histoire, l'article d'origine qui présentait RustHound à sa sortie est toujours lisible via web.archive.org.