
Ein Python-Tool, um die Zugriffsrechte von Netzwerkfreigaben einfach in BloodHound-OpenGraphs abzubilden.
Ein Tool, um die Zugriffsrechte von Netzwerkfreigaben in BloodHound OpenGraphs abzubilden.
Lies den zugehörigen Blogbeitrag: https://specterops.io/blog/2025/10/30/sharehound-an-opengraph-collector-for-network-shares/
Dieses Repository enthält zwei Implementierungen von ShareHound. Sie verfolgen dasselbe Ziel — aus SMB-Freigabeberechtigungen BloodHound OpenGraph-JSON zu erzeugen — unterscheiden sich jedoch in Sprache, Laufzeit und Funktionsumfang. Wähle diejenige, die zu deinem Workflow passt.
| Implementierung | Pfad | Autor | Am besten geeignet für |
|---|---|---|---|
| Python | Python/ | Remi Gascou (@podalirius_) @ SpecterOps | Die Referenzimplementierung; einfach zu erweitern und zu skripten |
| Go | Go/ | Javier Azofra @ Siemens Healthineers | Großflächige Scans (60.000+ Hosts), Checkpointing, statische Binaries |
Jedes Unterverzeichnis hat eine eigene README mit vollständigen Installations-, Verwendungs- und Konfigurationsdetails:
--effective-access-only-Modus, um die Graphgröße in großen Umgebungen drastisch zu reduzierenSobald du den OpenGraph in BloodHound importiert hast, decken diese Abfragen die häufigsten Anforderungen ab. Weitere findest du in den READMEs der jeweiligen Implementierungen.
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
Die Kanten CanEffectiveRead / CanEffectiveWrite / CanEffectiveExecute werden von der Go-Implementierung erzeugt, wenn dieselbe SID sowohl auf der Freigabe- als auch auf der NTFS-Ebene passende Rechte besitzt — also den tatsächlich über SMB gewährten Zugriff.
MATCH p=(principal)-[:CanEffectiveRead]->(f:File)
RETURN p
Pull Requests sind für beide Implementierungen willkommen. Eröffne ein Issue, wenn du zuerst ein neues Feature besprechen möchtest.