
Uma ferramenta Python para mapear facilmente os direitos de acesso de compartilhamentos de rede para os OpenGraphs do BloodHound
Uma ferramenta para mapear os direitos de acesso de compartilhamentos de rede em OpenGraphs do BloodHound.
Leia o post do blog associado: https://specterops.io/blog/2025/10/30/sharehound-an-opengraph-collector-for-network-shares/
Este repositório contém duas implementações do ShareHound. Elas compartilham o mesmo objetivo — produzir JSON de OpenGraph do BloodHound a partir de permissões de compartilhamento SMB — mas diferem em linguagem, runtime e conjunto de funcionalidades. Escolha a que melhor se adequa ao seu fluxo de trabalho.
| Implementação | Caminho | Autor | Melhor para |
|---|---|---|---|
| Python | Python/ | Remi Gascou (@podalirius_) @ SpecterOps | A implementação de referência; fácil de estender e criar scripts |
| Go | Go/ | Javier Azofra @ Siemens Healthineers | Varreduras em grande escala (mais de 60.000 hosts), checkpointing, binários estáticos |
Cada subdiretório tem seu próprio README com detalhes completos de instalação, uso e configuração:
--effective-access-only para reduzir drasticamente o tamanho do grafo em grandes ambientesDepois de importar o OpenGraph para o BloodHound, estas consultas cobrem as necessidades mais comuns. Para mais, consulte os READMEs de cada implementação.
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
As arestas CanEffectiveRead / CanEffectiveWrite / CanEffectiveExecute são emitidas
pela implementação em Go quando o mesmo SID tem direitos correspondentes tanto no nível do compartilhamento
quanto no nível NTFS — ou seja, o acesso real concedido via SMB.
MATCH p=(principal)-[:CanEffectiveRead]->(f:File)
RETURN p
Pull requests são bem-vindos para qualquer uma das implementações. Abra uma issue se quiser discutir primeiro uma nova funcionalidade.