Domain Trusts
Last updated
Many large organizations will acquire new companies over time and bring them into the fold. One way this is done for ease of use is to establish a trust relationship with the new domain. In doing so, you can avoid migrating all the established objects, making integration much quicker. This trust can also introduce weaknesses into the customer's environment if they are not careful. A subdomain with an exploitable flaw or vulnerability can provide us with a quick route into the target domain. Companies may also establish trusts with other companies (such as an MSP), a customer, or other business units of the same company (such as a division of the company in another geographical region). Let's explore domain trusts more and how we can abuse built-in functionality during our assessments.
A trust is used to establish forest-forest or domain-domain (intra-domain) authentication, which allows users to access resources in (or perform administrative tasks) another domain, outside of the main domain where their account resides. A trust creates a link between the authentication systems of two domains and may allow either one-way or two-way (bidirectional) communication. An organization can create various types of trusts:
Parent-child
: Two or more domains within the same forest. The child domain has a two-way transitive trust with the parent domain, meaning that users in the child domain corp.inlanefreight.local
could authenticate into the parent domain inlanefreight.local
, and vice-versa.
Cross-link
: A trust between child domains to speed up authentication.
External
: A non-transitive trust between two separate domains in separate forests which are not already joined by a forest trust. This type of trust utilizes SID filtering or filters out authentication requests (by SID) not from the trusted domain.
Tree-root
: A two-way transitive trust between a forest root domain and a new tree root domain. They are created by design when you set up a new tree root domain within a forest.
Forest
: A transitive trust between two forest root domains.
ESAE: A bastion forest used to manage Active Directory.
When establishing a trust, certain elements can be modified depending on the business case.
Trusts can be transitive or non-transitive.
A transitive
trust means that trust is extended to objects that the child domain trusts. For example, let's say we have three domains. In a transitive relationship, if Domain A
has a trust with Domain B
, and Domain B
has a transitive
trust with Domain C
, then Domain A
will automatically trust Domain C
.
In a non-transitive trust
, the child domain itself is the only one trusted.
Adapted from here
Trust Table Side By Side
Shared, 1 to many
Direct trust
The trust is shared with anyone in the forest
Not extended to next level child domains
Forest, tree-root, parent-child, and cross-link trusts are transitive
Typical for external or custom trust setups
An easy comparison to make can be package delivery to your house. For a transitive
trust, you have extended the permission to anyone in your household (forest) to accept a package on your behalf. For a non-transitive
trust, you have given strict orders with the package that no one other than the delivery service and you can handle the package, and only you can sign for it.
Trusts can be set up in two directions: one-way or two-way (bidirectional).
One-way trust
: Users in a trusted
domain can access resources in a trusting domain, not vice-versa.
Bidirectional trust
: Users from both trusting domains can access resources in the other domain. For example, in a bidirectional trust between INLANEFREIGHT.LOCAL
and FREIGHTLOGISTICS.LOCAL
, users in INLANEFREIGHT.LOCAL
would be able to access resources in FREIGHTLOGISTICS.LOCAL
, and vice-versa.
Domain trusts are often set up incorrectly and can provide us with critical unintended attack paths. Also, trusts set up for ease of use may not be reviewed later for potential security implications if security is not considered before establishing the trust relationship. A Merger & Acquisition (M&A) between two companies can result in bidirectional trusts with acquired companies, which can unknowingly introduce risk into the acquiring company’s environment if the security posture of the acquired company is unknown and untested. If someone wanted to target your organization, they could also look at the other company you acquired for a potentially softer target to attack, allowing them to get into your organization indirectly. It is not uncommon to be able to perform an attack such as Kerberoasting against a domain outside the principal domain and obtain a user that has administrative access within the principal domain. I have performed many penetration tests where this was the case: I was unable to find a foothold in the principal domain, but was able to find a flaw in a trusted domain which, in turn, gave me a foothold, or even full admin rights in the principal domain. This type of "end-around" attack could be prevented if security is considered as paramount before establishing any kind of domain trust. As we examine trust relationships, keep these thoughts in mind for reporting. Often, we will find that the larger organization is unaware that a trust relationship exists with one or more domains.
Below is a graphical representation of the various trust types.
We can use the Get-ADTrust cmdlet to enumerate domain trust relationships. This is especially helpful if we are limited to just using built-in tools.
Using Get-ADTrust
The above output shows that our current domain INLANEFREIGHT.LOCAL
has two domain trusts. The first is with LOGISTICS.INLANEFREIGHT.LOCAL
, and the IntraForest
property shows that this is a child domain, and we are currently positioned in the root domain of the forest. The second trust is with the domain FREIGHTLOGISTICS.LOCAL,
and the ForestTransitive
property is set to True
, which means that this is a forest trust or external trust. We can see that both trusts are set up to be bidirectional, meaning that users can authenticate back and forth across both trusts. This is important to note down during an assessment. If we cannot authenticate across a trust, we cannot perform any enumeration or attacks across the trust.
Aside from using built-in AD tools such as the Active Directory PowerShell module, both PowerView and BloodHound can be utilized to enumerate trust relationships, the type of trusts established, and the authentication flow. After importing PowerView, we can use the Get-DomainTrust function to enumerate what trusts exist, if any.
Checking for Existing Trusts using Get-DomainTrust
PowerView can be used to perform a domain trust mapping and provide information such as the type of trust (parent/child, external, forest) and the direction of the trust (one-way or bidirectional). This information is beneficial once a foothold is obtained, and we plan to compromise the environment further.
Using Get-DomainTrustMapping
From here, we could begin performing enumeration across the trusts. For example, we could look at all users in the child domain:
Checking Users in the Child Domain using Get-DomainUser
Another tool we can use to get Domain Trust is netdom
. The netdom query
sub-command of the netdom
command-line tool in Windows can retrieve information about the domain, including a list of workstations, servers, and domain trusts.
Using netdom to query domain trust
Using netdom to query domain controllers
Using netdom to query workstations and servers
We can also use BloodHound to visualize these trust relationships by using the Map Domain Trusts
pre-built query. Here we can easily see that two bidirectional trusts exist.
Visualizing Trust Relationships in BloodHound