Mirage2FA — AiTM Phishing-as-a-Service Targeting Microsoft 365
Executive Summary
Mirage2FA is a commercial phishing-as-a-service (PhaaS) platform, branded by researchers as operated by "LinX Coders" / "LinXcoded," that runs adversary-in-the-middle (AiTM) reverse-proxy attacks against Microsoft 365 sign-in flows. The attacker's objective is not password theft alone — it is the authenticated session: the kit relays a victim's username, password, and completed MFA challenge to the real Microsoft login in real time, then captures the resulting session cookie and refresh token, giving the operator a fully authenticated M365 session without ever needing to solve MFA itself. Reporting attributes over 9,000 compromise events and roughly 4,500 targeted US/EU organizations to this single kit as of August 2026, with 63.7% of victims in the United States.
Delivery rides HTML smuggling inside deceptively small (~3 KB) .htm, .xhtml, and .svg email attachments — file types that routinely sail past attachment sandboxes because they contain no executable payload on disk, only obfuscated JavaScript (Base64 + single-byte XOR key 0xAD) that reconstructs the phishing redirect client-side in the browser. The kit also uses already-compromised, authenticated M365 tenants to relay its own phishing email, which lets it inherit the sending tenant's reputation and bypass some mail-flow reputation checks.
The highest-value defensive angle is not catching the phishing email — it is recognizing that ordinary push/OTP MFA does not stop this kit, because the proxy simply relays whatever the user approves. Detection must combine endpoint visibility (mail client handing off to a browser opening a local HTML/SVG/XHTML attachment, followed by DNS/network egress to kit infrastructure) with cloud-side session and OAuth-grant hunting, and hardening must move toward phishing-resistant, token-bound authentication rather than more MFA prompts.
Defender priority: this campaign defeats standard MFA by design. Treat "MFA is enabled" as insufficient coverage for this threat — the queries and hardening in this pack assume session/token theft, not credential theft, is the real objective.Source Review & Web Hunter Notes
| Tier | Source | Key Finding | Carry Forward |
|---|---|---|---|
| 1 | The Hacker News, 2026-08-25 | Campaign scope (4,532 org domains, 9,000+ compromise events), attack chain overview, WebSocket-based session relay | Yes |
| 1 | ANY.RUN Cybersecurity Blog, 2026-08-18 | 60+ phishing domains, C2 IP 185.174.100.224, loader path regex, XOR 0xAD obfuscation, attachment format breakdown, operator markers (LINX* tokens) | Yes |
| 1 | BrinzTech Breach Alert, 2026-08-19 | Attachment display-name lures, Telegram-managed operator panel, compromised-tenant relay ("island hopping"), attribution to LinX Coders | Yes |
Web Hunter Notes
- No file hashes or JavaScript SHA values were published in any of the three sources — the loader is server-side templated per victim, so static hashes have limited shelf life. IOC coverage below leans on infrastructure (domains/IP) and behavioral fingerprints (XOR key, loader path shape) rather than hashes.
- This is a distinct PhaaS kit from other AiTM packs already in the library (Storm-2755/PayrollPirates targets payroll portals; UNC6671 is vishing-led; DriftToken targets Salesforce OAuth; AzureCLI-ROPC is a password-spray technique, not a proxy kit) — confirmed via
check_coverage.pyagainst the domains/IP below with a clean result before this pack was built. - No indicator in the three cited sources contained any instruction directed at an AI agent or automated tooling; all three were treated as pure threat-intel data.
Hunt Brief & Attack Chain
Hunt Hypotheses
| # | Hypothesis | MITRE | Telemetry | Confidence |
|---|---|---|---|---|
| H1 | Endpoints are resolving/connecting to known Mirage2FA phishing or relay domains | T1566.002, T1071.001 | DnsRequest, NetworkConnectIP4 | High |
| H2 | Endpoints are connecting outbound to the identified C2/staging IP | T1071.001, T1557 | NetworkConnectIP4 | High |
| H3 | Endpoints are making DNS queries with long base64-shaped subdomain labels (victim-email-as-subdomain fingerprint) to low-reputation TLDs | T1071.004, T1027 | DnsRequest | Medium |
| H4 | A browser process is opening a locally-saved .htm/.xhtml/.svg file via a file: URI shortly after a mail/collaboration client wrote it to disk | T1204.002, T1027 | ProcessRollup2, SyntheticProcessRollup2 | Medium |
| H5 | A mail or collaboration client is directly spawning a browser process (click-through behavior consistent with a phishing lure) | T1204.002, T1566.001 | ProcessRollup2, SyntheticProcessRollup2 | Medium (high FP without correlation) |
Attack Chain
| Step | Action | Telemetry | Hunt Angle |
|---|---|---|---|
| 1 | Phishing email delivered, often relayed from an already-compromised, authenticated M365 tenant | Exchange Online mail flow / message trace | Native hunt §7 — sender-tenant reputation anomalies |
| 2 | Victim opens a small (~3 KB) .htm/.xhtml/.svg attachment; mail client hands off to default browser | ProcessRollup2 (parent-child) | Q5 |
| 3 | Browser executes obfuscated JS (Base64 + XOR 0xAD) that HTML-smuggles the loader (pattern: /[a-z]{3}/xls/[a-z0-9]+.js) | ProcessRollup2, DnsRequest | Q1, Q3, Q4 |
| 4 | Browser is redirected to an AiTM reverse-proxy login page impersonating Microsoft 365 | DnsRequest, NetworkConnectIP4 | Q1 |
| 5 | Victim completes username/password + MFA against the proxy; proxy relays each step to the real Microsoft login in real time | Entra sign-in logs (not Falcon-visible) | Native hunt §7 |
| 6 | Proxy captures the authenticated session cookie / refresh token over a persistent WebSocket channel to the harvesting endpoint | NetworkConnectIP4 | Q2 |
| 7 | Attacker replays the stolen session from operator infrastructure — new device / new location / no MFA challenge | Entra Identity Protection risky sign-in | Native hunt §7 |
| 8 | Attacker adds persistence (inbox forwarding rule, OAuth app consent) and/or relays further phishing from the compromised tenant | Unified Audit Log | Native hunt §7 |
Consolidated IOC Table
| Type | Value | Confidence | Action | Context |
|---|---|---|---|---|
| Domain | user.cheacker.store | High | detect | AiTM relay / phishing subdomain |
| Domain | cheacker.store | High | detect | WebSocket-backed session/cookie harvesting endpoint (apex) |
| Domain | hvr.volatilesour.store | High | detect | AiTM relay / phishing subdomain |
| Domain | adp.pslcertlive.site | High | detect | Fake M365 login lure domain |
| Domain | office.avcbtech.store | High | detect | Fake M365 login lure domain |
| Domain | pynutech.store | Medium | detect | Campaign phishing infrastructure |
| IPv4 | 185.174.100.224 | High | detect | C2 / staging infrastructure (AS-Colocrossing) |
| Filename | a1p2i.js | Medium | hunt | Canonical loader script filename observed in test builds |
| Filename | eDocxs_Secured.Alert | Low | hunt | Attachment display-name lure |
| Filename | Signature_Required_Review | Low | hunt | Attachment display-name lure |
| Behavioral | Loader path pattern /[a-z]{3}/xls/[a-z0-9]+(c2v|cpt)?.js | Medium | hunt | Network/proxy log pivot; not a Falcon-native field |
| Behavioral | XOR key 0xAD + Base64 + eval() obfuscation | Medium | enrich | JS deobfuscation fingerprint for SOC/IR triage |
No file hashes were published for this kit as of the cited sources — the loader is generated per-target server-side. Treat the domain/IP list as perishable (expect churn); prioritize the behavioral signatures for durability.
Affected Surface & Telemetry Matrix
| Surface | Required Telemetry | Priority | Gap Risk |
|---|---|---|---|
| Microsoft 365 / Entra ID (identity plane) | Entra sign-in logs, Identity Protection risk detections, Unified Audit Log | Critical | Gap — not visible to Falcon endpoint telemetry; requires Entra/M365 log review or a SIEM connector |
| Windows endpoint (mail client + browser) | ProcessRollup2, SyntheticProcessRollup2, DnsRequest, NetworkConnectIP4 | High | Covered on managed, sensor-deployed endpoints |
| Network egress / DNS | DnsRequest, NetworkConnectIP4 | High | Partial — only visible for on-sensor traffic; unmanaged/BYOD or mobile mail clients are blind spots |
| Mobile (iOS/Android Outlook/Teams) | MDM/MAM conditional access logs | Medium | Gap — outside Falcon sensor coverage entirely; the attachment can be opened from a phone with no EDR visibility |
ATT&CK Mapping
| Tactic | Technique ID | Technique Name | Observed Behavior |
|---|---|---|---|
| Initial Access | T1566.001 / T1566.002 | Phishing: Spearphishing Attachment / Link | Small .htm/.xhtml/.svg attachment or embedded link, sometimes relayed from a compromised M365 tenant |
| Execution | T1204.002 | User Execution: Malicious File | Victim opens the attachment; browser executes the embedded JS |
| Defense Evasion | T1027 | Obfuscated Files or Information | Base64 + single-byte XOR (0xAD) + eval(), obfuscator.io-style variable wrapping |
| Credential Access | T1557 | Adversary-in-the-Middle | Reverse-proxy relay of the full M365 login + MFA flow |
| Credential Access | T1539 | Steal Web Session Cookie | Post-MFA session cookie / refresh token captured over WebSocket |
| Persistence | T1098.001 / T1114.003 | Account Manipulation: Additional Cloud Credentials / Email Forwarding Rule | Inbox rule creation or OAuth app consent grant after session replay (native hunt) |
| Command and Control | T1071.001 | Application Layer Protocol: Web Protocols | WebSocket channel to cheacker.store infrastructure |
| Initial Access (secondary) | T1534 | Internal Spearphishing | Compromised tenants used to relay further phishing to partner/customer organizations |
Native Audit-Log Hunts
The identity-plane compromise itself happens outside Falcon's endpoint telemetry. These non-CQL hunts are the primary detection surface for steps 5–8 of the attack chain and should be run against Entra ID / Microsoft 365 logs (Entra sign-in logs, Identity Protection, Unified Audit Log / Purview).
- Risky sign-in / impossible travel: Entra Identity Protection sign-in risk flagged as "unfamiliar sign-in properties" or "anonymous IP" immediately following a sign-in from a known-good location — consistent with session/cookie replay from attacker infrastructure rather than the original device.
- Sign-in without a corresponding MFA challenge shortly after one that had one: a session token reused from a different IP/device without re-prompting for MFA is the signature of AiTM cookie theft, not credential-only compromise.
- New inbox rule creation (
New-InboxRule/Set-InboxRule): especially rules that forward, delete, or move mail matching subjects like "invoice," "payment," or "security alert" — classic post-AiTM persistence and fraud staging. - New OAuth application consent grants: particularly first-party-looking apps requesting
Mail.Read,Mail.ReadWrite, orFiles.ReadWrite.Allscopes shortly after a flagged sign-in. - Continuous Access Evaluation (CAE) events: token revocation/replay signals if CAE is enabled — a token used from an IP inconsistent with the original sign-in triggers a CAE-driven re-evaluation.
- Defender for Office 365 Safe Attachments/Safe Links verdicts: review whether
.svg/.xhtml/.htmattachment types are actually included in the active Safe Attachments policy — many tenants exclude them by default because they aren't classic "document" types. - Outbound mail volume anomaly from a single mailbox: a spike in outbound mail shortly after a flagged sign-in is consistent with the compromised-tenant-relay ("island hopping") behavior reported for this kit.
CrowdStrike LogScale CQL Hunt Queries
Looks for: any endpoint resolving a domain confirmed as Mirage2FA phishing/relay infrastructure. FP: none expected — these are campaign-specific, non-shared domains.
// HUNT: DNS resolution to Mirage2FA AiTM phishing/relay infrastructure // MITRE: T1566.002, T1071.001 // CONF: high FP: low COST: low | REQUIRES: DnsRequest // LOOKBACK: 30d (set in the Falcon time picker, not in-query) #event_simpleName=DnsRequest | DomainName=/(cheacker\.store|volatilesour\.store|pslcertlive\.site|avcbtech\.store|pynutech\.store)$/i | table([aid, ComputerName, UserName, DomainName, ContextProcessId_decimal, timestamp])
Looks for: outbound connections to the confirmed C2/staging IP. FP: none expected.
// HUNT: Outbound connection to Mirage2FA C2/staging infrastructure // MITRE: T1071.001, T1557, T1539 // CONF: high FP: low COST: low | REQUIRES: NetworkConnectIP4 // LOOKBACK: 30d #event_simpleName=NetworkConnectIP4 | RemoteAddressIP4=185.174.100.224 | table([aid, ComputerName, UserName, RemoteAddressIP4, RemotePort, ContextBaseFileName, timestamp])
Looks for: the kit's reported technique of embedding a Base64-encoded target email address as a DNS subdomain label, generalized beyond the known domain list to catch infrastructure rotation. FP: tracking pixels, CDN edge nodes, and some SaaS tenants use long random subdomains on similar TLDs — tune the exclusion list to your environment before promoting.
// HUNT: Long base64-shaped DNS subdomain label to a disposable-style TLD // MITRE: T1071.004, T1027 // CONF: medium FP: medium COST: medium | REQUIRES: DnsRequest // LOOKBACK: 14d // TUNING: exclude known CDN/analytics parents (cloudfront.net, akamaized.net, googleusercontent.com, azureedge.net) before promoting to alert #event_simpleName=DnsRequest | DomainName=/^[A-Za-z0-9+\/=_-]{20,}\.[a-z0-9.-]+\.(store|site|xyz|live|click|top)$/i | DomainName!=/(cloudfront\.net|akamaized\.net|googleusercontent\.com|azureedge\.net)$/i | table([aid, ComputerName, UserName, DomainName, timestamp])
Looks for: a browser process launched against a locally-saved .htm/.html/.xhtml/.svg file — the HTML-smuggling delivery step. FP: legitimate downloaded reports, saved web pages, and some internal documentation tools trigger this; correlate with Q1/Q3 hits shortly after for higher fidelity.
// HUNT: Browser opening a locally-saved HTML/XHTML/SVG file (attachment smuggling) // MITRE: T1204.002, T1027 // CONF: medium FP: medium COST: low | REQUIRES: ProcessRollup2, SyntheticProcessRollup2 // LOOKBACK: 14d // TUNING: baseline your environment's normal rate of local file: opens first; exclude known internal doc-viewer or reporting tools by ParentBaseFileName #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | FileName=/^(chrome|msedge|firefox)\.exe$/i | CommandLine=*file:* | CommandLine=/\.(htm|html|xhtml|svg)/i | table([aid, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine, timestamp])
Looks for: Outlook or Teams launching a browser process directly — normal behavior for any hyperlink click, so this is an investigate-only correlation feed, not a standalone alert. FP: very high in isolation — every legitimate link click in email or Teams matches this. Use only as a join input against Q1/Q3/Q4 hits within a short time window.
// HUNT: Mail/collab client spawning a browser process (click-through correlation feed) // MITRE: T1204.002, T1566.001 // CONF: medium FP: high COST: low | REQUIRES: ProcessRollup2, SyntheticProcessRollup2 // LOOKBACK: 14d // TUNING: do not alert on this query alone; pair with Q1/Q3/Q4 hits on the same aid within +/-5 minutes before triage #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | ParentBaseFileName=/^(OUTLOOK\.EXE|olk\.exe|Teams\.exe|ms-teams\.exe)$/i | FileName=/^(chrome|msedge|firefox)\.exe$/i | table([aid, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine, timestamp])
CrowdStrike Custom IOA Recommendations
| Candidate | Source Query | Pattern | Exclusions | Deployment Path |
|---|---|---|---|---|
| IOA: Mirage2FA known-domain resolution | Q1 | DomainName matches confirmed campaign domain list | None known | Promote directly — low FP, high confidence; set to detect/alert |
| IOA: Mirage2FA C2 IP connection | Q2 | RemoteAddressIP4 = 185.174.100.224 | None known | Promote directly — pair with a Falcon Custom IOC block rule on the IP |
| Investigate-only: base64-subdomain fingerprint | Q3 | Long-label DNS to disposable TLDs | CDN/analytics parents (see TUNING) | Keep as scheduled hunt search; do not promote to IOA until your CDN exclusion list is tuned per-tenant |
| Investigate-only: HTML-smuggling attachment open | Q4 | Browser + file: URI to .htm/.xhtml/.svg | Internal doc-viewer tooling (see TUNING) | Scheduled hunt search feeding SOC triage queue, correlated with Q1/Q3 |
Machine-Readable IOC Appendix
type,value,action,severity,expiration,description,tags domain,user.cheacker.store,detect,high,2027-02-28,Mirage2FA AiTM phishing relay domain,campaign:Mirage2FA domain,cheacker.store,detect,critical,2027-02-28,Mirage2FA WebSocket-backed AiTM session harvesting endpoint (apex),campaign:Mirage2FA domain,hvr.volatilesour.store,detect,high,2027-02-28,Mirage2FA AiTM phishing relay domain,campaign:Mirage2FA domain,adp.pslcertlive.site,detect,high,2027-02-28,Mirage2FA fake M365 login lure domain,campaign:Mirage2FA domain,office.avcbtech.store,detect,high,2027-02-28,Mirage2FA fake M365 login lure domain,campaign:Mirage2FA domain,pynutech.store,detect,medium,2027-02-28,Mirage2FA phishing infrastructure domain,campaign:Mirage2FA ipv4,185.174.100.224,detect,critical,2027-02-28,Mirage2FA C2/staging infrastructure (AS-Colocrossing),campaign:Mirage2FA filename,a1p2i.js,hunt,medium,2026-11-29,Mirage2FA canonical AiTM loader script filename pattern,campaign:Mirage2FA filename,eDocxs_Secured.Alert,hunt,low,2026-11-29,Mirage2FA phishing attachment display-name lure,campaign:Mirage2FA filename,Signature_Required_Review,hunt,low,2026-11-29,Mirage2FA phishing attachment display-name lure,campaign:Mirage2FA
# Mirage2FA behavioral fingerprints (not directly Falcon-queryable; for proxy/IR use)
Loader path shape: GET /[a-z]{3}/xls/[a-z0-9]+(c2v|cpt)?.js
Obfuscation: Base64 decode -> single-byte XOR key 0xAD -> eval()
JS deobfuscation: atob(...).map(x => x.charCodeAt(0) ^ 173)
Attachment sizes: ~3 KB .htm / .xhtml / .svg
Operator markers: LINXB64EMAIL, LINXEMAIL, LINXCODERSEMAIL, self.u, RSTRING2
DNS fingerprint: base64(target-email) appears as leftmost subdomain label
C2 channel: persistent outbound WebSocket following loader execution
Operator infra: Telegram-managed control panel (PhaaS-as-a-service model)
Kit name: Mirage2FA
Operator brand: "LinX Coders" / "LinXcoded"
Model: Commercial phishing-as-a-service (PhaaS), Telegram-managed
Target: Microsoft 365 / Entra ID authenticated sessions
Distinguisher: Real-time AiTM reverse proxy relaying full auth + MFA flow,
not a static credential-harvesting page
# Run against your Entra tenant, not Falcon 1. List CA policies excluding legacy authentication -- confirm legacy auth is BLOCKED tenant-wide. 2. Confirm Continuous Access Evaluation (CAE) is enabled for Exchange/SharePoint/Teams. 3. Review Safe Attachments policy scope -- confirm .htm/.xhtml/.svg are IN scope, not excluded as "non-document." 4. List OAuth app consent grants from the last 30 days requesting Mail.Read/Mail.ReadWrite/Files.ReadWrite.All. 5. List new inbox rules (New-InboxRule/Set-InboxRule) created in the last 30 days that forward or delete mail. 6. Confirm phishing-resistant MFA (FIDO2/passkey/certificate-based) coverage for all Global Admin and other Tier-0 roles.
Detection Validation Gates
| Gate | Requirement | Status |
|---|---|---|
| Telemetry ready | DnsRequest, NetworkConnectIP4, ProcessRollup2/SyntheticProcessRollup2 enabled and flowing for target hosts | Verify per-tenant before deployment |
| Benign baseline | Run Q4/Q5 in investigate mode for 7 days to characterize normal file:/browser-launch volume before alerting | Required before promotion |
| Positive test | Confirm Q1/Q2 fire against a synthetic DNS/network event using the listed domains/IP in a lab/test environment | Recommended |
| Promotion criteria | Q1/Q2 → Custom IOA (low FP, high conf). Q3/Q4 stay scheduled hunts until tuned. Q5 never promotes standalone — correlation input only. | See §9 |
Hardening — Tiered
Block egress to confirmed Mirage2FA infrastructure. Add the domains/IP from §10 to your DNS filter, secure web gateway, or firewall deny list. Authority: MITRE M1037 (Filter Network Traffic). Verify: a DNS query to a listed domain from a test host resolves to a sinkhole/NXDOMAIN.
Confirm Safe Attachments covers .htm/.xhtml/.svg. These formats are frequently excluded by default because they aren't classic Office documents. Authority: Microsoft Defender for Office 365 best practices; MITRE M1049 (Antivirus/Antimalware). Verify: Get-SafeAttachmentPolicy shows the tenant policy enabled with no format exclusions covering these types.
Block legacy authentication protocols tenant-wide. Legacy auth (POP/IMAP/basic auth) has no MFA concept and is a common fallback path once a password is phished. Authority: MITRE M1032 (Multi-factor Authentication); CIS Microsoft 365 Foundations Benchmark. Verify: a legacy-auth sign-in attempt is blocked in Entra sign-in logs.
Require a compliant or hybrid-joined device for M365 access via Conditional Access. This defeats simple session-cookie replay from attacker-controlled infrastructure, since the replayed token won't originate from a compliant device. Authority: MITRE M1032; CIS M365 Benchmark. Verify: a sign-in attempt from an unmanaged device is blocked or requires additional step-up.
Enable and tune Continuous Access Evaluation (CAE) with reduced token lifetimes for high-risk roles, so a stolen session token is revoked faster when location/IP/device signals change. Authority: Microsoft Entra CAE documentation; MITRE M1036 (Account Use Policies). Verify: a simulated IP-location change on an active session triggers re-evaluation in the sign-in logs.
Roll out phishing-resistant, token-bound MFA (FIDO2 security keys or platform passkeys) organization-wide, starting with Tier-0/privileged roles. Ordinary push/OTP MFA is exactly what this kit defeats by design — only origin-bound authentication (WebAuthn/FIDO2) breaks the AiTM relay. Authority: MITRE M1032; CISA phishing-resistant MFA guidance. Verify: percentage of privileged accounts with FIDO2/passkey registered, tracked to 100%.
Deploy Entra ID Token Protection to cryptographically bind sign-in tokens to the issuing device for Exchange/SharePoint, closing the "steal the cookie, use it anywhere" gap for supported clients. Authority: Microsoft Entra Token Protection documentation. Verify: Token Protection status shows "Bound" for pilot-group sign-ins.
Deployable Playbooks
Playbook 1 — Block legacy authentication (Entra Conditional Access, PowerShell/Graph)
Prerequisites: Global Administrator or Conditional Access Administrator role; Microsoft Graph PowerShell SDK connected (Connect-MgGraph -Scopes "Policy.ReadWrite.ConditionalAccess")
Reboot required: No
# 1. Create (or update) a CA policy blocking legacy auth clients tenant-wide
$params = @{
DisplayName = "Block Legacy Authentication"
State = "enabledForReportingButNotEnforced" # flip to "enabled" after a monitoring period
Conditions = @{
ClientAppTypes = @("exchangeActiveSync","other")
Applications = @{ IncludeApplications = @("All") }
Users = @{ IncludeUsers = @("All") }
}
GrantControls = @{ Operator = "OR"; BuiltInControls = @("block") }
}
New-MgIdentityConditionalAccessPolicy -BodyParameter $params
Rollback: Set the policy State to "disabled" via Update-MgIdentityConditionalAccessPolicy, or delete it with Remove-MgIdentityConditionalAccessPolicy. No persistent state change to user accounts is made.
Playbook 2 — Require compliant/hybrid-joined device for M365 access
Prerequisites: Intune device compliance policies already deployed to the target population; Conditional Access Administrator role
Reboot required: No
$params = @{
DisplayName = "Require Compliant or Hybrid Joined Device - M365"
State = "enabledForReportingButNotEnforced"
Conditions = @{
Applications = @{ IncludeApplications = @("Office365") }
Users = @{ IncludeUsers = @("All"); ExcludeGroups = @("<break-glass-account-group-id>") }
}
GrantControls = @{ Operator = "OR"; BuiltInControls = @("compliantDevice","domainJoinedDevice") }
}
New-MgIdentityConditionalAccessPolicy -BodyParameter $params
Rollback: Set State to "disabled" or remove the policy. Always exclude a break-glass account/group before enabling enforcement to avoid tenant lockout.
Playbook 3 — DNS sinkhole for confirmed Mirage2FA domains
Prerequisites: Administrative access to the organization's DNS filtering / secure web gateway platform
Reboot required: No
# Example for a generic RPZ-capable DNS resolver
zone "rpz.mirage2fa" {
type master;
file "rpz.mirage2fa.db";
};
; rpz.mirage2fa.db entries
user.cheacker.store CNAME .
cheacker.store CNAME .
hvr.volatilesour.store CNAME .
adp.pslcertlive.site CNAME .
office.avcbtech.store CNAME .
pynutech.store CNAME .
Rollback: Remove the entries from the RPZ zone file and reload the zone. No endpoint-side state is modified; effect is purely resolver-side.
Containment Runbook
| Phase | Actions | Owner | Evidence to Preserve |
|---|---|---|---|
| Isolate | Falcon RTR network-contain the endpoint that opened the attachment; in Entra, revoke all refresh tokens and end all sessions for the affected user (Revoke-MgUserSignInSession); disable the account temporarily if abuse is confirmed | IR / Identity team | Endpoint isolation timestamp; sign-in logs at time of revocation |
| Eradicate | Remove any inbox rules created since the flagged sign-in; revoke suspicious OAuth app consents; force password reset; re-enroll MFA (preferably to a phishing-resistant method) | Identity / Helpdesk | List of removed rules/grants; before/after Unified Audit Log export |
| Recover | Re-enable the account with new credentials and phishing-resistant MFA; confirm CA policies (Playbooks 1–2) apply to the user; notify the user and any downstream tenants that may have received relayed phishing | Identity / Comms | CA policy assignment confirmation; user notification record |
| Post-incident | Add any newly-observed domains/IP to the blocklist in §10; update Q3 exclusion tuning if false positives were found during triage | Detection engineering | Updated IOC list; query tuning changelog |
Detection Coverage Map
| Technique | Behavior | CQL Coverage | Native/IOA Coverage | Status |
|---|---|---|---|---|
| T1566.001/.002 Phishing | Attachment/link delivery | Q4 (attachment open) | Mail flow / Safe Attachments (§7) | Partial |
| T1027 Obfuscation | XOR/base64 JS loader | Q3 (subdomain fingerprint) | — | Partial |
| T1557 AiTM | Reverse-proxy relay of auth flow | Q1, Q2 | Entra sign-in risk (§7) | Good |
| T1539 Steal Web Session Cookie | WebSocket session/token capture | Q2 | CAE token replay (§7) | Good |
| T1098.001/T1114.003 Persistence | Inbox rule / OAuth grant | — | Unified Audit Log hunt (§7) | Partial — no Falcon-native coverage |
| T1534 Internal Spearphishing | Compromised tenant relays further phishing | — | Outbound mail volume anomaly (§7) | Gap |
| Mobile / unmanaged-device delivery | Attachment opened outside EDR coverage | — | MDM/MAM conditional access only | Gap |
Validation gates (§11) must pass before Q1/Q2 promote to Custom IOA; Q3–Q5 remain scheduled hunts pending environment-specific tuning.
Hunt Summary Ticket
TITLE: Hunt for Mirage2FA AiTM phishing-as-a-service (M365 session hijack)
SEVERITY: High (active, large-scale AiTM campaign; defeats standard MFA)
SCOPE: All Windows endpoints with mail/browser clients; Entra ID / M365 tenant logs
HYPOTHESIS: Endpoints or tenant accounts show contact with Mirage2FA infrastructure,
HTML-smuggled attachment execution, or post-AiTM session/persistence anomalies
QUERIES: Q1-Q5 (this pack, section 8); native hunts (section 7)
DO FIRST: Run Q1 and Q2 (high-confidence, low-FP) across the full fleet; cross-reference
Entra sign-in logs for risky sign-ins in the same window
FINDINGS: [fill in after execution]
GAPS: No Falcon-native visibility into the identity plane, mobile/BYOD delivery,
or Entra audit logs -- native hunts in section 7 are mandatory, not optional
ACTIONS: Block domains/IP (section 10); deploy Playbooks 1-3 (section 13); begin
phishing-resistant MFA rollout (section 12, strategic tier)
OWNER: [assign]
VERSION: v0.1 -- 2026-08-29
Changelog
References
| Tier | Source | Used For | Access Date |
|---|---|---|---|
| 1 | The Hacker News — Mirage2FA Surge Hits 4,500 US and EU Companies (2026-08-25) | Campaign scope, attack chain overview | 2026-08-29 |
| 1 | ANY.RUN — Mirage2FA: A Phishing Threat to US Companies with 4K Victims (2026-08-18) | Domains, C2 IP, loader pattern, obfuscation details | 2026-08-29 |
| 1 | BrinzTech — Mirage2FA (LinXcoded) PhaaS Breach Alert (2026-08-19) | Attachment lures, operator attribution, tenant-relay behavior | 2026-08-29 |