Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Assess Active Directory security posture using PingCastle, BloodHound, and Purple Knight to identify misconfigurations, privilege escalation paths, and attack vectors.
.claude/skills/performing-active-directory-vulnerability-assessment/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-06 | ✗→✓ | ▲ Improved | — | — |
| case-03 | ✗→✓ | ▲ Improved | — | — |
| case-02 | ✗→✓ | ▲ Improved | — | — |
| case-04 | ✗→✓ | ▲ Improved | — | — |
| case-18 | ✗→✓ | ▲ Improved | — | — |
Active Directory (AD) is the primary identity and access management system in most enterprise environments, making it a critical attack target. This skill covers comprehensive AD security assessment using PingCastle for health checks, BloodHound for attack path analysis, and Purple Knight for security posture scoring. These tools identify misconfigurations, excessive privileges, Kerberos weaknesses, and lateral movement opportunities.
powershell# Download PingCastle Invoke-WebRequest -Uri "https://github.com/netwrix/pingcastle/releases/latest/download/PingCastle.zip" ` -OutFile "PingCastle.zip" Expand-Archive PingCastle.zip -DestinationPath C:\Tools\PingCastle # Run health check against current domain cd C:\Tools\PingCastle .\PingCastle.exe --healthcheck # Run health check against specific domain .\PingCastle.exe --healthcheck --server dc01.corp.local --user CORP\scanner_account --password P@ssw0rd # Run in scanner mode for multiple domains .\PingCastle.exe --scanner --scannerlp # Generate consolidated report .\PingCastle.exe --healthcheck --level Full
| Category | Description | Risk Areas | |----------|------------|------------| | Stale Objects | Inactive accounts, old passwords, obsolete OS | Ghost accounts, expired credentials | | Privileged Accounts | Excessive admin rights, nested groups | Domain Admin sprawl, SID history | | Trusts | Forest and domain trust configurations | Transitive trust abuse, SID filtering | | Anomalies | Security setting deviations | GPO misconfigurations, schema issues |
# Critical items to review in PingCastle report:
- Accounts with "Password Never Expires" flag
- Accounts with Kerberos pre-authentication disabled (AS-REP roastable)
- Accounts with Kerberos delegation (unconstrained/constrained)
- Domain Controllers running unsupported OS versions
- AdminSDHolder permission modifications
- Accounts in privileged groups (Domain Admins, Enterprise Admins, Schema Admins)
- Trust relationships with SID filtering disabled
- GPO vulnerabilities allowing privilege escalationpowershell# Download SharpHound collector # https://github.com/SpecterOps/BloodHound/tree/main/packages/csharp/SharpHound # Run SharpHound collection (all methods) .\SharpHound.exe --collectionmethods All --domain corp.local --zipfilename bloodhound_data.zip # Stealthy collection (minimal noise) .\SharpHound.exe --collectionmethods Session,LoggedOn --domain corp.local --stealth # Collection with specific domain controller .\SharpHound.exe --collectionmethods All --domain corp.local --domaincontroller dc01.corp.local # Run via PowerShell Import-Module .\SharpHound.ps1 Invoke-BloodHound -CollectionMethod All -Domain corp.local -OutputDirectory C:\BH_Data
bash# Deploy BloodHound Community Edition with Docker curl -L https://ghst.ly/getbhce -o docker-compose.yml docker compose up -d # Access BloodHound CE at http://localhost:8080 # Default credentials shown in docker compose logs # Upload SharpHound data through web UI or API curl -X POST "http://localhost:8080/api/v2/file-upload/start" \ -H "Authorization: Bearer $BH_TOKEN" \ -H "Content-Type: application/json" \ -d '{"fileName": "bloodhound_data.zip"}'
cypher# Find shortest path to Domain Admin MATCH p=shortestPath((u:User)-[*1..]->(g:Group {name:"DOMAIN ADMINS@CORP.LOCAL"})) WHERE u.name <> "ADMINISTRATOR@CORP.LOCAL" RETURN p # Find Kerberoastable accounts with admin privileges MATCH (u:User {hasspn:true})-[:MemberOf*1..]->(g:Group) WHERE g.name CONTAINS "ADMIN" RETURN u.name, u.serviceprincipalnames # Find computers where Domain Admins are logged in MATCH (c:Computer)-[:HasSession]->(u:User)-[:MemberOf*1..]->(g:Group {name:"DOMAIN ADMINS@CORP.LOCAL"}) RETURN c.name, u.name # Find AS-REP roastable accounts MATCH (u:User {dontreqpreauth:true}) RETURN u.name, u.description # Find unconstrained delegation hosts MATCH (c:Computer {unconstraineddelegation:true}) WHERE NOT c.name CONTAINS "DC" RETURN c.name # Find GPO abuse paths MATCH p=(u:User)-[:GenericAll|GenericWrite|WriteOwner|WriteDacl]->(g:GPO) RETURN p
powershell# Download Purple Knight from https://www.purple-knight.com/ # Run as domain admin or with appropriate read permissions .\PurpleKnight.exe # Purple Knight checks 130+ security indicators across: # - Account Security (password policies, privileged accounts) # - AD Infrastructure (replication, DNS, LDAP signing) # - Group Policy (GPO permissions, security settings) # - Kerberos Security (delegation, encryption types, SPN) # - AD Delegation (AdminSDHolder, OU permissions)
| Score Range | Rating | Action Required | |------------|--------|----------------| | 90-100 | Excellent | Maintain current posture | | 75-89 | Good | Address high-risk findings | | 60-74 | Fair | Prioritize remediation plan | | 40-59 | Poor | Immediate remediation required | | 0-39 | Critical | Emergency response needed |
powershell# Find SPNs assigned to user accounts (Kerberoasting targets) Get-ADUser -Filter {ServicePrincipalName -ne "$null"} -Properties ServicePrincipalName | Select-Object Name, ServicePrincipalName, PasswordLastSet, Enabled
powershell# Find accounts with pre-auth disabled Get-ADUser -Filter {DoesNotRequirePreAuth -eq $true} -Properties DoesNotRequirePreAuth | Select-Object Name, DoesNotRequirePreAuth, Enabled
powershell# Check if LLMNR is disabled via GPO Get-ItemProperty "HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\DNSClient" -Name EnableMulticast -ErrorAction SilentlyContinue
powershell# Count members in critical groups $groups = @("Domain Admins", "Enterprise Admins", "Schema Admins", "Account Operators", "Backup Operators") foreach ($group in $groups) { $count = (Get-ADGroupMember -Identity $group -Recursive).Count Write-Output "$group : $count members" }
| Finding | Risk | Remediation | |---------|------|-------------| | Kerberoastable admin accounts | Critical | Remove SPNs or use MSA/gMSA | | Unconstrained delegation on non-DCs | Critical | Switch to constrained/RBCD | | Password Never Expires on admins | High | Enable password rotation policy | | AS-REP roastable accounts | High | Enable Kerberos pre-authentication | | AdminSDHolder modification | High | Audit and restore default ACLs | | Stale computer accounts (90+ days) | Medium | Disable and move to quarantine OU | | LDAP signing not enforced | Medium | Enable via GPO on all DCs |
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-13 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-06 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-05 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-03 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-02 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-04 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-19 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-18 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-16 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-17 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-22 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-15 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-07 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-10 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-11 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-12 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-21 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-20 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-01 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-08 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-09 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-14 | 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. 22 cases were attempted. The headline lift of +36 percentage points is the difference between those two pass rates over the 22 comparable cases.
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.