
Uno strumento python per mappare facilmente i diritti di accesso delle condivisioni di rete in OpenGraphs di BloodHound.
Uno strumento per mappare i diritti di accesso delle condivisioni di rete in OpenGraph di BloodHound.
Leggi il post del blog associato: https://specterops.io/blog/2025/10/30/sharehound-an-opengraph-collector-for-network-shares/
Questo repository contiene due implementazioni di ShareHound. Condividono lo stesso obiettivo — produrre JSON OpenGraph BloodHound dai permessi delle condivisioni SMB — ma differiscono per linguaggio, runtime e funzionalità. Scegli quella che si adatta al tuo flusso di lavoro.
| Implementazione | Percorso | Autore | Ideale per |
|---|---|---|---|
| Python | Python/ | Remi Gascou (@podalirius_) @ SpecterOps | L'implementazione di riferimento; facile da estendere e scriptare |
| Go | Go/ | Javier Azofra @ Siemens Healthineers | Scansioni su larga scala (oltre 60.000 host), checkpointing, binari statici |
Ogni sottodirectory ha il proprio README con dettagli completi su installazione, utilizzo e configurazione:
--effective-access-only per ridurre drasticamente le dimensioni del grafo in ambienti di grandi dimensioniDopo aver importato l'OpenGraph in BloodHound, queste query coprono le esigenze più comuni. Per ulteriori informazioni, consulta i README delle singole implementazioni.
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
Le relazioni CanEffectiveRead / CanEffectiveWrite / CanEffectiveExecute vengono generate dall'implementazione Go quando lo stesso SID ha diritti corrispondenti sia a livello di condivisione che NTFS — ovvero l'accesso reale concesso su SMB.
MATCH p=(principal)-[:CanEffectiveRead]->(f:File)
RETURN p
Le pull request sono benvenute per entrambe le implementazioni. Apri una issue se vuoi discutere prima una nuova funzionalità.