Tycoon 2FA Adopts OAuth 2.0 Device-Code Phishing — PhaaS Kit Hijacks Microsoft 365 Accounts via Microsoft Authentication Broker (AppId 29d9ed98) Through Trustifi Click-Tracking and Cloudflare Workers Delivery (eSentire TRU TL-2026-0522)

Tycoon 2FA Adopts OAuth 2.0 Device-Code Phishing (TL-2026-0522), also tracked as Tycoon 2FA device-code variant, is a high-severity phishing campaign, first published 2026-05-17. It is attributed to Tycoon 2FA operators with high confidence, affects Microsoft Microsoft 365 (Entra ID / Azure AD), maps to 25 MITRE ATT&CK techniques (T1027, T1036, T1071), and is covered by 9 detection rules and 27 indicators of compromise.

Key facts for TL-2026-0522

Threat ID
TL-2026-0522
Also known as
Tycoon 2FA device-code variant, Tycoon2FA OAuth DCP campaign, eSentire TRU April 2026 device-code campaign
Severity
HIGH
Status
ACTIVE
Category
PHISHING
First published
2026-05-17
Last reviewed
2026-05-17
Attribution
Tycoon 2FA operators
Attribution confidence
HIGH
Motivation
FINANCIAL
Target sectors
financial-services, professional-services, legal, manufacturing, healthcare, government, education, technology, retail, all-microsoft-365-tenants
Target regions
Global, North America, Europe, Asia-Pacific
Detection rules
9
Indicators of compromise
27

Malware and tooling in Tycoon 2FA Adopts OAuth 2.0 Device-Code Phishing

Malware and tooling: Tycoon 2FA PhaaS (device-code variant)

Tycoon 2FA, the Phishing-as-a-Service (PhaaS) platform that survived the March 2026 Microsoft/Europol coalition takedown, has been re-tooled to deliver OAuth 2.0 Device Authorization Grant (RFC 8628) phishing against Microsoft 365 tenants. The eSentire Threat Response Unit (TRU) observed an April 29-30, 2026 campaign in which an invoice-themed lure travels through a Trustifi click-tracking URL, a disposable Cloudflare Workers subdomain, a four-layer AES-GCM/CBC encrypted in-browser delivery chain, and a fake "HumanCheck" Microsoft CAPTCHA before presenting the victim with an attacker-issued device_code they are instructed to paste into the genuine microsoft.com/devicelogin page. Once consent is granted, Microsoft issues access and refresh tokens for the Microsoft Authentication Broker first-party application (AppId 29d9ed98-a469-4536-ade2-f981bc1d605e) to the operator's Node.js polling backend on Alibaba Cloud (AS45102), which immediately fans out to Exchange Online, Microsoft Graph, and OneDrive without ever proxying the victim's password or MFA factor.

How Tycoon 2FA Adopts OAuth 2.0 Device-Code Phishing works

## Overview

Tycoon 2FA is a high-volume Phishing-as-a-Service (PhaaS) platform that has been tracked since 2023. Following a March 2026 Microsoft Digital Crimes Unit / Europol coalition takedown — conducted in collaboration with eSentire and other industry partners — the operators retained their source code and rebuilt on new infrastructure within weeks (Abnormal Security confirmed the rebound in early May 2026). The eSentire Threat Response Unit (TRU) analyzed an active campaign in late April 2026 that demonstrates a fundamental tradecraft shift: the kit no longer attempts to proxy Microsoft credentials at all. Instead, it has been repurposed as a delivery framework for OAuth 2.0 Device Authorization Grant phishing (also known as device-code phishing or DCP).

This is part of a broader ecosystem trend. Push Security reports OAuth device-code phishing volume has surged approximately 37x year-over-year and is now supported by at least ten PhaaS platforms and private kits; Proofpoint independently documents a parallel surge.

## Attack Chain

**Stage 0 — Lure delivery.** Victim receives an invoice-themed email containing a URL of the form `https://events.trustifi.com/api/o/v1/click/<MongoDB_ObjectId>/<recipient_hex>/...`. Trustifi is a legitimate enterprise email-security platform; its click-tracker is being abused as designed for reputation laundering. The first eight hex characters of the ObjectId encode the Unix timestamp at which the tracking record was created — the ObjectId `69f218d9bd8f28639a2460c7` from this campaign decodes to April 29, 2026 at 14:42:33 UTC. The third-party sending domain authenticated cleanly via SPF and DKIM but published no DMARC record, removing the recipient gateway's downstream sender-policy signal.

**Stage 1 — Cloudflare Workers handoff.** Trustifi issues an HTTP 307 redirect to a disposable `*.workers.dev` subdomain (observed: `cookies.28gholland.workers.dev`). The Worker returns an HTML page containing a base64-encoded AES-GCM-encrypted payload with the key, IV, and authentication tag inlined; decryption is performed in the victim's browser via SubtleCrypto and rendered into the DOM with `document.write()`. The unwrapper avoids literal `eval`/`atob` strings by reconstructing them from `.slice()` calls on dictionary words (a Tycoon 2FA fingerprint).

**Stage 2 — Anti-analysis gates.** The decrypted controller script performs four independent checks before rendering anything malicious:

1. *Headless / proxy detection* — `navigator.webdriver`, `window.callPhantom`, `window._phantom`, and `navigator.userAgent` substring "Burp". Positive match replaces the page with `about:blank`, blocking Selenium, Puppeteer, Playwright, PhantomJS, and Burp Suite traffic. 2. *Dev-tools suppression* — a keydown listener calls `preventDefault()` on F12, Ctrl+U, Ctrl+Shift+I/C/J/K, Ctrl+H, Cmd+Alt+I/C, Cmd+U; a `contextmenu` listener disables right-click. 3. *Debugger timing trap* — every 100 ms, the script measures the wall-clock delta around a bare `debugger;` statement. If a debugger pauses execution and the delta exceeds 100 ms, the page is redirected to legitimate `https://www.microsoft.com`. (Same construction documented in the eSentire April 2025 "Phish & Chips" blog.) 4. *ASN-based vendor filtering* — the script fetches `https://ipinfo.io/json` and compares `response.org` against a hardcoded 230-vendor blocklist covering AWS / GCP / Azure / Oracle / DigitalOcean / Hetzner / OVH / Vultr / Linode / Leaseweb / M247, VirusTotal / Hybrid Analysis / Any.Run / Joe Sandbox / Cuckoo / URLScan / Intezer, Proofpoint / Mimecast / Cloudflare / Zscaler / Forcepoint / Barracuda / Akamai / Fastly / Palo Alto / Fortinet / Cisco, Kaspersky / ESET / Bitdefender / Avast / AVG / Sophos / McAfee / Trend Micro / Symantec / G-Data / Avira, BrandVerity / RiskIQ / Netcraft / MarkMonitor / ZeroFox / Group-IB, GPTBot / ChatGPT / OpenAI / Claude / Anthropic / Perplexity / CCBot / Bytespider / PetalBot, NordVPN / ExpressVPN / Surfshark / ProtonVPN / CyberGhost / PIA / Mullvad / Windscribe, Bright Data / Luminati / Oxylabs / Smartproxy / SOAX. Any match redirects to `https://outlook.cloud.microsoft/mail/`. 5. *Time-bounded expiry* — `if (1780012800 < Math.floor(Date.now()/1000))` renders the literal string "Expired". The timestamp 1780012800 decodes to May 29, 2026 at 00:00:00 UTC, giving each deployed sample an approximately one-month operational tail.

**Stage 3 — HumanCheck + Check Domain branching.** The cleartext from Stage 2 is a Microsoft-branded fake CAPTCHA ("HumanCheck") page styled with the four Microsoft logo tile colors. The entire anti-analysis stack is repeated. On click, the page issues a GET to a Tycoon 2FA "Check Domain" — `https://shivacrio.com/bytecore~tx1j8` in this campaign — which the URLscan hunting regex published by TRU in April 2026 (`page.url:/.*\..*\.[a-z]{2,10}\/[a-zA-Z0-9]{1,20}[~!@$][a-zA-Z0-9]{1,20}/`) matches exactly. The behavior of the response has evolved: prior variants returned `0` or `1` and blocked outright on non-zero; this variant interprets the response as a fork — `0` proceeds to the device-code lure (`document.write(atob('<base64_voicemail_lure>'))`), non-zero renders a complete benign "NexusCore" fictional-registrar decoy site. Decoy-on-detection preserves operational secrecy that hard-blocking surrenders.

**Stage 4 — Device-code lure.** Victims who pass the Check Domain are shown a Microsoft 365 voicemail-themed page ("Voicemail_Message.mp3"). A spinner displays while the operator backend contacts Microsoft's `/devicecode` endpoint to obtain a fresh `device_code` / `user_code` pair. The page then displays the user code with a "Copy Code" button and a three-step instruction list. Clicking Copy Code places the code on the clipboard and opens `https://microsoft.com/devicelogin` in a popup. The victim pastes the code, signs in normally, satisfies any MFA challenge (phone-app push), and clicks Continue on the consent prompt — at which point Microsoft issues access and refresh tokens to the operator's polling client via `/organizations/oauth2/v2.0/token`. The victim is then cosmetically redirected to `https://outlook.cloud.microsoft/mail/` (their real inbox), leaving no apparent indicator of compromise.

**Stage 5 — Operator backend communication.** All POSTs go to `https://fijothi.com/dhkjCVBfLnfbhFjpYPoDKNMmLIQjNkGLMQPMQUBJFWELKIYHJHWDIESXVUZHHJNFTNMW<random>` — a fixed 68-character static path prefix followed by a per-request `randexp.js`-generated routing suffix matched against five hardcoded regular expressions. The starting bytes of the suffix act as a route discriminator: `codeemailtoken` (76|80) bootstraps the session, `emailtokencookie` (41|42) requests a fresh `device_code`, `emailtoken` (49|52) submits a harvested email, `checkemailtoken` (65|74) generic poll, `checkemailtokencookie` (67|86) the five-second-interval polling loop. Every request body is encrypted with CryptoJS AES-CBC using `key = iv = '1234567890123456'`, PKCS#7 padding, wrapper functions `encryptData()` / `decryptData()` — byte-for-byte identical to the encryption layer documented in the April 2025 "Phish & Chips" and April 2026 infrastructure-update blogs. The kit also calls `https://api.ipbase.com/v1/json/` for victim IP/country enrichment, joining `ipinfo.io`, `api.ipapi.is`, and `get.geojs.io` on TRU's list of legitimate IP-intelligence services abused by Tycoon 2FA.

## Why Device-Code Phishing Defeats MFA

The OAuth 2.0 Device Authorization Grant (RFC 8628) was designed for input-constrained devices (smart TVs, CLI tools, IoT appliances) where typing credentials is impractical. The protocol is intentionally indirect: the device asks the IdP for a short user-facing code, the user enters that code from a different browser, signs in normally, and the IdP returns tokens to the original device. **There is no cryptographic binding between the device that requested the code and the user's identity.** Anyone who initiates a device-code grant for a Microsoft first-party AppId can collect the resulting tokens from any user who consents.

The phish does not bypass MFA — it changes what MFA is being used to authorize. The user thinks they are approving access for a voicemail player; they are actually approving token issuance to an attacker-controlled device.

## The Microsoft Authentication Broker Pivot

The OAuth client the operator impersonates is **Microsoft Authentication Broker — AppId `29d9ed98-a469-4536-ade2-f981bc1d605e`** — a Microsoft first-party application. There are two consequences for defenders:

1. The application appears in Entra telemetry as a normal Microsoft app, not an unknown third-party OAuth app, so it does not trigger unverified-publisher detections that catch many OAuth phishing campaigns. 2. Microsoft Authentication Broker is a *broker* application — the token issued at consent can be exchanged for tokens scoped to other Microsoft resources (Exchange Online, Microsoft Graph, OneDrive for Business) without further user interaction. **One consent unlocks a token chain across the entire Microsoft 365 surface area.**

Network captures show the consent prompt advertises Microsoft Authentication Broker, but the subsequent `/authorize` request carries a different resource AppId — `9199bf20-a13f-4107-85dc-02114787ef48` (One Outlook Web) — confirming the broker-to-resource exchange.

## Operator Telemetry Footprint

Observed operator activity against the compromised identity (from Entra sign-in logs):

| Phase | Source IP | User-Agent | Event | |---|---|---|---| | Initial credential attempt | 47.90.180.205 (AS45102) | — | email/password submitted to Microsoft Authentication Broker; Entra returns errorCode 50199 ("user confirmation is required"); operator pivots to device-code grant | | Device-code consent | 47.90.180.205 (AS45102) | — | `AuthenticationProtocol = deviceCode` succeeds; tokens issued; MFA requirement satisfied by claim in token | | Immediate post-consent | 47.90.180.205 (AS45102) | `node` | three near-simultaneous non-interactive token uses against Exchange Online (x2) and Microsoft Graph (x1) within two seconds | | Sustained use | 47.252.11.99 (AS45102) | `undici` | nine non-interactive sign-in events against Exchange Online and Microsoft Graph over ~3 hours; all return errorCode 50173 ("the provided grant has expired due to it being revoked") — IR team had revoked the refresh-token chain but operator automation continued retrying |

The long-tail retry pattern is a strong post-compromise detection signal even after token revocation. `undici` is the modern Node.js native HTTP client library (the implementation behind global `fetch` in Node 18+); the bare `node` UA is the default for `node-fetch` and similar libraries when no explicit User-Agent header is set. Both are signatures of a Node.js automation backend. This is an evolution from the `axios/1.x` UA fingerprint documented across prior credential-relay-variant Tycoon 2FA reporting — defenders should now watch for all three (`axios/*`, `undici`, `node`) against the Microsoft Authentication Broker AppId in non-interactive sign-in logs.

AS45102 (Alibaba (US) Technology Co., Ltd.) has been observed as an active operator-side ASN across both the credential-relay and device-code variants of Tycoon 2FA since approximately April 10, 2026, and should be treated as an addition to (not replacement of) the post-takedown watchlist: AS9009 (M247), AS214238 (HOST TELECOM), AS62240 (Clouvider), AS204957 (GREEN FLOID), AS395092 (Shock Hosting), AS215540 (GLOBAL CONNECTIVITY SOLUTIONS).

## Continuity Fingerprints

Multiple independent source-code fingerprints carry over from prior Tycoon 2FA kits and together constitute strong attribution evidence: …

MITRE ATT&CK techniques used in TL-2026-0522

Defense Evasion

T1027 Obfuscated Files or Information; T1036 Masquerading; T1497 Virtualization/Sandbox Evasion; T1622 Debugger Evasion; T1684.001 Impersonation

Command and Control

T1071 Application Layer Protocol; T1090 Proxy; T1102 Web Service; T1573 Encrypted Channel

Collection

T1114 Email Collection; T1530 Data from Cloud Storage

Initial Access

T1199 Trusted Relationship; T1566 Phishing

Execution

T1204 User Execution

Discovery

T1526 Cloud Service Discovery

Credential Access

T1528 Steal Application Access Token; T1606 Forge Web Credentials; T1621 Multi-Factor Authentication Request Generation

Impact

T1531 Account Access Removal

lateral-movement

T1550 Use Alternate Authentication Material

Exfiltration

T1567 Exfiltration Over Web Service

Resource Development

T1583 Acquire Infrastructure; T1587 Develop Capabilities; T1608 Stage Capabilities

Reconnaissance

T1589 Gather Victim Identity Information

Affected products and versions in Tycoon 2FA Adopts OAuth 2.0 Device-Code Phishing

  • Microsoft — Microsoft 365 (Entra ID / Azure AD)
    Vulnerable versions: All tenants with OAuth Device Code flow enabled (default)
    Fixed in: No patch — mitigate via Conditional Access policy blocking deviceCode AuthenticationProtocol for end-users
  • Microsoft — Exchange Online
    Vulnerable versions: All — post-consent token reuse target
  • Microsoft — Microsoft Graph
    Vulnerable versions: All — post-consent token reuse target
  • Microsoft — OneDrive for Business
    Vulnerable versions: All — post-consent token reuse target
  • Microsoft (impersonated first-party application) — Microsoft Authentication Broker (AppId 29d9ed98-a469-4536-ade2-f981bc1d605e)
    Vulnerable versions: First-party broker app — token issuance to attacker-controlled device via device-code grant

Remediation for Tycoon 2FA Adopts OAuth 2.0 Device-Code Phishing

Patches

  • Microsoft has no patch — this is design-level abuse of RFC 8628 OAuth 2.0 Device Authorization Grant. Mitigation is Conditional Access policy, not a vendor fix.

Immediate actions

  • Implement a Microsoft Entra Conditional Access policy that BLOCKS the OAuth Device Code authentication flow for end-users (scope to explicit developer / device-onboarding cohorts only) — this single control eliminates the entire attack class
  • Restrict user consent to OAuth applications: require admin consent for all third-party apps and limit default user consent to verified publishers only
  • Block / sinkhole observed operator infrastructure at the perimeter: fijothi.com, shivacrio.com, cookies.28gholland.workers.dev, operator IPs 47.90.180.205 and 47.252.11.99 (AS45102)
  • Hunt Entra SigninLogs and AADNonInteractiveUserSignInLogs for AppId 29d9ed98-a469-4536-ade2-f981bc1d605e (Microsoft Authentication Broker) combined with UserAgent in ('node', 'undici') or UserAgent matches axios/1.x
  • On any confirmed device-code phish: revoke the OAuth refresh-token chain (Revoke-AzureADUserAllRefreshToken), audit recent application consents, review mailbox rules and forwarding configurations, sign user out across all Entra-protected applications

Workarounds

  • Disable OAuth device-code flow tenant-wide via Conditional Access if no legitimate business need exists
  • Where device-code flow is required, scope it to a named application allowlist and a managed-device-only network location
  • Monitor Entra logs for any AuthenticationProtocol = deviceCode events from sources with no prior device-code activity

Longer-term hardening

  • Enable Microsoft Entra Continuous Access Evaluation (CAE) tenant-wide so token revocation propagates in near real time
  • Enforce Device Compliance Conditional Access policies — attacker-controlled devices are not enrolled and will fail compliance checks
  • Treat supplier DMARC posture as part of vendor-risk management; vendors whose mail-sending domains do not publish DMARC remove a downstream control your gateway can apply when one of their accounts is later abused
  • Build an OAuth token-theft incident-response runbook driven by Microsoft's published token-tactics guidance
  • Layer the extended Tycoon 2FA KQL covering all three operator UA fingerprints (axios/*, node, undici) and the Check Domain URLscan regex into continuous hunts
  • Subscribe to TRU and CISA bulletins on PhaaS evolution; the kit codebase has now survived two infrastructure rebuilds (post-March 2026 takedown and pre-takedown re-tooling)

Weaknesses (CWE) in Tycoon 2FA Adopts OAuth 2.0 Device-Code Phishing

CWE-1390, CWE-287, CWE-602, CWE-345

Timeline of Tycoon 2FA Adopts OAuth 2.0 Device-Code Phishing

  • eSentire TRU publishes 'Phish & Chips: Serving Up Tycoon 2FA's Secrets', the first detailed analysis of the kit's Check Domain architecture, CryptoJS AES-CBC encryption layer (hardcoded key/IV '1234567890123456'), anti-debug stack, and byte-prefix route discriminator — fingerprints later confirmed unchanged in the 2026 device-code variant.
  • Microsoft Digital Crimes Unit, Europol, eSentire, and industry partners conduct an international coalition takedown of Tycoon 2FA infrastructure.
  • eSentire TRU publishes 'Tycoon 2FA Infrastructure Update: Threat Actors Adapt Following Global Coalition Takedown', confirming operators retained the kit codebase and rebuilt on new infrastructure within weeks. Publishes URLscan hunting regex for Check Domains.
  • First observed shift of Tycoon 2FA operator activity to AS45102 (Alibaba (US) Technology Co., Ltd.), continuing the post-takedown ASN rotation pattern (alongside AS9009 M247, AS214238 HOST TELECOM, AS62240 Clouvider, AS204957 GREEN FLOID, AS395092 Shock Hosting, AS215540 GLOBAL CONNECTIVITY SOLUTIONS).
  • Trustifi click-tracking ObjectId 69f218d9bd8f28639a2460c7 created at 14:42:33 UTC, encoding the moment the lure was delivered to the victim. Invoice-themed email contained a hxxps[://]events[.]trustifi[.]com/api/o/v1/click/<ObjectId>/<recipient_hex>/... URL.
  • eSentire TRU analysis of the captured campaign: Cloudflare Worker handoff to cookies.28gholland.workers.dev, four-layer in-browser decryption chain, fake HumanCheck CAPTCHA, Check Domain at shivacrio.com/bytecore~tx1j8, voicemail-themed device-code lure, operator C2 at fijothi.com, operator polling from 47.90.180.205 (UA: node) and 47.252.11.99 (UA: undici) in AS45102.
  • eSentire TRU publishes 'Tycoon 2FA Operators Adopt OAuth Device Code Phishing' blog with full source-code analysis, KQL hunting queries, and recommended Conditional Access mitigation.
  • BleepingComputer publishes coverage of the eSentire research (Bill Toulas, 'Tycoon2FA hijacks Microsoft 365 accounts via device-code phishing'), citing Push Security's ecosystem-wide finding of a ~37x year-over-year surge in OAuth device-code phishing across 10+ PhaaS platforms and private kits.
  • As of 2026-05-29, this remains ACTIVE: Tycoon 2FA survived the March 2026 Microsoft/Europol takedown (operators rebuilt within hours, back to pre-disruption levels in days per CrowdStrike/Barracuda) and re-tooled into OAuth device-code phishing now surging ~37x YoY across 10+ PhaaS kits. No vendor patch exists (RFC 8628 design abuse); only Entra Conditional Access mitigates.
  • Hardcoded campaign expiry timestamp (Unix 1780012800) baked into the Layer 2 controller script. After this date, fetched samples render the literal string 'Expired' instead of the lure, time-bounding the analytical window for forensic responders to approximately one month per deployed sample.

Sources cited for Tycoon 2FA Adopts OAuth 2.0 Device-Code Phishing

Threats related to Tycoon 2FA Adopts OAuth 2.0 Device-Code Phishing

Detection coverage for TL-2026-0522

As of 2026-05-17, Threadlinqs Intelligence publishes 9 detection rule(s) for TL-2026-0522 across Splunk SPL, Microsoft KQL and Sigma, covering 27 indicator(s) of compromise. The whole corpus is readable without an account; a free account unlocks full detection query text in Splunk SPL, Microsoft KQL and Sigma; paid tiers add raw indicator values, correlation and the MCP server. Threadlinqs MCP server · View plans.

Threadlinqs Intelligence — Real-Time Threat Detection Platform

[ 0 threats ] [ 0 det ] [ CRIT: 0 ] [ HIGH: 0 ]
// threat_feed
$ sort --newest
Showing all threats

Latest Threats