Conducting Internal Reconnaissance with BloodHound CE
Overview
BloodHound Community Edition (CE) is a modern, web-based Active Directory reconnaissance platform developed by SpecterOps that uses graph theory to reveal hidden relationships and attack paths within AD environments. Unlike the legacy BloodHound application, BloodHound CE uses a PostgreSQL backend with a dedicated graph database, providing improved performance, a modern web UI, and enhanced API capabilities. Red teams use BloodHound CE to collect AD objects, ACLs, sessions, group memberships, and trust relationships, then visualize attack paths from compromised low-privileged accounts to high-value targets like Domain Admins. The SharpHound collector (v2 for CE) gathers data from Active Directory, while AzureHound collects from Azure AD / Entra ID environments.
Objectives
- Deploy BloodHound CE server using Docker Compose
- Collect AD data using SharpHound v2 or BloodHound.py
- Import collected data into BloodHound CE for graph analysis
- Identify shortest attack paths from owned principals to Domain Admins
- Discover ACL-based attack paths, Kerberoastable accounts, and delegation abuse
- Execute custom Cypher queries for advanced attack path analysis
- Generate attack path reports for engagement documentation
MITRE ATT&CK Mapping
- T1087.002 - Account Discovery: Domain Account
- T1069.002 - Permission Groups Discovery: Domain Groups
- T1482 - Domain Trust Discovery
- T1615 - Group Policy Discovery
- T1018 - Remote System Discovery
- T1033 - System Owner/User Discovery
- T1016 - System Network Configuration Discovery
Implementation Steps
Phase 1: BloodHound CE Deployment
- Deploy BloodHound CE using Docker Compose:
curl -L https://ghst.ly/getbhce -o docker-compose.yml
docker compose pull
docker compose up -d
- Access the web interface at https://localhost:8080
- Log in with the default admin credentials (displayed in Docker logs):
docker compose logs | grep "Initial Password"
- Change the default admin password immediately
Phase 2: Data Collection with SharpHound v2
- Transfer SharpHound v2 to the compromised Windows host:
# Execute full collection
.\SharpHound.exe -c All --outputdirectory C:\Temp
# DCOnly collection (LDAP only, stealthier)
.\SharpHound.exe -c DCOnly
# Session collection for logged-on user mapping
.\SharpHound.exe -c Session --loop --loopduration 02:00:00
# Collect from specific domain
.\SharpHound.exe -c All -d child.domain.local
- Alternative: Use BloodHound.py from Linux:
bloodhound-python -u user -p 'Password123' -d domain.local -ns 10.10.10.1 -c All
- Exfiltrate the generated ZIP file to the analysis workstation
Phase 3: Data Import and Initial Analysis
- Upload collected data via the BloodHound CE web interface (File Ingest)
- Mark compromised accounts as "Owned" in the interface
- Run built-in analysis queries:
- Shortest Path to Domain Admin
- Kerberoastable Users with Path to DA
- AS-REP Roastable Users
- Users with DCSync Rights
- Computers with Unconstrained Delegation
Phase 4: Custom Cypher Queries
- Execute custom Cypher queries in the BloodHound CE search bar:
// Find shortest path from owned principals to Domain Admins
MATCH p=shortestPath((n {owned:true})-[*1..]->(m:Group {name:"DOMAIN ADMINS@DOMAIN.LOCAL"}))
RETURN p
// Find Kerberoastable users with path to DA
MATCH (u:User {hasspn:true})
MATCH p=shortestPath((u)-[*1..]->(g:Group {name:"DOMAIN ADMINS@DOMAIN.LOCAL"}))
RETURN p
// Find computers with sessions of DA members
MATCH (c:Computer)-[:HasSession]->(u:User)-[:MemberOf*1..]->(g:Group {name:"DOMAIN ADMINS@DOMAIN.LOCAL"})
RETURN c.name, u.name
// Find ACL-based attack paths (GenericAll, WriteDACL, GenericWrite)
MATCH p=(u:User)-[:GenericAll|GenericWrite|WriteDacl|WriteOwner|ForceChangePassword*1..]->(t)
WHERE u.owned = true
RETURN p
// Find users who can DCSync
MATCH (u)-[:MemberOf*0..]->()-[:DCSync|GetChanges|GetChangesAll*1..]->(d:Domain)
RETURN u.name, d.name
// Find computers with LAPS but readable by non-admins
MATCH (c:Computer {haslaps:true})
MATCH p=(u:User)-[:ReadLAPSPassword]->(c)
RETURN p
Phase 5: Attack Path Prioritization
- Score identified attack paths by:
- Number of hops (shorter = higher priority)
- Stealth requirements (avoid noisy techniques)
- Tool availability for each hop
- Likelihood of detection at each step
- Create an execution plan for the highest-priority paths
- Identify required tools for each step in the chain
- Plan OPSEC considerations for each technique
Tools and Resources
| Tool |
Purpose |
Platform |
| BloodHound CE |
Web-based graph analysis platform |
Docker |
| SharpHound v2 |
AD data collection (.NET, for CE) |
Windows |
| BloodHound.py |
AD data collection (Python) |
Linux |
| AzureHound |
Azure AD / Entra ID data collection |
Cross-platform |
| PlumHound |
Automated BloodHound reporting |
Python |
| BloodHound Query Library |
Community Cypher query repository |
Web |
Key Attack Path Types
| Path Type |
Description |
Example |
| ACL Abuse |
Exploit misconfigured ACLs |
GenericAll on DA group |
| Kerberoasting |
Crack service account passwords |
SPN account → DA |
| AS-REP Roasting |
Attack accounts without pre-auth |
No-preauth user → password crack |
| Delegation Abuse |
Exploit unconstrained/constrained delegation |
Computer → impersonate DA |
| GPO Abuse |
Modify GPOs applied to privileged OUs |
GPO write → code execution on DA |
| Session Hijack |
Leverage DA sessions on compromised hosts |
Admin session → token theft |
Validation Criteria
1---2name: conducting-internal-reconnaissance-with-bloodhound-ce3description: Conduct internal Active Directory reconnaissance using BloodHound Community Edition to map attack paths, identify privilege escalation chains, and discover misconfigurations in domain environments.4domain: cybersecurity5subdomain: red-teaming6tags: [red-team, reconnaissance, bloodhound, active-directory, attack-paths, privilege-escalation, graph-analysis]7version: "1.0"8author: mahipal9license: Apache-2.010---1112# Conducting Internal Reconnaissance with BloodHound CE1314## Overview1516BloodHound Community Edition (CE) is a modern, web-based Active Directory reconnaissance platform developed by SpecterOps that uses graph theory to reveal hidden relationships and attack paths within AD environments. Unlike the legacy BloodHound application, BloodHound CE uses a PostgreSQL backend with a dedicated graph database, providing improved performance, a modern web UI, and enhanced API capabilities. Red teams use BloodHound CE to collect AD objects, ACLs, sessions, group memberships, and trust relationships, then visualize attack paths from compromised low-privileged accounts to high-value targets like Domain Admins. The SharpHound collector (v2 for CE) gathers data from Active Directory, while AzureHound collects from Azure AD / Entra ID environments.1718## Objectives1920- Deploy BloodHound CE server using Docker Compose21- Collect AD data using SharpHound v2 or BloodHound.py22- Import collected data into BloodHound CE for graph analysis23- Identify shortest attack paths from owned principals to Domain Admins24- Discover ACL-based attack paths, Kerberoastable accounts, and delegation abuse25- Execute custom Cypher queries for advanced attack path analysis26- Generate attack path reports for engagement documentation2728## MITRE ATT&CK Mapping2930- **T1087.002** - Account Discovery: Domain Account31- **T1069.002** - Permission Groups Discovery: Domain Groups32- **T1482** - Domain Trust Discovery33- **T1615** - Group Policy Discovery34- **T1018** - Remote System Discovery35- **T1033** - System Owner/User Discovery36- **T1016** - System Network Configuration Discovery3738## Implementation Steps3940### Phase 1: BloodHound CE Deployment411. Deploy BloodHound CE using Docker Compose:42 ```bash43 curl -L https://ghst.ly/getbhce -o docker-compose.yml44 docker compose pull45 docker compose up -d46 ```472. Access the web interface at https://localhost:8080483. Log in with the default admin credentials (displayed in Docker logs):49 ```bash50 docker compose logs | grep "Initial Password"51 ```524. Change the default admin password immediately5354### Phase 2: Data Collection with SharpHound v2551. Transfer SharpHound v2 to the compromised Windows host:56 ```powershell57 # Execute full collection58 .\SharpHound.exe -c All --outputdirectory C:\Temp5960 # DCOnly collection (LDAP only, stealthier)61 .\SharpHound.exe -c DCOnly6263 # Session collection for logged-on user mapping64 .\SharpHound.exe -c Session --loop --loopduration 02:00:006566 # Collect from specific domain67 .\SharpHound.exe -c All -d child.domain.local68 ```692. Alternative: Use BloodHound.py from Linux:70 ```bash71 bloodhound-python -u user -p 'Password123' -d domain.local -ns 10.10.10.1 -c All72 ```733. Exfiltrate the generated ZIP file to the analysis workstation7475### Phase 3: Data Import and Initial Analysis761. Upload collected data via the BloodHound CE web interface (File Ingest)772. Mark compromised accounts as "Owned" in the interface783. Run built-in analysis queries:79 - Shortest Path to Domain Admin80 - Kerberoastable Users with Path to DA81 - AS-REP Roastable Users82 - Users with DCSync Rights83 - Computers with Unconstrained Delegation8485### Phase 4: Custom Cypher Queries861. Execute custom Cypher queries in the BloodHound CE search bar:87 ```cypher88 // Find shortest path from owned principals to Domain Admins89 MATCH p=shortestPath((n {owned:true})-[*1..]->(m:Group {name:"DOMAIN ADMINS@DOMAIN.LOCAL"}))90 RETURN p9192 // Find Kerberoastable users with path to DA93 MATCH (u:User {hasspn:true})94 MATCH p=shortestPath((u)-[*1..]->(g:Group {name:"DOMAIN ADMINS@DOMAIN.LOCAL"}))95 RETURN p9697 // Find computers with sessions of DA members98 MATCH (c:Computer)-[:HasSession]->(u:User)-[:MemberOf*1..]->(g:Group {name:"DOMAIN ADMINS@DOMAIN.LOCAL"})99 RETURN c.name, u.name100101 // Find ACL-based attack paths (GenericAll, WriteDACL, GenericWrite)102 MATCH p=(u:User)-[:GenericAll|GenericWrite|WriteDacl|WriteOwner|ForceChangePassword*1..]->(t)103 WHERE u.owned = true104 RETURN p105106 // Find users who can DCSync107 MATCH (u)-[:MemberOf*0..]->()-[:DCSync|GetChanges|GetChangesAll*1..]->(d:Domain)108 RETURN u.name, d.name109110 // Find computers with LAPS but readable by non-admins111 MATCH (c:Computer {haslaps:true})112 MATCH p=(u:User)-[:ReadLAPSPassword]->(c)113 RETURN p114 ```115116### Phase 5: Attack Path Prioritization1171. Score identified attack paths by:118 - Number of hops (shorter = higher priority)119 - Stealth requirements (avoid noisy techniques)120 - Tool availability for each hop121 - Likelihood of detection at each step1222. Create an execution plan for the highest-priority paths1233. Identify required tools for each step in the chain1244. Plan OPSEC considerations for each technique125126## Tools and Resources127128| Tool | Purpose | Platform |129|------|---------|----------|130| BloodHound CE | Web-based graph analysis platform | Docker |131| SharpHound v2 | AD data collection (.NET, for CE) | Windows |132| BloodHound.py | AD data collection (Python) | Linux |133| AzureHound | Azure AD / Entra ID data collection | Cross-platform |134| PlumHound | Automated BloodHound reporting | Python |135| BloodHound Query Library | Community Cypher query repository | Web |136137## Key Attack Path Types138139| Path Type | Description | Example |140|-----------|-------------|---------|141| ACL Abuse | Exploit misconfigured ACLs | GenericAll on DA group |142| Kerberoasting | Crack service account passwords | SPN account → DA |143| AS-REP Roasting | Attack accounts without pre-auth | No-preauth user → password crack |144| Delegation Abuse | Exploit unconstrained/constrained delegation | Computer → impersonate DA |145| GPO Abuse | Modify GPOs applied to privileged OUs | GPO write → code execution on DA |146| Session Hijack | Leverage DA sessions on compromised hosts | Admin session → token theft |147148## Validation Criteria149150- [ ] BloodHound CE deployed and accessible151- [ ] SharpHound v2 data collected from all domains in scope152- [ ] Data successfully imported into BloodHound CE153- [ ] Owned principals marked in the interface154- [ ] Shortest paths to Domain Admin identified155- [ ] ACL-based attack paths documented156- [ ] Kerberoastable and AS-REP roastable accounts listed157- [ ] Custom Cypher queries executed for advanced analysis158- [ ] Attack paths prioritized by feasibility and stealth159- [ ] Report generated with all identified paths and evidence