~/f4n6 $ grep -r "Mirage Kitten targeting aviation and FinTech sectors across the Middle East and Africa with a new malware set" ./investigations/ --include="*.md"

Mirage Kitten targeting aviation and FinTech sectors across the Middle East and Africa with a new malware set

Jeff Davies 01 Sep 2026 18 min read

1. Executive summary

Kaspersky GReAT has documented a campaign of targeted cyber-espionage activity against the aviation, aerospace and FinTech sectors across the Middle East and Africa (confirmed victims in Egypt, Ethiopia and Afghanistan), delivered via fake recruiter personas on LinkedIn and other job platforms that pressure software engineers into downloading and running trojanized coding-challenge archives hosted on Amazon S3. The campaign introduces two previously undocumented cross-platform RAT families — NodeRabbit (Node.js) and PollCat (obfuscated JavaScript) — both targeting Windows, Linux and macOS, with full file, process and shell command capability, developer-workflow persistence (fake VS Code extension, Git hooks, scheduled tasks, cron, LaunchAgents), and C2 hosted on Azure Websites and Cloudflare-fronted domains that blend into legitimate corporate traffic. Kaspersky attributes the activity to Mirage Kitten with high confidence; however, Mirage Kitten has no MITRE ATT&CK profile in our verified reference data, so the attribution must be treated as unconfirmed for the purposes of this advisory. No CVE is involved — this is a social-engineering and malicious-code-delivery campaign, not a patchable vulnerability — so the primary exposure for EMEA financial services clients is developer and engineering staff being recruited or job-hunting on LinkedIn, and the risk of espionage-grade RATs establishing long-lived persistence on developer endpoints, including in WSL environments.

2. Regulatory framing

Article Trigger (the fact in this item) Practical impact
DORA Art. 17: ICT-related incident management process The campaign delivers developer-workstation RATs with multi-OS persistence (scheduled tasks, cron, LaunchAgents, Git hooks, fake VS Code extensions) that are designed to survive reboots and evade casual review; victims include a FinTech organisation in scope of the campaign's targeting. Clients whose incident management process does not cover developer endpoints (including WSL and personal-device job-application workflows) should extend detection and containment playbooks to these platforms before an incident forces it.
DORA Art. 18: classification of ICT-related incidents and cyber threats A confirmed espionage-motivated intrusion into a FinTech-sector victim constitutes a cyber threat that must be classified under the entity's classification criteria to determine whether it is major. Ensure the classification process can distinguish espionage-motivated compromise (no ransomware, no extortion, no data-destruction observed) from disruptive incidents, and that classification drives the correct reporting decision.
NIS2 Art. 21(2)(d): supply chain security measures The initial-access vector is a trojanized third-party code artefact (unpublished npm packages colorized_terminal and pretty-log bundled into node_modules) that staff execute outside the organisation's software supply chain controls. Review whether developer security measures cover code executed during recruitment exercises and from untrusted archives, not just production dependency management.

No other article in the regulatory reference is specifically engaged. We note that DORA Art. 19 (reporting of major incidents) would only be triggered by an actual confirmed incident at the client, which this advisory does not assert.

3. Technical analysis & attack chain

Confirmed attack chain (reconstructed from Kaspersky telemetry and a corroborating public account of the delivery chain)

  1. A threat actor operating a fake recruiter persona (posing as a talent acquisition specialist at a major technology company) contacts a software engineer on LinkedIn or another job search platform and advertises a role requiring a technical assessment.
  2. The target receives a link to a coding-challenge ZIP archive hosted on legitimate cloud infrastructure — Amazon S3 (observed bucket: oracle-challenge.s3[.]us-east-1.amazonaws[.]com) — and is pressured to download and run the project immediately. The lure README imposes a three-hour time limit and prohibits AI assistants, both of which suppress review of the malicious code.
  3. The archive contains a plausible full-stack application (e.g. TaskFlow, built with Express, React and Vite). The README directs the candidate to fix frontend defects and asserts that server.js is bug-free and must not be modified — steering attention away from the only altered file.
  4. The first line of server.js imports a trojanized npm package — colorized_terminal or pretty-log, both pinned to version 2.1.0 — bundled directly in the archive's node_modules directory rather than published to the npm registry. On import, the package launches the implant from node_modules/.cache/.320697f1/index.js as a detached background process.
  5. The implant (NodeRabbit or PollCat) establishes per-OS persistence and begins encrypted C2 communication with Azure-hosted and Cloudflare-fronted infrastructure.

NodeRabbit — technical detail. Cross-platform Node.js RAT, three variants with shared code lineage, each recovered from a system in a different country (Afghanistan, Egypt, Ethiopia).

  • Agent ID: SHA-256 hash of hostname, username, OS version, architecture and MAC address, truncated to the first 32 hex characters.
  • Single-instance: Variant 1 binds a TCP listener to 127.0.0.1:48739; if the bind fails it exits silently. Variant 2 derives a host-specific port from the agent ID: 41984 + (value mod 5000) where value is the first four hex characters of the identifier interpreted as an integer (port range 41984–46983).
  • Variant 1 persistence: Windows — copies itself to %APPDATA%\Microsoft\EdgeUpdate\msedge_update.js, clones local node.exe to nodew.exe in the same folder and patches its PE subsystem from Console to Windows GUI to suppress the console window, then creates HKCU\Software\Microsoft\Windows\CurrentVersion\Run\MicrosoftEdgeUpdate executing nodew.exe msedge_update.js. Linux — copies to ~/.config/microsoft-edge-update/msedge_update.js with an @reboot cron entry. macOS — copies to ~/.config/microsoft-edge-update, creates ~/Library/LaunchAgents/com.microsoft.edgeupdate.plist with RunAtLoad and KeepAlive, and attempts to load it.
  • Variant 2 persistence: masquerades as Intel Driver & Support Assistant. Windows — copies to %LOCALAPPDATA%\Intel\DSA\idriver_support.js, copies node.exe to IntelDSA.exe with the same PE Console→GUI subsystem patch, and creates a scheduled task named IntelDriverSupportUpdate running daily at 10:00. Linux — ~/.config/intel-dsa/idriver_support.js plus @reboot cron. macOS — ~/Library/Application Support/Intel DSA/idriver_support.js with LaunchAgent com.intel.dsa.helper (RunAtLoad, KeepAlive).
  • Variant 2 anti-analysis: terminates if it detects limited system memory, low CPU count, short uptime, analyst-associated usernames/hostnames, or common analysis tools; before exiting it emits benign HEAD requests to www.google.com, www.microsoft.com and www.cloudflare.com and never contacts C2.
  • Variant 2 proxy awareness: checks HTTP(S) proxy environment variables, Windows Internet Settings including explicit PAC URL, and WinHTTP configuration; tunnels HTTPS C2 through HTTP CONNECT; retries with URL-embedded basic credentials; finally delegates NTLM/Negotiate challenges to curl.exe --proxy-anyauth --proxy-user using the victim's logon session. Proxy-discovery results are cached for five minutes and invalidated on network-interface or IP change.
  • Variant 1 C2: three Azure-hosted addresses with failover — plugplay.azurewebsites[.]net, Rgbteller.azurewebsites[.]net, Wslwebui.azurewebsites[.]net — using POST /api/rabbit/checkin (register), POST /api/rabbit/task (poll), POST /api/rabbit/result (submit).
  • C2 cryptography: request objects serialised as JSON, wrapped with AES-256-GCM; the AES key is the SHA-256 digest of an ASCII seed embedded in the agent; fresh 12-byte IV and 16-byte authentication tag per request. Wire format: { "d": "base64(IV || ciphertext || authentication_tag)", "_r": "8 hexadecimal characters", "_t": "epoch timestamp" }. C2 responses use the same structure and may carry a command.
  • Variant 1 commands (11): sys:info, proc:list, proc:start (arbitrary shell command), fs:list, fs:read (chunked, Base64), fs:write (Base64, chosen file offset), fs:delete, fs:mkdir, net:config, agent:sleep, script:exec (writes a Base64 Node.js script to a randomly named .tmp file, executes, deletes).
  • Variant 3 (Ethiopia): launched via pretty-log; C2 chain of Azure- and Cloudflare-hosted domains — visitfinancedentists[.]com, kyrasey-f8hfexa5cqamh7fk.westeurope-01.azurewebsites[.]net, healthcomfsdpower[.]com — with new endpoints POST /sdk/v2/ready, POST /sdk/v2/config, POST /sdk/v2/events. Persistence: Windows — attempts ProgramData (with /ru SYSTEM /rl highest if it can list C:\Windows\System32\config) or LocalAppData fallback, build-specific daily 10:00 task; macOS — ~/Library/Application Support with RunAtLoad/KeepAlive LaunchAgent; Linux — ~/.local/share with @reboot cron (skipped if crontab -l fails); WSL — reuses the Linux copy, writes launcher.vbs under the Windows user profile and creates a daily 10:00 Windows task relaunching via wscript.exe and wsl.exe. Retains the original 11 commands and adds 12, including outlook:emails (harvest account addresses from Outlook OST/PST artifacts), agent:servers (replace in-memory C2 list, optionally persisted to .sv.json), agent:getchain, proc:exec, proc:kill, fs:drives, and the developer-workflow persistence set below.
  • Variant 3 developer-workflow persistence: persist:vscode creates a fake VS Code extension displayed as "GitHub Copilot Helper" with description "AI coding assistant helper service" and activation event onStartupFinished; its extension.js starts the installed payload as a detached Node.js process, borrowing a trusted publisher name from local extension metadata or a trustedPublishers value in state.vscdb (no signature or trusted status actually copied); it also attempts to disable VS Code Workspace Trust and, on Windows, falls back to a current-user Run registry key if the extension directory is missing. persist:projects:scan checks recent VS Code workspace paths and the first 60 immediate children of common locations such as ~/projects and ~/source (max 20 repositories returned); persist:project:inject appends a marked launcher to .git/hooks/post-merge and .git/hooks/post-checkout, with marker # shepherd-persist; followed by a line that starts the installed payload with Node in the background. persist:check audits selected VS Code, scheduled-task and Run-key persistence indicators; persist:vscode:remove and persist:project:remove clean up.

PollCat — technical detail. Cross-platform RAT in obfuscated JavaScript, delivered via a separate lure: RankChallenge-react, a React code-fixing challenge presented as a time-limited assessment. Running the project invokes npm i && node index.js.

  • Lure mechanics: the project uses CTF terminology throughout (root package named ctf-server, backend prints "CTF server running", ctf-* storage keys, tutorial references path/to/ctf) — Kaspersky assesses this as consistent with an AI-assisted or template-generated project into which the attacker later inserted malicious components. The bundled PDF tutorial instructs the target to click Continue, enter a six-digit OTP supplied by the "recruiter" (single-use, expiring, claimed to rotate every 30 seconds) and complete the challenge within a one-hour session. The bundled .env contains the JWT signing secret, OTP service URL and OTP client ID. Submitted codes are forwarded to an attacker-managed domain registered in late June 2026: https://lifespotify[.]com/api/users/b879746e-fed9-4211-a6da-4d8223681267/otp/validate.
  • Execution independent of OTP: at application startup, app.js loads requireAuth.js, which imports and immediately starts the malicious requireObjects.js. PollCat begins C2 registration and command polling before the user enters any access code; a failed OTP leaves PollCat running in the background. A successful OTP validation issues a JWT, spawns an additional PollCat worker, and triggers persistence on the first authenticated request to the protected middleware.
  • Persistence: Windows — writes package.json and requireObject.js to %APPDATA%\Microsoft\Network, runs npm install, creates a daily 09:00 task named NetSync_<username> running the worker with Node.js. Linux — writes the worker to ~/.node_packages, runs npm i, appends a daily 09:00 cron line and an @reboot line. macOS — same ~/.node_packages copy and cron path, plus ~/Library/LaunchAgents/com.harsh.requireobject.plist with RunAtLoad and a daily 09:00 trigger.
  • C2: host identified as 129--<hostname>; iterates sahi-finance[.]com, GamebarAppinformation[.]azurewebsites[.]net, GamebarApp[.]azurewebsites[.]net until registration succeeds. Registration: POST /beacon with JSON body {"clientId":"<client-id>","type":"poll","pcName":"<hostname>","userName":"<username>"}. Unusually, a successful registration is signalled by an HTTP 400 response containing {"socketId":"<socket-id>","pollInterval":<ms>,"jitterTime":<ms>}; the socketId is stored and used as the session token. Subsequent traffic: POST /gate/hello (host, user, domain, OS, privilege level), GET /gate/fetch?token=<socketId> (poll), POST /gate/submit (Base64-encoded results), GET /vault/<uuid> (retrieve hosted file to victim), PUT /vault/push/ (upload local file or chunk to C2), POST /gate/track (report chunk-upload progress). Default poll interval two minutes with up to five seconds jitter. Commands and results are stored as little-endian binary records carried as Base64 text.
  • Commands (22 declared, three unimplemented): directory listing, move, shell execution, process listing, delete, C2-to-victim file download, victim-to-C2 upload, drive enumeration, process termination by PID, DLL load and exported-function call on Windows (RUNDLL), mkdir, ZIP create/extract, chunked upload, hidden background process, EVAL_JS (executes C2-supplied JavaScript with access to Node.js modules, files, processes, networking and child-process functions), SYSTEM_CHECK, SET_SLEEP_TIME, SET_IDLE_TIME, SET_JITTER_TIME; WS_DOWNLOAD, REQUEST_ELEVATION and PERSIST are defined but not implemented.
  • Security-software inventory: SYSTEM_CHECK collects running process names and lists files/folders, and searches for folders matching 24 hardcoded security-vendor strings: 'Google', 'Microsoft', 'Palo Alto Networks', 'Cisco', 'VMware', 'Fortinet', 'Citrix', 'CheckPoint', 'Juniper Networks', 'LogMeIn', 'Sophos', 'Symantec', 'Trend Micro', 'McAfee', 'Kaspersky Lab', 'ESET', 'Bitdefender', 'Avast Software', 'CrowdStrike', 'SentinelOne', 'Malwarebytes', 'BraveSoftware', 'Tencent', 'Naver'. On a match it lists that folder's root contents (non-recursive) and sends the inventory as JSON to POST /api/system-details/result.

Infrastructure. Mirage Kitten continues to use Azure Websites (AS8075, registrar MarkMonitor Inc.) and Cloudflare-backed domains (AS13335, NameCheap/Dynadot) for C2. In some cases the actors incorporated the targeted organisation's name into the Azure subdomain, making C2 traffic resemble normal business traffic from an employee machine. Pattern analysis across C2 channels including msmanagementgrp[.]com and visitfinancedentists[.]com led Kaspersky to approximately 11 additional infrastructure assets (see §5).

Attribution and confidence caveats. Kaspersky attributes this activity to Mirage Kitten with high confidence, citing (per the related corpus-1 reporting on the group's broader toolset) code and behavioural overlap with the MiniFast/Retrograde toolset: both treat HTTP 400 as a successful handshake and parse a socketId from the body; near-identical host-registration request bodies (/gate/hello vs /agent/init); the same GET ...?token=<socketId> polling pattern; identical default poll interval 120,000 ms (0x1D4C0), jitter 5,000 ms (0x1388) and retry timeout 60,000 ms (0xEA60); the same unimplemented REQUEST_ELEVATION (0xB0) / PERSIST (0xB1) command slots; and the same proxy-aware C2 design delegating NTLM/Negotiate to curl.exe --proxy-anyauth --proxy-user versus a native WinHttp equivalent. However, Mirage Kitten has no MITRE ATT&CK profile in Adverse Trace's verified reference data, so we treat the attribution as unconfirmed. The entire technical dataset in this advisory is single-sourced (one vendor report, Kaspersky GReAT); The Record's coverage corroborates only the discovery geography (Afghanistan, then Egypt and Ethiopia), not the malware internals. Single-sourced; verify before enforcement.

4. Mitigation & containment

P1 — within 24 hours

  1. Hunt for the lure archives. Search web/mail proxy logs, EDR download events and endpoint filesystems for the observed archive filenames: Front-Technical-Challenge.zip, FrontEnd-Task.zip, Task-FullStack.zip, fullstack-1536.zip, webapp76592.zip, webapp76531.zip, challenges-17831.zip, challenges-17832.zip, Project-1802.zip, Case-34234.zip, RankChallenge-react-6uJSX3-main.zip. Block and quarantine any hits; interview the recipient.
  2. Block C2 infrastructure at the egress proxy and DNS resolver. All domains in §5 are candidate blocks; at minimum block the active C2 sets: plugplay.azurewebsites[.]net, rgbteller.azurewebsites[.]net, wslwebui.azurewebsites[.]net, visitfinancedentists[.]com, healthcomfsdpower[.]com, kyrasey-f8hfexa5cqamh7fk.westeurope-01.azurewebsites[.]net, sahi-finance[.]com, gamebarapp.azurewebsites[.]net, gamebarappinformation.azurewebsites[.]net, lifespotify[.]com, msmanagementgrp[.]com, msmanagementgrpmedia[.]com. Note: blocking *.azurewebsites.net wholesale will break legitimate Azure App Service traffic — block per-host and alert on any other *.azurewebsites.net host receiving POST-heavy beaconing patterns.
  3. Sweep developer endpoints for the persistence artefacts. Windows: scheduled tasks named IntelDriverSupportUpdate, NetSync_<username>, and any build-specific daily 10:00 task; Run key HKCU\Software\Microsoft\Windows\CurrentVersion\Run\MicrosoftEdgeUpdate; files %APPDATA%\Microsoft\EdgeUpdate\msedge_update.js and nodew.exe, %LOCALAPPDATA%\Intel\DSA\idriver_support.js and IntelDSA.exe, %APPDATA%\Microsoft\Network\requireObject.js and package.json. Linux/macOS: ~/.config/microsoft-edge-update/, ~/.config/intel-dsa/, ~/.local/share payload copies, ~/.node_packages, @reboot and daily 09:00/10:00 cron entries, LaunchAgents com.microsoft.edgeupdate.plist, com.intel.dsa.helper, com.harsh.requireobject.plist. WSL: launcher.vbs under the Windows user profile and any daily 10:00 task invoking wscript.exe with wsl.exe.
  4. Sweep developer workflow persistence. VS Code extensions named "GitHub Copilot Helper" (description "AI coding assistant helper service", activation onStartupFinished); Git repositories for the marker # shepherd-persist; in .git/hooks/post-merge and .git/hooks/post-checkout; .sv.json files written by agent:servers.
  5. Isolate any confirmed-infected host. Full reimage is recommended given script:exec/EVAL_JS arbitrary-code capability; at minimum remove all persistence entries above and rotate any credentials, tokens and SSH keys present on the host. outlook:emails harvesting means OST/PST-exposed mailbox addresses should be treated as enumerated.

P2 — within 72 hours

  1. Alert on the single-instance listener behaviour. Variant 1 binds 127.0.0.1:48739; Variant 2 binds a host-specific port in 41984–46983. EDR/NetFlow rules for loopback listeners in these ranges on developer endpoints are cheap and high-signal.
  2. Detect the C2 protocol shapes. PollCat: outbound POST to /beacon followed by an HTTP 400 response treated as success, then GET /gate/fetch?token=; NodeRabbit Variant 3: POST /sdk/v2/ready, /sdk/v2/config, /sdk/v2/events. NodeRabbit Variant 1/2: POST /api/rabbit/checkin, /api/rabbit/task, /api/rabbit/result. These URI paths on non-business hosts warrant alerting.
  3. Brief engineering and recruitment-facing staff. The delivery vector is recruiter contact on LinkedIn/job platforms pressuring immediate download and execution of a coding challenge, with artificial time limits and prohibitions on AI assistants. Instruct developers never to run third-party coding-challenge projects on corporate endpoints; route any such request through security. Advise that AI code-review tooling would likely have flagged the malicious first-line import — the lure's explicit prohibition of AI assistants is itself an indicator.
  4. Review npm supply-chain controls. The trojanized packages (colorized_terminal, pretty-log, both "2.1.0") were bundled in node_modules and never published to the npm registry — registry allow/deny lists alone will not catch this. Controls must cover execution of bundled, unpublished packages from untrusted archives.

P3 — within 7 days

  1. Extend monitoring to Linux, macOS and WSL developer fleets. All three NodeRabbit variants and PollCat are cross-platform; Windows-only EDR coverage leaves the Linux/macOS persistence paths (cron, LaunchAgents, ~/.node_packages) invisible.
  2. Audit scheduled tasks and cron for masquerading names. The group favours plausible update-themed names (IntelDriverSupportUpdate, NetSync_<username>, MicrosoftEdgeUpdate Run key, WindowsSecurityUpdate in the related MiniFast toolset). Baseline legitimate update tasks and alert on new ones with Node.js/wscript command lines.
  3. Check proxy egress for curl.exe --proxy-anyauth --proxy-user invocations initiated by Node.js processes — the malware delegates NTLM/Negotiate proxy auth to curl using the victim's logon session, which is an anomalous parent-child pattern.
  4. Review historical DNS/HTTP logs (from May 2026) against the full §5 domain list, including the 11 additional infrastructure assets registered May–July 2026, to establish whether any pre-existing exposure predates this reporting.

5. Indicators of compromise

All indicators are drawn from the Kaspersky GReAT report (single source). Confidence reflects corroboration only within that source.

type value confidence source
md5 1EA83E4E4592B01E4ACAB63EB867BEE5 High Kaspersky (Front-Technical-Challenge.zip)
md5 CBAAF0900A13F28E380F49ADECEC932C High Kaspersky (FrontEnd-Task.zip)
md5 366515822D5AC1CC500711EF57A2E32E High Kaspersky (Task-FullStack.zip)
md5 CF449F1992C2819E62AC44A0B06AC2E7 High Kaspersky (fullstack-1536.zip)
md5 E95A4366686E3F786EA3C056FAB5B0DA High Kaspersky (webapp76592.zip)
md5 DE5AF16A3757EF700B01DC34D67079AE High Kaspersky (webapp76531.zip)
md5 BE086789568441D0D7E4679AEE51F566 High Kaspersky (challenges-17831.zip)
md5 E259C5EDF158AAC4CFE14F77DDD0B196 High Kaspersky (challenges-17832.zip)
md5 291AC3ABE73C5158E59A437B75D5F0AA High Kaspersky (Project-1802.zip)
md5 0962F56D7EC69F4F2A0162DCBE22116B High Kaspersky (Case-34234.zip)
md5 795E053A990A1569FFDCB57F48F6D085 High Kaspersky (RankChallenge-react-6uJSX3-main.zip)
domain oracle-challenge.s3[.]us-east-1.amazonaws[.]com High Kaspersky (S3 lure hosting)
domain naturalapplication.azurewebsites[.]net High Kaspersky (NodeRabbit sample 1 C2)
domain retaildemo.azurewebsites[.]net High Kaspersky (NodeRabbit sample 1 C2)
domain tubitak.azurewebsites[.]net High Kaspersky (NodeRabbit sample 1 C2)
domain rgbteller.azurewebsites[.]net High Kaspersky (NodeRabbit sample 2 C2)
domain wslwebui.azurewebsites[.]net High Kaspersky (NodeRabbit sample 2 C2)
domain plugplay.azurewebsites[.]net High Kaspersky (NodeRabbit sample 2 C2)
domain crossdwm.azurewebsites[.]net High Kaspersky (NodeRabbit sample 3 C2)
domain wdisystem.azurewebsites[.]net High Kaspersky (NodeRabbit sample 3 C2)
domain wslmenus.azurewebsites[.]net High Kaspersky (NodeRabbit sample 3 C2)
domain dnshnsdev.azurewebsites[.]net High Kaspersky (NodeRabbit sample 4 C2)
domain hpjumpsrv.azurewebsites[.]net High Kaspersky (NodeRabbit sample 4 C2)
domain storview.azurewebsites[.]net High Kaspersky (NodeRabbit sample 4 C2)
domain healthcomfsdpower[.]com High Kaspersky (NodeRabbit sample 5 C2)
domain visitfinancedentists[.]com High Kaspersky (NodeRabbit sample 5 C2)
domain kyrasey-f8hfexa5cqamh7fk.westeurope-01.azurewebsites[.]net High Kaspersky (NodeRabbit sample 5 C2)
domain greenyjsgfd.azurewebsites[.]net High Kaspersky (NodeRabbit sample 6 C2)
domain helptellerbls.azurewebsites[.]net High Kaspersky (NodeRabbit sample 6 C2)
domain timedrv.azurewebsites[.]net High Kaspersky (NodeRabbit sample 6 C2)
domain userwellgtfs.azurewebsites[.]net High Kaspersky (NodeRabbit sample 6 C2)
domain hecowime-aqdphyd4bbdef6es.westeurope-01.azurewebsites[.]net High Kaspersky (NodeRabbit sample 7 C2)
domain msmanagementgrp[.]com High Kaspersky (NodeRabbit sample 7 C2)
domain msmanagementgrpmedia[.]com High Kaspersky (NodeRabbit sample 7 C2)
domain lifespotify[.]com High Kaspersky (PollCat OTP validation / C2)
domain gamebarapp.azurewebsites[.]net High Kaspersky (PollCat C2)
domain gamebarappinformation.azurewebsites[.]net High Kaspersky (PollCat C2)
domain sahi-finance[.]com High Kaspersky (PollCat C2)
domain healthful-hub[.]com Medium Kaspersky (attributed infrastructure, 2026-07-03)
domain neumedicahealthcare[.]com Medium Kaspersky (attributed infrastructure, 2026-07-03)
domain optimumhealthcredit[.]com Medium Kaspersky (attributed infrastructure, 2026-07-03)
domain healthfullyrecipes[.]com Medium Kaspersky (attributed infrastructure, 2026-06-30)
domain refreshhealthandwellness[.]com Medium Kaspersky (attributed infrastructure, 2026-06-09)
domain healthvitalitycare[.]com Medium Kaspersky (attributed infrastructure, 2026-05-18)
domain aceofspadesmanagement[.]com Medium Kaspersky (attributed infrastructure, 2026-05-18)
domain glmediaagency[.]com Medium Kaspersky (attributed infrastructure, 2026-05-18)
domain digimediaskill[.]com Medium Kaspersky (attributed infrastructure, 2026-05-18)
domain healthyweightplan[.]com Medium Kaspersky (attributed infrastructure, 2026-05-18)
domain mens-health-online[.]com Medium Kaspersky (attributed infrastructure, 2026-05-15)
url hxxps://oracle-challenge[.]s3[.]us-east-1[.]amazonaws[.]com/Front-Technical-Challenge.zip High Kaspersky (lure download)
url hxxps://lifespotify[.]com/api/users/b879746e-fed9-4211-a6da-4d8223681267/otp/validate High Kaspersky (PollCat OTP forwarding)

Note on the S3 lure URL: the source presents the bucket hostname already defanged (oracle-challenge.s3[.]us-east-1.amazonaws[.]com); we reproduce it as given.

md5  1EA83E4E4592B01E4ACAB63EB867BEE5
md5  CBAAF0900A13F28E380F49ADECEC932C
md5  366515822D5AC1CC500711EF57A2E32E
md5  CF449F1992C2819E62AC44A0B06AC2E7
md5  E95A4366686E3F786EA3C056FAB5B0DA
md5  DE5AF16A3757EF700B01DC34D67079AE
md5  BE086789568441D0D7E4679AEE51F566
md5  E259C5EDF158AAC4CFE14F77DDD0B196
md5  291AC3ABE73C5158E59A437B75D5F0AA
md5  0962F56D7EC69F4F2A0162DCBE22116B
md5  795E053A990A1569FFDCB57F48F6D085
domain  oracle-challenge[.]s3[.]us-east-1[.]amazonaws[.]com
domain  naturalapplication[.]azurewebsites[.]net
domain  retaildemo[.]azurewebsites[.]net
domain  tubitak[.]azurewebsites[.]net
domain  rgbteller[.]azurewebsites[.]net
domain  wslwebui[.]azurewebsites[.]net
domain  plugplay[.]azurewebsites[.]net
domain  crossdwm[.]azurewebsites[.]net
domain  wdisystem[.]azurewebsites[.]net
domain  wslmenus[.]azurewebsites[.]net
domain  dnshnsdev[.]azurewebsites[.]net
domain  hpjumpsrv[.]azurewebsites[.]net
domain  storview[.]azurewebsites[.]net
domain  healthcomfsdpower[.]com
domain  visitfinancedentists[.]com
domain  kyrasey-f8hfexa5cqamh7fk[.]westeurope-01[.]azurewebsites[.]net
domain  greenyjsgfd[.]azurewebsites[.]net
domain  helptellerbls[.]azurewebsites[.]net
domain  timedrv[.]azurewebsites[.]net
domain  userwellgtfs[.]azurewebsites[.]net
domain  hecowime-aqdphyd4bbdef6es[.]westeurope-01[.]azurewebsites[.]net
domain  msmanagementgrp[.]com
domain  msmanagementgrpmedia[.]com
domain  lifespotify[.]com
domain  gamebarapp[.]azurewebsites[.]net
domain  gamebarappinformation[.]azurewebsites[.]net
domain  sahi-finance[.]com
domain  healthful-hub[.]com
domain  neumedicahealthcare[.]com
domain  optimumhealthcredit[.]com
domain  healthfullyrecipes[.]com
domain  refreshhealthandwellness[.]com
domain  healthvitalitycare[.]com
domain  aceofspadesmanagement[.]com
domain  glmediaagency[.]com
domain  digimediaskill[.]com
domain  healthyweightplan[.]com
domain  mens-health-online[.]com
url  hxxps://oracle-challenge[.]s3[.]us-east-1[.]amazonaws[.]com/Front-Technical-Challenge.zip
url  hxxps://lifespotify[.]com/api/users/b879746e-fed9-4211-a6da-4d8223681267/otp/validate

Behavioural indicators (not machine-pivotable atomics; excluded from the block above):

behaviour where to observe confidence
Loopback TCP listener on 127.0.0.1:48739 (NodeRabbit V1) or host-derived port 41984–46983 (V2) EDR process/network telemetry on developer endpoints High (single source)
Node.js process making POST requests to /api/rabbit/checkin, /api/rabbit/task, /api/rabbit/result, or /sdk/v2/ready, /sdk/v2/config, /sdk/v2/events Egress proxy / HTTP inspection logs High (single source)
POST to /beacon followed by HTTP 400 treated as success, then GET /gate/fetch?token= Egress proxy / HTTP inspection logs High (single source)
node.exe/Node child process invoking curl.exe --proxy-anyauth --proxy-user EDR process-tree telemetry High (single source)
Creation of scheduled task IntelDriverSupportUpdate (daily 10:00) or NetSync_<username> (daily 09:00) Windows event logs / EDR High (single source)
@reboot and daily 09:00/10:00 cron entries invoking .js files under ~/.config, ~/.local/share or ~/.node_packages Linux/macOS endpoint auditing High (single source)
Git hook files .git/hooks/post-merge / .git/hooks/post-checkout containing marker # shepherd-persist; Developer workstations, CI runners High (single source)
VS Code extension "GitHub Copilot Helper" with activation event onStartupFinished VS Code extension directories, state.vscdb High (single source)
wscript.exe launching launcher.vbs which invokes wsl.exe via a daily 10:00 scheduled task Windows telemetry on WSL-enabled hosts High (single source)

6. Detection

The sources provide distinctive strings, file paths, registry keys, scheduled-task names and C2 URI paths that are artefacts of the threat itself, enabling the rules below.

rule NodeRabbit_PollCat_MirageKitten_Implant_Strings
{
    meta:
        author = "Adverse Trace"
        date = "2026-09-01"
        reference = "https://securelist.com/mirage-kitten-new-backdoors-noderabbit-pollcat/121244/"
        description = "Detects NodeRabbit and PollCat RAT components by C2 endpoint paths, persistence artefact names and lure-specific strings observed in the Mirage Kitten coding-challenge campaign"
    strings:
        $ep_rabbit_checkin = "/api/rabbit/checkin"
        $ep_rabbit_task = "/api/rabbit/task"
        $ep_rabbit_result = "/api/rabbit/result"
        $ep_sdk_ready = "/sdk/v2/ready"
        $ep_sdk_config = "/sdk/v2/config"
        $ep_sdk_events = "/sdk/v2/events"
        $ep_beacon = "/beacon"
        $ep_gate_hello = "/gate/hello"
        $ep_gate_fetch = "/gate/fetch"
        $ep_gate_submit = "/gate/submit"
        $ep_vault_push = "/vault/push/"
        $ep_sysdetails = "/api/system-details/result"
        $cmd_sysinfo = "sys:info"
        $cmd_procstart = "proc:start"
        $cmd_scriptexec = "script:exec"
        $cmd_agent_servers = "agent:servers"
        $cmd_outlook = "outlook:emails"
        $cmd_persist_vscode = "persist:vscode"
        $cmd_project_inject = "persist:project:inject"
        $shepherd_marker = "# shepherd-persist;"
        $task_intel = "IntelDriverSupportUpdate"
        $task_netsync = "NetSync_"
        $runkey_edge = "MicrosoftEdgeUpdate"
        $file_msedge = "msedge_update.js"
        $file_idriver = "idriver_support.js"
        $file_requireobj = "requireObjects.js"
        $file_requireauth = "requireAuth.js"
        $file_svjson = ".sv.json"
        $file_launchervbs = "launcher.vbs"
        $pkg_colorized = "colorized_terminal"
        $pkg_prettylog = "pretty-log"
        $ext_copilot = "GitHub Copilot Helper"
        $ext_desc = "AI coding assistant helper service"
        $activation = "onStartupFinished"
        $plist_edge = "com.microsoft.edgeupdate.plist"
        $plist_intel = "com.intel.dsa.helper"
        $plist_harsh = "com.harsh.requireobject.plist"
        $json_d_field = "\"_r\""
        $json_t_field = "\"_t\""
    condition:
        uint16(0) == 0x4d5a or filesize < 5MB
        )
        and 5 of ($ep_*, $cmd_*, $pkg_*, $ext_*, $task_*, $file_*, $plist_*, $shepherd_marker, $runkey_edge, $activation, $json_*)
}

Note: the $ep_*, $cmd_*, $pkg_* and $json_* strings are protocol/behaviour artefacts of the malware's own code and C2 traffic; the $ext_*, $task_*, $file_*, $plist_*, $runkey_edge and $shepherd_marker strings are the exact persistence artefact names the malware creates. The condition requires five distinct artefact families to fire, limiting false positives on benign Node.js projects.

title: NodeRabbit/PollCat Persistence Artefacts - Mirage Kitten Coding Challenge Campaign
id: 7c2f1a34-9e58-4d21-b0aa-1f5e8c93d702
status: experimental
description: Detects scheduled-task creation, Run-key persistence and proxy-auth child processes used by NodeRabbit and PollCat RATs delivered via trojanized coding challenge archives (Kaspersky GReAT, 2026-09-01).
references:

    - https://securelist.com/mirage-kitten-new-backdoors-noderabbit-pollcat/121244/
author: Adverse Trace
date: 2026-09-01
tags:

    - attack.persistence
    - attack.t1053.005
    - attack.t1547.001
logsource:
    product: windows
    service: scheduled-task or process_creation
detection:
    selection_task_name:
        EventID: 4698
        TaskName:

            - 'IntelDriverSupportUpdate'
            - 'NetSync_*'
    selection_task_command:
        EventID: 4698

        |:

            - '*idriver_support.js*'
            - '*requireObject.js*'
            - '*msedge_update.js*'
            - '*launcher.vbs*'
    selection_run_key:
        EventID: 4657
        TargetObject|contains: '\Software\Microsoft\Windows\CurrentVersion\Run\MicrosoftEdgeUpdate'
    selection_curl_proxyauth:
        ParentImage|endswith: '\node.exe'
        Image|endswith: '\curl.exe'
        CommandLine|contains|all:

            - '--proxy-anyauth'
            - '--proxy-user'
    selection_wsl_relaunch:
        Image|endswith: '\wscript.exe'
        CommandLine|contains: 'launcher.vbs'
    condition: 1 of selection_*
falsepositives:

    - Legitimate Intel Driver & Support Assistant tasks (verify task action points to IntelDSA.exe with a .js argument before escalation)
    - Developer tooling invoking curl with proxy flags (verify parent is node.exe and flags match exactly)
level: high

7. Sources

  • Kaspersky Securelist (GReAT) — "Mirage Kitten switches to Node.js and JavaScript malware" — https://securelist.com/mirage-kitten-new-backdoors-noderabbit-pollcat/121244/ — 2026-09-01
  • Kaspersky Securelist (GReAT) — "Mirage Kitten targets Middle East and Africa region with new malware" (related toolset: NightLedger, ArcBridge, BridgeHead; MiniFast/Retrograde overlap) — https://securelist.com/mirage-kitten-new-tools/120811/ — (corpus context)
  • The Record (Recorded Future) — "Iranian cyber spies target aviation, fintech developers with new malware" — https://therecord.media/iranian-cyber-spies-target-aviation-fintech-new-malware — (corroborates discovery geography only)

8. Adverse Trace position

This is a capable, well-engineered espionage campaign aimed squarely at the developer population of FinTech, aviation and aerospace organisations in EMEA-adjacent regions, and its delivery vector — fake recruiter contact pressuring execution of a "coding challenge" — is directly transferable to any EMEA financial services client with engineers active on LinkedIn or job platforms; the absence of any CVE means patching is irrelevant and exposure is a function of people, process and endpoint telemetry on non-Windows platforms, which is where most financial-sector detection coverage is thinnest. Severity: high for clients with software engineering staff in or doing business with the Middle East and Africa; moderate elsewhere. Attribution to Mirage Kitten is unconfirmed in our verified reference data (no MITRE ATT&CK profile) and the technical dataset is single-sourced from Kaspersky GReAT — treat the IOC set as high-value but verify before enforcement action such as wholesale azurewebsites.net blocking. We will continue tracking this actor's infrastructure, monitor for a second Kaspersky instalment covering PollCat in depth (the report states further analysis is forthcoming), and update clients if the additional IoCs referenced as available through Kaspersky's commercial reporting surface or if independent corroboration of the attribution emerges.


Read the original source →

Published via PulseTrace — Adverse Trace threat intelligence.

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