T1558

Steal or Forge Kerberos Tickets

Credential Access Last updated:

Adversaries may attempt to subvert Kerberos authentication by stealing or forging Kerberos tickets to enable Pass the Ticket (T1550.003). In Active Directory environments, Kerberos is the primary authentication protocol. Adversaries exploit it through multiple sub-techniques: Kerberoasting (T1558.003) requests service tickets for accounts with SPNs using RC4 encryption for offline hash cracking; AS-REP Roasting (T1558.004) targets accounts with pre-authentication disabled to obtain crackable AS-REP responses; Golden Ticket attacks (T1558.001) use a stolen KRBTGT hash to forge TGTs granting unrestricted domain access; Silver Ticket attacks (T1558.002) forge service tickets using a service account hash for targeted service access; and Ccache file theft (T1558.005) targets Linux/macOS Kerberos credential cache files. Common offensive tools include Rubeus, Mimikatz (kerberos modules), Kekeo, and the Impacket suite (GetUserSPNs.py, GetNPUsers.py, ticketer.py). Detection leverages Windows Security Kerberos event IDs 4768, 4769, and 4771 for protocol-level anomalies such as RC4 encryption downgrade requests in AES-enforced environments, and process telemetry for offensive tool signatures.

What is T1558 Steal or Forge Kerberos Tickets?

Steal or Forge Kerberos Tickets (T1558) maps to the Credential Access tactic — the adversary is trying to steal account names and passwords in MITRE ATT&CK.

This page provides production-ready detection logic for Steal or Forge Kerberos Tickets, covering the data sources and telemetry it touches: Authentication: Authentication, Active Directory: Active Directory Credential Request, Process: Process Creation, Microsoft Sentinel SecurityEvent, Microsoft Defender for Endpoint. The queries below are rated high severity at high confidence, and ship for 7 SIEM platforms — KQL, SPL, Elastic, QRadar, Sumo, YARA-L, LogScale.

MITRE ATT&CK

Tactic
Credential Access
Technique
T1558 Steal or Forge Kerberos Tickets
Canonical reference
https://attack.mitre.org/techniques/T1558/
Microsoft Sentinel / Defender
kusto
// T1558: Steal or Forge Kerberos Tickets — Multi-pattern detection
// Covers Kerberoasting (4769+RC4), AS-REP Roasting (4768+PreAuth=0),
// Golden Ticket indicators (RC4 TGT), and attack tool process signatures
let LookbackWindow = 24h;

// Pattern 1: Kerberoasting — RC4 TGS requests via EventID 4769
// In AES-enforced environments, any 0x17 service ticket request is high-fidelity
let Kerberoasting = SecurityEvent
| where TimeGenerated > ago(LookbackWindow)
| where EventID == 4769
| where TicketEncryptionType in ("0x17", "0x18")  // RC4-HMAC and RC4-HMAC-EXP
| where ServiceName !endswith "$"                   // Exclude machine account SPNs
| where ServiceName !in~ ("krbtgt", "kadmin/changepw")
| where IpAddress !in ("::1", "127.0.0.1", "-")
| where Status == "0x0"                              // Successful ticket grants only
| summarize
    RequestCount = count(),
    UniqueServices = dcount(ServiceName),
    Services = make_set(ServiceName, 20),
    FirstSeen = min(TimeGenerated),
    LastSeen = max(TimeGenerated)
    by AccountName, IpAddress, Computer
| extend AttackPattern = "Kerberoasting"
| extend RiskLevel = iff(UniqueServices >= 3 or RequestCount >= 5, "Critical", "High");

// Pattern 2: AS-REP Roasting — TGT for account with pre-auth disabled (EventID 4768)
let ASREPRoasting = SecurityEvent
| where TimeGenerated > ago(LookbackWindow)
| where EventID == 4768
| where PreAuthType == "0"                           // Pre-authentication not required
| where TicketEncryptionType in ("0x17", "0x18")    // Attacker requests RC4 for offline cracking
| where Status == "0x0"
| where IpAddress !in ("::1", "127.0.0.1", "-")
| project TimeGenerated, AccountName, IpAddress, Computer, TicketEncryptionType, PreAuthType
| extend AttackPattern = "AS-REP Roasting"
| extend RiskLevel = "High";

// Pattern 3: Golden Ticket indicator — RC4 TGT request (EventID 4768)
// Legitimate AES-only domains should not produce 0x17 TGT events
let GoldenTicketIndicators = SecurityEvent
| where TimeGenerated > ago(LookbackWindow)
| where EventID == 4768
| where TicketEncryptionType in ("0x17", "0x18")    // RC4 TGT is abnormal in AES-enforced domains
| where IpAddress !in ("::1", "127.0.0.1", "-")
| project TimeGenerated, AccountName, IpAddress, Computer, TicketEncryptionType, Status
| extend AttackPattern = "Potential Golden Ticket (RC4 TGT)"
| extend RiskLevel = "Critical";

// Pattern 4: Kerberos attack tool detection via process command line telemetry
let KerberosTools = DeviceProcessEvents
| where Timestamp > ago(LookbackWindow)
| where ProcessCommandLine has_any (
    "Rubeus", "kerberoast", "asreproast", "tgtdeleg", "asktgt", "asktgs",
    "harvest", "monitor", "s4u",
    "sekurlsa::tickets", "kerberos::golden", "kerberos::silver",
    "kerberos::ptt", "kerberos::list", "kerberos::purge", "kerberos::tgt",
    "GetUserSPNs", "GetNPUsers", "ticketer.py"
  )
  or FileName in~ ("Rubeus.exe", "Kekeo.exe")
  or ProcessCommandLine has ".kirbi"
| project Timestamp, DeviceName, AccountName, FileName, ProcessCommandLine,
         InitiatingProcessFileName, InitiatingProcessCommandLine
| extend AttackPattern = "Kerberos Attack Tool"
| extend RiskLevel = "Critical";

// Unified output across all patterns
union
    (Kerberoasting
     | project TimeGenerated = LastSeen, Computer, AccountName, IpAddress,
         AttackPattern, RiskLevel,
         Details = strcat("RequestCount=", RequestCount, " UniqueServices=", UniqueServices, " SPNs=", tostring(Services))),
    (ASREPRoasting
     | project TimeGenerated, Computer, AccountName, IpAddress,
         AttackPattern, RiskLevel,
         Details = strcat("EncType=", TicketEncryptionType, " PreAuth=", PreAuthType)),
    (GoldenTicketIndicators
     | project TimeGenerated, Computer, AccountName, IpAddress,
         AttackPattern, RiskLevel,
         Details = strcat("EncType=", TicketEncryptionType, " Status=", Status)),
    (KerberosTools
     | project TimeGenerated = Timestamp, Computer = DeviceName, AccountName,
         IpAddress = "N/A (host-based)", AttackPattern, RiskLevel,
         Details = ProcessCommandLine)
| sort by TimeGenerated desc

Multi-pattern KQL detection covering all major T1558 sub-techniques using Microsoft Sentinel SecurityEvent and Defender for Endpoint DeviceProcessEvents tables. Pattern 1 (Kerberoasting) detects EventID 4769 TGS requests with RC4 encryption type 0x17, which is the primary Kerberoasting indicator in modern AES-enforced domains. Summarization groups requests per source to surface burst-scanning behavior and identifies multi-SPN enumeration. Pattern 2 (AS-REP Roasting) detects EventID 4768 TGT requests for accounts with PreAuthType=0, indicating pre-authentication is disabled. Pattern 3 (Golden Ticket) flags RC4 TGT requests as anomalous in AES-only domains, which may indicate a forged Golden Ticket being presented. Pattern 4 detects known offensive tool signatures (Rubeus, Mimikatz kerberos modules, Impacket GetUserSPNs/GetNPUsers/ticketer.py, and .kirbi ticket files) via process command line matching in DeviceProcessEvents. All patterns are unioned with RiskLevel tagging for analyst prioritization.

high severity high confidence

Data Sources

Authentication: Authentication Active Directory: Active Directory Credential Request Process: Process Creation Microsoft Sentinel SecurityEvent Microsoft Defender for Endpoint

Required Tables

SecurityEvent DeviceProcessEvents

False Positives

  • Legacy applications that still negotiate RC4 for Kerberos due to compatibility requirements — older Java-based apps (JDK < 17 defaults to AES but may fall back), older Linux Kerberos clients with krb5 library versions that prefer RC4, and applications where 'arcfour-hmac' is listed in krb5.conf etypes
  • IT inventory and vulnerability scanning tools such as Tenable Nessus, Qualys, and CyberArk that enumerate service principal names as part of Active Directory discovery modules
  • Backup and monitoring software (Veeam Backup, CommVault, SolarWinds) using service accounts with registered SPNs running on older server OS versions where RC4 is the negotiated cipher
  • Domain environments in mixed-mode with Windows Server 2008 R2 domain controllers, which still advertise RC4 support by default and can cause clients to negotiate 0x17 during normal Kerberos exchanges

Sigma rule & cross-platform mapping

The detection logic for Steal or Forge Kerberos Tickets (T1558) above is provided in a vendor-neutral form so you can deploy it on any SIEM. The same logic is shipped here as native KQL (Microsoft Sentinel / Defender), SPL (Splunk), Elastic (Elastic Security (EQL)), QRadar (IBM QRadar (AQL)), Sumo (Sumo Logic CSE), YARA-L (Google Chronicle / SecOps), LogScale (CrowdStrike LogScale (CQL)) queries. In Sigma terms, this detection targets the following logsource:

logsource:
  category: process_creation
  product: windows

Browse the community-maintained Sigma rules for this technique:


Testing Methodology

Validate this detection against 5 adversary techniques from Atomic Red Team. Each test below lists the behaviour to exercise and the telemetry you should expect to see. Executable commands and cleanup steps are available with Pro.

  1. Test 1Kerberoasting with Rubeus — RC4 TGS Enumeration

    Expected signal: Sysmon Event ID 1: Process Create with Image ending in Rubeus.exe and CommandLine containing 'kerberoast'. Windows Security Event ID 4769 on the domain controller for each SPN enumerated, with TicketEncryptionType=0x17 and TicketOptions=0x40810000. The requesting AccountName and source IpAddress will match the test machine. Multiple 4769 events in rapid succession from the same source IP is the key burst pattern.

  2. Test 2AS-REP Roasting with Rubeus — Pre-Auth Disabled Account Hash Capture

    Expected signal: Sysmon Event ID 1: Process Create with Image ending in Rubeus.exe and CommandLine containing 'asreproast'. Windows Security Event ID 4768 on the domain controller for each targeted account, with PreAuthType=0 and TicketEncryptionType=0x17 or 0x18. Source IpAddress matches test machine.

  3. Test 3Kerberos Ticket Dump with Mimikatz

    Expected signal: Sysmon Event ID 1: Process Create with Image ending in mimikatz.exe and CommandLine containing 'sekurlsa::tickets'. Sysmon Event ID 10 (Process Access): mimikatz.exe accessing lsass.exe with GrantedAccess 0x1010 or 0x1438. Sysmon Event ID 11 (File Create): multiple .kirbi files written to the working directory. Windows Defender Event ID 1116 may fire on AMSI or signature detection.

  4. Test 4AS-REP Roasting with Impacket GetNPUsers.py (Linux/Cross-Platform)

    Expected signal: Windows Security Event ID 4768 on the targeted domain controller for each AS-REP Roastable account, with PreAuthType=0 and source IpAddress matching the Linux attacker machine. On the DC Sysmon would not capture this (it's a network event), so primary telemetry is the Security log. DNS/LDAP queries to the DC LDAP port (389/636) from the source IP visible in network logs.

  5. Test 5Kerberos Ticket Enumeration with Built-in klist

    Expected signal: Sysmon Event ID 1: Process Create with Image = C:\Windows\System32\klist.exe. Security Event ID 4688 (if command line auditing enabled) with ProcessName = klist.exe. No 4769 events are generated — klist reads from local cache only without contacting the KDC.


Response Playbook

Triage

  1. Identify the specific sub-technique triggered: Kerberoasting (4769 + RC4 + non-machine SPN), AS-REP Roasting (4768 + PreAuthType=0), Golden Ticket indicator (4768 + RC4 TGT from unexpected IP), or tool-based (process signature). Each requires a different response path.
  2. For Kerberoasting: review the ServiceName fields in the 4769 events — are these service accounts in privileged groups (Domain Admins, Enterprise Admins, server admins)? Check UniqueServices count: a single RC4 TGS request may be a legacy app, but 5+ distinct SPNs in a short window is high-confidence Kerberoasting.
  3. Pivot to the source IP (IpAddress/ClientIP field): run a reverse DNS lookup, check if it matches a known workstation/server in CMDB, and review all Kerberos requests from that IP in the last 24 hours using: SecurityEvent | where IpAddress == "<IP>" | where EventID in (4768, 4769, 4771) | sort by TimeGenerated
  4. Check the requesting account (AccountName): is this a service account, domain admin, regular user, or machine account? Review recent logon events (EventID 4624) for this account and compare against normal patterns. An account that logged in recently from a different IP than the Kerberoasting source is a strong lateral movement indicator.
  5. For Golden Ticket indicators: check whether the AccountName in the 4768 event actually exists in Active Directory and whether the TicketOptions match expected values. Forged Golden Tickets often use non-standard TicketOptions (0x40e00000 is a common Mimikatz default vs. the legitimate 0x40810010).
  6. Correlate with endpoint telemetry: search DeviceProcessEvents and Sysmon for Rubeus, Mimikatz, or Impacket process creation on the source IP's host in the same time window.

Containment

  1. If Kerberoasting confirmed (multiple RC4 TGS requests): immediately reset passwords for all service accounts that had tickets requested — attackers may have captured hashes for offline cracking. Prioritize accounts in privileged groups. Enforce long random passwords (25+ chars) to make cracked hashes useless.
  2. If AS-REP Roasting confirmed: enable Kerberos pre-authentication (clear the DONT_REQ_PREAUTH flag in userAccountControl) for the targeted accounts via AD Users and Computers or PowerShell: Set-ADAccountControl -Identity <user> -DoesNotRequirePreAuth $false
  3. If Golden Ticket attack confirmed (KRBTGT hash compromised): reset the KRBTGT account password TWICE with a 10-hour gap between resets (to ensure all existing tickets expire). Use Microsoft's script: https://aka.ms/krbtgtaccountresetscript. This is the only complete remediation — all existing TGTs become invalid.
  4. If Silver Ticket attack confirmed: reset the password of the specific service account whose hash was used to forge the ticket. Identify the service from the 4769 ServiceName field and locate the corresponding account.
  5. Isolate the source host using EDR network isolation or VLAN change if active tooling is detected. Block the source IP at the domain controller network perimeter if the IP is external or belongs to a compromised machine.
  6. Purge Kerberos tickets on potentially compromised hosts using: klist purge (Windows) or kdestroy (Linux). Force re-authentication to generate fresh tickets from the legitimate KDC.

Evidence Collection

  1. Windows Security Event Log on domain controllers: EventIDs 4768 (TGT request), 4769 (TGS request), 4770 (ticket renewal), 4771 (pre-auth failure), 4776 (NTLM credential validation), 4672 (special privileges assigned) — pull logs from all DCs in the environment, not just the alerting one
  2. Sysmon Event ID 1 (Process Create) on the source endpoint: captures full command lines for Rubeus, Mimikatz, and Impacket invocations including arguments that reveal targeted accounts and ticket types
  3. Sysmon Event ID 11 (File Create) on the source endpoint: look for .kirbi files in temp directories, user profile, or tool output paths indicating exported ticket files
  4. Sysmon Event ID 3 (Network Connect) from the source endpoint: verify which hosts the attacker connected to using harvested tickets — lateral movement leaves 4624/4769 pairs on destination hosts
  5. LSASS memory dump (if IR team has capability): live ticket extraction from LSASS process memory using Volatility's kerberos plugin reveals in-memory tickets that may not have generated event log entries
  6. Network PCAP from domain controller interface (if available): TGS-REQ packets with eType 23 (RC4-HMAC) in AS-REQ/TGS-REQ are direct wire evidence of Kerberoasting; Wireshark filter: kerberos.msg.type == 12 (TGS-REQ)
  7. Active Directory audit: run Get-ADUser -Filter {ServicePrincipalName -ne "$null"} -Properties ServicePrincipalName,PasswordLastSet to identify which SPNed accounts were targeted and when their passwords were last rotated

Escalation Criteria

  • ! Golden Ticket attack confirmed or suspected: KRBTGT password has not been reset in >180 days AND anomalous 4768 events show RC4 TGT from non-DC source IP — escalate immediately as full domain compromise is possible
  • ! High-value service accounts targeted in Kerberoasting: ServiceName maps to accounts in Domain Admins, Enterprise Admins, Schema Admins, or Tier-0 service accounts (backup agents, PAM solutions) — password cracking would yield domain-level access
  • ! Multiple domain controllers showing the same RC4 TGS pattern from the same source IP within a short window — indicates active enumeration across the forest, not a legacy compatibility issue
  • ! Confirmed offensive tool execution (Rubeus, Mimikatz kerberos modules) on any host — tool presence confirms intent and elevates all associated Kerberos anomalies to confirmed attack
  • ! Evidence of successful lateral movement following Kerberos ticket activity: 4624 Type 3 (network) logon events on high-value servers (DC, file server, backup server) from the same source host as the Kerberoasting activity

Investigation Guide

Forensic Artifacts

  • > Windows Security Event Log on DCs: EventIDs 4768/4769/4770/4771 with source IP, account name, encryption type, and ticket options — primary evidence for all Kerberos-based attacks
  • > File System: *.kirbi files in %TEMP%, attacker working directories, or tool output paths — Mimikatz and Rubeus both export tickets in .kirbi format by default
  • > File System: Rubeus.exe, Kekeo.exe, or renamed copies in user profile directories, %TEMP%, or C:\ProgramData — presence confirms offensive tooling
  • > Registry: HKLM\SYSTEM\CurrentControlSet\Services\Kdc\KdcSupportedEncTypes — value controls which encryption types the DC accepts; attackers may modify this to force RC4 downgrade
  • > Active Directory: userAccountControl attribute on user objects — DONT_REQ_PREAUTH flag (0x400000) set on accounts indicates AS-REP Roastable configuration
  • > Active Directory: msDS-SupportedEncryptionTypes attribute on service accounts — absence or value 0x4 (RC4 only) indicates account is Kerberoastable with RC4
  • > Memory: LSASS process memory via Volatility kerberos plugin or live klist.exe output — reveals currently cached tickets including forged ones with anomalous lifetimes or PAC structures
  • > Network PCAP: TGS-REQ packets with etype 23 (RC4-HMAC) in kerberos.EncryptedData.etype field — direct wire evidence captured at domain controller network interface
  • > PowerShell/CMD history: %APPDATA%\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt and cmd doskey history for Rubeus, Mimikatz, and Impacket invocation history
  • > Prefetch: C:\Windows\Prefetch\RUBEUS.EXE-*.pf, MIMIKATZ.EXE-*.pf — execution timestamps and loaded modules even after binary deletion

Tuning Guidance

Begin tuning by auditing which accounts and applications legitimately use RC4 Kerberos encryption in your environment. Run: Get-ADUser -Filter {ServicePrincipalName -ne "$null"} -Properties msDS-SupportedEncryptionTypes | Where-Object {$_.msDS-SupportedEncryptionTypes -eq 0 -or $_.msDS-SupportedEncryptionTypes -band 4} to identify service accounts that do not explicitly advertise AES support — these will generate legitimate 0x17 TGS events and should be in your allowlist. Similarly, identify legacy applications that cannot support AES and allowlist their source IPs or service account names as specific string matches (never wildcard-exclude entire IP ranges). To reduce Golden Ticket FPs, enforce AES-only Kerberos via GPO (Computer Configuration > Windows Settings > Security Settings > Local Policies > Security Options: Network security: Configure encryption types allowed for Kerberos = AES128/AES256 only) — after this policy is deployed, any 0x17 TGT event is near-certain malicious. For Kerberoasting detection, increase the RequestCount threshold from 1 to 3+ for the initial alert if your environment has legacy RC4 apps, but maintain a lower threshold for alerts that span multiple distinct ServiceNames. For AS-REP Roasting, run Get-ADUser -Filter {DoesNotRequirePreAuth -eq $true} and remediate all non-service accounts — a clean environment should have zero PreAuthType=0 success events, making this a zero-FP detection. Suppress klist.exe invocations from known IT admin accounts but do not suppress the pattern entirely.


Hunting Queries

Hunt for accounts or source IPs requesting RC4-encrypted TGS tickets for 3 or more distinct service SPNs over 7 days. Kerberoasting tools like Rubeus and Impacket's GetUserSPNs.py enumerate all Kerberoastable accounts in a single run, generating a burst of 4769 events across multiple ServiceNames. A single legacy app would request RC4 for the same one or two services repeatedly — multi-SPN RC4 bursts are Kerberoasting fingerprints. Sort by UniqueServices descending to prioritize high-breadth enumeration.

Hunting — KQL
kql
// Hunt: Bulk SPN enumeration — accounts requesting many distinct service tickets
// Kerberoasting tools enumerate all Kerberoastable SPNs in a burst; this surfaces
// accounts that request 3+ distinct service tickets within a 1-hour sliding window
SecurityEvent
| where TimeGenerated > ago(7d)
| where EventID == 4769
| where TicketEncryptionType in ("0x17", "0x18")
| where ServiceName !endswith "$"
| where ServiceName !in~ ("krbtgt", "kadmin/changepw")
| where IpAddress !in ("::1", "127.0.0.1", "-")
| where Status == "0x0"
| summarize
    TotalRequests = count(),
    UniqueServices = dcount(ServiceName),
    Services = make_set(ServiceName, 50),
    ActiveDays = dcount(bin(TimeGenerated, 1d)),
    FirstSeen = min(TimeGenerated),
    LastSeen = max(TimeGenerated)
    by AccountName, IpAddress
| where UniqueServices >= 3
| order by UniqueServices desc
Hunting — SPL
spl
index=wineventlog (sourcetype="WinEventLog:Security" OR sourcetype="XmlWinEventLog:Security")
EventCode=4769 (Ticket_Encryption_Type="0x17" OR Ticket_Encryption_Type="0x18")
NOT Service_Name="krbtgt" NOT like(Service_Name, "%$")
NOT (Client_Address="::1" OR Client_Address="127.0.0.1" OR Client_Address="-")
earliest=-7d
| eval SvcName=coalesce('Service_Name', ServiceName)
| eval ClientIP=coalesce('Client_Address', IpAddress)
| eval ActName=coalesce('Account_Name', AccountName)
| stats count as TotalRequests, dc(SvcName) as UniqueServices, values(SvcName) as Services, dc(date_mday) as ActiveDays, earliest(_time) as FirstSeen, latest(_time) as LastSeen by ActName, ClientIP
| where UniqueServices >= 3
| sort - UniqueServices

Hunt for Active Directory account modifications that enable the DONT_REQ_PREAUTH flag (userAccountControl bit 0x400000), which makes an account AS-REP Roastable. EventID 4738 (A User Account Was Changed) records userAccountControl modifications, and the flag appears in the event message as %%2096 or DONT_REQ_PREAUTH. Attackers who have write access to AD objects may enable this flag on service accounts or user accounts to generate crackable AS-REP responses. This hunt surfaces the enabling action as a precursor to the roasting attempt.

Hunting — KQL
kql
// Hunt: AS-REP Roastable account flag changes — DONT_REQ_PREAUTH modifications
// Attackers may enable pre-auth bypass on accounts they control to expand roastable surface.
// EventID 4738 captures UserAccountControl changes; hunt for DONT_REQ_PREAUTH flag additions.
SecurityEvent
| where TimeGenerated > ago(7d)
| where EventID == 4738                               // A user account was changed
| where UserAccountControl has "2096"                 // %%2096 = DONT_REQ_PREAUTH in Security log message text
    or UserAccountControl has "PREAUTH"
    or UserAccountControl has "4194304"               // 0x400000 numeric form
| project TimeGenerated, TargetUserName, SubjectUserName, SubjectDomainName,
         UserAccountControl, Computer
| sort by TimeGenerated desc
Hunting — SPL
spl
index=wineventlog (sourcetype="WinEventLog:Security" OR sourcetype="XmlWinEventLog:Security")
EventCode=4738 earliest=-7d
| eval UAC=coalesce('User_Account_Control', UserAccountControl)
| where match(UAC, "(2096|PREAUTH|4194304)")
| eval TargetUser=coalesce('Target_Account_Name', TargetUserName)
| eval SubjectUser=coalesce('Subject_Account_Name', SubjectUserName)
| table _time, host, TargetUser, SubjectUser, UAC
| sort - _time

Hunt for Kerberos ticket file artifacts (.kirbi) created on endpoints (Sysmon Event 11) and ticket export commands (Sysmon Event 1). Attackers using Mimikatz's kerberos::list /export, sekurlsa::tickets /export, or Rubeus dump/triage commands write ticket files to disk for exfiltration or use on other hosts via Pass-the-Ticket. The presence of .kirbi files is a high-confidence indicator of active credential theft activity. This hunt finds artifacts that the main detection may miss if no anomalous 4769 events were generated (e.g., Silver Ticket attacks that bypass the KDC entirely).

Hunting — KQL
kql
// Hunt: Kerberos ticket file artifacts and klist export activity
// Attackers export tickets to .kirbi files for portability and use on other hosts.
// This hunt surfaces .kirbi file creation events and suspicious klist/ticket-export commands.
let TicketFileCreation = DeviceFileEvents
| where Timestamp > ago(7d)
| where FileName endswith ".kirbi"
| project Timestamp, DeviceName, AccountName, FileName, FolderPath, InitiatingProcessFileName, InitiatingProcessCommandLine
| extend HuntPattern = "Kerberos Ticket File Created (.kirbi)";

let KlistExport = DeviceProcessEvents
| where Timestamp > ago(7d)
| where FileName =~ "klist.exe"
    or ProcessCommandLine has_any ("kerberos::list /export", "sekurlsa::tickets /export",
                                    "Rubeus dump", "Rubeus triage", "harvest /interval")
| project Timestamp, DeviceName, AccountName, FileName, ProcessCommandLine,
         InitiatingProcessFileName
| extend HuntPattern = "Kerberos Ticket Dump/Export Command";

union TicketFileCreation, KlistExport
| sort by Timestamp desc
Hunting — SPL
spl
index=wineventlog sourcetype="XmlWinEventLog:Microsoft-Windows-Sysmon/Operational" earliest=-7d
((EventCode=11 TargetFilename="*.kirbi")
 OR (EventCode=1 (Image="*\\klist.exe"
   OR CommandLine="*kerberos::list /export*" OR CommandLine="*sekurlsa::tickets /export*"
   OR CommandLine="*Rubeus dump*" OR CommandLine="*Rubeus triage*"
   OR CommandLine="*harvest /interval*")))
| eval HuntPattern=case(
    EventCode=11, "Kerberos Ticket File Created (.kirbi)",
    EventCode=1, "Kerberos Ticket Dump/Export Command",
    true(), "Unknown")
| eval Artifact=coalesce(TargetFilename, CommandLine)
| table _time, host, User, Image, Artifact, HuntPattern
| sort - _time

Atomic Red Team Tests

Test 1 Kerberoasting with Rubeus — RC4 TGS Enumeration
windows

Uses Rubeus to request RC4-encrypted TGS tickets for all accounts with Service Principal Names registered in Active Directory. This is the standard Kerberoasting workflow used by threat actors: enumerate SPNs, request RC4 tickets (which the KDC will supply if RC4 is not disabled), and capture hashes for offline cracking. The /rc4opsec flag limits requests to accounts that explicitly advertise RC4 support to reduce noise, but /outfile captures all hashes regardless.

Command

powershell
Rubeus.exe kerberoast /outfile:C:\Temp\kerberoast_hashes.txt /format:hashcat /rc4opsec

Cleanup

powershell
del C:\Temp\kerberoast_hashes.txt 2>nul

Expected Telemetry

Sysmon Event ID 1: Process Create with Image ending in Rubeus.exe and CommandLine containing 'kerberoast'. Windows Security Event ID 4769 on the domain controller for each SPN enumerated, with TicketEncryptionType=0x17 and TicketOptions=0x40810000. The requesting AccountName and source IpAddress will match the test machine. Multiple 4769 events in rapid succession from the same source IP is the key burst pattern.

Expected Detection

KQL Pattern 1 (Kerberoasting) fires: EventID 4769 + TicketEncryptionType 0x17 + non-machine ServiceName, summarized per AccountName/IpAddress. KQL Pattern 4 (KerberosTools) fires: ProcessCommandLine has 'Rubeus' and 'kerberoast'. SPL IsKerberoasting=1 and IsKerberosTool=1. Alert RiskLevel escalates to Critical if 3+ unique SPNs are requested.

Test 2 AS-REP Roasting with Rubeus — Pre-Auth Disabled Account Hash Capture
windows

Uses Rubeus to request AS-REP hashes for accounts in the domain that have Kerberos pre-authentication disabled (DONT_REQ_PREAUTH set in userAccountControl). The KDC will return an AS-REP encrypted with the account's password hash without verifying the requester's identity, allowing offline cracking. This requires at least one AS-REP Roastable account to exist in the domain.

Command

powershell
Rubeus.exe asreproast /format:hashcat /outfile:C:\Temp\asrep_hashes.txt /nowrap

Cleanup

powershell
del C:\Temp\asrep_hashes.txt 2>nul

Expected Telemetry

Sysmon Event ID 1: Process Create with Image ending in Rubeus.exe and CommandLine containing 'asreproast'. Windows Security Event ID 4768 on the domain controller for each targeted account, with PreAuthType=0 and TicketEncryptionType=0x17 or 0x18. Source IpAddress matches test machine.

Expected Detection

KQL Pattern 2 (ASREPRoasting) fires: EventID 4768 + PreAuthType=0 + TicketEncryptionType 0x17. KQL Pattern 4 fires on 'asreproast' in ProcessCommandLine. SPL IsASREPRoasting=1 and IsKerberosTool=1. Alert severity = High.

Test 3 Kerberos Ticket Dump with Mimikatz
windows

Uses Mimikatz's kerberos::list /export command to dump all Kerberos tickets from the current user's or LSASS's ticket cache and export them as .kirbi files. These files can be imported on another machine using kerberos::ptt for Pass-the-Ticket lateral movement. This technique is used by APT groups including those associated with the Akira ransomware to harvest credentials post-compromise.

Command

powershell
mimikatz.exe "privilege::debug" "sekurlsa::tickets /export" "exit"

Cleanup

powershell
del *.kirbi 2>nul

Expected Telemetry

Sysmon Event ID 1: Process Create with Image ending in mimikatz.exe and CommandLine containing 'sekurlsa::tickets'. Sysmon Event ID 10 (Process Access): mimikatz.exe accessing lsass.exe with GrantedAccess 0x1010 or 0x1438. Sysmon Event ID 11 (File Create): multiple .kirbi files written to the working directory. Windows Defender Event ID 1116 may fire on AMSI or signature detection.

Expected Detection

KQL Pattern 4 (KerberosTools) fires on 'sekurlsa::tickets' in ProcessCommandLine. SPL IsKerberosTool=1 via regex match on 'sekurlsa::tickets'. Hunting Query 3 fires on .kirbi file creation via DeviceFileEvents. Alert RiskLevel = Critical.

Test 4 AS-REP Roasting with Impacket GetNPUsers.py (Linux/Cross-Platform)
linux

Uses Impacket's GetNPUsers.py script to query Active Directory for accounts with pre-authentication disabled and request their AS-REP hashes. This is the standard attacker workflow from Linux attacker infrastructure (Kali Linux, Parrot OS) targeting Windows Active Directory environments without domain-joined access. The script authenticates with provided credentials and queries LDAP for DONT_REQ_PREAUTH accounts.

Command

bash
python3 /opt/impacket/examples/GetNPUsers.py DOMAIN.LOCAL/ -usersfile /tmp/users.txt -format hashcat -outputfile /tmp/asrep_hashes.txt -dc-ip 192.168.1.10

Cleanup

bash
rm -f /tmp/asrep_hashes.txt

Expected Telemetry

Windows Security Event ID 4768 on the targeted domain controller for each AS-REP Roastable account, with PreAuthType=0 and source IpAddress matching the Linux attacker machine. On the DC Sysmon would not capture this (it's a network event), so primary telemetry is the Security log. DNS/LDAP queries to the DC LDAP port (389/636) from the source IP visible in network logs.

Expected Detection

KQL Pattern 2 (ASREPRoasting) fires: 4768 + PreAuthType=0. Source IP will be a Linux/non-domain-joined machine, which increases suspicion since domain-joined machines rarely appear with PreAuthType=0. SPL IsASREPRoasting=1. No process-level telemetry on Windows endpoints since attack originates from Linux.

Test 5 Kerberos Ticket Enumeration with Built-in klist
windows

Uses the built-in Windows klist utility to enumerate all cached Kerberos tickets for the current logon session. This is the initial reconnaissance step adversaries use to identify available tickets for Pass-the-Ticket attacks or to understand the victim's access scope. klist is a signed Microsoft binary and its use is difficult to block — detection relies on contextual anomaly (e.g., called from a suspicious parent process or in conjunction with other tooling).

Command

powershell
klist

Expected Telemetry

Sysmon Event ID 1: Process Create with Image = C:\Windows\System32\klist.exe. Security Event ID 4688 (if command line auditing enabled) with ProcessName = klist.exe. No 4769 events are generated — klist reads from local cache only without contacting the KDC.

Expected Detection

Standalone klist.exe execution has low fidelity on its own — alert only fires if klist appears in the KerberosTools DeviceProcessEvents query via the 'kerberos::list' pattern, or if klist is spawned by a suspicious parent (PowerShell, cmd.exe launched by Office, etc.). Hunting Query 3 (klist export) fires if combined with /export flag. Use parent process context for triage — klist spawned by explorer.exe or a user terminal is benign; klist spawned by powershell.exe or a red team framework is suspicious.

Related Detections