Playbook ID: PB-BEC | Default severity: SEV-3 (SEV-2 once funds have left or a second mailbox is implicated; SEV-1 and switch to Playbook 14.4 if the account holds a privileged directory role) | Owner: Incident Commander
Open this playbook on: a payment sent to an account that does not belong to the payee; a supplier or customer reporting a hijacked email thread; Unified Audit Log returning New-InboxRule or Set-InboxRule with DeleteMessage set, or a move to a folder nobody reads (RSS Subscriptions, Conversation History); an external ForwardingSmtpAddress nobody requested; an Entra ID Protection high-risk detection on an account with payment authority; MailItemsAccessed records carrying an unexpected ClientAppId/AppId or a SessionID that is not the user's; or anyone in finance taking a call from an "executive" pressing for a payment change.
Not for: encryption with an extortion demand (14.1); identity-provider compromise (14.4); SaaS takeover where mail is not the objective (14.3); synthetic-media approaches that never reached a mailbox (14.9). Finance's own callback script and vendor-master change control are Chapter 19.
The mailbox is not the target. The payment instruction is. An attacker who owns a finance mailbox drops no malware and defaces nothing — they read the invoice threads, learn your approval language, learn which supplier invoices on the 30th, then send one email changing one set of bank details. IC3 recorded 24,768 BEC complaints and $3,046,598,558 in reported losses in 2025 (IC3 2025).
Two clocks start together and run at wildly different speeds. The money clock is hours: IC3's Recovery Asset Team ran 3,900 Financial Fraud Kill Chain incidents in 2025 against $1.16bn of attempted theft and froze $679,013,183 — a 58% success rate, down from 66% (IC3 2025; IC3 2024). Six chances in ten, decaying hourly. The forensic clock runs in days. Teams that run these two in sequence lose the money and then produce a beautiful timeline explaining how.
The access is rarely exotic. Adversary-in-the-middle kits proxy the real sign-in page and capture the session token after genuine MFA completes — MFA is not bypassed, it is made irrelevant (Group-IB; Proofpoint). The other live path is consent: IC3's September 2026 PSA describes an active campaign where victims approve a malicious app on a genuine Microsoft or Google consent screen, granting persistent read-and-send access without the password — and a password change does not revoke it (Help Net Security on IC3 PSA260901). At the top end the pressure is synthetic: Arup lost about US$25.6m across 15 transfers in one day after an employee's scepticism was defeated by a video call in which every other participant was AI-generated (CNN).
So the mistake teams make is the comfortable one: reset the password, close the ticket. Microsoft says it in writing — "normal remediation steps (for example, resetting passwords or requiring multifactor authentication (MFA)) aren't effective against this type of attack, because these apps are external to the organization" (illicit consent grants). A reset leaves refresh tokens, an OAuth grant, an inbox rule and a forwarding address behind, and tells the adversary you noticed. Takeaway: containment here is revoke, remove, reset — one action, that order.
| Role | Responsibility in a BEC |
|---|---|
| Incident Commander | Two-track structure, containment timing, counterparty notification. |
| Operations Lead | Identity track: hold, export, enumerate, revoke, remove, verify. |
| Finance Lead (Controller/Treasury) | Money track: bank recall, payment freeze, beneficiary screening, reconciliation. |
| Communications Lead | Out-of-band channel; counterparty notifications. |
| Legal Liaison | Privilege; IC3 filing; notification determination. |
| Scribe | Timeline to the minute, including when each "awareness" state arose. |
| Executive Sponsor | Loss disclosure, insurer notification, materiality escalation. |
The first ten minutes answer two questions: has money moved, and who else can read this mailbox right now.
| # | Action | Who | Done when | Evidence to capture |
|---|---|---|---|---|
| 1.1 | Declare; open the timeline; Legal attaches privilege before the first assessment | IC / Legal | Incident ID issued | Declaration time (UTC, ISO 8601), declarer |
| 1.2 | Move the response off the affected mail tenant — separate tenant, bridge line, phones | Comms | Responders on the alternate channel | Channel, join time, roster. Skipping tips off the adversary |
| 1.3 | Answer "has money left?" — yes / no / queued. If yes or queued, launch Phase 2A now, in parallel | Finance | Amounts and beneficiary bank recorded | Payment references, both banks, timestamps |
| 1.4 | Purview eDiscovery hold on every implicated mailbox, before any containment | Ops | Hold active on all custodians | Case ID, hold policy ID, custodians |
| 1.5 | Export Entra sign-in and audit logs for the window (see clock below) | Ops | Export hashed into evidence store | Query, time range, count, SHA-256 |
| 1.6 | Capture inbox rules and mailbox forwarding — two commands, because forwarding never appears in Get-InboxRule | Ops | Both captured per mailbox | Rule definitions incl. Description; both forwarding properties; WHOIS |
| 1.7 | Pull rule-change history, risk state and the account's consented applications | Ops | Operations, detections and grants listed | Actor UPN, ClientIP, risk level, OAuthAppId, scopes |
# Two modules, two connections. The mailbox cmdlets are ExchangeOnlineManagement; the risk
# cmdlets further down are Microsoft Graph. Neither session gets you the other.
Connect-ExchangeOnline
# Capture before you change anything. Forwarding set via Set-Mailbox does NOT appear
# in Get-InboxRule output — you must read the two properties separately.
Get-InboxRule -Mailbox <mbx> | FL Name,Description,DeleteMessage,MoveToFolder,Enabled
Get-Mailbox <mbx> | FL ForwardingAddress,ForwardingSmtpAddress
# Who created or changed mailbox rules, and when. Microsoft names exactly three operations.
# Without -SessionCommand this cmdlet returns at most 100 records however high you set
# -ResultSize — and a truncated set is how you undercount mailboxes and miss the SEV-1 line.
# ReturnLargeSet comes back unsorted; re-run it with the SAME -SessionId until it returns
# zero rows, then sort what you have.
Search-UnifiedAuditLog -StartDate <MM/DD/YYYY> -EndDate <MM/DD/YYYY> -UserIds <user1,user2> `
-Operations New-InboxRule,Set-InboxRule,Remove-InboxRule `
-SessionCommand ReturnLargeSet -SessionId <id> -ResultSize 1000
# Risk state — a different module and a separate connection from everything above.
# Requires Security Administrator plus the scopes below.
Connect-MgGraph -Scopes "IdentityRiskEvent.Read.All","IdentityRiskyUser.ReadWrite.All"
Get-MgRiskyUser -Filter "RiskLevel eq 'high'"
Get-MgRiskDetection | Format-Table UserDisplayName,RiskType,RiskLevel,DetectedDateTime
# Empty because mailbox auditing was never on? Enable it for the NEXT incident —
# audit events cannot be obtained retroactively.
Set-Mailbox <mbx> -AuditEnabled $true -AuditOwner @{Add="Create","Update"}Identify who modified mailbox rules · ID Protection via Graph
Two tracks, same clock, different owners. The Incident Commander's job is to stop anyone turning them into a queue.
| # | Action | Who | Done when | Evidence to capture |
|---|---|---|---|---|
| 2A.1 | Phone the originating bank's fraud desk — voice, not email — request a recall or reversal and a Hold Harmless Letter or Letter of Indemnity | Finance | Bank case reference issued | Call time, contact, case reference |
| 2A.2 | File at ic3.gov (BEC: bec.ic3.gov) with full transaction detail in the provided fields, including banking information — what the Recovery Asset Team needs to open an FFKC | Legal / Finance | Complaint number received | Complaint number, filing time |
| 2A.3 | Supply any known onward "second hop" transfers; the RAT extends the FFKC past the first recipient bank | Finance | Included or recorded as unknown | Onward accounts, source of that detail |
| 2A.4 | Freeze the payment run; hold all further payments to the beneficiary account | Finance | Hold confirmed by the AP system owner | Hold ticket, systems, approver |
| 2A.5 | Screen queued and recent payments for the same account, routing number or IBAN across every entity and currency | Finance | Search complete across all systems | Query, systems searched, matches |
| 2A.6 | Notify the cyber insurer; brief the Executive Sponsor if the loss may be material | Exec Sponsor | Claim reference issued | Policy and claim reference |
IC3's own words: "If you discover a fraudulent transfer, time is of the essence. Immediately, contact your financial institution and request a recall of the funds along with any necessary indemnification documents. Different financial institutions have varying policies; it is important to know what assistance your financial institution will provide" (IC3 2025).
| # | Action | Who | Done when | Evidence to capture |
|---|---|---|---|---|
| 2B.1 | Revoke sessions and reset the credential in the same action | Ops | Revoke-MgUserSignInSession succeeds | Cmdlet output, timestamp, operator |
| 2B.2 | Remove attacker rules; clear both forwarding properties — only after step 1.6 captured them | Ops | Rules and properties clean | Before/after pairs. Destroys evidence if run first |
| 2B.3 | Revoke OAuth grants: Remove-MgOauth2PermissionGrant, Remove-MgServicePrincipalAppRoleAssignment | Ops | No unexpected grants remain | Grant IDs, app IDs, scopes removed |
| 2B.4 | Review registered authentication methods and mailbox delegate permissions; remove what the user did not authorize | Ops | User confirms each survivor by voice | Method and permission lists, before/after |
| 2B.5 | Confirm-MgRiskyUserCompromised -UserIds "<id>" — raises the user to high risk, a CAE critical event | Ops | Risk state confirmed compromised | Cmdlet output |
| 2B.6 | Decide account disable vs. block Conditional Access policy (Decision 1). Both tip off the adversary; disable also freezes your telemetry | IC | Decision recorded with rationale | Decision, authority, timestamp |
# Microsoft's documented emergency revocation. Revoke-MgUserSignInSession invalidates
# refresh tokens and browser session cookies via signInSessionsValidFromDateTime.
# Admin-role accounts require Privileged Authentication Administrator.
Connect-MgGraph -Scopes "User.ReadWrite.All","Directory.AccessAsUser.All"
$User = Get-MgUser -Search UserPrincipalName:'<upn>' -ConsistencyLevel eventual
Revoke-MgUserSignInSession -UserId $User.Id
Update-MgUser -UserId $User.Id -AccountEnabled:$false # only if you decided to disableHybrid identity: do the on-premises side first and reset the AD password twice — Microsoft's stated reason is to mitigate pass-the-hash where replication is delayed (Revoke user access). Google Workspace needs both users/{userKey}/signOut (POST) and users/{userKey}/tokens/{clientId} (DELETE) on admin.googleapis.com, because signing the user out does not revoke a third-party OAuth grant (signOut · tokens.delete).
| # | Action | Who | Done when | Evidence to capture |
|---|---|---|---|---|
| 3.1 | Scope what was read via MailItemsAccessed, separating Bind (per message) from Sync (whole folder — its presence means the folder was accessed or exfiltrated) | Ops | Every session attributed to user or actor | MailAccessType, ClientIPAddress, ClientInfoString, SessionID, Logon_type |
| 3.2 | Check IsThrottled: above 1,000 records in 24 hours logging stops for that mailbox for 24 hours, and throttling itself indicates misuse | Ops | State recorded per mailbox per day | IsThrottled values, written note of the blind spot |
| 3.3 | Scope what was sent: pull Send and MailItemsDelivered for the actor's SessionID | Ops | Actor-session messages preserved | Message IDs, recipients, send times, bodies |
| 3.4 | Pivot on the actor's ClientIPAddress and user agent across tenant-wide sign-in logs | Ops | Second-victim list produced or ruled out | Query, time range, matching accounts |
| 3.5 | Tenant-wide consent inventory; triage ConsentType = AllPrincipals and any .All permission. Audit latency is 30 min to 24 hours — run twice, an hour apart | Ops | Two clean runs; all tenant-wide grants reviewed | Permissions.csv, reviewer, disposition, run times |
| 3.6 | Remove remaining persistence — attacker-registered apps, added SMTP proxy addresses, transport mail-flow rules — then enable the two audit events needing manual activation | Ops | Config matches baseline; FL *Audit* shows the intended set | Before/after config and audit-action lists |
# CISA's shape for the two events that stay OFF until you enable them.
# Adding an action REPLACES the default set for that sign-in type — always re-verify.
Set-Mailbox <identity> -<sign-in type> @{Add="SearchQueryInitiated"}
Get-Mailbox <identity> | FL *Audit*
# Tenant-wide OAuth consent inventory (Microsoft's documented method).
.\Get-AzureADPSPermissions.ps1 | Export-csv -Path "Permissions.csv" -NoTypeInformationCISA Expanded Cloud Logs Playbook · illicit consent grants
Blocklisting the phishing domain is worth doing and worth almost nothing: AiTM infrastructure rotates on a 24-to-72-hour domain lifetime by design (Group-IB). Takeaway: the client IP, user agent and SessionID belong in the hunt query at step 3.4, not just the block list.
| # | Action | Who | Done when | Evidence to capture |
|---|---|---|---|---|
| 4.1 | Re-enable the account; restore the user's legitimate rules from the step 1.6 capture | Ops | User confirms mail flow by voice | Restored rule set, confirmation |
| 4.2 | Allow the documented re-enable lag before declaring failure: 15 minutes SharePoint and Teams, 35–40 minutes Exchange Online | Ops | Access confirmed after the lag | Re-enable time, first sign-in |
| 4.3 | Verify by observation: no new token issuance, no new sign-ins, no mail from the actor's fingerprint over a full business day | Ops | 24 hours clean | Monitoring query, watch window, result |
| 4.4 | Re-verify the supplier's bank details on a number from the vendor master record — never from any email in the thread | Finance | Confirmed by a named person | Call log, contact, number source |
| 4.5 | Reconcile frozen, returned and unrecovered amounts against the bank case and IC3 complaint | Finance | Ledger position final | Bank confirmations, residual loss |
| 4.6 | Move the affected user and the whole finance/AP/treasury cohort to phishing-resistant MFA, then release the payment-run hold jointly with the IC | Ops / Finance | Cohort enrolled; payments resumed | Enrolment report, date legacy methods disabled, release approval |
Phishing-resistant MFA blocks over 99% of identity-based attacks even when the attacker already holds a valid username and password (MDDR 2025), and CISA is explicit that number matching is a push-fatigue mitigation, not the destination (CISA). Actionable takeaway: if you can fund one cohort this quarter, fund the people who can move money — and set the date before you close this incident.
| # | Action | Who | Done when | Evidence to capture |
|---|---|---|---|---|
| 5.1 | Blameless review within 10 business days, Finance Lead and affected user present. The person who was phished is a witness, not a defendant | IC | Findings logged with owners and dates | Findings register |
| 5.2 | Close the notification determination with Legal, including a documented "no notification required" | Legal | Determination signed and filed | Memo, decision date, reasoning |
| 5.3 | Fix the finance control that failed: out-of-band callback on every bank-detail change to a vendor-master number, dual authorization above a stated threshold, a cooling-off period on vendor bank changes | Finance | Documented, implemented, tested once | Updated procedure, test record |
| 5.4 | Record in the playbook header the bank fraud-desk direct line, the recall services your accounts are entitled to, and a named FBI field office contact | Finance / Legal | All three recorded and dated | Contacts, verification date |
| 5.5 | Ship detections: rules with DeleteMessage, external forwarding additions, Consent to application with IsAdminConsent: True, impossible travel on payment-authority accounts | Detection eng. | Live with a passing validation test | Rule IDs, ATT&CK mapping, validation date |
| 5.6 | Where auditing was off or logs had expired, raise a named finding with a budget owner — an ingest problem, not a detection problem | IC | Finding accepted with owner and date | Gap, cost, owner |
In BEC the regulatory clock is almost never started by the money. It is started by what was in the mailbox. A finance mailbox holds employee bank details and customer data; an HR or clinical mailbox holds special-category or protected health information. If step 3.1 shows personal data was accessed, GDPR Article 33's 72 hours from awareness is running, and the Scribe's timeline is your only evidence of when awareness arose. US state statutes, HIPAA and sector rules run in parallel on the same facts; the full matrix is Chapter 15.
Three items belong here rather than there. File the IC3 complaint regardless of loss amount — it is the entry point to the Recovery Asset Team, not a regulatory notification. Notify the cyber insurer early; social-engineering-fraud cover is commonly conditioned on prompt notice. And if the loss could be material to a public filer, the Executive Sponsor opens the materiality assessment on day one.
Automate the collection, never the eviction. Steps 1.5 through 1.7 should fire the moment a BEC alert opens: export the sign-in logs, dump the inbox rules, read both forwarding properties, pull the rule-change records, list the OAuth grants, attach it all to the ticket. Read-only, reversible, and twenty minutes ahead of a human at a console — which matters when Entra Free retains seven days.
Gate everything else. Session revocation, credential reset, rule removal, consent revocation and account disable all tip off the adversary or destroy telemetry, and their blast radius scales with a false positive. The rule that holds up: automation may gather, enrich, correlate and recommend without approval; it may act only where the action is reversible, scoped and rate-limited; irreversible or tenant-wide actions require a named human approver. Every automated closure must carry the evidence that justified it — the documented failure modes for AI agents in triage are overconfident closure on weak proof and hallucinated detail in the narrative, and a rule change that looks benign is exactly where both bite. The money track is not automatable at all: no machine phones a bank fraud desk.