TL博士
单个 npm 发布者, deadcode09284814,曾针对合法域名发起过拼写错误抢注活动。 axios 和 chalk-template 自 2026 年 5 月中旬以来的包裹。
该攻击活动最初表现为传统的凭证和钱包窃取,将数据泄露到…… Serveo HTTPS 隧道.
On 2026-05-17, axois-utils:1.0.9操作员完全替换了有效载荷:相同的三重安装钩子脚手架、相同的发布者、相同的软件包名称。
但现在该安装脚本已成为跨平台 DDoS 僵尸网络的一员。
有效载荷指向一个 localhost.run 隧道并接受洪水攻击命令,将受感染的环境变成能够进行 DDoS 攻击的僵尸网络的一部分。
运营商甚至还发货了 C2 服务器二进制文件 tarball 内部显示,从凭证窃取到活跃的僵尸网络基础设施,攻击手段明显升级。
两个软件包,注册表中仍有四个活跃版本,现在有一个操作员正在并行运行这两个模块。
严重程度:高。
共享脚手架
这两个软件包的每个已发布版本都声明了相同的三个生命周期。 hooks in 的package.json:
"scripts": { "preinstall": "node <payload>.js", "install": "node <payload>.js", "postinstall": "node <payload>.js" } 在所有三个类别下列出有效载荷 hooks 反应过度了—— 安装后 单独运行会在默认模式下运行。 npm安装选择至关重要: npm install --ignore-scripts 跳过脚本,但几个常见的流程(CI 缓存恢复会重新运行生命周期) hooks 有选择地,或者只进行审计的开发人员 安装后对攻击者而言,三重冗余声明是最安全的选择。
粉笔模板 增加了第二种机制:它声明 axois-utils:^1.0.7 作为运行时环境 依赖安装 typosquatted 粉笔模板 因此,它也会拉取同级的 typosquat 包,两个包都会运行。这两个包是协同工作的,而不是独立的。
A阶段——凭证/钱包窃取器(2026年05月15日至今)
A阶段是原始有效载荷。装载机是一个短的 postinstall.js 这指向一个Serveo HTTPS反向隧道:
// chalk-tempalte/postinstall.js:11-13 const C2_HOST = "f04a273bd84c0622-80-200-28-28.serveousercontent.com"; const C2_PORT = 443; const C2_PATH = '/collect'; Serveo 子域名对目标 IP 进行编码(80.200.28.28直接在主机名中——这是该服务的一个可识别的约定。运营商会在不同版本之间轮换随机子域名前缀,以规避简单的域名黑名单,但底层 IP 地址始终保持不变。粉笔模板:1.0.14 用过的 8a3e818ea8f11186-80-200-28-28…; 1.0.16 / 1.0.19 / 1.0.20 使用 f04a273bd84c0622-….)
postinstall.js 放手 phantom.js一个包含 7,667 行代码的捆绑式“收集器”模块。 phantom.js 陪同主人散步:
SSH 私钥(~/.ssh/*) |
.npmrc 内容和任何 npm_* 环境令牌 |
| AWS、GCP 和 Azure 凭证文件 |
GitHub 个人访问令牌正则表达式(ghp_*, gho_*, ghu_*, ghs_*) |
| 适用于比特币、Exodus、Electrum、门罗币、莱特币、狗狗币、Zcash、达世币的加密钱包文件 |
递归 .env* 走过去 ~/projects, ~/dev, ~/code, ~/workspace以及安装 cwd |
壳牌公司的历史及全部内容 process.env |
该数据包通过 POST 方式发送到 Serveo 隧道。 / 搜集没有混淆,没有反虚拟机逻辑,没有分阶段部署——运营商押注的是容量和速度。
B阶段——PhantomBot DDoS攻击招募(2026年05月17日,仅限axois-utils:1.0.9版本)
B阶段将phantom.js和postinstall.js替换为一个名为distribube.js的单个文件(拼写错误是操作员的笔误)。package.json中的三重钩子结构保持不变;包的名称、作用域和版本号递增模式也保持不变。从表面上看,axois-utils:1.0.9似乎是1.0.6的一个小版本更新。但实际上,它属于不同的恶意软件家族。
distribube.js 首先是一个配置块,用于指定运营商自身的品牌名称:
// axois-utils-1.0.9/distrube.js:11-15 |
// Use your localhost.run HTTPS URL (the tunnel handles HTTP internally) |
const C2_HOST = 'b94b6bcfa27554.lhr.life'; // Your localhost.run tunnel |
const C2_PORT = 443; // HTTPS port - tunnel handles SSL |
const BOT_ID = `${os.hostname()}_${Date.now()}_${crypto.randomBytes(4).toString('hex')}`; |
这些注释是针对未来运行该工具包的操作人员的(“使用您的 localhost.run HTTPS URL”)。这一点,再加上机器人客户端附带的内容,足以表明这不仅仅是一个受害者有效载荷——它就是整个工具包。
流程:
- 坚持 首先运行。该脚本会根据不同的操作系统以三种不同的方式安装自身(注册表)。 运行 + 启动文件夹 + 任务 在 Windows 系统上;crontab + phantom-bot.service systemd 单元 + 的.bashrc/.zshrc 追加 + 在/etc/rc.local 在 Linux 系统上; LaunchAgent com.phantom.bot.plist 在 macOS 上)。持久化服务名称和 LaunchAgent 标签都是 幻影机器人 / com.phantom.bot这也是此次竞选名称的由来。
- 系统信息泄露 仅运行一次——向 b94b6bcfa27554.lhr.life:443/collect 发送一次性指纹 POST 请求,请求中包含主机名、平台、架构、用户名、CPU/内存、网络接口、process.env 文件、当前工作目录、用户主目录、节点版本和公网 IP 地址。这比 A 阶段的攻击性要低得多:不使用 SSH,不使用钱包,也不进行 .env 文件递归修改。该机器人的任务是注册,而不是窃取数据。
- 心跳循环 每 30 秒向 b94b6bcfa27554.lhr.life:443/ 发起一个 HTTPS POST 请求。User-Agent 为 PhantomBot/1.0。TLS 验证已显式禁用(rejectUnauthorized: false)。C2 响应被解析为 JSON 格式的 {type, target, port, duration, threads, method} 并进行分发。
- 洪水兵工厂 它与六条指令相连:
| 命令类型 | 模块 | 笔记 |
|---|---|---|
| 平 | 实时回复 | 机器人进行自我识别 |
| HTTP | HTTP泛洪 | 7 层请求泛洪 |
| HTTPS | HTTPS 洪水攻击 | 与 http 相同,TLS 封装 |
| TCP | TCP泛洪 | 65 KB 随机有效载荷垃圾邮件 |
| UDP | UDP泛洪 | 65,507 字节的 UDP 数据包 |
| 快 | HTTP/2 快速重置拒绝服务攻击 | 2023 年 CVE-2023-44487 技术 |
所有五个洪水模块都采用 目标, 端口, 为期和 线程 论点——该机器人是一个通用的雇佣攻击机器人,并非针对任何特定受害者。运营者的受害者列表存储在C2服务器上,而不是软件包中。
新增内容——已发布的 C2 二进制文件
A阶段是一个常见的模式:凭证窃取、安装钩子、厂商隧道C2服务器。B阶段是 还 这是一个熟悉的形态——DDoS僵尸网络多年来一直是恶意npm包的常见组成部分。不同寻常的是,攻击者竟然发布了…… 服务器端 npm tarball 中的工具包:
- c2 — 一个 4 兆字节的已编译 Go ELF 二进制文件
- c2.go — 该二进制文件的 426 行 Go 源代码
这两个文件都没有被任何安装钩子调用。它们不属于受害者的有效载荷。它们像文档文件一样位于软件包目录中。最合理的解释是,攻击者在未整理文件列表的情况下将其开发工作树推送到了 npm——这是一个严重的运维疏忽——结果推送的却是完整的双向工具包:受害者运行的客户端和攻击者运行的服务器。
故事的这一部分恰恰证明了“交钥匙僵尸网络工具包”的说法是合理的。任何下载过该工具包的人都可能遇到这种情况。 axois-utils:1.0.9 在下架服务器之前,他们不仅掌握了受害者样本,还掌握了正在运行的 C2 服务器。
关键点,用一句话概括。
同样的发行商,同样的软件包名称,同样的三钩式框架,同样的“幽灵”品牌——但 有效载荷一夜之间改变了盈利模式。从“收集可转售的秘密”到“租用可租赁的洪水攻击能力”。防御者应该关注的安装时战术、技术和程序 (TTP) 在两个阶段几乎相同;基于签名的防御措施,分别针对 A 阶段的钱包路径字符串或 phantom.js的 7,667 线集线器将完全错过 B 相。
| 日期(UTC) | 创建 |
|---|---|
| 2026-05-15 | 首次发表: axois-utils:1.0.4 (局域网测试版本,开发环境) 192.168.129.19) |
| 2026-05-15 | axois-utils:1.0.6 已发布——A阶段C2已切换至 80.200.28.28 通过 Serveo 隧道;来源评论 // Change to '80.200.28.28' for public 确认开发环境到生产环境的切换 |
| 2026-05-16 | chalk-tempalte:1.0.14 和 1.0.16 已发布 — 链式装载机声明 axois-utils:^1.0.7 作为运行时依赖项;Serveo 子域名已轮换 |
| 2026-05-16 | 在例行 npm 扫描中发现 A 阶段攻击活动;已确认恶意行为。 |
| 2026-05-17 | axois-utils:1.0.9 已发布 — 有效载荷转移:PhantomBot DDoS 通过 localhost.run 隧道招募;运营商端 c2 二进制和 c2.go 源代码包含在压缩包中 |
| 2026-05-17 | chalk-tempalte:1.0.19 和 1.0.20 已发布——仍处于A阶段(窃取器);运营商目前两个模块并行运行。 |
| 2026-05-17 | 在常规扫描中发现B期病变;判决适用于所有情况 2026-05-17 版本 |
| (进行中) | 待提交下架报告;截至发稿时,所有四个已发布的软件包仍可在注册表中找到。 |
妥协指标
| 生态系统 | 小包装 | 选项 |
|---|---|---|
| NPM | axois-utils (axios 的拼写错误) | 1.0.4, 1.0.6, 1.0.9 |
| NPM | chalk-tempalte (粉笔模板的拼写错误) | 1.0.14, 1.0.16, 1.0.19, 1.0.20 |
作者身份
| 领域 | 价值 |
|---|---|
| npm 发布者 | deadcode09284814 |
| 出版商电子邮件 | phantomdeadcode@tutamail.com |
| SCM 验证 | 没有 |
指挥与控制
| 相 | 端点 | 运输 |
|---|---|---|
| A | f04a273bd84c0622-80-200-28-28.serveousercontent.com:443/collect | Serveo HTTPS 隧道 |
| A | 8a3e818ea8f11186-80-200-28-28.serveousercontent.com:443/collect | Serveo HTTPS隧道(早期版本) |
| A | 80.200.28.28:443/collect | 底层VPS端点 |
| B | b94b6bcfa27554.lhr.life:443/ | localhost.run HTTPS 反向隧道 |
文件摘要(SHA-256)
| 文件 | SHA-256 | 笔记 |
|---|---|---|
c2 (GO ELF,4 MB) | 165fa92d237fd017c227d00da06ab788212a62be94bf61e95df2d22d00377ef2 | 运营商端 C2 服务器,内置于…… axois-utils:1.0.9 |
c2.go (426行) | 7d0ae79fdb1e9968f3323a3712b624643a782ba3efb2cf3a2cb9c4c5513cea30 | C2 二进制文件的 Go 源代码 |
distrube.js | 308b15c023088a7188dea4ef609010ac2493eb4c365b103053d7621a9ca5b935 | B阶段机器人客户端 |
phantom.js (chalk-tempalte:1.0.19) | 9e380ec88d3ccf3929e1a104e3b868d4d7b59ca189a8a431a54e9f3357dfdd81 | A阶段凭证/钱包收集器 |
phantom.js (chalk-tempalte:1.0.20) | d1c9e3f296ee9f7d5032f73f9c504cede50334bc14c394055fd5cb9c3a6e08b3 | A阶段收集器(1.0.20版本) |
postinstall.js (chalk-tempalte:1.0.19 = 1.0.20) | ffba9bdd6793edd5b38e12900252c1813a693f59c25af51c3b658cf3f27b6162 | A阶段加载器,两个版本字节完全相同 |
归因与动机
我们会追踪此次活动。 幻影机器人采用了运营商自身的品牌标识 用户代理:PhantomBot/1.0 心跳标题, phantom-bot.service systemd 单元, com.phantom.bot LaunchAgent 标签,以及 phantomdeadcode@ 邮箱地址。该操作员在至少四个工件中都使用了相同的名称。
信号目录
- 出版商 - 死码09284814 在 npm 上。单账号,Tutamail 一次性邮箱,无 SCM 已核实。除本次活动外,无其他出版记录。
- 品牌重复使用 — “phantom”出现在出版商电子邮件中,也出现在A阶段收集器文件名中(phantom.js),在 B 阶段持久性服务名称中(phantom-bot.service),在 LaunchAgent 标签中(com.phantom.bot),以及在机器人 User-Agent 中(PhantomBot/1.0).
- 基础设施 — 单个 VPS 80.200.28.28 A阶段通过Serveo子域轮换进行;B阶段转移到 localhost.run 反向隧道(b94b6bcfa27554.lhr.life)。这两个供应商的服务都是免费的,并且只需要运营商端的出站 SSH,符合低预算、低运营安全设置的要求。
- 代码风格 — 全程使用纯 JavaScript;无混淆、无字符串编码、无反虚拟机检查。变量名具有描述性(窃取系统信息, 执行命令, httpFlood)。评论中 distribube.js 直接向未来的操作员发出指令(“使用您的 localhost.run HTTPS URL”),这表明该文件旨在作为工具包重新分发,而不是供单个攻击者使用。
- OpSec 滑倒 — B阶段压缩包同时包含机器人客户端和运营商端的C2服务器(c2 ELF + c2.go (来源)。这与操作员在未审核文件列表的情况下将工作目录推送到 npm 的情况一致。要么是操作员经验不足,要么是工具包存在问题。 意思 将公开分发,C2 二进制文件是产品的一部分。
- 自我确认 - axois-utils:1.0.4 包含源评论 // 改为 '80.200.28.28' 以公开访问 第 12 行确认了开发/测试/生产阶段的进展,而运营商通常会否认这一点。
激励卡片
A阶段的有效载荷是直接的金融盗窃:凭证、云密钥、GitHub代币和加密钱包都有流动性强的转售市场。B阶段也涉及金融,但方式不同:DDoS攻击服务按分钟出租流量容量,而像这里提供的这种僵尸程序正是这些服务运行的资源。30秒的心跳,通用的 目标/端口/为期 命令模式,以及五种协议的泛洪攻击武器库是…… standard 启动器操作员的产品。
两个模块并行运行—— 粉笔模板:1.0.19 和 1.0.20 继续运送窃贼 axois-utils:1.0.9 机器人上线——这表明运营商是在对冲收入来源,而不是放弃A阶段。这一转变是…… 增加,而不是替代品。
我们没有声称
我们尚未能确认其背后的真实身份。 死码09284814 我们并未将此攻击活动归咎于任何已知的威胁行为者、组织或国家。“幽灵”品牌在不同攻击物上的一致性足以表明其出自同一攻击者之手,但C2二进制文件以工具包的形式分发,也使得未来来自其他攻击平台的软件包有可能重复使用相同的代码。
影响、趋势及防守者应采取的措施
冲击
合法的深蹲目标 爱可信 和 粉笔模板 在 JavaScript 生态系统中被广泛依赖; 爱可信 仅此一项就跻身下载量排名前三十的 npm 包之列。这些拼写错误的包名与真正的包名只差一个按键而已(轴 ↔ 爱可信, 模板 ↔ 模板),而且两者都是语言学上合理的拼写错误。
我们无法在下架前获得恶意版本的可靠下载统计数据——npm 在软件包取消发布后不会保留每个版本的下载次数,而且 npms.io在这种规模下,-style代理会产生大量噪声。任何锁定文件解析到名为“ 轴子工具 or 粉笔模板 来自出版商 死码09284814 应视为已泄露:轮换所有存在的凭证 进程.env 在受影响的主机上,审核每个操作系统的持久性向量(参见下文“防御者应该做什么”),并移除依赖项。
新兴模式
这次事件体现了我们在最近几起 npm 事件中看到的转变: 安装钩脚手架是耐用资产。有效载荷可互换同一个出版商,同一个软件包,同一个 预安装 / 安装 / 安装后 三重奏,甚至连版本更新的节奏都一样——这是两者之间唯一的变化。 axois-utils:1.0.6 和 axois-utils:1.0.9 文件是 hooks 运行。基于签名的检测,以 A 阶段有效载荷(钱包路径字符串)为密钥, phantom.jsServeo C2 主机的 7,667 行收集器会标记出前三个版本,并完全错过 B 阶段。
在我们追踪的其他 2026 年攻击活动中也发现了同样的模式:一个拥有稳定攻击框架的单一攻击者,不断变换攻击手段,包括窃取凭证、使用作弊客户端、利用 Telegram 机器人窃取数据,以及现在的 DDoS 攻击招募。依赖有效载荷签名的防御者将在每次攻击活动的第二轮中持续败北。
由此可得出推论: 安装时 TTP 是更好的信号三重安装钩子声明,导入的安装脚本 HTTPS or 子进程安装写入用户启动文件夹的脚本,以及安装解析免费反向隧道服务(Serveo)上主机名的脚本。 localhost.run(例如 ngrok、cloudflared)在合法软件包中很少见,但在恶意软件包中很常见。
防守队员应该怎么做
- 锁定文件审计. 搜索所有 包lock.json / yarn.lock / pnpm-lock.yaml 在您的组织中查找确切的字符串 轴子工具 和 粉笔模板把任何比赛都视为一种妥协。
- 轮换秘密 在受影响的主机上。 A阶段批量收集SSH、云平台、GitHub、npm和钱包凭证。假设所有凭证都已存在。 进程.env, 〜/ .ssh, ~/.aws, 〜/.npmrc, 〜/ .config或任何 .env* 受影响主机上的文件已暴露。
- 移除持久性(阶段 B)。 在 Windows 系统中,删除 HKCU\Software\Microsoft\Windows\CurrentVersion\Run\SystemUpdate, 去掉 %APPDATA%\Microsoft\Windows\开始菜单\程序\启动\系统更新.bat和 schtasks /delete /tn SystemUpdate /f在Linux系统上, crontab -e命令 并删除 @重启节点…, systemctl --user disable --now phantom-bot.service 然后删除 ~/.config/systemd/user/phantom-bot.service擦洗 的.bashrc / .zshrc / 在/etc/rc.local在 macOS 上, launchctl unload ~/Library/LaunchAgents/com.phantom.bot.plist 然后删除plist文件。
- 屏蔽C2主机。 将 IOC 表中的四个 C2 端点添加到您的出口阻止列表中。 *.serveousercontent.com 和 *.lhr.life 如果您的环境对反向隧道服务没有正当用途,则可以完全阻止其运行。
- 通过安装时 TTP 进行搜索不是有效载荷。 库存锁定文件条目 的package.json 声明 预安装, 安装和 安装后 所有链接都指向同一个脚本。请交叉检查软件包的发布时间和发布者验证状态。这种模式在合法软件包中很少见,也是 PhantomBot 重复使用的最可靠信号。
- 对 C2 二进制文件进行审计。 任何下载者 axois-utils:1.0.9 拥有运营商的 C2 服务器(c2 ELF,sha256 165fa92d…)位于磁盘上。扫描缓存和 CI 工件存储。该二进制文件本身处于休眠状态,但它在工作站上的存在明确证明该软件包已安装。
关闭线
同一个攻击者、同一个软件包、同一个安装钩子,在 48 小时内就能传播完全不同的威胁。关注的是攻击的底层架构,而不是最终的攻击载荷。




