
Un outil Python permettant de cartographier facilement les droits d’accès des partages réseau dans les OpenGraphs BloodHound
Un outil pour cartographier les droits d'accès des partages réseau dans des OpenGraphs BloodHound.
Lisez l'article de blog associé : https://specterops.io/blog/2025/10/30/sharehound-an-opengraph-collector-for-network-shares/
Ce dépôt contient deux implémentations de ShareHound. Elles partagent le même objectif — produire du JSON OpenGraph BloodHound à partir des permissions SMB des partages — mais diffèrent par le langage, l'exécution et l'ensemble des fonctionnalités. Choisissez celle qui correspond à votre flux de travail.
| Implémentation | Chemin | Auteur | Idéal pour |
|---|---|---|---|
| Python | Python/ | Remi Gascou (@podalirius_) @ SpecterOps | L'implémentation de référence ; facile à étendre et à script |
| Go | Go/ | Javier Azofra @ Siemens Healthineers | Analyses à grande échelle (60 000+ hôtes), points de contrôle, binaires statiques |
Chaque sous-répertoire possède son propre README avec l'installation complète, l'utilisation et la configuration :
--effective-access-only pour réduire drastiquement la taille du graphe sur les grands environnementsUne fois l'OpenGraph importé dans BloodHound, ces requêtes couvrent les besoins les plus courants. Pour plus de détails, consultez les README de chaque implémentation.
MATCH (p)-[r]->(s:NetworkShareSMB)
WHERE (p)-[:CanDelete]->(s)
AND (p)-[:CanDsControlAccess]->(s)
AND (p)-[:CanDsCreateChild]->(s)
AND (p)-[:CanDsDeleteChild]->(s)
AND (p)-[:CanDsDeleteTree]->(s)
AND (p)-[:CanDsListContents]->(s)
AND (p)-[:CanDsListObject]->(s)
AND (p)-[:CanDsReadProperty]->(s)
AND (p)-[:CanDsWriteExtendedProperties]->(s)
AND (p)-[:CanDsWriteProperty]->(s)
AND (p)-[:CanReadControl]->(s)
AND (p)-[:CanWriteDacl]->(s)
AND (p)-[:CanWriteOwner]->(s)
RETURN p,r,s
MATCH x=(p)-[r:CanWriteDacl|CanWriteOwner|CanDsWriteProperty|CanDsWriteExtendedProperties]->(s:NetworkShareSMB)
RETURN x
MATCH p=(h:NetworkShareHost)-[:HasNetworkShare]->(s:NetworkShareSMB)-[:Contains*0..]->(f:File)
WHERE toLower(f.name) = toLower("flag.txt")
RETURN p
MATCH p=(h:NetworkShareHost)-[:HasNetworkShare]->(s:NetworkShareSMB)-[:Contains*0..]->(f:File)
WHERE toLower(f.extension) = toLower(".vmdk")
RETURN p
Les arêtes CanEffectiveRead / CanEffectiveWrite / CanEffectiveExecute sont émises
par l'implémentation Go lorsque le même SID possède des droits correspondants à la fois sur le partage
et au niveau NTFS — c'est-à-dire l'accès réel accordé via SMB.
MATCH p=(principal)-[:CanEffectiveRead]->(f:File)
RETURN p
Les pull requests sont les bienvenues pour l'une ou l'autre implémentation. Ouvrez une issue si vous souhaitez discuter d'une nouvelle fonctionnalité au préalable.