
Analisi dei percorsi di attacco in Rust per AD, ADCS ed Entra ID
Analisi open-source dei percorsi di attacco per Active Directory, ADCS ed Entra ID / Azure, sviluppata in Rust per ambienti molto grandi. CopperHound importa output di SharpHound, bloodhound-python, ldapdomaindump e AzureHound, dump LDIF grezzi e snapshot di Sysinternals AD Explorer in un archivio di grafi mappato in memoria ed esegue query di percorso, esposizione e CHQL direttamente su di esso, senza alcun database a grafi. Un singolo container serve l'interfaccia web e l'API REST.

![]() |
![]() |
![]() |
Le schermate utilizzano dati demo fittizi (scripts/demo_data.py).
Documentazione: Guida utente · Distribuzione · Sorgenti dati · API REST · CHQL · Riferimento degli archi · Prestazioni · Architettura
docker compose up -d --build
docker compose logs copperhound | grep "Initial admin password"
Apri http://127.0.0.1:8090, accedi come admin, trascina i tuoi file
SharpHound / AzureHound .zip o .json nella scheda Data e premi Rebuild
graph. COPPERHOUND_ADMIN_PASSWORD imposta la password, mentre
COPPERHOUND_PORT / COPPERHOUND_HOST modificano l'indirizzo pubblicato (predefinito
127.0.0.1:8090, così può essere eseguito accanto a BloodHound sulla 8080).
Non hai ancora dati? python scripts/demo_data.py demo/ genera un ambiente
fittizio (AD, ADCS ed Entra ID con debolezze deliberate) da caricare; vedi
Provalo con i dati demo.
Senza Docker: cd web && npm ci && npm run build, poi
cargo run --release -- serve (predefiniti: 127.0.0.1:8080, dati in ./data,
UI da ./web/dist).
Account, token API, la cartella monitorata, report pianificati, avvisi di modifica, HTTPS e single sign-on (OpenID Connect, SAML 2.0): docs/DEPLOYMENT.md.
Calcolata in background dopo ogni ingestione:
Equivalenti CLI: copperhound findings corp.chg, copperhound plan corp.chg --steps 10.
Una canvas grafica WebGL (sigma.js) con ricerca, pathfinding, dettagli dei nodi, "Come è stato derivato?" per ogni edge derivato, l'editor CHQL e la libreria di query, e pagine per risultati, remediation, zone, postura, report, dati e amministrazione. Procedura guidata con screenshot: docs/USER_GUIDE.md.
Un dialetto Cypher di sola lettura compilato in operazioni native sul grafo — pattern
multipli e clausole MATCH, OPTIONAL MATCH, WITH, aggregazione,
ORDER BY/SKIP/LIMIT, UNION, salti non orientati e a lunghezza variabile, funzioni
di percorso e predicati di pattern. La maggior parte delle query BloodHound CE e legacy funziona
invariata; vedi il riferimento CHQL e la tabella di compatibilità con Cypher.
MATCH p = shortestPath((u:User {name:'[email protected]'})-[*1..]->(t {tier0:true})) RETURN p
MATCH p = allShortestPaths((g:Group)-[*1..]->(t {tier0:true})) WHERE g.name STARTS WITH 'DOMAIN USERS@' RETURN p
MATCH (u:User {hasspn:true, enabled:true}) WHERE u.pwdlastset < 1600000000 RETURN u.name, u.pwdlastset
MATCH (g:Group)-[:AdminTo]->(c:Computer) RETURN g.name, count(c)
MATCH (p)-[r:ADCSESC1|ADCSESC6a]->(d:Domain) RETURN p, r, d
MATCH (n {owned:true}), (m:Group) WHERE m.objectid ENDS WITH '-512' MATCH p = shortestPath((n)-[*1..]->(m)) RETURN p
MATCH (dc)-[:MemberOf*0..]->(g:Group) WHERE g.objectid ENDS WITH '-516' WITH collect(dc) AS dcs
MATCH (c:Computer {unconstraineddelegation:true}) WHERE NOT c IN dcs RETURN c
Da riga di comando: copperhound query corp.chg "MATCH …". days_ago(n)
fornisce timestamp relativi, ad esempio WHERE u.lastlogontimestamp < days_ago(90).