
Rust-Angriffspfadanalyse für AD, ADCS und Entra ID
Open-Source-Angriffspfadanalyse für Active Directory, ADCS und Entra ID / Azure, in Rust für sehr große Umgebungen entwickelt. CopperHound liest Ausgaben von SharpHound, bloodhound-python, ldapdomaindump und AzureHound, rohe LDIF-Dumps und Sysinternals AD Explorer-Snapshots in einen speicherabgebildeten Graph-Store ein und führt Pfad-, Expositions- und CHQL-Abfragen direkt darauf aus, ohne Graphdatenbank. Ein Container stellt die Web-UI und die REST-API bereit.

![]() |
![]() |
![]() |
Die Screenshots verwenden fiktive Demodaten (scripts/demo_data.py).
Dokumentation: Benutzerhandbuch · Bereitstellung · Datenquellen · REST-API · CHQL · Edge-Referenz · Performance · Architektur
docker compose up -d --build
docker compose logs copperhound | grep "Initial admin password"
Öffne http://127.0.0.1:8090, melde dich als admin an, ziehe deine SharpHound- /
AzureHound-.zip- oder .json-Dateien auf den Tab Data und drücke Rebuild
graph. COPPERHOUND_ADMIN_PASSWORD legt das Passwort fest, und
COPPERHOUND_PORT / COPPERHOUND_HOST ändern die veröffentlichte Adresse (Standard
127.0.0.1:8090, sodass es neben BloodHound auf 8080 laufen kann).
Noch keine Daten? python scripts/demo_data.py demo/ schreibt eine fiktive
Umgebung (AD, ADCS und Entra ID mit absichtlichen Schwachstellen) zum Hochladen; siehe
Mit Demo-Daten ausprobieren.
Ohne Docker: cd web && npm ci && npm run build, dann
cargo run --release -- serve (Standardwerte: 127.0.0.1:8080, Daten in ./data,
UI aus ./web/dist).
Konten, API-Tokens, der Überwachungsordner, geplante Berichte, Änderungsbenachrichtigungen, HTTPS und Single Sign-on (OpenID Connect, SAML 2.0): docs/DEPLOYMENT.md.
Wird im Hintergrund nach jedem Ingest berechnet:
CLI-Äquivalente: copperhound findings corp.chg, copperhound plan corp.chg --steps 10.
Eine WebGL-Graph-Canvas (sigma.js) mit Suche, Pfadfindung, Knotendetails, „Wie wurde das abgeleitet?" für jede abgeleitete Kante, dem CHQL-Editor und der Abfragebibliothek sowie Seiten für Befunde, Behebung, Zonen, Posture, Berichte, Daten und Administration. Durchlauf mit Screenshots: docs/USER_GUIDE.md.
Ein schreibgeschützter Cypher-Dialekt, der zu nativen Graph-Operationen kompiliert wird — mehrere
Patterns und MATCH-Klauseln, OPTIONAL MATCH, WITH, Aggregation,
ORDER BY/SKIP/LIMIT, UNION, ungerichtete und variabel lange Hops, Pfad-
Funktionen und Pattern-Prädikate. Die meisten BloodHound-CE- und Legacy-Abfragen laufen
unverändert; siehe die CHQL-Referenz und Cypher-Kompatibilitätstabelle.
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
Auf der Kommandozeile: copperhound query corp.chg "MATCH …". days_ago(n)
liefert relative Zeitstempel, z. B. WHERE u.lastlogontimestamp < days_ago(90).