PhantomBot: от кражи учетных данных до ботнета

PhantomBot: Кампания на платформе Typosquat, перешедшая от кражи учетных данных к готовому комплекту ботнета.

TL, д-р

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

Кампания началась как обычная кража учетных данных и электронных кошельков с целью похищения данных. Туннель HTTPS Serveo.

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

Но теперь скрипт установки представляет собой кроссплатформенный ботнет для DDoS-атак.

Полезная нагрузка говорит о localhost.run Он создает туннель и принимает команды флуда, превращая зараженные среды в часть ботнета, способного совершать DDoS-атаки.

Оператор даже отправил исполняемый файл сервера C2 Внутри архива tarball наблюдается явная эскалация от кражи учетных данных к активной ботнет-инфраструктуре.

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

Степень тяжести: высокая.

Заголовок МОК Любая версия axois-utils или chalk-template от издателя deadcode09284814

Атака: как она работает

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

Общий каркас

В каждой опубликованной версии обоих пакетов указан один и тот же трехэтапный жизненный цикл. hooks in пакет.json:

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

меловой шаблон добавляет второй механизм: он объявляет axois-utils:^1.0.7 в качестве среды выполнения зависимостьУстановка опечатки меловой шаблон Таким образом, он также включает в себя соседний пакет typosquat, и оба пакета выполняются. Эти два пакета представляют собой скоординированную пару, а не независимые элементы.

Этап А — кража учетных данных/кошелька (15.05.2026 → настоящее время)

Фаза А — это исходная полезная нагрузка. Загрузчик представляет собой короткий postinstall.js который указывает на обратный туннель HTTPS от Serveo:

Поддомен Serveo кодирует целевой IP-адрес (80.200.28.28) непосредственно в имени хоста — это общепринятая практика для данной службы. Оператор меняет случайный префикс поддомена между версиями, чтобы обойти наивные списки блокировки доменов, но базовый IP-адрес никогда не меняется.chalk-tempalte: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 personal-access-token regex (ghp_*, gho_*, ghu_*, ghs_*)
Инструменты для создания криптокошельков Bitcoin, Exodus, Electrum, Monero, Litecoin, Dogecoin, Zcash, Dash.
Рекурсивный .env* прохождение ~/projects, ~/dev, ~/code, ~/workspaceи текущий рабочий каталог установки
История компании Shell и полная информация process.env

Пакет данных отправляется методом POST в туннель Serveo по адресу / собиратьЗдесь нет обфускации, нет логики, препятствующей работе виртуальных машин, нет подготовки — оператор делает ставку на объем и скорость.

Этап B — Привлечение DDoS-атак с помощью PhantomBot (17.05.2026, только для axois-utils:1.0.9)

На этапе B файлы phantom.js и postinstall.js заменяются одним файлом с именем distrobe.js (опечатка в операторе). Структура тройного хука в package.json остается неизменной; пакет сохраняет то же имя, область видимости и схему обновления версии. С виду axois-utils:1.0.9 выглядит как незначительное продолжение 1.0.6. Внутри же это другое семейство вредоносных программ.

distube.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-адрес localhost.run по протоколу HTTPS»). Это, а также то, что поставляется вместе с клиентским приложением бота, указывает на то, что это не просто полезная нагрузка для жертвы — это и есть сам набор инструментов.

Поток:

  1. Настойчивость Сначала запускается скрипт. Скрипт устанавливается тремя разными способами в зависимости от операционной системы (через реестр). Run + Папка автозагрузки + Schtasks в Windows; crontab + phantom-bot.service systemd unit + .bashrc/.zshrc добавить + /etc/rc.local на Linux; LaunchAgent com.phantom.bot.plist (в macOS). Имя службы постоянного хранения и метка LaunchAgent — это одновременно и имя службы постоянного хранения, и метка LaunchAgent. фантом-бот / com.phantom.botИменно отсюда и происходит название кампании.
  2. Извлечение системной информации Запускается один раз — одноразовая POST-запрос с отпечатком пальца на адрес b94b6bcfa27554.lhr.life:443/collect, содержащий имя хоста, платформу, архитектуру, имя пользователя, процессор/ОЗУ, сетевые интерфейсы, process.env, текущий рабочий каталог, домашний каталог, версию Node и публичный IP-адрес. Это гораздо менее агрессивный подход, чем на этапе A: нет SSH, нет кошельков, нет рекурсии в .env. Задача бота — зарегистрировать, а не украсть.
  3. Цикл сердцебиения Открывается HTTPS POST-запрос каждые 30 секунд к адресу b94b6bcfa27554.lhr.life:443/. User-Agent — PhantomBot/1.0. Проверка TLS явно отключена (rejectUnauthorized: false). Ответ C2 анализируется как JSON в формате {type, target, port, duration, threads, method} и отправляется.
  4. Арсенал противопаводковых средств подключен к шести командам:
Тип команды Модули Заметки
пинг Ответ Liveness Бот идентифицирует себя
HTTP HTTP-флуд Поток запросов уровня 7
протокол HTTPS HTTPS-флуд Аналогично HTTP, обернуто в TLS.
TCP TCP флуд 65 КБ случайной полезной нагрузки спама
UDP UDP флуд UDP-пакеты размером 65 507 байт
быстро HTTP/2 быстрая перезагрузка DoS Техника 2023 CVE-2023-44487

Все пять модулей защиты от наводнений имеют значение. цель, порт, продолжительность и темы Аргумент — бот представляет собой обычный наёмный флуд-агрегатор, не нацеленный на какую-либо конкретную жертву. Список жертв оператора хранится на C2, а не в самом пакете.

Что нового — поставляемый бинарный файл C2.

Фаза А имеет знакомую форму: кража учетных данных, установка системы, туннелирование C2 через поставщика. Фаза B — это причислены Знакомая форма — ботнеты для DDoS-атак уже много лет являются неотъемлемой частью вредоносных пакетов npm. Необычно то, что оператор выпустил этот пакет. серверная сторона из комплекта, находящегося внутри архива npm:

  • c2 — скомпилированный исполняемый файл Go ELF размером 4 мегабайта
  • c2.go — Исходный код на языке Go, состоящий из 426 строк, для этого бинарного файла.

Ни один из этих файлов не вызывается никаким хуком установки. Они не являются частью полезной нагрузки жертвы. Они находятся в каталоге пакета так же, как и файл документации. Наиболее правдоподобное объяснение заключается в том, что оператор загрузил свою рабочую ветку разработки в npm, не проверив список файлов — настоящая ошибка в области операционной безопасности — и в результате был отправлен полный двусторонний комплект: клиент, который запускает жертва, и сервер, который запускает оператор.

Именно эта часть истории оправдывает концепцию «готового к использованию ботнет-комплекта». Любой, кто скачал его, может это сделать. axois-utils:1.0.9 Перед удалением у них есть не только образец жертвы, но и работающий сервер управления и контроля.

Поворотный момент, в одном предложении

Тот же издатель, те же названия пакетов, та же структура с тремя крючками, тот же «фантомный» брендинг — но Модель монетизации полезной нагрузки изменилась в одночасье.от «секретов сбора урожая, которые я могу перепродать» до «возможностей для сдачи в аренду». Тактика, тактика и методы, которые должны отслеживать защитники на этапе установки, практически идентичны на обоих этапах; защита на основе сигнатур, привязанная к цепочкам транзакций кошелька на этапе А или к 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; подтверждены вредоносные действия.
2026-05-17 axois-utils:1.0.9 опубликовано — изменение структуры полезной нагрузки: привлечение DDoS-атак PhantomBot через туннель localhost.run; на стороне оператора c2 двоичный и c2.go исходный код поставляется в архиве tarball.
2026-05-17 chalk-tempalte:1.0.19 и 1.0.20 Опубликовано — по-прежнему фаза А (похититель); оператор теперь запускает оба модуля параллельно.
2026-05-17 Обнаружение фазы B в ходе стандартного сканирования; выводы были применены ко всем образцам. 2026-05-17 версии
(В настоящее время) Отчеты об удалении ожидают обработки; все четыре опубликованных пакета остаются доступными в реестре на момент написания статьи.

Показатели компромисса

Packages

Экосистема Упаковка Версии
НПМ axois-utils (typosquat of xios) 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 Туннель 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 МБ) 165fa92d237fd017c227d00da06ab788212a62be94bf61e95df2d22d00377ef2 Сервер управления и контроля на стороне оператора, поставляемый в комплекте с оборудованием. axois-utils:1.0.9
c2.go (426 строк) 7d0ae79fdb1e9968f3323a3712b624643a782ba3efb2cf3a2cb9c4c5513cea30 Исходный код Go для бинарного файла C2
distrube.js 308b15c023088a7188dea4ef609010ac2493eb4c365b103053d7621a9ca5b935 Клиент бота фазы B
phantom.js (chalk-tempalte:1.0.19) 9e380ec88d3ccf3929e1a104e3b868d4d7b59ca189a8a431a54e9f3357dfdd81 Сборщик учетных данных/кошельков фазы А
phantom.js (chalk-tempalte:1.0.20) d1c9e3f296ee9f7d5032f73f9c504cede50334bc14c394055fd5cb9c3a6e08b3 Коллектор фазы А (вариант 1.0.20)
postinstall.js (chalk-tempalte:1.0.19 = 1.0.20) ffba9bdd6793edd5b38e12900252c1813a693f59c25af51c3b658cf3f27b6162 Загрузчик фазы А, байтово идентичный в обеих версиях.

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

Мы отслеживаем эту кампанию следующим образом: ФантомБотзаимствуя фирменный стиль оператора. User-Agent: PhantomBot/1.0 заголовок "пульс", phantom-bot.service модуль systemd, com.phantom.bot метка LaunchAgent и phantomdeadcode@ Адрес электронной почты. Оператор использует это имя последовательно как минимум в четырех документах.

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

  • Издатель - deadcode09284814 на npm. Однопользовательская учетная запись, одноразовый адрес электронной почты Tutamail, нет SCM Проверка. Ранее никаких публикаций, кроме этой кампании, не было.
  • Повторное использование фирменной символики — Слово «фантом» появляется в электронном письме издателя в имени файла сборщика данных фазы А (phantom.js), в имени службы сохранения данных на этапе B (phantom-bot.service), в метке LaunchAgent (com.phantom.bot), а также в User-Agent бота (PhantomBot/1.0).
  • Инфраструктура — Один VPS по адресу 80.200.28.28 Фаза А начинается с ротации поддоменов Serveo; фаза В переходит к localhost.run обратный туннель (b94b6bcfa27554.lhr.lifeОба сервиса от разных поставщиков бесплатны и требуют только исходящего SSH-соединения на стороне оператора, что соответствует бюджетным решениям с низким уровнем операционной безопасности.
  • Кодовый стиль — Весь код написан на чистом JavaScript; без обфускации, без кодирования строк, без проверок на виртуальную машину. Имена переменных являются описательными (stealSystemInfo, выполнитьКоманду, httpНаводнениеКомментарии в distube.js Это напрямую обращается к будущему оператору («Используйте свой URL-адрес localhost.run по протоколу HTTPS»), предполагая, что файл предназначался для распространения в виде набора инструментов, а не для использования одним злоумышленником.
  • OpSec slip — В архиве Phase B содержатся как клиентское ПО для бота, так и сервер управления и контроля (C2) на стороне оператора.c2 ЭЛФ + c2.go (источник). Это соответствует ситуации, когда оператор загрузил свою рабочую ветку в npm, не проверив список файлов. Либо оператор неопытен, либо комплект неисправен. означает, Предназначен для публичного распространения, а исполняемый файл C2 является частью продукта.
  • Самоподтверждение - axois-utils:1.0.4 содержит исходный комментарий // Изменить на '80.200.28.28' для публичного доступа в строке 12 подтверждается последовательность этапов разработки/тестирования/производства, которую операторы обычно отрицают.

мотивация

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

Запуск обоих модулей параллельно — chalk-tempalte:1.0.19 и 1.0.20 продолжать отправку вора, пока axois-utils:1.0.9 Отправка бота — это говорит о том, что оператор хеджирует потоки доходов, а не отказывается от Фазы А. Этот поворот — это дополнение, не замена.

То, что мы не заявляем

Нам не удалось подтвердить реальную личность человека, стоящего за этим. deadcode09284814 Мы не связываем эту кампанию ни с каким конкретным субъектом угроз, группой или страной. «Фантомная» маркировка достаточно последовательна во всех артефактах, чтобы предполагать причастность одного оператора, но распространение бинарного файла C2 в виде комплекта оставляет открытой возможность того, что будущие пакеты от несвязанных субъектов будут использовать тот же код.

Влияние, тенденции и что должны делать защитники.

Влияние

Законные цели для сквотов Вардар и меловой шаблон В экосистеме JavaScript от них широко полагаются; Вардар Один только этот пакет входит в тридцать самых скачиваемых пакетов npm. Названия, набранные с помощью typosquat, отличаются от настоящих всего одним нажатием клавиши.аксоидаВардар, шаблоншаблон), и оба варианта являются лингвистически правдоподобными орфографическими ошибками.

Нам не удалось получить достоверную статистику загрузок вредоносных версий до их удаления — npm не сохраняет количество загрузок для каждой версии после снятия пакета с публикации, и npms.ioПрокси-серверы такого масштаба создают много шума. Любая организация, чей файл блокировки разрешается в пакет с именем аксиос-утилиты or меловой шаблон от издателя deadcode09284814 Следует рассматривать это как скомпрометированное: необходимо менять все имеющиеся учетные данные. процесс.env На затронутом хосте проведите аудит векторов сохранения данных для каждой операционной системы (см. раздел «Что должны делать специалисты по защите» ниже) и удалите зависимость.

Новые модели

Эта кампания иллюстрирует сдвиг, который мы наблюдали в нескольких недавних инцидентах с npm: Монтажные крюковые строительные леса — это долговечное изделие.Полезная нагрузка является сменной.Тот же издатель, та же упаковка, тот же предустановка / устанавливать / послеустановка утроенный, и даже тот же самый ритм обновления версий — единственное, что изменилось между 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) — все эти пакеты редко встречаются в легитимных программах и часто — во вредоносных.

Что должны делать защитники

  • аудит файла блокировки. Обыскать все Пакет-lock.json / пряжа.замок / pnpm-lock.yaml в вашей организации для получения точных строк аксиос-утилиты и меловой шаблонРассматривайте любой матч как компромисс.
  • Поворачивайте секреты на пораженных хозяевах. Этап А: массовый сбор учетных данных SSH, облачных сервисов, GitHub, npm и кошелька. Предполагается использование всех когда-либо присутствовавших учетных данных. процесс.env, ~ / .ssh, ~/.aws, ~ / .npmrc, ~ / .configИли любой .env* Файл на затронутом хосте находится в открытом доступе.
  • Устранение проблем с сохранением данных (фаза B). В Windows удалите HKCU\Software\Microsoft\Windows\CurrentVersion\Run\SystemUpdate, Удалить %APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup\system-update.bat и schtasks /delete /tn SystemUpdate /fВ Linux, кронтаб -e и удалите @reboot node …, 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). Добавьте четыре конечные точки C2 из таблицы IOC в список заблокированных исходящих соединений. *.serveousercontent.com и *.lhr.life Обратное туннелирование может быть полностью заблокировано, если в вашей среде нет законных оснований для его использования.
  • Поиск по TTP во время установкиа не полезная нагрузка. Записи в файле блокировки инвентаризации, чьи пакет.json заявляет, предустановка, устанавливать и послеустановка Все они указывают на один и тот же скрипт. Проверьте его на соответствие возрасту пакета и статусу подтверждения издателя. Этот шаблон редко встречается в легитимных пакетах и ​​является единственным наиболее надежным сигналом, который повторно использует PhantomBot.
  • Проверка исполняемого файла C2. Все, кто скачал axois-utils:1.0.9 имеет сервер управления и контроля оператора (c2 ELF, sha256 165fa92d…) на диске. Сканирует кэши и хранилища артефактов CI. Сам по себе бинарный файл находится в спящем режиме, но его наличие на рабочей станции является однозначным доказательством того, что пакет был установлен.

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

Один и тот же оператор, один и тот же пакет и один и тот же установочный хук могут представлять совершенно разные угрозы в течение 48 часов. Следите за структурой, а не за полезной нагрузкой.

sca-инструменты-программное обеспечение-композиция-анализ-инструменты
Расставьте приоритеты, устраните и защитите риски, связанные с программным обеспечением
Получите бесплатный аккаунт.
Нет необходимости кредитную карту.

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

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