Skip to content
← use cases
Case study · fully anonymised

How an autonomous red team went from an ADCS relay to full on-prem compromise — and was stopped at the cloud.

An autonomous red-team run drove an 11-phase chain — ESC8 NTLM relay → DCSync → rogue cloud device → attempted tenant takeover. It was stopped at one wall: a phishing-resistant MFA policy. Here is every step, and every place a SOC could have caught it.

In one line. An unmanaged cloud administrator without phishing-resistant MFA let R0 turn a single relayed certificate into full control of the on-prem domain in about 25 minutes, entirely autonomously. The push into the cloud tenant ran a further ~35 minutes and was stopped by one control: phishing-resistant MFA enforced through Conditional Access. The same run hands your SOC a detection checkpoint for every step.

NOTE

All names, domains, hostnames, IP addresses, tenant IDs and accounts below are fictional placeholders (corp.example). Real R0 output from a lab run, with every identifier replaced by a fictional corp.example placeholder.

Target
prod.corp.example + Entra ID
Forest
corp.example → CORPPROD (child)
Operator
R0 — authorised
Objective
on-prem DA → cloud Global Admin
On-prem result
full compromise
Cloud takeover
blocked at MFA wall
Attack chain overview

Eleven phases, one continuous run.

The full chain, grouped by stage of the chain. Successful, partial and blocked steps are all shown — a red team is as useful for what it can’t do as for what it can.

On boundaries. R0 is non-destructive by default. Higher-impact actions — credential changes, device enrolment — run only under the explicit rules of engagement for a run, after an operator approval gate, and every one is reversible from the ledger. Nothing here touched data or availability.

01ESC8 — ADCS HTTP enrolment relay~14:05SUCCESS
02DCSync — full domain compromise~14:15SUCCESS
03Rogue cloud device enrolment14:50SUCCESS
04Token acquisition via Kerberos SSO14:50SUCCESS
05Directory API enumeration~14:56PARTIAL
06FOCI token swapping~14:58PARTIAL
07ADCS ESC1 exploitation~14:22BLOCKED
08Privileged account password reset~14:30SUCCESS
09ROPC token discovery14:35SUCCESS
10MFA enrolment attempts15:00FAILED
11WHfB key registration15:00BLOCKED
Timeline

On-prem in 25 minutes. Cloud attempt in the next 35.

On-prem foothold · before 14:30
~14:05ESC8 relay — DC certificate obtained
~14:15DCSync — full credential set
~14:22ESC1 attempt — PAC validation held
Cloud takeover attempt · 14:30–15:05
~14:30Privileged account password reset
14:50Rogue device enrolment + PRT
~14:58FOCI token swapping
15:05MFA & WHfB registration — wall
≈ 35 min
from the first cloud action to the MFA wall. On-prem was fully compromised before 14:30; the cloud assault ran 14:30 → 15:05 and stopped at a phishing-resistant Conditional-Access policy.
The attack chain

Phase by phase, with evidence.

Selected phases with redacted evidence as R0 captured them to the audit ledger on a lab run. Secrets, hashes and passwords are removed.

Phase 1

ESC8 — ADCS enrolment relay

SUCCESS

Both issuing CAs exposed HTTP web-enrolment without Extended Protection for Authentication (EPA). R0 coerced NTLM auth from a domain machine, relayed it to the CA’s /certsrv endpoint, obtained a machine-account certificate, and used PKINIT to mint a TGT — escalating to Domain Admin in prod.corp.example.

ntlmrelayx → CA-01 /certsrv (redacted)
[*] coercing auth from DC-CHILD-01 ...
[*] relaying to http://CA-01/certsrv/certfnsh.asp
[+] certificate issued for DC-CHILD-01$
[+] PKINIT -> TGT obtained (machine acct)
Detection opportunity

Certificate enrolment from a non-standard source IP; NTLM-relay signatures in CA/IIS logs; events 4886/4887 for machine-account enrolment; sudden PKINIT/TGT requests for DC machine accounts.

Phase 2

DCSync — full domain compromise

SUCCESS

With DA privileges, R0 performed a DRSUAPI replication (DCSync) against the child DC and extracted the full credential set — including the krbtgt key and the cloud-sync service accounts that make the on-prem → cloud pivot possible.

secretsdump — DCSync (passwords redacted)
[*] Dumping Domain Credentials via DRSUAPI
admin_ga01 Global Admin (NO MFA)
admin_da01 Domain Admin
krbtgt Kerberos TGT key [REDACTED]
CLOUDSYNC$ directory-sync acct [REDACTED]
[+] full domain credential set obtained
Detection opportunity

Event 4662: replication access on the domain object from a non-DC; DsGetNCChanges originating from a workstation IP rather than a domain controller.

Phase 3

Rogue cloud device enrolment

SUCCESS

Targeting an unprotected Global Admin (admin_ga01, no MFA methods), R0 forged a Kerberos ticket with the seamless-SSO computer-account hash, obtained a cloud-join token, and joined a rogue device — receiving a Primary Refresh Token and device certificate.

device join (redacted)
[*] forge ticket via SSO computer acct
[*] seamless-SSO -> cloud-join token
[+] joined ROGUE-DEV-01 to tenant
[+] PRT + device cert issued
[!] device NOT compliant / NOT managed
Detection opportunity

Cloud audit: new device registration by a GA from an unusual source; SSO sign-in with a forged Kerberos ticket (SID mismatch); device name outside the naming convention; PRT for a brand-new non-compliant device.

Phase 8

Privileged account password reset

SUCCESS

Holding the account’s hash, R0 reset the Global Admin’s password over LDAPS via pass-the-hash, satisfied the fine-grained password policy on the third try, and confirmed the change synced to the cloud within seconds — enabling ROPC token flows.

bloodyAD — PtH reset (redacted)
> set password admin_ga01 [REDACTED]
[-] attempt 1: password complexity (FGPP)
[-] attempt 2: password complexity (FGPP)
[+] attempt 3: 33-char password set OK
[+] synced to cloud within seconds
Detection opportunity

Event 4724: password reset for a GA by a DA; event 4723: failed complexity attempts; NTLM auth from a Linux/WSL IP to a DC; directory-sync of a privileged password change.

Phase 6

FOCI token swapping

PARTIAL

R0 tried to swap the limited first-party refresh token for clients with broader scopes. FOCI-family clients accepted the token but triggered an MFA challenge; non-FOCI clients were refused outright. With zero MFA methods enrolled, the challenge could never be satisfied.

token swap (family-of-client-ids)
office / teams / outlook -> MFA required (50079)
onedrive -> MFA required (50079)
azure-cli / az-ps -> refused (7000016)
[!] CA evaluates per-client — no exempt path
Detection opportunity

Multiple token requests for different resources in a short window from one session; repeated AADSTS MFA-required failures for an account with no registered methods.

Phase 11

WHfB key registration — the wall

BLOCKED

A signed-PRT exchange produced a device-registration token proving possession (amr: pwd,rsa), but key registration was rejected: the service demands an MFA claim (amr: mfa/ngcmfa). A device signature proves possession, not identity assurance — and with no MFA method, that claim can never be minted.

DRS key registration -> rejected
POST …/key/ -> 400 "MFA is required"
token has amr: pwd,rsa (device cert)
service requires amr: mfa / ngcmfa
[x] ForceNGCMFA -> "MFA method must exist"
Detection opportunity

DRS key-registration failures for a new device; ForceNGCMFA errors; PRT-signed requests lacking an MFA claim — a strong signal of exactly this attack being attempted.

Why it stopped

The MFA chicken-and-egg problem.

Every remaining path to the tenant depended on the one after it. The Conditional-Access policy requiring phishing-resistant MFA is what ultimately closed the loop.

01
Register a WHfB key
needs an MFA claim in the token
02
Get an MFA claim
needs an MFA method already registered
03
Register an MFA method
needs MFA, or admin-consented scopes
04
Get admin scopes
needs admin consent — the portal is CA-gated
05
Grant consent via API
needs a directory API the token can’t reach
Blue-team value

Every step maps to a detection.

The same run that proves the attack path hands the SOC a checklist: what should have fired, and where. R0 pairs each action with the telemetry that catches it.

ESC8 relay

NTLM-relay enrolment in CA/IIS logs; events 4886/4887; enrolment from a non-standard IP.

DCSync

Event 4662 replication from a non-DC; DsGetNCChanges from a workstation IP.

Password reset

Events 4724/4723; PtH from a Linux IP; directory-sync of a privileged password change.

Rogue device

New device by a GA from an unusual source; PRT for a non-compliant device; off-convention name.

Forged ticket

KDC TGT-revoked / PAC-validation events; SID-history mismatches on inbound tickets.

Token abuse

Repeated AADSTS MFA-required failures for a no-MFA account; rapid multi-resource token requests.

What R0 demonstrated

Autonomous end-to-end — and it respected the one real control.

One run crossed external, on-prem AD and hybrid-identity boundaries without a human driving, chained eleven techniques, and produced CVSS-scored, replayable evidence for each. It also proved a defensive truth worth paying for: phishing-resistant MFA, enforced everywhere, stops the takeover cold.

How runs stay accountable →

Run this chain
against your estate.

See R0 attempt the same path in your environment — and show you exactly where it stops.

Book a demoJoin the waitlist