A Primary Refresh Token (PRT) is the master SSO credential Entra ID issues to a joined or registered Windows device. It bundles the user's identity, the device identity, and — critically — the MFA claim, so once a device holds a valid PRT, the user rides single sign-on into Microsoft 365, Azure, and every federated app without re-authenticating. If an attacker steals that PRT (or the derived session keys) from a compromised endpoint, they can replay it from their own machine and inherit the victim's fully-authenticated, MFA-satisfied session — Pass-the-PRT. Password resets and even blocking sign-in do not, on their own, kill an already-issued PRT or the access tokens minted from it.
This SOP treats a confirmed PRT/CloudAP credential extraction or a Pass-the-PRT replay as a SEV1 identity compromise. The response is two-front: contain the endpoint that leaked the token and contain the identity by revoking every refresh token and rotating the device. Key data sources: DeviceProcessEvents / DeviceEvents (CloudAP/LSASS access, BrowserCore abuse, forge tooling), SigninLogs & AADNonInteractiveUserSignInLogs (trusted-device token replay, deviceDetail vs Location mismatch, AuthenticationProtocol), and AADUserRiskEvents (anomalousToken, tokenIssuerAnomaly, unfamiliarFeatures).
☰ Table of Contents
01 — BACKGROUND
TECHNIQUE OVERVIEWThe PRT is issued to Entra-joined, hybrid-joined, and Entra-registered Windows 10/11 devices and is held by the CloudAP (Cloud Authentication Provider) plug-in inside the LSASS process. It is protected by two device-bound keys — a device key (dkey) and a session transport key (tkey) — which live in the TPM where one is present. An attacker with local SYSTEM/admin on the endpoint has several paths to abuse it: extract the PRT and its keys directly from LSASS/CloudAP, or ask the local BrowserCore.exe broker to mint a fresh PRT cookie (x-ms-RefreshTokenCredential) they can then replay from anywhere. Because the PRT carries the MFA claim, the replayed session is treated as already strong-authenticated.
| Field | Value |
|---|---|
| MITRE Technique | T1550.001 — Use Alternate Authentication Material: Application Access Token (Pass-the-PRT) T1528 — Steal Application Access Token T1003 — OS Credential Dumping (CloudAP/LSASS extraction) |
| Kill-chain Phase | Credential Access → Lateral Movement → Defense Evasion (MFA bypass) |
| Primary Log Source | DeviceProcessEvents, DeviceEvents (LSASS access), SigninLogs, AADNonInteractiveUserSignInLogs, AADUserRiskEvents |
| Secondary Log Sources | CloudAppEvents (post-replay app activity), AuditLogs (device / method registration follow-on), IdentityInfo (device-user binding) |
| Common Tooling | Mimikatz (sekurlsa::cloudap, dpapi::cloudapkd), ROADtoken, AADInternals (Get-AADIntUserPRTToken), requestaadrefreshtoken via BrowserCore.exe, Pass-the-PRT in a controlled browser |
| Default Severity | SEV1 — token theft grants MFA-satisfied SSO to all federated apps |
| Detection Window | Endpoint queries last 24h; sign-in replay hunting last 7–14 days (refresh tokens are long-lived) |
A stolen PRT is not killed by a password reset. It must be neutralised by revoking the user's refresh tokens (revokeSignInSessions) AND disabling/re-registering the leaking device so its device key can no longer sign PRT requests. Reset-only responses leave the attacker's session live.
Five concrete scenarios drive this playbook. The first three are the dominant real-world paths; the last two anchor the false-positive edges an analyst must rule out before escalating.
| # | Attack Path | What the SOC sees |
|---|---|---|
| A1 | CloudAP / LSASS extraction — Mimikatz sekurlsa::cloudap or dpapi::cloudapkd pulls the PRT + derived keys from LSASS after local admin/SYSTEM is obtained | DeviceProcessEvents cred-tool command lines; DeviceEvents LSASS handle-open from an unusual process |
| A2 | PRT-cookie minting — attacker drives BrowserCore.exe (ROADtoken / requestaadrefreshtoken) to issue a fresh x-ms-RefreshTokenCredential without touching LSASS memory | BrowserCore.exe spawned by a non-browser parent (cmd/powershell/rundll32) with a nonce argument |
| A3 | Pass-the-PRT replay — stolen PRT/cookie injected into the attacker's browser; sign-in appears from the victim's device identity but a new IP / ASN / geo | SigninLogs: compliant/managed device + impossible travel; MFA shows "previously satisfied" via token |
| A4 | Token anomaly detection — Entra flags anomalousToken / tokenIssuerAnomaly when a token's characteristics (lifetime, device binding) don't match the sign-in context | AADUserRiskEvents risk detection; often the first and only signal when the endpoint is unmanaged |
| A5 | Benign SSO / red-team (FP edge) — legitimate roaming, VPN egress change, or an authorised identity-attack simulation replaying test tokens | Trusted device + new IP but a matching change/engagement record, known tester account, corporate ASN |
Severity model. Grade by evidence of key/token theft and blast radius:
| Signal | Severity |
|---|---|
| CloudAP/LSASS extraction tool confirmed on endpoint, or Pass-the-PRT replay to a privileged account | SEV1 / CRITICAL |
| BrowserCore/ROADtoken PRT-cookie mint, or trusted-device sign-in from anomalous IP with anomalousToken risk | SEV1 |
| Single Entra token-risk detection, endpoint telemetry inconclusive, no confirmed replay yet | SEV2 |
| Trusted device + new IP fully explained by documented roaming/VPN/red-team | FP |
PRT theft is the "why did MFA not fire?" answer to an impossible-travel alert on a managed device. If a Conditional Access impossible-travel or unfamiliar-location sign-in shows the session as already MFA-satisfied from a compliant device, suspect a replayed PRT before you write it off as a VPN quirk.
02 — IDENTIFICATION
6 INDICATORS + TRIAGEFive yes/no questions decide whether this jumps the queue. Any single YES on Q1–Q3 makes it live-incident SEV1 — a stolen PRT is actively usable and every minute of dwell buys the attacker more federated-app reach.
- 1Is there LSASS/CloudAP access or a credential-dump tool on the endpoint? (I1) — YES = confirmed key theft attempt, isolate now.
- 2Did
BrowserCore.exespawn from a non-browser parent with a nonce? (I2) — YES = PRT-cookie minting, isolate now. - 3Is there a sign-in from a trusted/compliant device but a new IP/ASN/country? (I3) — YES = probable Pass-the-PRT replay.
- 4Is the affected account privileged (Global Admin, PIM-eligible, or with app-secret access)? — YES = raise one severity tier regardless of other answers.
- 5Is there a matching change ticket, travel notice, or authorised red-team engagement? (A5) — a documented YES points toward FP; an unverified "probably" does not.
Do not downgrade on "the device is compliant." Compliant/managed device is exactly what a replayed PRT looks like — the device identity is the victim's; only the network origin and behaviour betray the attacker.
The most direct theft path: with SYSTEM/admin, an attacker reads the PRT and its derived session keys straight out of the CloudAP plug-in inside LSASS. Any non-security process opening a handle to lsass.exe, or a Mimikatz cloudap/dpapi::cloudapkd command line, is a confirmed key-theft attempt.
- 1Open Hunting → Advanced Hunting and paste the KQL below. Set Time range to Last 24 hours.
- 2For each hit, open the Device Timeline from the DeviceName link and confirm the initiating process and the account that ran it.
- 3Note the DeviceName, AccountName, and timestamp — this is the leaking endpoint and the compromised identity for Containment.
- 4Pivot to Incidents & alerts and check for a co-incident "Possible credential theft from LSASS" or Mimikatz detection.
| Indicator | Meaning | Severity |
|---|---|---|
| sekurlsa::cloudap | Mimikatz dumps the CloudAP cached PRT + session key from LSASS | CRITICAL |
| dpapi::cloudapkd | Derives the CloudAP key to decrypt the protected PRT material | CRITICAL |
| token::elevate / privilege::debug | SeDebugPrivilege acquired to read LSASS memory | HIGH |
| LSASS handle-open (0x1010/0x1410) from non-security proc | Read/query access to lsass.exe by an unexpected process | CRITICAL |
On TPM-backed devices the raw keys cannot be exported off-box, so attackers pivot to I2 (BrowserCore cookie minting) instead — they mint tokens while on the machine. Absence of an LSASS hit does not clear the host; check I2 next.
BrowserCore.exe is the legitimate local broker that hands the browser a signed PRT cookie (x-ms-RefreshTokenCredential). Tools such as ROADtoken and requestaadrefreshtoken drive it directly to mint a fresh cookie the attacker can replay — no LSASS memory read required, so it evades TPM protection. A BrowserCore.exe launched by cmd/powershell/rundll32 rather than the browser is the tell.
- 1Run the KQL below and inspect InitiatingProcessFileName — a browser parent (msedge/chrome) is normal; a shell or unknown parent is suspicious.
- 2Check the command line for a nonce argument or piped JSON request — ROADtoken/requestaadrefreshtoken pass a server nonce to sign the cookie.
- 3Correlate the timestamp with any I3 sign-in from a new IP within minutes — a mint immediately followed by an off-host replay is a confirmed chain.
- 4Hunt for the tool binaries themselves (ROADtoken.exe, roadtx, AADInternals import) in the same session.
| Indicator | Meaning | Severity |
|---|---|---|
| BrowserCore.exe (non-browser parent) | Broker driven by a shell/tool to mint a PRT cookie | CRITICAL |
| x-ms-RefreshTokenCredential | The PRT cookie header value being requested/replayed | CRITICAL |
| ROADtoken / roadtx / requestaadrefreshtoken | Known PRT-cookie minting tooling | CRITICAL |
| Get-AADIntUserPRTToken | AADInternals cmdlet that returns a usable PRT token | CRITICAL |
This is the payoff signal. When the stolen PRT is replayed, the sign-in carries the victim's device identity (managed / Entra-joined / compliant) but originates from the attacker's IP, ASN and geo. Because the MFA claim rides inside the PRT, the sign-in shows strong auth as already satisfied — an impossible-travel event with no MFA prompt on a "trusted" device is the classic Pass-the-PRT footprint.
- 1Open the user's Sign-in logs and add columns for Device / Managed, Location, IP address, and Authentication requirement.
- 2Look for the same DeviceId / DeviceName appearing from two irreconcilable locations inside a short window, with MFA shown as previously satisfied.
- 3Run the KQL below in Sentinel to auto-surface trusted-device sign-ins from a new IP/country against the device's baseline.
- 4Record the attacker IP, ASN, user agent, and the DeviceDetail.deviceId — these feed the IOC list (I6) and Containment blocks.
| Field / Value | Meaning | Analyst Action |
|---|---|---|
| DeviceDetail.trustType = "Azure AD joined" | Sign-in claims a managed device identity | Verify origin matches that device's baseline |
| AuthenticationRequirement = singleFactor (MFA satisfied via token) | No interactive MFA — claim carried by the PRT | On a new IP = suspect replay |
| ResultType 0 + new ASN/Country | Successful sign-in from an unfamiliar network | Correlate with device baseline & I4 risk |
| Impossible travel / atypical location risk | Two locations too far apart in time | On a compliant device = strong replay signal |
The device identity being "yours" is not exculpatory — it is the whole point of Pass-the-PRT. Correlate on network origin and behaviour (I4/I5), never on device trust alone.
Entra ID Protection scores token characteristics and flags anomalousToken when a token's lifetime or replay pattern is unusual, and tokenIssuerAnomaly when issuer claims don't match. When the leaking endpoint is unmanaged (no MDE telemetry), these risk detections are frequently the only signal a replay happened — treat them as first-class evidence, not background noise.
- 1Open Risk detections and filter Detection type to Anomalous Token and Token Issuer Anomaly.
- 2For the flagged user, open Risky users → [user] → Recent risk detections and note the linked sign-in and correlationId.
- 3Pivot each detection to its sign-in and cross-check against I3 (new IP/device mismatch) and I5 (non-interactive replay).
- 4Run the KQL below to join risk events to their sign-ins in Sentinel for a full picture.
| RiskEventType | Meaning | Analyst Action |
|---|---|---|
| anomalousToken | Token shows abnormal lifetime / replay characteristics | Treat as probable replay; confirm device binding |
| tokenIssuerAnomaly | Issuer claims inconsistent with expected token issuer | Investigate for forged/replayed token |
| unfamiliarFeatures | Sign-in properties deviate from user baseline | Correlate with I3 origin mismatch |
| unlikelyTravel | Impossible-travel between two sign-ins | On a compliant device = strong PRT-replay signal |
Once a PRT yields access/refresh tokens, the attacker's follow-on calls to Graph, Exchange, and SharePoint are non-interactive — they never re-authenticate, so the activity lands in AADNonInteractiveUserSignInLogs and CloudAppEvents, not the interactive sign-in blade. A burst of non-interactive token use from a new ASN, or sudden mailbox/file access right after I3, confirms the session is being actively used.
- 1Switch the Sign-in logs tab to Non-interactive user sign-ins and filter to the affected UPN.
- 2Look for token use from the attacker IP/ASN identified in I3, targeting Microsoft Graph, Office 365 Exchange Online, or SharePoint.
- 3Pivot to CloudAppEvents to see the actual actions taken (mail read, file download, inbox-rule creation) from that session.
- 4Any inbox-rule or OAuth-grant follow-on means the compromise is expanding — cross-reference SOP-85 (mailbox rules) and SOP-21 (OAuth consent).
Refresh tokens minted from a PRT are long-lived (default ~90 days of sliding activity). Hunt back at least 7–14 days, not just the alert hour — the initial replay may predate the alert that finally tripped I4.
Before Containment, consolidate the artifacts and make an explicit call. PRT theft has a real false-positive edge (roaming, VPN egress, authorised red-team) — but "probably the user travelled" is a hypothesis, not a verdict. Confirm with a record that names the user, device, origin and window.
Extract and record:
- 1Leaking DeviceName / DeviceId and the local account that ran the extraction/mint (I1/I2).
- 2Compromised UserPrincipalName and whether it holds privileged roles.
- 3Attacker IP address(es), ASN, geo, user agent from I3/I5.
- 4Tooling artifacts — binary names/hashes, command lines, and any
x-ms-RefreshTokenCredentialnonce. - 5Timeline: mint/extraction time → first replay → post-access actions (mail/file/OAuth).
| True Positive Signals | False Positive Signals |
|---|---|
| CloudAP/LSASS extraction tool or LSASS read on the endpoint (I1) | No endpoint theft artifact; single risk detection later fully explained |
| BrowserCore.exe minting a PRT cookie from a shell parent (I2) | BrowserCore spawned by msedge/chrome during normal SSO |
| Trusted device sign-in from new ASN/country with MFA pre-satisfied (I3) | New IP matches a documented VPN egress / corporate roaming pattern |
| anomalousToken / tokenIssuerAnomaly plus non-interactive replay (I4/I5) | Risk detection dismissed by ID Protection after benign confirmation |
| Post-access mail/file/OAuth actions from the attacker origin | Named red-team engagement with matching account, IP and time window |
If any I1/I2 endpoint artifact OR an I3 replay to a privileged account is present, declare TP and go straight to Containment. Do not wait for all six indicators to line up — a live PRT is being spent while you deliberate.
03 — CONTAINMENT
STOP ITOrder matters: revoke tokens (C3) BEFORE or alongside device isolation. Isolating the host stops new mints but does not kill tokens already exfiltrated — those die only on refresh-token revocation.
- 1Before isolation, start a Live Response session and collect a memory image + running-process list — CloudAP state and tooling are volatile.
- 2Click Actions (⋮) → Isolate Device and choose Full Isolation to cut the host off from further token minting.
- 3Collect the investigation package (Actions → Collect investigation package) for offline forensics.
- 4Query other devices in the same subnet/user scope for the same I1/I2 activity — PRT theft is often part of a broader hands-on-keyboard intrusion.
Do not power off the endpoint — CloudAP keys and the attacker's in-memory tooling are lost on shutdown. Network isolation preserves the memory-resident evidence.
- 1Revoke all refresh tokens — user profile →
Revoke sessions(or GraphPOST /users/{id}/revokeSignInSessions). This invalidates every token minted from the PRT. - 2Reset the user's password and require change at next sign-in — needed to stop re-authentication, but on its own it does NOT kill the PRT (revocation in step 1 does).
- 3Block sign-in temporarily (
Account enabled = No) for privileged accounts until the device is cleared. - 4Re-evaluate MFA methods — confirm no attacker-registered method was added post-replay (Authentication methods blade); remove any rogue method and cross-reference SOP-80.
- 5Confirm the user as compromised in ID Protection so risk-based Conditional Access enforces re-auth on next attempt.
Graph one-liner to revoke: Invoke-MgInvalidateUserRefreshToken -UserId <UPN> (or the REST revokeSignInSessions action). Verify the response is true before moving on.
- 1Disable the compromised device object in Entra — this stops its device key from signing new PRT requests. Plan a full re-registration/re-image before re-enabling.
- 2Block the attacker IP/ASN via a Conditional Access named location (block policy) and add it as an MDE network indicator (
Settings → Endpoints → Indicators → IP addresses). - 3Tighten Conditional Access for the user: require compliant device + phishing-resistant MFA, and enable token protection (bind sessions to the device) where licensed.
- 4For any app the attacker touched (I5), review and revoke suspicious OAuth grants (Enterprise applications → Permissions) — cross-reference SOP-21.
04 — ERADICATION
CLEAN UP- 1From the I1/I2 initiating-process chain, trace back to initial access (phishing, malicious download, lateral movement) and remove it — kill malicious processes via Live Response, delete dropped tooling, quarantine confirmed in MDE.
- 2Hunt for and remove persistence created by the same account/process around the theft window — scheduled tasks, run keys, WMI subscriptions (cross-reference SOP-26 / SOP-30).
- 3Re-image or re-register the compromised device. Because CloudAP key material may have been touched, do not trust an in-place clean for a confirmed extraction — rebuild and re-join, then re-enable the device object.
- 4Rotate secrets the session could reach — any app secrets, keys, or tokens the user/session had access to during the dwell window.
- 5Close the vector: enforce Credential Guard / LSASS protection (RunAsPPL) to blunt CloudAP extraction, require TPM-backed device keys, and enable token protection Conditional Access so future tokens are cryptographically bound to the device.
- 6Verify clean state — re-run I1, I2, I3 and I5 expecting 0 hits; confirm ID Protection shows the user risk remediated and no new non-interactive replay from the attacker origin.
- All refresh tokens revoked and password reset confirmed (C3 response = true)
- Leaking device disabled and re-imaged/re-registered; device object re-enabled only after rebuild
- Attacker IP/ASN blocked in Conditional Access and MDE indicators
- No rogue MFA method, inbox rule, or OAuth grant remains on the account
- I1/I2/I3/I5 queries return 0 hits over the incident window
- Timeline reconstructed: extraction/mint → first replay → post-access actions
- Token protection / Credential Guard / RunAsPPL enforced to prevent recurrence
Do not close on a password reset alone. Until refresh tokens are revoked and the device key is invalidated (disable + rebuild), the attacker's replayed session and any long-lived refresh tokens remain valid.
05 — ESCALATION
TIERS| Tier | Trigger Condition | Who to Notify | Action |
|---|---|---|---|
| L1 → L2 | Cannot confirm TP vs FP within 30 min; token-risk detection with no clear device attribution; any privileged account involved | SOC L2 / Identity Lead | Hand off with IOC pack; L2 drives Sentinel correlation (I3–I5) |
| L2 → IR | Confirmed endpoint extraction (I1/I2) or Pass-the-PRT replay (I3); active non-interactive replay (I5); >1 device/user affected | Incident Response Team | Full IR: isolate, revoke, rebuild device, hunt lateral spread |
| IR → CISO | Privileged/Global Admin token replayed; mailbox/file exfiltration confirmed; multiple identities compromised | CISO / Security Management | Declare major incident; assess breach-notification obligations |
| CISO → Exec / Legal | Customer/regulated data accessed via the replayed session; tenant-wide admin compromise | CISO → CEO → Legal / DPO | GDPR 72h clock; regulator & affected-party notification |
| External | Nation-state / sophisticated actor indicators; incident exceeds internal capacity | MSSP / DFIR vendor / law enforcement | Engage forensics retainer; preserve evidence chain of custody |
Bring to every escalation:
- 1Incident / alert ID and current confidence (TP confirmed / suspected / unverified).
- 2Affected user(s), device(s), and whether any hold privileged roles.
- 3Timeline: extraction/mint time → first replay → post-access actions.
- 4Attacker IOCs: IP/ASN, user agent, tooling artifacts, DeviceId.
- 5Containment already executed: tokens revoked? device disabled? IP blocked?
A single confirmed replay to a Global Admin or PIM-eligible account is a potential tenant-takeover — escalate straight to IR + CISO regardless of how few sign-in events appear. One replayed privileged token is enough.
Stay Threat-Ready
Follow CyberHawk Threat Intel for daily SOC analyst playbooks, detection engineering guides, and threat intelligence.