// HackTricks · Windows

Kerberos Authentication

Kerberos Authentication

For a protocol-level walkthrough of the exchanges summarized below, see Tarlogic’s Kerberos article.[3]

TL;DR for attackers

  • Kerberos is the default AD auth protocol; most lateral-movement chains will touch it.
  • Think in three operator phases:[3]
    • AS-REQ / AS-REP → password/hash/certificate to obtain a TGT. This is where AS-REP roasting, over-pass-the-hash / pass-the-key, and PKINIT live.
    • TGS-REQ / TGS-REP → use a TGT to obtain service tickets. This is where Kerberoasting, S4U abuse, delegation abuse, and most ticket-forging tradecraft become relevant.
    • AP-REQ / AP-REP → present the ticket to the service. This is where pass-the-ticket and service-specific lateral movement happen.
  • For hands-on cheatsheets (AS-REP/Kerberoasting, ticket forgery, delegation abuse, etc.) see: Readme
  • Use this page as the overview / “what changed recently” index, then jump to the dedicated pages for Kerberoast, Resource-Based Constrained Delegation, AD Certificates / PKINIT abuse, or BadSuccessor / dMSA abuse.

Fresh attack notes (2024-2026)

  • RC4 hardening changed the defaults, not Kerberos itself – modern DC hardening focuses on the default assumed encryption types for accounts that do not explicitly set msDS-SupportedEncryptionTypes. After the 2026 rollout, those accounts increasingly default to AES-only on patched DCs, so blind /rc4 Kerberoast assumptions fail more often. However, explicitly RC4-enabled service accounts remain excellent offline-crack targets.[1]
  • PAC validation enforcement matters for forged tickets – 2024 PAC-signature hardening means that golden/diamond/sapphire/extraSID-style abuses need more realistic PAC data and the correct signing context. Unpatched domains or domains left in compatibility/audit-style deployments stay softer targets.[2]
  • Certificate-based Kerberos changed twice:
    • Strong certificate binding (KB5014754 timeline) makes sloppy certificate-to-account mappings less reliable in fully enforced environments.
    • CVE-2025-26647 added another hardening layer around altSecurityIdentities mappings that use a certificate’s Subject Key Identifier. Patch level, enforcement or audit state, and explicit mapping configuration therefore matter when evaluating pass-the-certificate and related certificate-based paths.[5][6] For PKINIT, the KDC also validates the certificate path and checks that the issuer is trusted through the NTAuth store.[8]
  • Cross-domain / cross-forest delegation abuse is still very alive – Windows supports modern cross-realm S4U2Self/S4U2Proxy flows, so writable delegation attributes in another domain are still valuable. The blocker is usually tooling fidelity and trust/policy details, not protocol support.
  • Recursive multi-domain RBCD matters operationally – in 3+ domain forests, S4U2Self/S4U2Proxy can recurse through trust referrals, and SPN-less abuse may require a final S4U2Self+U2U hop plus RC4-dependent ticket handling. See Resource-Based Constrained Delegation.[4]
  • Windows Server 2025 introduced delegated Managed Service Accounts (dMSAs) and their migration logic. If you see delegated rights over OUs or service-account objects in a 2025 domain, check the dedicated BadSuccessor page instead of treating it like “just another gMSA”.[7]

Fast operator checks in modern domains

Before choosing a Kerberos attack path, quickly answer four questions:

  1. Which accounts are still RC4-friendly?
  2. Which users do not require pre-auth?
  3. Which objects expose delegation abuse?
  4. Which parts of the domain are new enough to enforce recent hardening?
# 1) Service accounts explicitly pinned to RC4 / legacy etypes
Get-ADObject -LDAPFilter '(|(msDS-SupportedEncryptionTypes=4)(msDS-SupportedEncryptionTypes=12))' \
  -Properties samAccountName,servicePrincipalName,msDS-SupportedEncryptionTypes

# 2) Service accounts with no explicit etype config
#    (these increasingly inherit AES-only defaults on patched 2026 DCs)
Get-ADObject -LDAPFilter '(&(servicePrincipalName=*)(!(msDS-SupportedEncryptionTypes=*)))' \
  -Properties samAccountName,servicePrincipalName

# 3) AS-REP roastable users
Get-ADUser -LDAPFilter '(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=4194304))' \
  -Properties userAccountControl

# 4) Delegation hot spots
Get-ADComputer -LDAPFilter '(msDS-AllowedToActOnBehalfOfOtherIdentity=*)' \
  -Properties msDS-AllowedToActOnBehalfOfOtherIdentity
Get-ADObject -LDAPFilter '(|(userAccountControl:1.2.840.113556.1.4.803:=524288)(userAccountControl:1.2.840.113556.1.4.803:=16777216))' \
  -Properties samAccountName,servicePrincipalName,userAccountControl

# 5) DC-side RC4 hardening / compatibility clues
Get-WinEvent -LogName System | Where-Object {
  $_.ProviderName -eq 'Microsoft-Windows-Kerberos-Key-Distribution-Center' -and $_.Id -in 201..209
}

Practical interpretation:

  • If interesting SPN accounts are explicitly RC4-capable, Kerberoasting stays cheap and fast.
  • If most service accounts have no explicit etype configuration, expect AES-only behavior on updated 2026 DCs and plan for slower offline cracking or a different path.
  • If RBCD / KCD / unconstrained delegation is present, S4U often beats brute-force.
  • If certificate auth is in play, remember that a failed PKINIT path does not always mean the cert is useless; in many environments the same cert still works for Schannel/LDAPS abuse (see AD Certificates / PKINIT abuse).

Common Kerberos errors that change the attack plan

  • KDC_ERR_ETYPE_NOTSUPP → The target account / DC will not use the encryption type you asked for. Stop retrying with RC4 only; supply AES keys or request AES roast material instead.
  • KRB_AP_ERR_MODIFIED → You likely have the wrong service key, the wrong SPN, or a forged ticket that does not match the service account actually decrypting it.
  • KRB_AP_ERR_SKEW → Your time is off. Sync to the DC before debugging anything else.
  • KDC_ERR_BADOPTION during S4U / delegation flows → frequently means sensitive/not-delegable users, the wrong delegation model, or that you are trying to do classic KCD where only RBCD would accept a non-forwardable S4U2Self ticket.

References

☧ CPTS · ordered posts

Locked

Unlock with your Main_Key through local GPG.

Start the local GPG helper

In your cheatsheet checkout, run:

npm run unlock:helper

Open the link it prints, or paste its pairing code below. Keep the terminal open until GPG finishes.

Import an index you already decrypted

Download the encrypted index, then decrypt with GPG:

gpg --output report-index.json --decrypt report-index.gpg

Your private key stays in GPG. The decrypted index is saved in this browser so you can reopen it after navigation, refreshes and restarts. Lock this browser or clear this site's browser data to remove the saved index. Nothing is uploaded.