ββββββ βββββββ βββββββ βββββββ ββββββ βββββββ βββ βββ
ββββββββββββββββ ββββββββ βββββββββββββββββββββββββββ βββ
βββββββββββ βββ βββ ββββββββββββββββββββββββββββββββββββ
βββββββββββ βββ βββ ββββββββββββββββββββββββββ ββββββββ
βββ βββββββββββ ββββββββββββ ββββββ ββββββ βββ βββ
βββ ββββββββββ βββββββ βββ ββββββ ββββββ βββ βββ
Active Directory Β· attack-path graph Β· operator-first
A modern, local, BloodHound-style attack-path graph for Active Directory.
Import a BloodHound collector ZIP, explore AD relationships through a clean, fast, operator-focused web UI, and walk the abuse paths to Domain Admin β all offline, no Node, no Docker, pure Python standard library.
Crafted & weaponized by c4sh$r Β· authorized engagements only Β· companion to β‘ ADAutoPwn
BloodHound is excellent β but sometimes you just want a lightweight local viewer that opens instantly, doesn't dump 5,000 nodes on screen at once, keeps one engagement isolated, highlights the abuse paths with ready-to-run commands, and feels native to an offensive workflow.
That's ADAutoGraph. You import a BloodHound ZIP, pick a domain, and build the visible graph progressively β from searches, focused object actions, ACL views, or full attack paths. Mark what you own, and it draws the chain to Domain Admin for you.
It's the graphical companion to β‘ ADAutoPwn:
that tool can launch ADAutoGraph automatically at the end of a run, import the
freshly-collected BloodHound data, and pre-mark every principal it already
compromised as owned β so the path lights up the moment the browser opens.
β οΈ Legal: Use only against systems you are explicitly authorized to test β your own lab, a CTF, or a signed engagement. You are responsible for your actions.
| Area | What you get |
|---|---|
| Import | BloodHound collector ZIPs β normalized users, groups, computers, domains, OUs, GPOs, containers and ACL edges, stored in data/graph.db (SQLite) |
| Multi-domain | A domain/project selector β import many datasets, keep each isolated, switch freely |
| Progressive graph | Starts empty; build only the context you need via search / views / object actions β huge datasets stay readable |
| Modern canvas | Deterministic static layout (no force physics, no magnetic drift), per-node drag, directional arrows (who controls whom), edge labels baked into the line and colored by severity |
| Severity-aware ACLs | π΄ Critical (DCSync, GenericAll, WriteDACL, GetChangesAll) Β· π High (WriteOwner, Owns, ForceChangePassword, Shadow Credentials) Β· π‘ Medium (WriteSPN, AddMember, ReadGMSAPassword, delegation) |
| Views | Overview Β· Attack paths Β· ACLs Β· High value Β· Owned Β· All β one click each |
| Object inspector | Full imported properties, outbound + inbound edges, abuse-focused edge list, raw property view |
| Attack-path builder | Mark objects as owned β it traverses abuse edges, group membership and OU containment to high-value targets, and falls back to the best reachable chain when there's no clean DA route |
| Group & OU delegation | The inspector expands rights a principal wields indirectly β through group membership (nested + AddSelf/AddMember) and through control of an OU/Container (GenericAll on an OU β the users it holds), each shown with the exact via trail. The writeup's D.Anderson β Marketing OU β E.Rodriguez β Chiefs Marketing β M.Harris chain, inline. |
| Member-of context | Group memberships surfaced with what they grant (e.g. Remote Management Users β WinRM, Protected Users β hardened) β access no ACL edge represents |
| ADCS / ESC | Load certipy find -json β CertTemplate/CA nodes + ESC edges, flagging exactly which principal is vulnerable to which ESC (and every group member inherits it). Plus a built-in ESC1βESC16 playbook modal with chained certipy commands, parameterized to the active domain |
| Command snippets | Per-edge Linux and Windows abuse commands, color-coded, with a copy button |
| Owned, your way | Toggle owned in the UI or pre-seed it on import (used by ADAutoPwn) |
| Manage the DB | Delete any imported graph straight from the domain list (cascades its nodes/edges) |
ADAutoGraph is built to drop into the ADAutoPwn workflow:
- ADAutoPwn auto-launches the server at the end of a run, imports the
BloodHound zip, pre-marks owned principals, and opens your browser β no
manual steps. (
--no-webto disable,--web-portto change the port.) - Visualize any run's data on demand, even standalone:
adautopwn --graph /path/to/bloodhound.zip -d corp.local --web
- If you cloned ADAutoGraph next to ADAutoPwn (or set
ADAUTOGRAPH_DIR), ADAutoPwn finds it automatically.install.shover there clones it for you and putsadautographon yourPATH.
git clone https://github.com/C4sh3R/ADAutoGraph.git
cd ADAutoGraph
chmod +x server.pyNo pip install, no Node, no Docker β it only uses the Python standard library
(3.10+). That's it.
ln -sf "$PWD/server.py" ~/.local/bin/adautograph # ~/.local/bin is on PATH
# now just: adautographserver.py resolves its own directory, so the symlink works from anywhere.
(ADAutoPwn's install.sh also clones ADAutoGraph and creates this symlink for you.)
adautograph # or: python3 -B server.py
# β ADAutoGraph listening on http://127.0.0.1:8765Then in the browser:
- Import a BloodHound
.zip. - Open the imported domain.
- Search for a user, group, computer or domain object.
- Click a node to inspect its properties, edges and abuse commands.
- Mark compromised objects as
owned(right panel). - Hit Attack paths to draw the chain from what you own to Domain Admin.
adautograph --host 127.0.0.1 --port 8765| Option | Description | Default |
|---|---|---|
--host |
Bind address | 127.0.0.1 |
--port |
HTTP port | 8765 |
Small JSON API (handy for scripting / tooling like ADAutoPwn):
| Method & path | Purpose |
|---|---|
POST /api/import |
Multipart upload: zip (BloodHound zip), optional name, optional owned (names/SIDs, separated by spaces/commas/newlines β pre-marked owned) |
GET /api/domains |
List imported domains (id, name, counts) |
GET /api/domain/<id>/graph |
Graph payload for a view (?view=β¦&q=β¦&focus=β¦) |
GET /api/domain/<id>/search?q= |
Search nodes |
GET /api/domain/<id>/stats |
Node/edge stats |
GET /api/domain/<id>/node/<sid> |
Full object + edges |
POST /api/domain/<id>/owned/<sid> |
Toggle a node's owned flag |
# import a zip and pre-mark owned principals in one shot
curl -F "zip=@bloodhound.zip" -F "name=corp.local" \
-F "owned=jdoe,svc_sql,DC01\$" http://127.0.0.1:8765/api/importADAutoGraph/
βββ server.py # the whole backend (stdlib http.server + sqlite3)
βββ web/
β βββ index.html
β βββ style.css
β βββ app.js # the canvas renderer + UI
βββ data/
β βββ graph.db # imported data β local only, git-ignored (delete to reset)
βββ assets/screenshot.png
βββ requirements.txt
βββ LICENSE
βββ README.md
ADAutoGraph is free and source-available (noncommercial), built on a lot of late nights. If it made an engagement smoother or helped you learn, consider buying me a coffee β it directly fuels the next feature. π
PRs and issues are very welcome β the AD graph space has endless room to grow.
git clone https://github.com/<you>/ADAutoGraph.git && cd ADAutoGraph
git checkout -b feature/my-idea
# hack on server.py (backend) or web/app.js (renderer) β keep it stdlib-only
python3 -c "import ast; ast.parse(open('server.py').read())" # must stay clean
git commit -am "feat: my idea" && git push origin feature/my-idea- More abuse-command recipes per edge (Linux + Windows).
- Session /
AdminTo/CanRDPlateral edges in the attack-path traversal. - Export the current graph (PNG / JSON).
- Saved layouts per domain.
- Dark / light themes.
Test against a lab or a box you're allowed to use, and never commit loot (the
.gitignorealready blocksdata/*.dband uploads).
ADAutoGraph is not a replacement for the official BloodHound / BloodHound Enterprise. It's a lightweight local viewer focused on offensive workflow, abuse readability and fast inspection β and on pairing tightly with ADAutoPwn.
PolyForm Noncommercial 1.0.0 β see LICENSE. Free to use, modify
and share for noncommercial purposes (research, education, personal use,
nonprofits). Commercial use, selling or reselling is not permitted β all
commercial rights are reserved by the author (c4sh$r). Provided for
authorized security testing only; the author assumes no liability for misuse.
