PhantomBot: від крадіжки облікових даних до ботнету

PhantomBot: кампанія Typosquat, яка перейшла від крадіжки облікових даних до готового комплекту ботнету

TL, д-р

Один видавець npm, deadcode09284814, розпочала кампанію з помилковими опечатками проти законних axios та chalk-template пакети з середини травня 2026 року.

Кампанія розпочалася як звичайна крадіжка облікових даних та гаманців, викрадаючи дані HTTPS-тунель Serveo.

On 2026-05-17, С axois-utils:1.0.9, оператор повністю змінив корисне навантаження: той самий потрійний схрест з інсталяційним хуком, той самий видавець, та сама назва пакета.

Але скрипт встановлення тепер є кросплатформним DDoS-ботнетом.

Корисне навантаження говорить про localhost.run тунель та приймає команди flood, перетворюючи заражені середовища на частину ботнету, здатного до DDoS-атак.

Оператор навіть відправив Бінарний файл сервера C2 всередині тар-архіву, що демонструє чітку ескалацію від крадіжки облікових даних до активної інфраструктури ботнету.

Два пакети, чотири версії все ще активні в реєстрі, і один оператор, який тепер запускає обидва модулі паралельно.

Ступінь тяжкості: високий.

Головний МОК Будь-яка версія axois-utils або chalk-tempalte від видавця deadcode09284814

Атака: як це працює

Кампанія побудована на навмисно нудному каркасі доставки: дві нетипові назви пакетів, на одну літеру відмінні від пакетів із сотнями мільйонів щотижневих завантажень (аксіоси, крейдяний шаблон) та потрійне встановлення hooks що гарантують виконання. Цікаво те, що таке риштування несе — і той факт, що оператор змінив вантаж, не змінюючи нічого іншого.

Спільний риштування

Кожна опублікована версія обох пакетів декларує однакові три життєві цикли hooks in package.json:

Перелік корисного навантаження під усіма трьома hooks це надмірно — після встановлення сам по собі працюватиме за замовчуванням npm встановитиВибір має значення: npm install –ignore-scripts пропускає скрипти, але кілька поширених робочих процесів (відновлення кешу неперевершеної інтеграції, що повторно запускає життєвий цикл) hooks вибірково, або розробники, які лише здійснюють аудит після встановлення) зробити потрійне надлишкове оголошення найбезпечнішим варіантом для зловмисника.

крейдяний шаблон додає другий механізм: він оголошує axois-utils:^1.0.7 як середовище виконання залежністьВстановлення помилки крейдяний шаблон тому також підключає рідний typosquat, і обидва корисні навантаження запускаються. Ці два пакети є узгодженою парою, а не незалежними списками.

Фаза A — крадіжка облікових даних / гаманців (2026-05-15 → теперішній час)

Фаза А – це початкове корисне навантаження. Завантажувач короткий postinstall.js що вказує на зворотний тунель HTTPS Serveo:

Піддомен 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_*)
Артефакти криптогаманців для Bitcoin, Exodus, Electrum, Monero, Litecoin, Dogecoin, Zcash, Dash
Рекурсивний .env* пройтися через ~/projects, ~/dev, ~/code, ~/workspace, та інсталяційний cwd
Історії Shell та повний опис process.env

Пакет відправляється до тунелю Serveo за адресою / збиратиНемає ні обфускації, ні логіки проти віртуальних машин, ні проміжного розміщення — ставка оператора робиться на обсяг і швидкість.

Фаза B — рекрутинг для DDoS-атаки PhantomBot (17 травня 2026 р., лише axois-utils:1.0.9)

Фаза B замінює phantom.js + postinstall.js одним файлом з назвою distrube.js (помилка належить оператору). Потрійний гачок у package.json залишається незмінним; пакет зберігає ту саму назву, область дії та шаблон підвищення версії. Ззовні axois-utils:1.0.9 виглядає як незначне продовження версії 1.0.6. Усередині це інше сімейство шкідливих програм.

distrube.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')}`;

Коментарі адресовані майбутньому оператору, який запускатиме комплект («Використовуйте URL-адресу HTTPS вашого localhost.run»). Це, а також те, що постачається поруч із клієнтом бота, вказує на те, що це не просто корисне навантаження жертви — це сам комплект.

Потік:

  1. Наполегливість запускається першим. Скрипт встановлюється трьома різними способами для кожної ОС (реєстр прогін + Папка автозавантаження + штаски у Windows; crontab + phantom-bot.service системний блок d + .bashrc/.zshrc додати + /etc/rc.local на Linux; LaunchAgent com.phantom.bot.plist на macOS). Назва служби персистентності та мітка LaunchAgent є фантом-бот / com.phantom.bot, звідси й походить назва кампанії.
  2. Інформація про систему, вилучена виконується один раз — одноразовий POST-відбиток до b94b6bcfa27554.lhr.life:443/collect, що містить ім'я хоста, платформу, arch, ім'я користувача, CPU/RAM, мережеві інтерфейси, process.env, cwd, домашній каталог, версію вузла та публічну IP-адресу. Це набагато менш агресивно, ніж Фаза A: жодного SSH, жодних гаманців, жодної рекурсії .env. Завдання бота — реєструвати, а не красти.
  3. Петля серцебиття Відкриває HTTPS POST кожні 30 секунд до b94b6bcfa27554.lhr.life:443/. Агент користувача – PhantomBot/1.0. Перевірка TLS явно вимкнена (rejectUnauthorized: false). Відповідь C2 аналізується як JSON у форматі {type, target, port, duration, threads, method} та відправляється.
  4. Арсенал повені підключено до шести команд:
Тип команди Модулі примітки
пінг Відповідь на життєздатність Бот ідентифікує себе
HTTP HTTP-флуд Захист запитів рівня 7
протокол HTTPS HTTPS-флуд Те саме, що й http, захищено TLS
тпп TCP-флуд 65 КБ випадкового корисного навантаження спаму
udp UDP-флуд 65 507-байтові UDP-пакети
швидко DoS-атак із швидким скиданням HTTP/2 Техніка CVE-2023-44487 2023 року

Усі п'ять модулів повені приймають мета, порт, тривалість та теми аргумент — бот — це звичайний флудер, який працює за наймом і не спрямований на якусь конкретну жертву. Список жертв оператора знаходиться на C2, а не в пакеті.

Що нового тут — випущений бінарний файл C2

Фаза А має знайому форму: крадіжка облікових даних, перехоплення встановлення, тунелювання постачальником C2. Фаза B це Також знайома форма — DDoS-ботнети роками були невід’ємною частиною шкідливих npm-пакетів. Незвично те, що оператор відправив сторона сервера з комплекту всередині tar-архіву npm:

  • c2 — 4-мегабайтний скомпільований бінарний файл Go ELF
  • c2.go — 426-рядковий вихідний код Go для цього бінарного файлу

Жоден з файлів не викликається жодним гачком встановлення. Вони не є частиною корисного навантаження жертви. Вони знаходяться в каталозі пакета так само, як і файл документації. Найбільш правдоподібним тлумаченням є те, що оператор переніс своє робоче дерево розробки до npm без курування списку файлів — справжня помилка OpSec — і те, що було надано, — це повний двосторонній комплект: клієнт, який запускає жертва, і сервер, який запускає оператор.

Це та частина історії, яка виправдовує формулювання «готового до використання ботнету». Кожен, хто завантажив axois-utils:1.0.9 перед знищенням має не лише зразок жертви — у них є робочий сервер C2.

Поворот, одним реченням

Той самий видавець, ті самі назви пакетів, той самий потрійний каркас, той самий «фантомний» брендинг — але корисне навантаження змінило модель монетизації за одну нічвід «зібрати секрети, які я можу перепродати» до «оренда потужності для флуду, яку я можу здати в оренду». TTP часу встановлення, на які повинні звертати увагу захисники, майже однакові на обох фазах; захист на основі сигнатур, пов'язаний з рядками шляху гаманця Фази А або з phantom.jsКолектор із 7,667 рядків повністю пропустив би Фазу B.

Дата (UTC) Event
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; застосовано вердикт «підтверджено шкідливий»
2026-05-17 axois-utils:1.0.9 опубліковано — pivot корисного навантаження: вербування 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 версії
(триває) Звіти про видалення очікують на розгляд; всі чотири опубліковані пакети залишаються доступними в реєстрі на момент написання статті.

Показники компромісу

Пакети

Екосистема пакет версії
нмм axois-utils (типоскват аксіоса) 1.0.4, 1.0.6, 1.0.9
нмм 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 HTTPS-тунель Serveo
A 8a3e818ea8f11186-80-200-28-28.serveousercontent.com:443/collect HTTPS-тунель Serveo (попередня версія)
A 80.200.28.28:443/collect Базова кінцева точка VPS
B b94b6bcfa27554.lhr.life:443/ localhost.run Зворотний тунель HTTPS

Дайджести файлів (SHA-256)

Файл SHA-256 примітки
c2 (Перейти до ELF, 4 МБ) 165fa92d237fd017c227d00da06ab788212a62be94bf61e95df2d22d00377ef2 Сервер C2 на стороні оператора, що постачається всередині axois-utils:1.0.9
c2.go (426 рядків) 7d0ae79fdb1e9968f3323a3712b624643a782ba3efb2cf3a2cb9c4c5513cea30 Вихідний код Go для бінарного файлу C2
distrube.js 308b15c023088a7188dea4ef609010ac2493eb4c365b103053d7621a9ca5b935 Клієнт бота фази B
phantom.js (chalk-tempalte:1.0.19) 9e380ec88d3ccf3929e1a104e3b868d4d7b59ca189a8a431a54e9f3357dfdd81 Колектор облікових даних фази A / гаманців
phantom.js (chalk-tempalte:1.0.20) d1c9e3f296ee9f7d5032f73f9c504cede50334bc14c394055fd5cb9c3a6e08b3 Колектор фази А (варіант 1.0.20)
postinstall.js (chalk-tempalte:1.0.19 = 1.0.20) ffba9bdd6793edd5b38e12900252c1813a693f59c25af51c3b658cf3f27b6162 Завантажувач фази А, ідентичний побайтово в обох версіях

Атрибуція та мотивація

Ми відстежуємо цю кампанію як PhantomBot, запозичивши власний брендинг оператора з Агент користувача: PhantomBot/1.0 заголовок серцебиття, phantom-bot.service системний блок com.phantom.bot Мітка LaunchAgent та phantomdeadcode@ дескриптор електронної пошти. Оператор є послідовним щодо цього імені щонайменше в чотирьох артефактах.

Каталог сигналів

  • видавець - мертвий код09284814 на npm. Обліковий запис з одним керуючим, одноразова електронна пошта Tutamail, ні SCM перевірка. Немає попередньої історії публікацій після цієї кампанії.
  • Повторне використання бренду — «phantom» з’являється в електронному листі видавця, в назві файлу колекціонера Фази А (phantom.js), у назві служби персистентності фази B (phantom-bot.service), у мітці LaunchAgent (com.phantom.bot), а також у боті User-Agent (ФантомБот/1.0).
  • Інфраструктура — Один VPS за адресою 80.200.28.28 передає Фазу А через обертання піддомену Сервео; Фаза B переміщується до localhost.run зворотний тунель (b94b6bcfa27554.lhr.life). Обидва сервіси постачальників є безкоштовними та вимагають лише вихідного SSH на стороні оператора, що відповідає низькобюджетним налаштуванням з низьким рівнем операційної безпеки.
  • Стиль коду — Простий JavaScript у всьому тексті; без обфускації, без кодування рядків, без перевірок антивірусної архітектури. Назви змінних є описовими (stealSystemInfo, executeCommand, httpFlood). Коментарі в distrube.js безпосередньо звертатися до майбутнього оператора («Використовуйте URL-адресу HTTPS вашого localhost.run»), що свідчить про те, що файл мав бути розповсюджений як комплект, а не використаний одним зловмисником.
  • Пропуск оперативної безпеки — Архівний пакет Фази B містить як клієнт-бота, так і сервер C2 на стороні оператора (c2 ЕЛФ + c2.go джерело). Це узгоджується з оператором, який передав своє робоче дерево до npm без аудиту списку файлів. Або оператор недосвідчений, або комплект... означав для публічного розповсюдження, а бінарний файл C2 є частиною продукту.
  • Самопідтвердження - axois-utils:1.0.4 містить коментар до джерела // Змінити на '80.200.28.28' для публічного доступу у рядку 12, підтверджуючи прогрес розробки / проходження / виробництва, який оператори зазвичай заперечують.

мотивація

Корисне навантаження Фази А — це пряма фінансова крадіжка: облікові дані, хмарні ключі, токени GitHub та криптогаманці — усі вони мають ліквідні ринки перепродажу. Фаза B також є фінансовою, але непрямою: сервіси DDoS-атак за наймом («booter») орендують потужності щохвилини, а боти, подібні до того, що представлений тут, є інвентарем, на якому працюють ці сервіси. 30-секундний heartbeat, загальний мета/порт/тривалість схема команд та арсенал флуду з п'яти протоколів є standard продукт оператора-замовника.

Паралельний запуск обох модулів — крейда-шаблон:1.0.19 та 1.0.20 продовжуйте відправляти викрадача, поки axois-utils:1.0.9 відправляє бота — це свідчить про те, що оператор хеджує потоки доходів, а не відмовляється від Фази А. Поворот — це доповнення, а не заміна.

Що ми не стверджуємо

Нам не вдалося підтвердити реальну особу, яка стоїть за цим мертвий код09284814 дескриптор, і ми не пов'язуємо цю кампанію з жодним названим порушником, групою чи країною. Брендування «фантом» достатньо послідовне в усіх артефактах, щоб припустити одного оператора, але доставка бінарного файлу C2 у стилі набору залишає можливість того, що майбутні пакети з непов'язаних дескрипторів повторно використовуватимуть той самий код.

Вплив, тенденції та що повинні робити захисники

Impact

Законні цілі для присідань аксіоси та крейдяний шаблон широко залежать від екосистеми JavaScript; аксіоси один входить до тридцяти найбільш завантажених npm-пакетів. Назви з друкарськими помилками відрізняються від справжніх назв за одне натискання клавіші (аксосаксіоси, шаблоншаблон), і обидва є лінгвістично правдоподібними орфографічними помилками.

Нам не вдалося отримати достовірну статистику завантажень шкідливих версій перед видаленням — npm не зберігає кількість завантажень для кожної версії після скасування публікації пакета, і npms.ioПроксі-сервери в стилі - створюють шум у такому масштабі. Будь-яка організація, файл блокування якої відповідає пакету з назвою axois-utils or крейдяний шаблон від видавця мертвий код09284814 слід розглядати як скомпрометовані: ротувати всі наявні облікові дані process.env на ураженому хості перевірте вектори персистенції для кожної ОС (див. розділ «Що повинні робити захисники» нижче) та видаліть залежність.

Нові закономірності

Ця кампанія є прикладом зміни, яку ми спостерігали в кількох нещодавніх інцидентах з новими лідерами: монтажне риштування з гаком – це довговічний активкорисне навантаження можна замінюватиТой самий видавець, той самий пакет, той самий попереднє встановлення / встановлювати / після встановлення потрійний, і навіть однаковий каденс підвищення версій — єдине, що змінилося між axois-utils:1.0.6 та axois-utils:1.0.9 був файл hooks запустити. Виявлення на основі підпису, пов'язане з корисним навантаженням Фази А (рядки шляху гаманця, phantom.jsКолектор із 7,667 рядків, хост Serveo C2), позначив би перші три версії та повністю пропустив би Фазу B.

Така ж закономірність спостерігається і в інших кампаніях 2026 року, які ми відстежували: один оператор зі стабільною платформою, який чергує крадіжку облікових даних, клієнтів для шахрайства на іспитах, вилучення ботів Telegram, а тепер і вербування DDoS-атак. Захисники, які покладаються на підписи корисного навантаження, продовжуватимуть програвати другий раунд кожної кампанії.

Наслідком є ​​те, що TTP під час встановлення є кращим сигналомПотрійні оголошення install-hook, скрипти встановлення, що імпортують протокол HTTPS or дочірній_процес, встановлюйте скрипти, які записують дані в папки автозавантаження користувача, та встановлюйте скрипти, які розпізнають імена хостів на безкоштовних сервісах зворотного тунелювання (Serveo, localhost.run, ngrok, cloudflared) рідко зустрічаються в легітимних пакетах і часто зустрічаються в шкідливих.

Що мають робити захисники

  • Аудит файлів блокування. Шукати кожні package-lock.json / пряжа.замок / pnpm-lock.yaml у вашій організації для отримання точних рядків axois-utils та крейдяний шаблонСтавтеся до будь-якого матчу як до компромісу.
  • Змінювати секрети на уражених хостах. Фаза A: масово зібрані облікові дані SSH, хмари, GitHub, npm та гаманця. Припускається, що всі облікові дані, будь-коли присутні в process.env, ~ / .ssh, ~/.aws, ~/.npmrc, ~ / .configабо будь-який .env* файл на ураженому хості стає доступним.
  • Усунути персистенцію (Фаза B). У Windows видаліть HKCU\Software\Microsoft\Windows\CurrentVersion\Run\SystemUpdate, видалити %APPDATA%\Microsoft\Windows\Меню «Пуск»\Програми\Автозавантаження\system-update.bat та schtasks /delete /tn SystemUpdate /fУ Linux, кронтаб -e і видалити Вузол @reboot …, systemctl –користувач вимкнути –тепер phantom-bot.service потім видаліть ~/.config/systemd/user/phantom-bot.serviceскраб .bashrc / .zshrc / /etc/rc.localУ macOS, launchctl вивантажити ~/Бібліотека/LaunchAgents/com.phantom.bot.plist потім видаліть plist.
  • Блокуйте хости C2. Додайте чотири кінцеві точки C2 з таблиці IOC до вашого списку блокування виходу. *.serveousercontent.com та *.lhr.life* може бути повністю заблоковано, якщо ваше середовище не має законного використання послуг зворотного тунелювання.
  • Пошук за часом встановлення (TTP), а не корисне навантаження. Записи файлу блокування інвентаризації, чиї package.json заявляє попереднє встановлення, встановлювати та після встановлення всі вказують на один і той самий скрипт. Перевірте вік пакета та статус перевірки видавця. Цей шаблон рідко зустрічається в легітимних пакетах і є найнадійнішим сигналом, який PhantomBot повторно використовує.
  • Аудит для бінарного файлу C2. Кожен, хто завантажив axois-utils:1.0.9 має сервер C2 оператора (c2 ЕЛФ, ша256 165fa92d…) на диску. Сканувати кеші та сховища артефактів CI. Бінарний файл сам по собі неактивний, але його присутність на робочій станції є однозначним доказом того, що пакет було встановлено.

Лінія закриття

Той самий оператор, той самий пакет і той самий інсталяційний хук можуть створювати абсолютно різні загрози протягом 48 годин. Слідкуйте за скам'яною структурою, а не за корисним навантаженням.

інструменти-для-аналізу-складу-програмного-засобу-sca
Визначте пріоритети, усуньте та захистіть ризики, пов'язані з програмним забезпеченням
Отримайте свій безкоштовний обліковий запис.
Не потрібна кредитна картка.

Забезпечте розробку та доставку програмного забезпечення

з пакетом продуктів Xygeni