Ticket theft and forgery, from the defender's chair
Where this sits in the series
- Part 1: Foundations and roasting. The protocol, keys, encryption types, the 2026 RC4 changes, and the attacks that crack passwords offline.
- Part 2 (this page): Defending against ticket theft and forgery. Tickets as bearer tokens, the difference between stealing and forging them, the golden/silver/diamond/sapphire family explained at the level needed to detect and explain them, the PAC signature hardening from 2021 to 2023, Credential Guard, and krbtgt rotation. The weight is on detection, mitigation, and verification.
- Part 3: Delegation and trust. Unconstrained, constrained and resource-based delegation, the Service for User (S4U) extensions, cross-domain referrals, Protected Users, and Kerberos armoring.
Plain English first
In Part 1 the attacker guessed a password. Here the password stage is over. The attacker already has a foothold and is working with Kerberos tickets directly. There are two moves, and keeping them separate is most of the battle.
- Theft: taking a real ticket that already exists, out of a machine's memory or off disk, and reusing it elsewhere. The ticket is genuine; it's just in the wrong hands.
- Forgery: making a ticket that the Key Distribution Center (KDC) never issued, by getting hold of a secret key. If the attacker has the right key, the KDC's signature can be reproduced, so the fake looks authentic.
The whole domain's trust rests on one key in particular: the key of the krbtgt account. Every Ticket Granting Ticket (TGT) is sealed and signed with it. Whoever holds that key can mint a TGT for anyone, which is why recovering from that single compromise is the hardest problem in this part.
The analogy: the master key and the engraving machine
A building uses metal keys. Stealing a ticket is copying a key someone left on a desk: it opens exactly what that key opened, until the lock is changed. Forging is worse. The krbtgt key is the blank-and-engraving machine in the locksmith's back room. Get into that room and you can cut a master key for any door, dated however you like, and the front desk waves it through because the engraving is real.
That's why the response to a suspected forgery isn't "change this one lock." It's "replace the engraving machine's templates, twice, so every master key ever cut stops working." That is the double krbtgt reset.
Why it matters now
These techniques are post-exploitation: persistence and lateral movement after an initial compromise. A forged TGT can outlive password resets and account disables. This is the stage of an incident where "we reset the user's password" quietly fails to evict the intruder.
Microsoft closed real gaps between 2021 and 2023 with PAC requestor and PAC signature enforcement, and Credential Guard now ships on by default on many client builds. Those raise the bar but don't remove it. Clients ask "are we patched enough to be safe from golden tickets?" and the honest answer needs the detail on this page.
If you remember only 5 things
- Theft and forgery are different problems. Theft is contained by resets and by protecting credentials in memory. Forgery is contained only by protecting, and rotating, the key that was used to sign the fake.
- The
krbtgtkey is the domain. Its compromise means golden and diamond tickets. Recovery is a double password reset with a wait in between, not a single reset. - Forgery needs a stolen key first. Golden and diamond tickets both require the
krbtgtkey, which usually comes from DCSync or a Domain Controller (DC) compromise. Detecting that theft is often easier than detecting the forged ticket. - The 2021 to 2023 PAC hardening matters. PAC requestor (CVE-2021-42287) and full PAC signatures (CVE-2022-37967) are fully enforced on patched DCs and close specific forgery and privilege-escalation tricks. Confirm every DC is current.
- Detect the key theft and the anomalies, not the ticket itself. A well-made forged ticket can look legitimate. Watch for DCSync from non-DCs, tickets with odd lifetimes, and Ticket-Granting-Service requests with no matching logon.
Core concepts
Thirteen ideas, ordered so each builds on the last. Open "Go deeper" for expert detail.
Visual map
Step through where each forged ticket inserts itself into the normal trust chain, and which key it needs. Each step names the defense that catches it.
The forged-ticket family at a glance
| Ticket | What it is | Key required | Hits the DC? | Main use |
|---|---|---|---|---|
| Golden | A TGT forged from scratch | krbtgt key | No for the forge; yes when used to get service tickets | Domain-wide persistence, impersonate anyone |
| Silver | A service ticket forged from scratch | Target service account key | No | Quiet access to one service |
| Diamond | A real TGT, decrypted and modified, then re-sealed | krbtgt key (AES) | Yes, a real TGT is requested first | Persistence that blends with real traffic |
| Sapphire | A real TGT carrying a real privileged user's authorization data, obtained through protocol abuse | krbtgt key | Yes | Forgery with a legitimate-looking PAC |
Theft versus forgery
| Ticket theft | Ticket forgery | ||
|---|---|---|---|
| Examples | Pass-the-ticket, pass-the-key / overpass-the-hash | Golden, silver, diamond, sapphire | |
| What the attacker needs | Access to a machine's memory or ticket cache (usually local admin) | A long-term key: krbtgt, or a service account's key | |
| Ticket authenticity | Genuine, issued by the KDC | Fabricated or altered | |
| Contained by | Protecting credentials in memory, password reset, account disable (after ticket expiry) | Rotating the signing key; for krbtgt, a double reset | |
| Main detection | Credential access on hosts (EDR), reuse from unexpected hosts | The key theft that preceded it (DCSync, DC access) plus ticket anomalies |
What each defense actually stops
| Control | Stops / blunts | Does not stop |
|---|---|---|
| PAC requestor enforcement (CVE-2021-42287) | Privilege escalation by requesting a ticket as a renamed/created account to impersonate a DC; mismatched-SID forgeries | A golden ticket built with a correct, existing SID |
| Full PAC signature enforcement (CVE-2022-37967) | Tampered PACs that lack the krbtgt-signed signature, including some older forgery tooling | Forgeries made with the genuine krbtgt key, which can reproduce the signature |
| Credential Guard | Pulling TGTs and NT hashes out of LSASS memory for theft | Secrets read from the AD database on a DC; forgery once a key is already stolen |
| krbtgt double reset | All outstanding golden and diamond tickets once complete | Future forgery if the attacker still has DC access to re-steal the new key |
| Protected Users group | Caching of long-term keys and RC4/DES for members; shortens TGT life | Service accounts (shouldn't be members); doesn't help if a DC is owned |
TechnicalUnder the hood
The PAC, and the signatures that protect it
The Privilege Attribute Certificate (PAC) is Microsoft's block of authorization data inside a ticket: the user's Security Identifier (SID), group SIDs, and more. Services build a Windows access token from it, so if an attacker can edit a PAC undetected, they can grant themselves any group membership. The defenses are a set of signatures.
| Signature | Signed with | Purpose |
|---|---|---|
| Server signature | The service account's key | Proves the PAC wasn't altered since the service's key last touched it |
| KDC signature | The krbtgt key | Proves the KDC issued the authorization data |
| Ticket signature (added 2020/2022) | The krbtgt key | Binds the PAC to the specific ticket, defeating some PAC-swap tricks |
| Extended / full PAC signature (CVE-2022-37967) | The krbtgt key | Additional krbtgt-signed checksum enforced from 2023 so a tampered PAC is rejected |
The through-line for a defender: the strong signatures all use the krbtgt key. That is exactly why golden and diamond tickets need it, and why a forger who has it can still produce valid signatures. Services, by default, usually verify only the server signature and don't call back to the KDC for PAC validation, which is the gap silver tickets live in.
PAC requestor SID (CVE-2021-42287, KB5008380)
This update adds the requesting account's SID into the TGT's PAC, and the KDC checks that a service ticket's account matches the account that asked for it. It closed a path where an attacker created or renamed an account to resemble a DC and obtained an over-privileged ticket (often paired with CVE-2021-42278, the "noPac" / sAMAccountName spoofing chain).
| Date | Change |
|---|---|
| November 9, 2021 | Initial deployment. Install on all DCs and read-only DCs. |
| From 7 days later | Microsoft advised moving to Enforcement once all DCs were updated. |
| July 12, 2022 | Setting 0 (disabled) begins to act as setting 1. |
| October 11, 2022 | Enforcement is permanent; PacRequestorEnforcement is no longer read. |
Registry: HKLM\System\CurrentControlSet\Services\Kdc, value PacRequestorEnforcement. Events on the DC System log: 35 (a TGT from another KDC lacks the attributes field), 36 and 37 (ticket without a PAC or without requestor info; warning in deployment, error in enforcement), and 38 (the account in the ticket doesn't match AD, logging both SIDs, a possible exploit sign).
Full PAC signature (CVE-2022-37967, KB5020805)
| Date | Change |
|---|---|
| November 8, 2022 | DCs add the new signature but don't check it. |
| December 13, 2022 | Audit mode by default; missing or invalid signatures are allowed but logged. |
| June 13, 2023 | You can no longer fully disable signature addition (value 0). |
| July 11, 2023 | Enforcement becomes the default; an admin can still choose Audit. |
| October 10, 2023 | Full enforcement. The key and Audit mode are removed; tickets without the new PAC signatures are denied. |
Registry: HKLM\System\CurrentControlSet\Services\Kdc, value KrbtgtFullPacSignature (0 disabled, 1 add only, 2 audit, 3 enforce). Events from the Kerberos-Key-Distribution-Center source: 43 (full PAC signature failed) and 44 (full PAC signature missing). A related CVE-2022-37966 is covered by KB5021131 (event 42). If any DC lags on patches, these protections are inconsistent across the domain.
krbtgt key can still compute every krbtgt-signed signature. The updates are not a substitute for protecting and rotating that key. Diamond-ticket research (Charlie Clark and Andrew Schwartz) specifically demonstrated an approach that remains viable on fully updated DCs.Credential Guard
Credential Guard uses Virtualization-Based Security (VBS) to isolate secrets, so NT hashes and Kerberos TGTs live in a protected process that even an administrator can't read. That blocks the memory-theft step behind pass-the-hash and pass-the-ticket.
- Default-on: Windows 11 22H2 and later, and Windows Server 2025 and later, on Enterprise or Education editions that meet the hardware and licensing requirements and aren't explicitly configured off. On Server 2025 it also requires the machine to be domain-joined and not a DC.
- Not on domain controllers. Microsoft doesn't recommend it there; it adds no protection on a DC and can cause compatibility issues. This matters because the DC is exactly where the
krbtgtkey lives. - What it does not protect: the AD database (
ntds.dit) and the Security Account Manager (SAM); forgery once a key is already stolen; attacks from a Hyper-V host against a guest. It also breaks features that need unconstrained delegation, Kerberos Data Encryption Standard (DES), TGT extraction, or NTLMv1. - Default enablement doesn't use a Unified Extensible Firmware Interface (UEFI) lock, so it can be turned off remotely by an admin if an app genuinely needs one of those features.
krbtgt rotation, done correctly
The krbtgt account has a current and a previous key (it keeps the last two password generations so tickets signed just before a change still validate briefly). A single reset only rolls one generation, so a stolen key may still validate tickets. The correct eviction is two resets with a wait between them.
- Confirm AD replication is healthy first.
- Reset once. Wait at least 10 hours, longer if the maximum ticket lifetime policy is higher than default, so legitimate tickets expire and the first change replicates everywhere.
- Reset a second time. Now both key generations are new and every previously forged golden/diamond ticket is dead.
- Microsoft's
New-KrbtgtKeys.ps1script (from the microsoftarchive repository) handles read-write and read-only DCs; the manual path is Active Directory Users and Computers. - Expect disruption: AD-integrated apps and non-Windows clients may need to re-authenticate as their tickets become invalid.
krbtgt is not enough: the attacker re-steals the new key. Eviction and krbtgt rotation have to happen together, which is why this is a coordinated incident-response step, not a routine maintenance task. Rotating krbtgt on a healthy schedule (for hygiene) is fine and reduces the window; rotating it in a live incident must be sequenced with containment.Common misconceptions
| Misconception | Reality |
|---|---|
| "We reset the user's password, so the attacker is out." | A forged TGT doesn't depend on the user's password. Only rotating krbtgt kills it. |
| "We're fully patched, so golden tickets can't happen." | Patches close specific tricks and tampering. A golden ticket made with a stolen krbtgt key still works. Patching plus key protection plus detection is the set. |
| "Silver tickets show up in DC logs." | They don't contact the DC. Detection is on the target service and host, not 4769. |
| "One krbtgt reset is enough." | Two accounts of the key are kept; a single reset can leave a stolen key usable. Reset twice with a wait. |
| "Credential Guard protects the DC." | It's not run on DCs. DC credential protection is physical/host hardening, tiering, and limiting who can log on. |
| "A forged ticket is obviously fake." | Diamond and sapphire tickets are built from, or carry, genuine KDC-issued material and can look correct. Detection leans on the preceding key theft. |
Troubleshooting and verification commands
klist # list cached tickets, lifetimes, etypes, and the KDC that issued them
klist purge # clear a host's ticket cache
nltest /dsgetdc:corp.example.com # confirm which DC a host is using
repadmin /showrepl # check AD replication health before a krbtgt reset
# After a krbtgt reset, watch for Kerberos errors on member servers as old tickets expire
Get-ADObject -Filter 'Name -eq "krbtgt"' -Properties whenChanged,pwdLastSet -SearchBase (Get-ADDomain).UsersContainer
AttackerAttacker's view, for defenders
Each technique is covered at the level needed to recognise it, test that your detections fire, and explain it in a report. The focus is prerequisites, what makes an environment vulnerable, the evidence left behind, and how it reads as a finding. Tools are named so you can build a detection lab, not as a how-to.
How these show up in an incident, in order
- Credential or key access: LSASS memory access on a host, or DCSync-style replication from a machine that isn't a DC. This is usually the most detectable moment.
- Forgery or theft: a ticket is created or copied, often offline, leaving little trace by itself.
- Use: the ticket is presented. Golden and diamond tickets are used to request service tickets, so the TGS activity exists on a DC even though the initial logon (AS-REQ) never happened from that host.
- Objective: access to a target service, data, or persistence that survives password resets.
krbtgt key or a DC," with the forged ticket as the demonstration of impact.DefenderDefender's playbook
Written for the sysadmins doing the work. The strategy: make the krbtgt key and DCs hard to reach, protect credentials in memory, enforce the PAC hardening, and alert on the key-theft step rather than hoping to spot a well-made ticket.
Quick wins (days)
- Confirm every DC is fully patched and past the October 2022 and October 2023 enforcement dates for PAC requestor and full PAC signatures. A single lagging DC weakens the whole domain.
Get-ADDomainController -Filter * | Select Name,OperatingSystem,OperatingSystemVersion # verify the latest cumulative update is installed on each - Restrict DCSync rights. Only DCs should have "Replicating Directory Changes All." Audit who else holds it on the domain head and remove stray grants.
# Review replication rights on the domain object; remove any non-DC, non-service principal (Get-Acl "AD:$((Get-ADDomain).DistinguishedName)").Access | Where-Object {$_.ObjectType -match '1131f6ad|1131f6aa|89e95b76'} | Select IdentityReference,ActiveDirectoryRights,ObjectType - Check
krbtgtage. If it has never been rotated, or not in over a year, schedule a healthy-state double reset. - Confirm Credential Guard status on workstations and member servers (not DCs).
(Get-CimInstance -ClassName Win32_DeviceGuard -Namespace root\Microsoft\Windows\DeviceGuard).SecurityServicesRunning # a value of 1 in the list means Credential Guard is running - Populate the Protected Users group with high-value human accounts (never service accounts), and confirm no legacy app depends on RC4/DES for them first.
- Turn on the right DC auditing: Account Logon and DS Access, so 4768/4769/4770 and the PAC events are captured and forwarded.
Longer-term fixes (weeks to months)
- Tier the environment. DCs and anything that can control them are Tier 0. Tier 0 admins log on only to Tier 0 hosts, so their tickets never land in a workstation's memory to be stolen.
- Use Privileged Access Workstations for domain administration, and a Privileged Access Management (PAM) solution to vault and check out Tier 0 credentials.
- Reduce standing Domain Admins. Fewer powerful tickets in circulation means fewer worth stealing.
- Enable Credential Guard by policy across the client and member-server fleet, after testing for the known breakages (unconstrained delegation, NTLMv1, DES).
- Deploy identity detection such as Microsoft Defender for Identity (MDI) on DCs, which has built-in analytics for DCSync, golden tickets, and overpass-the-hash.
- Adopt a
krbtgtrotation schedule for hygiene (for example, twice a year, done as the correct double reset), separate from incident response. - Move services off user accounts to group Managed Service Accounts (gMSA), which also shrinks silver-ticket exposure since those keys are long, random, and rotated.
Detection signals
| Signal | Source | Why it matters |
|---|---|---|
| DCSync from a non-DC: 4662 with the replication GUIDs, from an account/host that isn't a DC | DC Security log, or MDI | The usual way the krbtgt key is stolen before a golden/diamond ticket. One of the highest-value alerts here. |
| LSASS memory access on hosts | EDR, Sysmon event 10 | The theft step for pass-the-ticket and pass-the-hash. |
| 4769 / 4624 with anomalous ticket lifetimes, or group membership that doesn't match the account | DC Security log | Crudely made golden tickets often use default 10-year lifetimes or impossible group sets. |
| TGS requests (4769) with no preceding TGT request (4768) for that account from that host | DC Security log | Suggests a TGT that wasn't issued normally, as with pass-the-ticket or golden tickets. Weaker against diamond tickets, which start from a real TGT. |
| Kerberos PAC events 35 to 38, 43, 44 | DC System log | Missing or mismatched PAC data; event 38 flags a requestor-SID mismatch, a possible forgery or noPac attempt. |
| Access to a service with no corresponding 4769 on any DC | Service host logs | Hallmark of a silver ticket, which never contacts the DC. |
| Use of a disabled or deleted account's ticket | Correlate DC and host logs | Tickets are bearer tokens; a forged one can name an account that no longer exists. |
krbtgt rotation ready so impact is bounded.Verify the fix worked
- After a double
krbtgtreset, confirmpwdLastSetchanged twice with the correct gap, replication is healthy, and member servers are issuing and accepting fresh tickets (no lingering Kerberos errors). - Confirm PAC enforcement by checking every DC is past the enforcement updates and that System logs are clean of events 37, 38, 43 and 44 under normal operation.
- Confirm DCSync rights list only DCs and expected service principals.
- Confirm Credential Guard is running on the sampled hosts (and correctly absent on DCs).
- Ask the testers to re-run pass-the-ticket and DCSync against the hardened environment and confirm the alerts fire end to end.
Why remediation stalls, and workable compromises
| Objection | Workable compromise |
|---|---|
| "Rotating krbtgt scares us; last time things broke." | Do it in a maintenance window with the official script, after a replication health check, with the documented 10-hour-plus gap. Communicate that some non-Windows clients re-authenticate as tickets expire. Practise once in a lab. |
| "Credential Guard breaks our old app." | Identify the dependency (usually unconstrained delegation or NTLMv1). Fix or replace that app; in the meantime scope the Credential Guard exception narrowly rather than leaving it off fleet-wide. |
| "We can't tier; admins need to log on everywhere." | Start with Tier 0 only: a short list of DCs and domain admins, logging on only to a handful of hardened hosts. That alone removes the most valuable tickets from workstation memory. |
| "DCSync auditing is too noisy." | Baseline the legitimate replication partners (the DCs) and alert only on principals outside that set. That turns it into a near-zero-false-positive rule. |
| "We think we had a golden ticket but can't prove it." | Treat DC compromise as assumed, evict thoroughly, then rotate krbtgt twice as part of recovery. The reset is cheap insurance relative to a lingering forged TGT. |
ExecutiveExecutive brief
The risk in plain language
Once an attacker gets deep enough into our Windows network to reach a domain controller, which is one of the servers that vouches for every login, they can copy a single master secret. With it, they can manufacture valid-looking access passes for any employee, including administrators, and those passes keep working even after we change passwords and disable accounts.
This is the stage of a breach where the obvious response, resetting the compromised user's password, quietly fails. Evicting the attacker requires a specific, careful procedure, and skipping it has let intruders stay in networks for months.
Business impact
- Durable, hard-to-remove control of the entire Windows environment: the foothold ransomware crews use before encrypting everything at once.
- The ability to impersonate any employee, which undermines our logs and our ability to tell legitimate activity from the attacker's.
- A longer, more expensive incident, because incomplete eviction means the attacker comes back.
What drives likelihood
- Whether an attacker can reach a domain controller or its master secret at all. Strong separation of administrator accounts is the single biggest factor.
- Patch level. Microsoft closed specific tricks in 2021 to 2023; unpatched servers reopen them.
- Credential protection on everyday computers, which newer Windows versions provide by default.
- Whether we can detect the theft of the master secret, and whether we have a rehearsed recovery procedure.
Cost of inaction
The defenses are mostly process and configuration: separating administrator duties, keeping servers patched, turning on protections already built into Windows, and rehearsing one recovery procedure. The cost of not doing this is a breach that we cannot fully clean up on the first attempt, with the attacker retaining control while we believe we've recovered.
What good looks like
- Administrators of the most sensitive systems use separate, protected computers, so their access passes never sit on ordinary machines.
- All domain controllers are current on security updates.
- Credential protection is on across company laptops and servers.
- We get an alert if someone copies the master secret, and we have a tested procedure to rotate it.
- Recovery from a domain controller compromise is a documented, practised runbook, not an improvised scramble.
Questions executives ask
Presenting this finding to leadership
- Headline: "We were able to reach the network's master login secret, which would let an attacker impersonate anyone and stay in even after password resets."
- The point about eviction: stress that this is the finding where the normal clean-up doesn't work, so it changes how an incident must be handled, not just how it's prevented.
- Tie to patch and privilege: name whether separation of admin duties and patching would have blocked the path we used.
- The ask: admin-tiering, a patch-currency commitment for domain controllers, and a rehearsed recovery runbook.
Talk the talk
Jargon decoder
Smart questions to ask
Sysadmins
- When was
krbtgtlast rotated, and was it a proper double reset? - Are all DCs past the October 2022 and October 2023 PAC enforcement updates?
- Who holds "Replicating Directory Changes All" besides the DCs?
- Is Credential Guard running on workstations and member servers, and deliberately off on DCs?
- Which accounts are in Protected Users, and did you check for RC4/DES dependencies first?
- Do you have a written, rehearsed procedure for recovering from a DC compromise?
Executives
- If an attacker reached a domain controller, how confident are we that we could fully remove them?
- Do our most privileged administrators use separate, protected machines?
- Have we rehearsed recovering from this kind of compromise?
Coworkers
- Does this engagement allow DCSync, and is the blue team watching for it?
- Are we demonstrating persistence, or just proving the key was reachable?
- What's the client's krbtgt rotation state; is the double reset part of our recommendations?
Say this, not that
Same point, two audiences
Acronyms
Every acronym used on this page. Four test modes are below the table.
Test yourself
Flashcards
Quiz
Fifteen questions, mostly scenarios. Feedback appears as soon as you choose.
Conversation drills
Say or type your answer first, then compare with the sample.
Export cards
Basic cards (Quizlet and Anki Basic)
Anki cloze cards
Keep going
What to learn next, in order
- Part 3 of this series: delegation and trust. Unconstrained, constrained and resource-based constrained delegation, the S4U extensions (which underpin sapphire tickets), cross-domain referrals and SID history, Protected Users in depth, and FAST armoring.
- Active Directory incident response and forest recovery. The runbook side of this page: containment sequencing, krbtgt rotation during an incident, and rebuilding trust.
- Reading AD attack paths as graphs. BloodHound, to see which footholds reach Tier 0 and the
krbtgtkey. - Active Directory Certificate Services. Certificate-based paths to tickets and to the
krbtgtequivalent of trust; a large surface of its own. - Detection engineering for identity. Writing and tuning the DCSync, lifetime-anomaly, and PAC-event rules in your SIEM.
Resources worth seeking out
- Microsoft Support: KB5008380 (CVE-2021-42287, PAC requestor), KB5020805 (CVE-2022-37967, full PAC signature), KB5021131 (CVE-2022-37966), and the Credential Guard documentation on Microsoft Learn.
- Specifications: [MS-PAC] for the PAC structure and signatures, and [MS-KILE] for the Windows Kerberos extensions.
- Incident response: Microsoft's AD forest recovery guidance, and CISA's eviction guidance, which cover the double krbtgt reset and
New-KrbtgtKeys.ps1. - MITRE ATT&CK: T1558 (Steal or Forge Kerberos Tickets) and its sub-techniques .001 Golden Ticket and .002 Silver Ticket; T1550.003 Pass the Ticket; T1003.006 OS Credential Dumping: DCSync.
- Research background: the TrustedSec and Semperis write-ups on diamond tickets by Charlie Clark and Andrew Schwartz, for why newer forgeries evade older detections.
- Hands-on labs: the GOAD project, to run DCSync and pass-the-ticket in a safe lab and then find the traces in DC logs.
- Defender reading: Sean Metcalf's ADSecurity.org for golden/silver ticket and krbtgt articles written for defenders.