Kerberoasting
Kerberoasting lets any domain user request a crackable ticket for a service account, then brute-force its password offline. Here is exactly what it looks like in your logs and the Sigma and Wazuh rules that catch it.
Run it live: Kerberoast to Domain Admin
A real Active Directory domain with a kerberoastable service account, an attacker box, and a Wazuh SIEM. Request the ticket, crack it offline, then find event 4769 in the SIEM.
Kerberoasting abuses a normal feature of Kerberos: any authenticated domain user can request a service ticket (TGS) for any account that has a Service Principal Name (SPN). Part of that ticket is encrypted with the service account's password hash, so an attacker requests the ticket, takes it offline, and brute-forces the password at their leisure, with no further contact with the domain. Service accounts often have weak, non-expiring passwords and excessive privilege, which is why this one technique so often ends in Domain Admin.
What it looks like
On the attacker side it is a single request. With Impacket that is `GetUserSPNs.py -request`, or in Rubeus `kerberoast`. The tell is the ticket's encryption type: attackers force RC4 (etype 0x17) because it cracks far faster than AES. On the domain controller, every ticket request writes a Kerberos Service Ticket Operations event, Event ID 4769, and the roasting request stands out as RC4 to a user-associated SPN from a normal workstation.
- Windows Security log, DC: Event ID 4769 with Ticket Encryption Type 0x17 (RC4).
- A burst of 4769s for many different service names from one account is bulk roasting.
- The Service Name is a user account SPN (e.g. svc_sql), not a machine account ($).
- Ticket Options often 0x40810000; Failure Code 0x0.
Detect it: Sigma
title: Kerberoasting via RC4 Service Ticket Request
id: 0f1a2b3c-roast-4d5e-6f70-tyrian000001
status: stable
logsource:
product: windows
service: security
detection:
selection:
EventID: 4769
TicketEncryptionType: '0x17' # RC4-HMAC, forced by roasting tools
TicketOptions: '0x40810000'
filter_machine:
ServiceName|endswith: '$' # exclude computer-account SPNs
filter_krbtgt:
ServiceName: 'krbtgt'
condition: selection and not filter_machine and not filter_krbtgt
level: high
tags:
- attack.credential_access
- attack.t1558.003The rule keys on the two things a roasting tool controls: an RC4-encrypted TGS for a user SPN. Excluding machine accounts (`$`) and krbtgt removes the normal Kerberos noise. In a healthy modern domain, RC4 TGS requests for service accounts should be rare, so even a low volume is worth an alert.
Detect it: Wazuh
<group name="windows,kerberos,attack,">
<rule id="100410" level="10">
<if_group>windows_security</if_group>
<field name="win.system.eventID">^4769$</field>
<field name="win.eventdata.ticketEncryptionType">^0x17$</field>
<description>Kerberoasting: RC4 service ticket requested (T1558.003)</description>
<mitre>
<id>T1558.003</id>
</mitre>
<options>no_full_log</options>
</rule>
<!-- Raise severity when one account roasts many SPNs in a short window -->
<rule id="100411" level="12" frequency="8" timeframe="120">
<if_matched_sid>100410</if_matched_sid>
<same_field>win.eventdata.targetUserName</same_field>
<description>Kerberoasting: bulk RC4 ticket requests from one account</description>
<mitre>
<id>T1558.003</id>
</mitre>
</rule>
</group>Reduce the attack surface
- Give service accounts long (25+ char) random passwords, or use Group Managed Service Accounts (gMSA).
- Disable RC4 where you can so tickets are AES-only, which makes offline cracking impractical.
- Audit which accounts have SPNs and remove ones that don't need them.
- Alert on 4769 RC4 for user SPNs, then measure your mean-time-to-detect against a real request.
Test this detection on your own SIEM
Launch the Kerberoast to Domain Admin range, fire T1558.003, and measure how fast you catch it. $5 free credit, no card.