🔍 Contexte
Publié le 26 mai 2026 par Elastic Security Labs (auteurs : Samir Bousseaden et Terrance DeJesus), cet article constitue une analyse technique détaillée du kit Phishing-as-a-Service (PhaaS) Tycoon 2FA, attribué à Storm-1747 par Microsoft Threat Intelligence. Malgré un démantèlement coordonné en mars 2026 impliquant Microsoft, Europol, Cloudflare, SpyCloud et eSentire (plus de 300 domaines saisis), le kit a repris ses activités dès fin avril 2026.
⚙️ Mécanisme AiTM
Tycoon 2FA opère comme un proxy inverse en temps réel entre la victime et le fournisseur d’identité légitime (Entra ID ou Google). Le flux d’attaque comprend :
- Envoi d’un email de phishing avec lien ou QR code (PDF, SVG, HTML, PPTX)
- Chaîne de redirections multi-couches avec fingerprinting, CAPTCHA et anti-analyse
- Réplique pixel-perfect de la page de connexion Microsoft ou Google
- Relais des credentials et du challenge MFA en temps réel
- Interception du token de session post-MFA avant qu’il n’atteigne le navigateur de la victime
🧩 Deux variantes structurelles
WebSocket AiTM (variante classique) : proxy via Socket.IO (Socket.IO 4.6.0) capturant le cookie de session post-MFA, avec canal bidirectionnel temps réel vers le C2.
Device-code-grant abuse (Microsoft uniquement) : obtention d’un device code via l’endpoint oauth2/devicecode avec Microsoft Authentication Broker (29d9ed98-a469-4536-ade2-f981bc1d605e) comme client, échange contre des access/refresh tokens après authentification de la victime sur microsoft.com/devicelogin.
🛡️ Techniques d’évasion
- Filtrage IP via
api.ipapi.is(blocklist cloud providers avec strings inversées) - Détection de bots : vérification de
navigator.webdriver,window.callPhantom, user-agent “Burp” - Blocage DevTools : interception des raccourcis clavier, désactivation du clic droit
- Debugger trap : boucle
setIntervalà 100ms mesurant les pauses d’exécution - DOM vanishing : suppression du JavaScript malveillant après exécution
- Chiffrement par victime : cipher Caesar + XOR avec PRNG seedé par session
- Ciblage Linux : page blanche pour les utilisateurs Linux (supposés chercheurs)
- Faux CAPTCHA : grille 3×3 avec images Unsplash
🏗️ Architecture opérationnelle Microsoft 365 (deux tiers)
Tier 1 - Kit Relay : IPs cloud-VPS (Alibaba Cloud), user agents Node.js (node, axios/1.15.2, node-fetch/1.0, undici), progression de tokens : none → refreshToken → Rogue Device Registration → primaryRefreshToken (PRT).
Tier 2 - Operator Console : IPs résidentielles/proxy, user agent Firefox fixe, accès aux apps web M365 (My Profile, Outlook Web, OfficeHome), c_sid partagé entre toutes les IPs, apparition 10-20 minutes après le premier token issu par le kit relay.
📊 Post-compromise : énumération Graph API
Rafale de 20-30+ appels Graph API en 30-60 secondes couvrant :
- Découverte de rôles (
transitiveRoleAssignments,roleManagement) - Reconnaissance cross-tenant (
tenantRelationships/getResourceTenants) - Recon mailbox (
me/mailboxSettings) - Collecte de contacts (
me/contactFolders/contacts,$top=1000) - Inventaire org/licences (
subscribedSkus,organization)
🔒 Persistance via Device-PRT
Le kit enregistre un device via DRS (Device Registration Service) en soumettant un CSR PKCS#10 synthétique, obtient un certificat device, puis forge un JWT signé RS256 pour obtenir un primaryRefreshToken (PRT). Ce PRT survit à revokeSignInSessions car le device est un principal séparé dans Entra ID. La neutralisation requiert la suppression des devices enregistrés AVANT la révocation des sessions.
🌐 Variante Google Workspace
Architecture single-tier (pas d’operator console distinct). Séquence en ~1 seconde par IP relay :
login_successlogin_verificationavecis_second_factor: truetoken: authorizepour le client Chrome OAuth (77185425430.apps.googleusercontent.com)DEVICE_REGISTER_UNREGISTER_EVENT
Scope utilisé : https://www.google.com/accounts/OAuthLogin. Architecture JavaScript en 5 couches avec clé AES-CBC hardcodée 1234567890123456 et fingerprint kit : event Socket.IO recieveid (typo intentionnelle).
🔎 Règles de détection déployées
- Entra ID : détection relay via user agents Node.js, device-code phishing, Auth Broker vers ressource inhabituelle, enregistrement device avec UA anormal
- Graph API : règle ES|QL détectant ≥4 catégories de recon distinctes en ≤60s
- Google Workspace : impossible travel (>800 km/h, >500 km), premier login depuis ASN inconnu (fenêtre 14 jours), OAuth Chrome + device registration depuis ASN suspect en 30s, burst de device registrations (≥3 device IDs en 1 minute)
⚡ Containment automatisé (Elastic Workflows)
Workflow déclenché sur alerte AiTM en moins de 10 secondes : désactivation du compte (accountEnabled: false), énumération et suppression des devices enregistrés, révocation des sessions, ouverture d’un case Kibana — bien en deçà de la fenêtre de handoff kit-to-operator de 10-20 minutes.
📋 Type d’article
Il s’agit d’une analyse technique publiée par Elastic Security Labs, dont le but principal est de documenter le fonctionnement détaillé de Tycoon 2FA, de cartographier les signaux de détection sur les deux plateformes cloud et de fournir des règles de détection et un workflow de containment directement exploitables par les équipes SOC.
🧠 TTPs et IOCs détectés
Acteurs de menace
TTP
- T1566.002 — Phishing: Spearphishing Link (Initial Access)
- T1539 — Steal Web Session Cookie (Credential Access)
- T1078.004 — Valid Accounts: Cloud Accounts (Defense Evasion)
- T1098.005 — Account Manipulation: Device Registration (Persistence)
- T1550.001 — Use Alternate Authentication Material: Application Access Token (Defense Evasion)
- T1087.004 — Account Discovery: Cloud Account (Discovery)
- T1069.003 — Permission Groups Discovery: Cloud Groups (Discovery)
- T1526 — Cloud Service Discovery (Discovery)
IOC
Malware / Outils
- Tycoon 2FA (other)
- Socket.IO (tool)
🟢 Indice de vérification factuelle : 71/100 (haute)
- ✅ elastic.co — source reconnue (liste interne) (20pts)
- ✅ 29321 chars — texte complet (fulltext extrait) (15pts)
- ✅ 1 IOC(s) (6pts)
- ⬜ 0/1 IOCs confirmés externellement (0pts)
- ✅ 8 TTPs MITRE identifiées (15pts)
- ✅ date extraite du HTML source (10pts)
- ✅ acteur(s) identifié(s) : Storm-1747 (5pts)
- ⬜ pas de CVE à vérifier (0pts)
🔗 Source originale : https://www.elastic.co/security-labs/tycoon-2fa-aitm-detection-engineering?utm_source=substack&utm_medium=email