Trusts
Last updated
Was this helpful?
Last updated
Was this helpful?
There are some parts missing here. It's indicated with the 🛠️ emoji in the category name. Wanna help? Please reach out to me:
Attacking Active Directory trust relationships requires a good understanding of a lot of concepts (what forests and domains are, how trusts work, what security mechanisms are involved and how they work, ...). Consequently, this page is lengthy, especially in the and parts, but I did my best to include all the necessary info here.
Pro tip: take a look at the table of contents on the right panel, it will allow you to browse the page more easily.
An Active Directory domain is a collection of computers, users, and other resources that are all managed together. A domain has its own security database, which is used to authenticate users and computers when they log in or access resources within the domain.
A forest is a collection of one or more Active Directory domains that share a common schema, configuration, and global catalog. The schema defines the kinds of objects that can be created within the forest, and the global catalog is a centralized database that contains a searchable, partial replica of every domain in the forest.
Trust relationships between domains allow users in one domain to access resources in another domain. There are several types of trust relationships that can be established, including one-way trusts, two-way trusts, external trusts, etc.
Once a trust relationship is established between a trusting domain (A) and trusted domain (B), users from the trusted domain can authenticate to the trusting domain's resources. In other -more technical- terms, trusts extend the security boundary of a domain or forest.
The global catalog is a partial copy of all objects in an Active Directory forest, meaning that some object properties (but not all) are contained within it. This data is replicated among all domain controllers marked as global catalogs for the forest. One of the Global Catalog's purposes is to facilitate quick object searching and conflict resolution without the necessity of referring to other domains .
The initial global catalog is generated on the first domain controller created in the first domain in the forest. The first domain controller for each new child domain is also set as a global catalog by default, but others can be added.
The GC allows both users and applications to find information about any objects in ANY domain in the forest. The Global Catalog performs the following functions:
Authentication (provided authorization for all groups that a user account belongs to, which is included when an access token is generated)
Object search (making the directory structure within a forest transparent, allowing a search to be carried out across all domains in a forest by providing just one attribute about an object.)
Downlevel: a trust with a domain that is running a version of Windows NT 4.0 or earlier.
Uplevel: a trust with a domain that is running Windows 2000 or later.
MIT: a trust with a non-Windows Kerberos realm, typically used for interoperability with UNIX-based systems running MIT Kerberos.
AAD: the trusted domain is in Azure Active Directory.
Parent-Child: this type of trust relationship exists between a parent domain and a child domain in the same forest. The parent domain trusts the child domain, and the child domain trusts the parent domain. This type of trust is automatically created when a new child domain is created in a forest.
Tree-Root: exists between the root domain of a tree and the root domain of another tree in the same forest. This type of trust is automatically created when a new tree is created in a forest.
Shortcut (a.k.a. cross-link): exists between two child domains of different tree (i.e. different parent domains) within the same forest. This type of trust relationship is used to reduce the number of authentication hops between distant domains. It is a one-way or two-way transitive trust.
External: exists between a domain in one forest and a domain in a different forest. It allows users in one domain to access resources in the other domain. It's usually set up when accessing resources in a forest without trust relationships established.
Forest: exists between two forests (i.e. between two root domains in their respective forest). It allows users in one forest to access resources in the other forest.
Realm: exists between a Windows domain and a non-Windows domain, such as a Kerberos realm. It allows users in the Windows domain to access resources in the non-Windows domain.
Parent-Child
Transitive
Two-way
Either
Automatic
Tree-Root
Transitive
Two-way
Either
Automatic
Shortcut (a.k.a. cross-link)
Transitive
Either
Either
Manual
Realm
Either
Either
Kerberos V5 only
Manual
Forest
Transitive
Either
Either
Manual
External
Non-transitive
One-way
NTLM only
Manual
In Active Directory, a transitive trust is a type of trust relationship that allows access to resources to be passed from one domain to another. When a transitive trust is established between two domains, any trusts that have been established with the first domain are automatically extended to the second domain. This means that if Domain A trusts Domain B and Domain B trusts Domain C, then Domain A automatically trusts Domain C, even if there is no direct trust relationship between Domain A and Domain C. Transitive trusts are useful in large, complex networks where multiple trust relationships have been established between many different domains. They help to simplify the process of accessing resources and reduce the number of authentication hops that may be required.
According to Microsoft, the security boundary in Active Directory is the forest, not the domain. The forest defines the boundaries of trust and controls access to resources within the forest.
The domain is a unit within a forest and represents a logical grouping of users, computers, and other resources. Users within a domain can access resources within their own domain and can also access resources in other domains within the same forest, as long as they have the appropriate permissions. Users cannot access resources in other forests unless a trust relationship has been established between the forests.
SID filtering plays an important role in the security boundary by making sure "only SIDs from the trusted domain will be accepted for authorization data returned during authentication. SIDs from other domains will be removed" (netdom
cmdlet output). By default, SID filtering is disabled for intra-forest trusts, and enabled for inter-forest trusts.
if SID filtering is fully enabled, all SIDs that differ from the trusted domain will be filtered out
The SID (Security Identifier) is a unique identifier that is assigned to each security principal (e.g. user, group, computer). It is used to identify the principal within the domain and is used to control access to resources.
The SID history is a property of a user or group object that allows the object to retain its SID when it is migrated from one domain to another as part of a domain consolidation or restructuring. When an object is migrated to a new domain, it is assigned a new SID in the target domain. The SID history allows the object to retain its original SID, so that access to resources in the source domain is not lost.
Many resources across the Internet, including Microsoft's docs and tools, state that SID history can be enabled across a trust. This is not 100% true. SID history is not a feature that can be toggled on or off per say.
Inter-forest trusts ("External" and "Forest" trusts) can be configured with different levels of authentication:
Forest-wide authentication: allows unrestricted authentication from the trusted forest's principals to the trusting forest's resources. This is the least secure level, it completely opens one forest to another (authentication-wise though, not access-wise). This level is specific to intra-forest trusts.
Domain-wide authentication: allows unrestricted authentication from the trusted domain's principals to the trusting domain's resources. This is more secure than forest-wide authentication because it only allows users in a specific (trusted) domain to access resources in another (trusting).
Selective authentication: allows only specific users in the trusted domain to access resources in the trusting domain. This is the most secure type of trust because it allows administrators to tightly control access to resources in the trusted domain. In order to allow a "trusted user" to access a "trusting resource", the resource's DACL must include an ACE in which the trusted user has the "Allowed-To-Authenticate
" extended right (GUID: 68b1d179-0d15-4d4f-ab71-46152e79a7bc
).
It's worth noting that selective authentication is less used by the general public due to its complexity, but it's definitely the most restrictive, hence secure, choice.
Kerberos unconstrained delegations could be abused across trusts to take control over any resource of the trusting domain, including the domain controller, as long as the trusted domain is compromised. This relies on the delegation of TGT across trusts, which can be disabled.
When a user in domain A tries to authenticate or access a resource in domain B that he has established access to, he presents his ticket-granting-ticket (TGT) and request for a service ticket to the KDC for domain A. The KDC for A determines that the resource is not in its realm, and issues the user a referral ticket.
In an NTLM authentication sequence, a user authenticates to a resource by sending an NTLM Negotiate message, receiving an NTLM Challenge, and then sending back an NTLM Authenticate. The server then passes the logon request through to the Domain Controller, using the Netlogon Remote Protocol.
This mechanism of delegating the authentication request to a DC is called pass-through authentication.
Upon successful validation of the user credentials on the DC, the Netlogon Remote Protocol delivers the user authorization attributes (referred to as user validation information) back to the server over the secure channel.
When using NTLM across trust relationships, the process is very similar.
The trusted domain's DC does the usual checks and passes the result to the trusting DC, which in turn passes it to the resource. The resource then accepts or rejects the authentication based on the decision passed through the DCs.
Nota bene, wether it's Kerberos or NTLM, the ExtraSids are in the same data structure, it's just named differently for each protocol. And, the SID filtering function called by the trusting DC is the same, for both authentication protocols.
Microsoft introduced MIM (Microsoft Identity Manager) Privileged Access Management (PAM) with Server 2016, including the following features. (Sometimes PAM is also referred to as PIM in some docs/links).
A Bastion forest (i.e. forest in ESAE (Enhanced Security Admin Environment), a.k.a. Red Forest)
Shadow Security Principals (i.e. admins in Bastion Forest can be mapped as Domain Admins or a "User Forest")
Temporary group membership (i.e. add a user to a group with a time-to-live (TTL))
PAM enables the management of an existing "Production Forest" (one can think of that as a User Forest as well) using a "Bastion Forest" which has a one-way PAM trust with the existing forest. The users in the Bastion Forest can be 'mapped' to privileged groups like "Domain Admins" and "Enterprise Admins" in the Production Forest without modifying any group memberships or ACLs. This takes away the administrative overhead and reduces the chances of lateral movement techniques.
This is done by creating "Shadow Security Principals" in the Bastion Forest, which are mapped to SIDs for high-privileged groups in the User Forest, and then adding users from the Bastion Forest as members of the Shadow Security Principals.
While domain trusts don't necessarily give access to resources, they allow the trusted domain's principal to query another -trusting- domain's AD info.
Attacking AD trusts comes down to the following process.
Map all direct and indirect trusts involved with an already compromised domain.
Trust partner: trusting domain for outbound trusts, trusted domain for inbound trusts. Bidirectional trusts are two one-way trusts. Retrieved from the TDO attribute trustPartner
value.
Trust direction: inbound, outbound, or bidirectional. Retrieved from the TDO attribute trustDirection
integer value.
Trust type: Parent-Child, Tree-Root, Shortcut (a.k.a. "Cross-Link"), Forest, External, or Realm (a.k.a. "Kerberos").
If the attacker is moving across an intra-forest trust, it would allow to compromise the forest root, and by extension, all the forest, since Enterprise Admins can access all domains' domain controllers as admin (because the security boundary is the forest, not the domain).
ticketer.py to forge tickets
getST.py to request service tickets
lookupsid.py to retrieve the domains' SIDs
If SID filtering is disabled, set the RID to 519 to act as Enterprise Admin.
If SID filtering is partially enabled, set the RID >=1000.
The attack is conducted as follows:
Get the local domain's SID of the target server. This step requires Windows older than Windows 10 build 1607, or before Server 2016, as it uses MS-LSAT RPC to query the target server for the SID of its local domain, that is restricted on newer versions and requires administrative privileges on the target.
Spoof the local domain's SID of the target server. This steps must be run as SYSTEM
on the trusted forest's domain controller. The Frida script used for this step is made for Windows Server 2016 version 1607. If the target runs a different version, the address offset might be different and some additional preparation must be done.
Some considerations to reproduce the attack:
Full control over the trusted forest is assumed.
Information that flows over to the trusting forest can be modified.
There is at least one server joined to a domain in the trusting forest (referred to as the "target server" here).
// Enterprise Domain Controllers have GenericAll
on Keys
container (CN=keys,DN=domain,DN=local
), "Default container for key credential objects", used for gMSA ?
// Container should be empty, but if it's not, exploitable seulement s'il y a déjà des objets dans le conteneur ce qui n'est pas censé être le cas par défaut.
Depuis le domaine source, en tant que SYSTEM, on peut modifier le schéma dans la partition de Configuration puis attendre que ce soit répliqué sur le domaine cible
Plus particulièrement en modifiant le defaultSecurityDescriptor de classes intéressantes (groupes, users, GPC), ou retirant le flag confidential
In addition to that, the ideal setup would be to have a two-way trust between the compromised domain (A) and the target domain (B), in order to allow the exploitation detailed below.
(trusting B -> trusted A), allows access from A to B, allows to coerce authentications
(trusting A -> trusted B), allows access from B to A, allows the coerced account to authenticate to the attacker-controlled KUD account.
If an attacker manages to gain control over an account configured for unconstrained delegation, he could escalate to domain admin privileges. Across trusts, the scenario is very similar. An attacker needs to gain control over a trusted account, configured for KUD (Kerberos Unconstrained Delegation), in order to act on a trusting resource (e.g. trusting domain's DC) as another principal (i.e. domain admin).
In most cases, the attacker will have to:
retrieve the TGT delegated in the service ticket the trusting resource used to access the attacker-controlled KUD account
TODO // Regular permissions, ACE, and whatnot abuses, but now between foreign principals, BloodHound comes in handy.
The trustType
attribute of a TDO specifies the type of trust that is established. Here are the different trust types (section of [MS-ADTS]):
DCE: not used in Windows. Would refer to trusts with a domain running .
The trust "flavor", on the other hand, represents the nature of the trust relationship between domains or forests. It is not a direct attribute but is identified based on other TDO attributes (see ).
The transitivity status of a trust depends on the flags of a .
(by on )
Section of [MS-PAC] specifies what is filtered and when. There are three important things to remember from this documentation:
even if it's enabled, a few SIDs will (almost) never be filtered: "Enterprise Domain Controllers" (S-1-5-9) SID and those described by the , as well as seven well-known SIDs (see , and ).
there are two kinds of inter-forest trusts: "Forest", and "External" (see ). Microsoft says "", meaning that in External trusts, SID filtering only filters out RID < 1000.
The SID filtering status of a trust depends on the flags of a as well as the type of trust.
(by on )
(sources: section of [MS-ADTS], and section of [MS-PAC]).
Above are some key, usually valid, elements. But as puts it: "the logic that sits behind this might be too complex to put it in text". To really know the behavior of SID filtering for a trust, refer to the lookup tables (for default trusts setups) and (for custom configs).
SID filtering is not unique to trusts. It occurs "" either by the KDC or by a local service and behaves differently depending on the contect in which the ticket was produced.
Also, SID filtering works the same way for NTLM and Kerberos. It's a separate mechanism invoked after user logon info are unpacked (more details in and chapters).
When authenticating across trusts , it is assumed that the extra SID field of the ticket's PAC (Privileged Attribute Certificate) reflects the SID history attribute of the authenticating user. With enabled in a trust, the SIDs contained in that field are filtered, effectively preventing SID history from doing its job. There are certain scenarios where some SIDs are not filtered, allowing for example SIDs with a RID >= 1000. Some, including Microsoft, call it "enabling SID history", but in fact, SID history is not toggled on or off here, it's the behavior of SID filtering that is adjusted. I'd call that "partial SID filtering", or "unencumbered SID history". calls that "".
When authenticating with NTLM, the process is highly similar, see the theory chapter for more information.
The authentication level of a trust depends on the flags of a .
(by on )
Kerberos unconstrained delegation (KUD) allows a service configured for it to impersonate (almost) any user on any other service. This is a dangerous feature to configure, that won't be explained into much details here as the , and pages already cover it.
If TGT delegation is disabled in a trust, attackers won't be able to . On a side note, the other types of delegations are not affected by this as they don't rely on the delegation of tickets, but on S4U extensions instead.
The TGT delegation status of a trust depends on the flags of a .
(by on )
Understanding how Kerberos works is required here: .
For a Kerberos authentication to occur across a domain trust, the Kerberos key distribution centers (KDCs) in two domains must have a shared secret, called an inter-realm key. This key is , and rotates approximately every 30 days. Parent-child domains share an inter-realm key implicitly.
This referral ticket is a ticket-granting-ticket (TGT) encrypted with the inter-realm key shared by domain A and B. The user presents this referral ticket to the KDC for domain B, which decrypts it with the inter-realm key, checks if the user in the ticket has access to the requested resource, and issues a service ticket. This process is described in detail in in the Simple Cross-Realm Authentication and Examples section.
(by on )
From an offensive point of view, just like a , a referral ticket could be forged. Forging a referral ticket using the inter-realm key, instead of relying on the krbtgt keys for a golden ticket, is a nice alternative for organizations that choose to roll their krbtgt keys, as they should. This technique is though, as it requires to .
Depending on the trust characteristics, ticket forgery can also be combined with spoofing for a direct privilege escalation from a child to a parent domain.
When doing Kerberos authentications across trusts, the trusting domain's domain controller before handing out service tickets to trusted users: during (looking in the ExtraSids
attribute from the structure in the PAC), verification (when asked for a Service Ticket for a service configured for unconstrained delegation), and limitation.
()
When a trusted domain's user wants to access a resource from a trusting domain, the user and the resource engage in the standard 3-way NTLM handshake. Upon receiving the NTLM Authenticate message, the resource forwards it to its own domain controller through a Netlogon "". The trusting DC forwards it as well to the trusted domain's DC through a Netlogon "".
When doing NTLM authentications across trusts, the trusting domain's domain controller checks a few things from the user info structure supplied by the trusted domain controller: (looking in the ExtraSids
attribute from the structure), and limitation during the . verification doesn't occur here, since it's a Kerberos mechanism.
The following section is a light adaptation of and work.
And remember that all parent->child (intra-forest domain trusts) retain an implicit two way transitive trust with each other. Also, due to how child domains are added, the “Enterprise Admins” group is automatically added to Administrators domain local group in each domain in the forest. This means that trust “flows down” from the forest root, making it our objective to move from child to forest root at any appropriate step in the attack chain. (from ).
All domains from the same forest are to be considered as first-choice targets ( would be disabled, allowing for with an ).
For the others, permissions must be audited to finds ways in trusting domains. This is done by finding out what trusted principals can do on trusting resources (Kerberos delegations, groups membership, DACLs, etc.), and then . All regular AD movement techniques apply, except the target resources and the account used to authenticate are not on the same domain, that's basically it.
Several tools can be used to enumerate trust relationships. The following major characteristic must be looked for, some of which are directly readable from the attributes and others need a little bit of logic.
Trust authentication level, transitivity, TGT delegation and SID filtering: Retrieved from a set of flags in the TDO's trustAttributes
attribute, combined with the type of trust (see , , and ).
Keep in mind that there is a TDO [()] for each side of the Trust relationship so always analyze both TDOs for each trust. [...]
(by on )
From UNIX-like systems, tools like (Python), (Python), (Python) and (C) can be used to enumerate trusts.
can also be used to map the trusts. While it doesn't provide much details, it shows a visual representation.
From Windows systems, many tools like can be used to enumerate trusts. "" by provides more in-depth guidance on how to enumerate and visually map domain trusts (in the "Visualizing Domain Trusts" section), as well as identify potential attack paths ("Foreign Relationship Enumeration" section).
Alternatively, 's (PowerShell) supports multiple commands for various purposes.
The in an Active Directory forest, meaning that some object properties (but not all) are contained within it. This data is replicated among all domain controllers marked as global catalogs for the forest. Trusted domain objects are replicated in the global catalog, so we can enumerate every single internal and external trust that all domains in our current forest have extremely quickly, and only with traffic to our current PDC.
(by on )
The global catalog can be found in many ways, including a simple DNS query (see ).
can also be used to map the trusts. While it doesn't provide much details, it shows a visual representation.
In addition to enumerating trusts, retrieving information about the permissions of trusted principals against trusting resources could also allow for lateral movement and privilege escalation. The recon techniques will depend on the permissions to abuse (, , etc.).
When forging a , or a , additional security identifiers (SIDs) can be added as "extra SID" and be considered as part of the user's when authenticating. Alternatively, the SID could be added beforehand, directly in the SID history attribute, with mimikatz command, but that's a topic for another day.
Then, when using the ticket, the SID history would be taken into account and could grant elevated privileges (depending on how is configured in the trust)
If the attacker is moving across an inter-forest trust, it could allow to compromise the trusting domain, depending on how is configured, and if there are some groups that have sufficient permissions.
In conclusion, before attacking trusts, it's required to enumerate them, as well as enumerate the target (trusting) domain's resources. See .
If SID filtering is disabled in the targeted trust relationship (see and ), a ticket (inter-realm/referral ticket, or golden ticket) can be forged with an extra SID that contains the root domain and the RID of the "Enterprise Admins" group (i.e. S-1-5-21-<RootDomain>-519
). The ticket can then be used to access the trusting domain controller as admin and conduct a attack.
If SID filtering is partially enabled (sometimes referred to as ), effectively only filtering out RID <1000, a ticket can be forged with an extra SID that contains the target domain and the RID of any group, with RID >= 1000). The ticket can then be used to conduct more attacks depending on the group's privileges.
For example the Exchange security groups, which allow for a in many setups all have RIDs larger than 1000. Also many organisations will have custom groups for workstation admins or helpdesks that are given local Administrator privileges on workstations or servers.
(by on )
If SID filtering is fully enabled, the techniques presented above will not work since all SIDs that differ from the trusted domain will be filtered out. This is usually the case with standard inter-forest trusts. Attackers must then fallback to other methods of . Alternatively, there are a few SIDs that won't be filtered out (see theory and practice).
If the attacker chooses to forge an inter-realm ticket forgery (i.e. referral ticket), a service ticket request must be conducted before trying to access the domain controller. In the case of a golden ticket, the target domain controller will do the hard work itself. Once the last ticket is obtained, it can be used with for the (if enough privileges, or any other operation if not).
From UNIX-like systems, scripts (Python) can be used for that purpose.
Impacket's script can also be used to conduct the golden ticket technique automatically when SID filtering is disabled (retrieving the SIDs, dumping the trusted domain's krbtgt, forging the ticket, dumping the forest root keys, etc.). It will forge a ticket with the Enterprise Admins extra SID.
a few SIDs will (almost) never be filtered: "Enterprise Domain Controllers" (S-1-5-9) SID and those described by the , as well as seven well-known SIDs (see , and ).
( theory)
//
The idea behind is to bypass SID filtering to authenticate as a server in the trusting forest targeting the local admin on this server (RID = 500). To do so, the local domain SID of the server is spoofed to "fake" a child domain in the trusted forest, which will be added to the list of trusted SIDs in the trusting forest domain's TDO () after 24 hours (see ). An inter-realm/referral ticket will then be forged using the spoofed SID as extended SID which will be used to request a service ticket to that server (see ).
Forging tickets. For this step, refer to theory chapter for more details about the trust key being used, the ticket forgery is then highly similar to the practice part.
For more details about how this attack works under the hood, refer to the article on by .
The attack can be conducted with 's .
//
//
//
//
In order to abuse unconstrained delegation across trusts, must be allowed/enabled on the trust, and must NOT be enabled (or with a configuration that would allow for the exploitation detailed below, see the chapter).
Other regular KUD-abuse-specific requirements apply (e.g. accounts not sensitive for delegation or member of the protected users group), see the page.
The page can be consulted in order to obtain operational guidance on how to abuse this context.
coerce the authentication (, , , , etc.) of a high-value target (e.g. domain controller) of the trusting domain
authenticate to trusting resources using the extracted TGT () in order to conduct privileged actions (e.g. )
TODO // How a domain admin of forest A could administrate a domain in forest B ?
When an ADCS is installed and configured in an Active Directory environment, a CA is available for the whole forest. Every usual ADCS attack can be executed through intra-forest trusts. and in particular can be used to pivot to any domain within the forest associated to the C
// group scoping,
Parts of this page were written with the help of the AI model.
We thank Capgemini for giving some time to write this page (see ).