目录
简短摘要
common-tg-service 是一个 npm 包,标榜为"NestJS 应用的通用 Telegram 服务"。common-tg-service 内部编译后的代码是一个 Telegram 账户接管框架。所有 502 个已发布版本(1.0.1 到 1.3.207)均为恶意。 该包在公共 npm 注册表上有约 28,000 次周下载量。
同一发布者发布的第二个包 ams-ssk 是服务端运行时,common-tg-service 会回调该包。ams-ssk 本身不会攻击安装它的主机。它只是运送运营者的基础设施代码:相同的 common-tg-service npm 发布者身份、相同的 common-tg-service API 接口、相同的复制粘贴的 NestJS 模板 README、相同的伪装模式。配套的客户端和服务端。
影响:
- 在通过该服务的每个 Telegram 账户上设置硬编码的 2FA 密码(
Ajtdmwajt1@),并使用运营者的 Gmail 邮箱(paidgirl555@gmail.com)作为恢复地址。 - 读取运营者的 IMAP 邮箱以自动提交 Telegram 的 2FA 确认邮件。受害者看不到任何提示。
- 撤销所有与运营者会话不匹配的设备授权,将合法所有者踢出自己的账户。
- 将 Telegram 聊天
777000的每个 OTP 登录码连同受害者的电话号码一起转发到运营者控制的机器人频道。 - 对每个托管账户运行 SRP 检查循环,并将任何用户已轮换 2FA 的账户标记为
rotated_2fa。 - 使用提交的明文凭证和预烘焙的会话 cookie 从
npoint.io拉取运行时配置。运营者可以更改所有已部署实例的行为而无需重新发布。 - 将被阻止的 HTTP 请求通过
helper-thge.onrender.com进行路由,作为归属混淆中继。
入侵指标(活动级别):
IoC:两个包的活动基础设施
| # | 类型 | 指标 | 来源 | 备注 |
|---|---|---|---|---|
| 1 | npm 发布者 | shetty123 < [email protected] > | 两个包均涉及 | 两个包的维护者 |
| 2 | 显示作者 | Mad_man | ams-ssk | 用于 repository.url;ams-ssk 的声明作者 |
| 3 | 域名 | paidgirl.site | common-tg-service | 运营者品牌前端 |
| 4 | 域名 | cms.paidgirl.site | 两个包均涉及 | AMS / CMS 部署 + IP 管理 API |
| 5 | 域名 | promoteClients2.glitch.me | ams-ssk | Glitch 托管的 AMS / promote-clients 部署(新发现) |
| 6 | 域名 | helper-thge.onrender.com | common-tg-service | WAF 绕过 / HTTP 中继 |
| 7 | 域名 | www.npoint.io | common-tg-service | 远程 JSON 配置存储;账户 [email protected] |
| 8 | 域名 | imap.gmail.com | common-tg-service | 2FA 确认码邮箱;账户 [email protected] |
| 9 | 域名 | zomcall.netlify.app | common-tg-service | 运营者控制的前端 |
| 10 | 域名 | tgchats.netlify.app | common-tg-service | 运营者控制的前端 |
| 11 | 域名 | tg-chats.netlify.app | common-tg-service | 运营者控制的前端 |
| 12 | 域名 | report-upi.netlify.app | common-tg-service | 运营者控制的前端(UPI = 印度支付) |
| 13 | IP | 31.97.59.2 | common-tg-service | 运营者 VPS IP(已白名单) |
| 14 | IP | 148.230.84.50 | common-tg-service | 运营者 VPS IP |
| 15 | IP | 13.228.225.19 | common-tg-service | 运营者 VPS IP(AWS 新加坡) |
| 16 | IP | 18.142.128.26 | common-tg-service | 运营者 VPS IP(AWS 新加坡) |
| 17 | IP | 54.254.162.138 | common-tg-service | 运营者 VPS IP(AWS 新加坡) |
| 18 | 凭证 | Ajtdmwajt1@ | common-tg-service | 硬编码的通用 2FA 密码和 npoint.io 密码 |
| 19 | 凭证 | santoor | common-tg-service | 硬编码的内部 API 密钥 / 认证绕过 |
| 20 | 凭证 | [email protected] | common-tg-service | 植入受害者账户的 2FA 恢复邮箱 |
| 21 | 凭证 | password - India143 | common-tg-service | 植入受害者账户的 2FA 提示 |
| 22 | Telegram 聊天 | -1001801844217 | common-tg-service | 默认 accountsChannel 窃密目的地 |
| 23 | Telegram 聊天 | -1001972065816 | common-tg-service | 默认 updatesChannel 窃密目的地 |
23 行
| 4 列
三个细节指向目标:README 中的"UPI Integration"功能、paidgirl555@gmail.com 来源,以及 India143 2FA 提示。该框架针对印度 Telegram 账户以进行下游支付欺诈。
包 1:common-tg-service
来源信息
| 字段 | 值 |
|---|---|
| 包名 | common-tg-service |
| 最新分析版本 | 1.3.207 |
| npm 上总版本数 | 502(1.0.1 → 1.3.207) |
| 首次发布 | 版本 1.0.1 |
| 维护者 | shetty123 < [email protected] > |
| 声明的许可证 | MIT |
| 引擎 | node >= 16.0.0 |
| 安装时脚本 | 无。恶意行为在运行时触发,而非安装时 |
| 周下载量 | 约 28,000 |
| Tarball | common-tg-service-1.3.207.tgz |
| SHA-1 | 71a4eaa37bbdd9d7b38cd5af7e6eeacccdb8cf58 |
| 包大小 | 662.9 kB 压缩 / 4.0 MB 解压 / 934 个文件 |
版本数量已直接验证:
该包声明没有 preinstall 或 postinstall 钩子。基于生命周期脚本进行检测的安装时扫描器不会标记它。恶意行为在服务启动时运行,而不是在 npm install 时。
行为 1:通过 IMAP 植入 2FA
当服务处理没有 2FA 密码的 Telegram 账户时,它会设置一个。密码、恢复邮箱和提示都是硬编码的。
IMAP 模块连接到运营者的 paidgirl555@gmail.com 邮箱,读取 Telegram 发送到恢复地址的确认码,然后将其提交回 Telegram。整个 2FA 设置过程无需提示受害者即可运行。
恢复邮箱由运营者控制是关键细节。即使受害者通过其他方式恢复了对账户的某些访问权限,运营者也可以随时通过恢复流程重置 2FA。
行为 2:所有权验证循环
该框架不仅接管账户。它还会监视逃脱的用户。
在循环中,框架对每个托管账户使用硬编码密码进行 SRP 检查。如果合法用户已轮换了他们的 2FA,框架会将账户标记为 rotated_2fa 并 ping 运营者的 Telegram 频道。该活动会对用户反弹进行告警。
行为 3:强制驱逐其他会话
对于账户上授权的每个其他设备,框架调用 revokeOtherAuthorizations,过滤掉运营者自己的会话指纹,并撤销其余的。
每次撤销都会向运营者的机器人频道报告电话号码、国家、设备型号和 API ID。合法所有者被踢出自己的账户,无通知,无申诉渠道。
行为 4:从聊天 777000 收割 OTP
Telegram 从官方发送方聊天 777000 发送 OTP 登录码。框架监听该聊天上的消息并将它们直接转发到运营者的机器人频道。
任何通过该框架的电话号码都会给运营者按需的完整登录能力。
行为 5:npoint.io 作为远程配置存储
npoint.io 是一个免费的公共 JSON 托管服务。运营者将实时凭证和预烘焙的会话 cookie 提交到源代码中。
每个运行的实例都作为运营者向 npoint 进行身份验证,并从中拉取 JSON 配置。运营者可以通过编辑 npoint 上的 JSON 文件来更改所有已部署实例的行为,无需重新发布。
行为 6:HTTP 请求洗白
在 HTTP 403 或 495 时,框架通过运营者控制的中继重新发起请求。
helper-thge.onrender.com 运行在 Render 的免费层上,作为归属混淆代理。认证头是共享字符串 santoor,代码库将其重用为通用内部 API 密钥。
行为 7:认证绕过后门
该服务通过 INTERNAL_API_KEY 在管理端点前面暴露了一个守卫。三个条件中的任何一个都会通过守卫:
API 密钥是源代码中公开可读的字符串。任何阅读该包的人都可以作为运营者进行身份验证。
common-tg-service 交叉引用映射
| 文件 | 角色 |
|---|---|
| npoint.service.ts | npoint.io C2 配置存储,包含硬编码的运营者凭证和会话 cookie |
| two-fa.service.ts | 2FA 植入、IMAP 邮件轮询、撤销其他授权 |
| otp.service.ts | OTP 窃密到 Telegram 机器人频道 |
| internal.service.ts | internal 内部主机、文件下载 API 密钥处理 |
| account-verification.service.ts | account-verification 所有权验证循环、rotated_2fa 检测 |
| session.service.ts | sessions、从 777000 读取 OTP |
| ip-management.service.ts | 从 cms.paidgirl.site 拉取代理/IP 配置 |
| http-bypass.service.ts | 通过 helper-thge.onrender.com 的 HTTP 绕过中继 |
| bot.service.ts | Telegram 机器人窃密 URL 构建器、默认运营者聊天 ID |
| gmail.service.ts | Gmail IMAP 客户端,用于获取 2FA 确认码 |
| file.service.ts | 从 paidgirl.site 拉取 zip 有效载荷 |
| main.ts | 硬编码的运营者 IP、来源和用于入站认证的 API 密钥 santoor |
清单和 README 欺骗
README 是一个复制粘贴的 NestJS 模板,将该包呈现为"一个渐进的 Node.js 框架",带有通用功能列表(@nestjs/common、@nestjs/core、reflect-metadata、rxjs、class-validator)。它没有提及任何真实行为:没有 2FA 修改、没有 IMAP 轮询、没有硬编码凭证、没有 Telegram 机器人窃密、没有强制撤销其他授权。
package.json 声明没有安装时脚本,因此安装时扫描器保持静默。所有恶意行为都在运行时运行。
包 2:ams-ssk
相同的 shetty123 npm 发布者还维护着 ams-ssk,营销定位为"NestJS AMS 文件管理库"。就其本身而言,ams-ssk 不是木马或远控木马(RAT)。该包没有针对运行 ams-ssk 的主机的有效载荷。真正有趣的点是它扮演的角色:作为 common-tg-service 调用的服务端运行时。
来源信息
| 字段 | 值 |
|---|---|
| 包名 | ams-ssk |
| 最新分析版本 | 1.0.33 |
| npm 上总版本数 | 31(1.0.0 → 1.0.33) |
| Tarball | ams-ssk-1.0.33.tgz |
| SHA-1 | f36f57e4d90d0d1b46c5f8a0d2e7dc8a5f3b9c1d |
| 包大小 | 161.8 kB 压缩 / 680.7 kB 解压 / 92 个文件 |
| npm 发布者 | shetty123 < [email protected] >(与 common-tg-service 相同) |
| 声明的作者 | Mad_man |
| 声明的描述 | "NestJS AMS Library for file management" |
| 声明的仓库 | https://github.com/mad-man/ams-ssk(无法解析) |
| 引擎 | node >= 16.0.0 |
| 首次发布 | 2025-03-05 |
| 最近发布 | 2026-04-12 |
| 安装时脚本 | 无 |
显示作者 Mad_man 是出现在运营者 repository.url 字段中的同一处理程序。
ams-ssk 运送的内容
该包捆绑了两个功能模块:
files,一个文件夹和文件 CRUD API:createFolder、rename、delete、move、copy、download、preview、上传,以及generateThumbnail、range-streaming、lock/unlock、版本控制和一个 bulk-zip 端点bulkZipDownload(注册在/bulk-zip)。telegram-bot,一个 Telegram 多机器人转发器。bot-pool.service.ts管理一个Telegram客户端池,每个机器人都有操作计数器;bot-forwarder.service.ts将传入消息转发到配置的频道,并带有重试和管理员聊天通知。
在隔离状态下代码没有明显的红旗:没有硬编码的运营者凭证、没有 paidgirl 字符串、没有 cms.paidgirl.site 或 paidgirl.site、没有 base64 混淆、没有 postinstall 钩子、没有 IMAP 模块。
它如何链接到 common-tg-service
链接点是 API 接口。common-tg-service 调用特定的 URL 语法;ams-ssk 定义了相同的语法。
common-tg-service 调用 | ams-ssk 定义 |
|---|---|
FILES_URL(files/upload) | 路由 /upload(FilesController.upload) |
内部允许列表包含 cms.paidgirl.site(bot.ADMIN_CHAT_ID) | 响应使用 bot.sendAdminMessage |
promoteClients2.glitch.me 是 ams-ssk 的部署实例(或者是共享控制器的姐妹分支)。文件夹/文件 URL 语法在客户端和服务端之间是相同的。
Swagger DTO 用于可共享链接,泄漏了第二个运营者控制的主机,该主机未出现在 ams-ssk 的任何地方:
zomcall.netlify.app 是免费 Glitch.me 平台上之前未报告的运营者主机。"2"后缀指向顺序预发布(promoteClients.glitch.me、promoteClients2.glitch.me,可能还有更多)。命名与 common-tg-service 的 warmup 功能一致,后者预热新获取的 Telegram 账户。
两者共享架构,而不仅仅是 API:
| 功能 | common-tg-service | ams-ssk |
|---|---|---|
| 多机器人轮换 | CSV botTokens、在 bot.service.ts 中轮询 | bot-pool.service.ts、telegram-bot 轮询 |
| 基于频道的窃密 | 五种类别:accounts、sessions、otp、updates、files | TELEGRAM_CHANNEL_* 环境变量;bot.config.ts 解析器 |
| 管理员聊天通知 | sendAdminMessage 类似物贯穿各处 | sendAdminMessage + forwardToChannel |
| 文件包拉取 | 通过 paidgirl.site 下载 zips | 从 /bulk-zip 提供 zips |
伪装模式相同:复制粘贴的 NestJS 模板 README(相同的 @nestjs/common、相同的 rxjs、相同的 author 块)、误导性的"文件管理库"描述、关键字中未声明的 Telegram 机器人集成,以及无法解析的 GitHub 仓库 URL。
另一个线索:files.service.ts 硬编码 videos/ 并将 workingDirectory 约束到该目录。结合 paidgirl 品牌和 .avi 默认文件扩展名,AMS 部署可能托管用作 Telegram 目标诱饵的媒体。
入侵指标(ams-ssk 特定)
IoC:ams-ssk 包
| # | 指标 | 类型 | 位置 |
|---|---|---|---|
| 1 | promoteClients2.glitch.me | 运营者控制的主机(Glitch.me 免费托管) | dist/files/dto/responses.dto.js:80 |
| 2 | mad_man | 运营者处理程序(也在 repository.url 中) | package.json author 字段 |
| 3 | bot_ADMIN_CHAT_ID | 运营者 Telegram 管理员聊天的环境变量 | dist/config/bot.config.js:38 |
| 4 | TELEGRAM_CHANNEL_* | 环境变量前缀;channelId::description::botTokens 模式 | dist/config/bot.config.js:84 |
| 5 | videos/ | 默认媒体托管工作目录 | dist/files/utils/helper.js:42 |
5 行
| 3 列 |
对 ams-ssk 的判定
| 维度 | 分类 |
|---|---|
| 针对安装者的直接本地执行恶意软件 | 否 |
| 已确认恶意包活动的成员 | 是 |
| 适合 OSV 漏洞列表 | 是,活动关联,以 common-tg-service 作为活动参考 |
| npm 下线理由 | 是。与已确认的凭证收割恶意软件相同的发布者。包在其自己的文档中泄漏了实时运营者 C2。描述具有误导性。 |
ams-ssk 是运营者基础设施工具,公开在 npm 上。其附带效果是合理的可否认性:"该开发者也发布了一个正常的 NestJS 库"软化了对其恶意姐妹包的审查。
修复
如果项目在任何版本上依赖 common-tg-service:
- 移除该依赖项。
- 审计每个电话号码通过该服务的 Telegram 账户。检查 2FA 恢复邮箱(
paidgirl555@gmail.com意味着已沦陷),检查 2FA 提示(India143意味着已沦陷),并审查"设置 → 设备"下来自上述运营者 IP 的未知会话的活动授权。 - 重置 Telegram 2FA 密码和恢复邮箱,然后撤销所有其他活动会话。
- 从运行该包的所有环境阻止到
paidgirl.site、cms.paidgirl.site、helper-thge.onrender.com、www.npoint.io和zomcall.netlify.app的出站流量。 - 轮换可能已暴露给运行中服务的任何环境变量:
TELEGRAM_API_ID、TELEGRAM_API_HASH、BOT_TOKEN、ADMIN_CHAT_ID、ACCOUNTS_CHANNEL、UPDATES_CHANNEL、OTP_CHANNEL、INTERNAL_API_KEY、GOOGLE_APP_PASSWORD、以及任何TELEGRAM_CHANNEL_*变量。
判定
common-tg-service 是一个 Telegram 账户接管框架,作为 502 个 npm 版本以良性的 NestJS 工具名称发布。ams-ssk 是同一运营者的服务端运行时,部署在 cms.paidgirl.site 和 promoteClients2.glitch.me 上,并以相同的 shetty123 身份在 npm 上发布,采用相同的伪装模式。这两个包是同一个凭证收割和账户劫持操作中的配套客户端和服务端。
- vet
- malware
- npm
- supply-chain
- credential-theft
SafeDep 博客最新动态
关注以获取开源安全与工程的最新更新和见解