home / research / detecting-kerberoasting
DETECTION ENGINEERING · Jun 10, 2026 · ~14 min

Detecting Kerberoasting: A Practical Walkthrough with Sigma

Kerberoasting is a decade old, requires no special privileges, and produces almost no noise — which is exactly why it's still one of the most common post-compromise techniques in 2026. Here's how it works, what it leaves behind in your logs, and a set of Sigma rules you can actually run.

ATT&CK T1558.003 Credential Access Active Directory Event ID 4769

TL;DR for defenders. Turn on Audit Kerberos Service Ticket Operations on your domain controllers, then watch Event ID 4769 for two things: (1) service-ticket requests using RC4 (TicketEncryptionType 0x17) in an environment that should be using AES, and (2) a single account requesting tickets for an unusual number of distinct service principals. A decoy "honeypot" SPN turns this from anomaly-hunting into a near-zero-false-positive alarm. Rules below.

Why this is still worth your time in 2026

Kerberoasting has been public since Tim Medin presented it in 2014, so it's tempting to file it under "solved." It isn't. CrowdStrike's 2025 Global Threat Report lists it among the top post-compromise techniques they observe, and IBM X-Force reported a roughly 100% year-over-year increase in Kerberoasting seen during incident-response engagements. The reason it persists is structural: the attack abuses how Kerberos is supposed to work, so there's no patch that makes it disappear.

There's also a 2026-specific wrinkle. Microsoft is finally retiring RC4: new Active Directory domains built on Windows Server 2025 have RC4 disabled by default as of Q1 2026. That's real progress — but existing domains keep RC4 enabled for backward compatibility unless an admin changes it. So for most organizations, the weak encryption that makes Kerberoasting fast is still sitting there, and detection still matters.

How the attack actually works

Kerberos lets any authenticated domain user request a service ticket (a TGS) for any account that has a Service Principal Name (SPN). That's not a bug — it's how a user gets access to, say, a SQL service. The catch is what's inside the ticket: a portion encrypted with a key derived from the service account's password.

  1. The attacker, using any low-privilege domain account, enumerates accounts that have an SPN set (these are usually service accounts).
  2. They request a TGS for one or more of those SPNs. The domain controller happily issues the tickets.
  3. They extract the encrypted blob and crack it offline, on their own hardware, to recover the service account's plaintext password.
  4. Because the cracking happens off the network, there are no failed logons, no account lockouts, and nothing to trip a brute-force alarm.

Service accounts are a juicy target precisely because they're often over-privileged, rarely rotated, and set up years ago with passwords that predate any modern policy. Crack one and you may inherit a foothold that's effectively permanent.

RC4 is the part that hurts

The crackability depends almost entirely on the ticket's encryption type. When a ticket is issued with RC4-HMAC (etype 0x17, decimal 23), the key is derived directly from the account's unsalted NT hash — fast to attack with a GPU. Modern cracking rigs running Hashcat exceed 100 billion guesses per second, so a weak service-account password falls in minutes.

AES tickets (0x11/AES-128 and 0x12/AES-256) are dramatically harder — on the order of tens of thousands of times more cracking effort — because of salting and key derivation. That's why Kerberoasting tooling frequently requests RC4 on purpose: the attacker downgrades to the weakest option the domain will hand out. That deliberate downgrade is your single best detection signal.

What you need flowing into your SIEM

Everything here keys off one Windows event generated on domain controllers: Event ID 4769 — "A Kerberos service ticket was requested." If you're not collecting it yet:

The fields you'll lean on in each 4769 event:

FieldWhy it matters
TicketEncryptionType0x17 = RC4 (the downgrade signal). 0x12 = AES-256, 0x11 = AES-128.
ServiceName / ServiceSidThe account whose ticket was requested — i.e. the roast target. Names ending in $ are computer accounts (usually benign).
TargetUserName / Account NameThe principal that made the request — the account you'd investigate.
TicketOptionsRoasting tools often produce recognizable option flags (commonly 0x40810000), though this varies and shouldn't be relied on alone.
Status0x0 = the ticket was successfully issued.

Detection strategy

No single rule is a silver bullet. The reliable approach layers three detections, from highest-precision to broadest. This mirrors MITRE ATT&CK's own detection strategy for the technique (DET0157).

1. RC4 ticket requested in an AES environment (high precision)

If your domain functional level and accounts support AES, legitimate clients should almost never request RC4. So an RC4 4769 becomes a strong signal. We exclude computer accounts ($) and krbtgt, which generate benign RC4 traffic in many environments.

title: Kerberoasting - RC4 Service Ticket Requested
id: 8f1e2c33-6a4b-4d9e-9a1f-2b7c0d5e4a10
status: experimental
description: >
    A Kerberos TGS (Event 4769) was issued using RC4-HMAC encryption.
    In AES-capable domains this is a common indicator of Kerberoasting,
    where tooling downgrades to RC4 to ease offline cracking.
references:
    - https://attack.mitre.org/techniques/T1558/003/
    - https://umbrasec.dev/research/detecting-kerberoasting.html
author: UMBRASEC
date: 2026/06/10
tags:
    - attack.credential_access
    - attack.t1558.003
logsource:
    product: windows
    service: security
detection:
    selection:
        EventID: 4769
        TicketEncryptionType: '0x17'   # RC4-HMAC
        TicketOptions: '0x40810000'     # see tuning note - remove if too narrow
    filter_machine:
        ServiceName|endswith: '$'
    filter_krbtgt:
        ServiceName: 'krbtgt'
    filter_failures:
        Status: '0x1b'                  # only count issued tickets, drop S4U/failed
    condition: selection and not 1 of filter_*
falsepositives:
    - Legacy applications or appliances that genuinely require RC4
    - Some Linux/macOS or third-party Kerberos clients
    - Accounts whose msDS-SupportedEncryptionTypes still allow only RC4
level: medium

Tuning note. The TicketOptions: '0x40810000' line tightens precision but will miss tools that vary their flags. Start without it to measure your baseline of RC4 requests, identify the legitimate RC4-only accounts, add those to filter_machine as an allowlist, and only then decide whether the TicketOptions constraint earns its keep.

2. One account, many service principals (velocity / fan-out)

Roasting frameworks frequently pull tickets for every SPN they can find in one burst. A normal user touches a handful of services a day; an account requesting tickets for dozens of distinct SPNs in minutes is anomalous regardless of encryption type. This one is best expressed as an aggregation, so it's a natural fit for a Sigma correlation rule (or the equivalent stats query in your SIEM):

title: Kerberoasting - High Volume of Distinct SPN Requests
id: 1c9d4b77-2e55-4f01-bb3a-6d8e9f0a1b22
status: experimental
description: >
    A single account requested Kerberos service tickets (4769) for an
    unusually large number of distinct service principals in a short
    window - consistent with bulk Kerberoasting enumeration.
references:
    - https://attack.mitre.org/techniques/T1558/003/
author: UMBRASEC
date: 2026/06/10
tags:
    - attack.credential_access
    - attack.t1558.003
correlation:
    type: value_count
    rules:
        - kerberoasting_4769_base
    group-by:
        - TargetUserName
    timespan: 5m
    condition:
        gte: 15
        field: ServiceName
---
title: Kerberoasting 4769 base
id: 2d0e5c88-3f66-4012-cc4b-7e9f0a1b2c33
name: kerberoasting_4769_base
logsource:
    product: windows
    service: security
detection:
    selection:
        EventID: 4769
        Status: '0x0'
    filter_machine:
        TargetUserName|endswith: '$'
    condition: selection and not filter_machine

The gte: 15 threshold and 5m window are starting points, not gospel. Run it in report-only mode for a week, look at your top talkers (vulnerability scanners and monitoring accounts will show up — allowlist them), and set the threshold above your noisiest legitimate account.

3. The honeypot SPN (near-zero false positives)

This is the highest-value, lowest-effort detection in the whole post, and it deserves more attention than it gets. Create a decoy service account:

Now any 4769 naming that account is suspicious by construction, because no honest workload ever requests its ticket. This converts a fuzzy anomaly problem into a binary alarm.

title: Kerberoasting - Honeypot SPN Ticket Requested
id: 3e1f6d99-4a77-4123-dd5c-8f0a1b2c3d44
status: experimental
description: >
    A Kerberos service ticket (4769) was requested for a decoy service
    account that no legitimate workload uses. Any hit is high-confidence
    evidence of SPN enumeration / Kerberoasting.
references:
    - https://attack.mitre.org/techniques/T1558/003/
author: UMBRASEC
date: 2026/06/10
tags:
    - attack.credential_access
    - attack.t1558.003
    - attack.deception
logsource:
    product: windows
    service: security
detection:
    selection:
        EventID: 4769
        ServiceName: 'svc-honeypot-sql'   # <-- your decoy sAMAccountName
    condition: selection
falsepositives:
    - A misconfigured scanner that was pointed at the decoy (investigate anyway)
level: high

Mitigation, not just detection

Detection buys you time; these changes shrink the attack surface. Microsoft's October 2024 guidance is the authoritative reference and worth reading in full.

Honest limitations

A "low and slow" attacker who requests a single high-value ticket and waits will sail past the velocity rule (#2) and, if they target an account that's still RC4-only for legitimate reasons, may not stand out in rule #1 either. That's not a reason to skip these — it's the reason the honeypot (#3) exists, and the reason mitigation matters as much as detection. Layer all three, and pair them with the non-crackable passwords that make a stolen ticket useless even if it slips through.

These rules are written to be readable and tunable, not dropped in blind. Test them in report-only mode, baseline your own environment, and treat the thresholds as dials. If one misbehaves for you, that's a great GitHub issue — corrections make the next version better.

References

Scope note. This is a defensive writeup. It explains the technique only to the depth needed to detect and mitigate it, and deliberately does not provide roasting tooling or cracking instructions. UMBRASEC publishes defense, not offense.

← All research Found an error? Tell me →