Исследования GReAT

Tsundere — новый ботнет на базе Node.js, использующий блокчейн

Введение

Tsundere — новый ботнет, обнаруженный командой глобального центра исследования и анализа угроз «Лаборатории Касперского» (GReAT) примерно в середине 2025 года. Нам удалось связать эту угрозу с инцидентами, описанными в отчетах за октябрь 2024 года, благодаря сходству фрагментов кода, аналогичному механизму получения адресов командного сервера и совпадению адреса криптокошелька. Тогда злоумышленники создавали вредоносные пакеты Node.js и использовали менеджер пакетов npm для внедрения полезной нагрузки. Для привлечения пользователей использовалась техника тайпсквоттинга: названия пакетов выглядели как немного измененные названия популярных библиотек. Злоумышленники пытались выдавать свои пакеты за такие решения, как Puppeteer, Bignum.js и другие криптовалютные библиотеки: всего было выявлено 287 вредоносных пакетов. Эта атака на цепочку поставок затронула пользователей Windows, Linux и macOS, однако просуществовала недолго: как только вредоносные пакеты были удалены, а способ распространения стал известен, злоумышленники отказались от данного метода заражения.

Затем те же злоумышленники возобновили свою деятельность примерно в июле 2025 года, представив новую угрозу — бот Tsundere, который мы назвали по имени его панели управления. Этот ботнет продолжает расширяться и остается актуальной угрозой для пользователей Windows.

Начальный вектор заражения

В настоящее время нет достоверных сведений о том, как именно распространяются импланты бота Tsundere. В одном задокументированном случае имплант был установлен с помощью файла pdf.msi, загруженного через инструмент удаленного мониторинга и управления (RMM) со скомпрометированного веб-сайта. Кроме того, названия некоторых образцов позволяют предположить, что для распространения имплантов злоумышленники используют в качестве приманки популярные игры для Windows, в частности шутеры от первого лица. Обнаруженные образцы, связанные с реальными инцидентами, имели такие названия, как valorant, cs2 и r6x, — вероятно, из-за популярности этих игр в пиратских сообществах.

Вредоносные импланты

Судя по панели управления ботнетом, существует два формата распространения импланта: через MSI-установщик и через PowerShell-скрипт. Импланты генерируются автоматически с помощью панели управления командным сервером (подробности описаны в разделе Инфраструктура).

MSI-установщик

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

Установщик содержит набор данных и JavaScript-файлов, которые обновляются в каждой новой сборке, а также все необходимые исполняемые файлы Node.js для запуска этих скриптов. Один из исследованных нами образцов содержал следующие файлы:

Три последних файла в списке являются легитимными компонентами Node.js. Они устанавливаются вместе с вредоносными артефактами в каталог AppData\Local\nodejs текущего пользователя.

Проанализировав таблицу CustomAction в MSI-файле, мы выяснили механизм, с помощью которого установщик Windows запускает вредоносное ПО и внедряет в систему бот Tsundere:

После декодирования по алгоритму Base64 команда принимает следующий вид:

Команда выполняет код Node.js, который создает новый процесс Node.js для запуска JavaScript-загрузчика (в данном случае — B4jHWzJnlABB2B7). Этот дочерний процесс работает в фоновом режиме и скрыт от пользователя.

Скрипт-загрузчик

Скрипт‑загрузчик обеспечивает корректную расшифровку и запуск основного скрипта бота, отвечающего за распаковку и настройку npm. Хотя код загрузчика, как и других JavaScript‑файлов, обфусцирован, его можно привести к читаемому виду с помощью общедоступных инструментов. После запуска загрузчик определяет местоположение скрипта для распаковки и файла конфигурации бота Tsundere, расшифровывает их с помощью алгоритма AES‑256‑CBC, используя специальный ключ и вектор инициализации для конкретной сборки, и сохраняет расшифрованные файлы под новыми именами.

В JSON-файле конфигурации описаны структура каталогов и файлов, а также содержимое файлов, которые будет воссоздавать вредоносное ПО. Автор назвал этот файл config, но его основная задача — распаковать и развернуть окружение менеджера пакетов Node.js (npm) без ручной установки или загрузки. Распаковочный скрипт воссоздает эту структуру, включая каталог node_modules со всеми библиотеками, необходимыми для работы вредоносного ПО.

После подготовки окружения зловред устанавливает через npm три пакета в каталог node_modules:

  • ws — сетевая библиотека WebSocket;
  • ethers — библиотека для взаимодействия с блокчейном Ethereum;
  • pm2 — инструмент для управления процессами Node.js.
Скрипт-загрузчик, устанавливающий все необходимые инструменты для запуска бота Tsundere и его закрепления в системе

Скрипт-загрузчик, устанавливающий все необходимые инструменты для запуска бота Tsundere и его закрепления в системе

Пакет pm2 отвечает за запуск бота Tsundere и следит за его работоспособностью. Кроме того, pm2 обеспечивает закрепление в системе — он модифицирует реестр и настраивает автоматический перезапуск вредоносного процесса при входе пользователя в систему.

Модуль заражения на PowerShell

Разновидность модуля заражения в виде PowerShell‑скрипта более компактная и простая. Вместо конфигурационного файла и распаковщика, как в MSI‑установщике, он скачивает ZIP-файл node-v18.17.0-win-x64.zip с официального сайта Node.js (nodejs[.]org) и распаковывает его в каталог AppData\Local\NodeJS, по сути разворачивая среду Node.js на целевом устройстве. Далее модуль заражения расшифровывает две длинных шестнадцатеричных переменных с помощью алгоритма AES‑256‑CBC — в них содержатся скрипты бота и механизма закрепления. После расшифровки эти файлы вместе с package.json записываются на диск. Файл package.json содержит описание вредоносного пакета Node.js и необходимых зависимых библиотек, в том числе пакетов ws и ethers. В завершение модуль заражения выполняет оба скрипта: сначала скрипт закрепления, затем основной скрипт бота.

Модуль заражения на PowerShell создает файл пакета с зависимостями импланта

Модуль заражения на PowerShell создает файл пакета с зависимостями импланта

Закрепление в системе производится так же, как в MSI‑установщике: скрипт создает запись в ключе реестра HKCU:\Software\Microsoft\Windows\CurrentVersion\Run, указывающую на себя. Затем он перезаписывает свой файл новым скриптом, декодированным по алгоритму Base64. Этот новый скрипт создает новый экземпляр процесса при каждом входе пользователя, обеспечивая автозапуск бота.

Бот Tsundere

Давайте рассмотрим бот Tsundere подробнее, проанализируем его ключевые функции и способ взаимодействия с командным сервером.

Получение адреса командного сервера

Контракты Web3, или смарт-контракты, развертываются напрямую в блокчейне с помощью транзакций криптокошельков. Они могут хранить данные в переменных, которые изменяются через функции, определенные в контракте. В рассматриваемом случае ботнет Tsundere использует блокчейн Ethereum, где реализован метод setString(string _str) для изменения переменной состояния param1, в которой может храниться строковое значение. В этой переменной операторы ботнета сохраняют адреса новых командных серверов WebSocket. Таким образом злоумышленники могут свободно переключаться между серверами, при этом записи обо всех изменениях сохраняются в блокчейне.

Ботнет Tsundere полагается на две постоянные точки взаимодействия с блокчейном Ethereum:

  • Кошелек: 0x73625B6cdFECC81A4899D221C732E1f73e504a32
  • Контракт: 0xa1b40044EBc2794f207D45143Bd82a1B86156c6b

Чтобы сменить командный сервер, операторы ботнета Tsundere совершают транзакцию, записывающую в переменную состояния новый адрес. Ниже приведены сведения о транзакции от 19 августа 2025 года на сумму 0 ETH, с помощью которой был задан актуальный адрес командного сервера.

Смарт-контракт с адресом командного сервера WebSocket ботнета Tsundere

Смарт-контракт с адресом командного сервера WebSocket ботнета Tsundere

Переменная состояния имеет фиксированную длину 32 байта, в ней хранится строка длиной 24 байта (см. элемент [2] на скриншоте выше). После преобразования этой строки из шестнадцатеричного представления в ASCII можно прочитать новый адрес командного сервера WebSocket: ws[:]//185.28.119[.]179:1234.

Чтобы получить адрес командного сервера, бот обращается к общедоступным конечным точкам, предоставляющим API удаленного вызова процедур (RPC) для взаимодействия с узлами блокчейна Ethereum. В начале скрипта бот вызывает функцию fetchAndUpdateIP, которая проверяет список поставщиков RPC-интерфейсов. Для каждого поставщика он анализирует транзакции, связанные с адресом контракта и владельцем кошелька, после чего получает строку из переменной состояния, содержащую адрес WebSocket, как уже было описано ранее.

Вредоносный код для получения адреса командного сервера из смарт-контракта

Вредоносный код для получения адреса командного сервера из смарт-контракта

Бот Tsundere проверяет, что адрес командного сервера является корректным URL WebSocket и начинается с ws:// или wss://, после чего устанавливает полученную строку в качестве адреса сервера. Заполучив URL-адрес нового сервера, бот сначала анализирует региональные настройки устройства, чтобы избежать заражения систем в странах СНГ. Если устройство не относится к этому региону, бот пытается установить соединение с командным сервером через WebSocket и настраивает необходимые обработчики событий для получения и отправки данных, а также для контроля состояния соединения, включая обработку ошибок и закрытие сокета.

Обработчики коммуникаций, прописанные в боте

Обработчики коммуникаций, прописанные в боте

Коммуникация

Связь между клиентом (ботом Tsundere) и командным сервером WebSocket устроена следующим образом:

  1. Бот Tsundere устанавливает WebSocket-соединение с полученным адресом командного сервера.
  2. Сразу после подключения сервер передает AES-ключ.
  3. Бот отправляет пустую строку в качестве подтверждения получения ключа.
  4. Затем сервер передает вектор инициализации (IV), после чего обмен данными переходит полностью на зашифрованный канал.
    Все последующие сообщения передаются уже в зашифрованном виде.
  5. Бот отправляет сведения об операционной системе зараженной машины, включая MAC-адрес, объем оперативной памяти, характеристики видеочипа и другие параметры. Эти данные также используются для формирования уникального идентификатора (UUID).
  6. В ответ командный сервер отправляет JSON-файл, подтверждающий подключение и активность бота.
  7. После установления защищенного канала клиент и сервер могут свободно обмениваться информацией.
    1. Для поддержания соединения каждую минуту выполняется обмен сигнальными сообщениями ping/pong.
    2. Бот отправляет зашифрованные ответы в рамках этого обмена, поддерживая непрерывную коммуникацию.
Процесс обмена данными бота Tsundere с командным сервером через WebSocket

Процесс обмена данными бота Tsundere с командным сервером через WebSocket

Соединения не проходят никакой дополнительной аутентификации, то есть можно подделать клиент и успешно подключиться к серверу.

Как уже упоминалось, клиент каждую минуту отправляет на командный сервер зашифрованное ping‑сообщение и получает pong‑ответ. Такой обмен позволяет панели управления ботнетом поддерживать список активных ботов.

Функциональность

Бот Tsundere может получать от командного сервера динамический JavaScript‑код. Когда сервер отправляет сообщение с ID=1, оно интерпретируется как новая функция и выполняется. Результат операции возвращается серверу через специальную функцию serverSend, которая передает вывод в виде зашифрованного JSON‑объекта. Способность бота Tsundere интерпретировать код делает его относительно простым, но при этом гибким вредоносным инструментом.

Код бота Tsundere для интерпретации функций, поступивших с командного сервера

Код бота Tsundere для интерпретации функций, поступивших с командного сервера

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

Инфраструктура

Бот Tsundere использует WebSocket в качестве основного протокола для взаимодействия с командным сервером. На момент написания статьи, как уже упоминалось, вредоносное ПО взаимодействовало с WebSocket‑сервером по адресу 185.28.119[.]179 и, как показали наши тесты, сервер корректно реагировал на установление соединений с ботами.

Ниже в таблице перечислены IP‑адреса и порты, извлеченные из списка URL‑адресов:

IP-адрес Порт Первое появление (обновление контракта) ASN
185.28.119[.]179 1234 19 августа 2025 г. AS62005
196.251.72[.]192 1234 3 августа 2025 г. AS401120
103.246.145[.]201 1234 14 июля 2025 г. AS211381
193.24.123[.]68 3011 21 июня 2025 г. AS200593
62.60.226[.]179 3001 4 мая 2025 г. AS214351

Торговая площадка и панель управления

Как ни один бизнес не может существовать без торговой площадки, так и ботнеты не могут функционировать без панели управления. Ботнет Tsundere имеет собственную панель управления и торговую площадку, объединенные в единый фронтенд.

Страница входа в панель управления ботнетом Tsundere

Страница входа в панель управления ботнетом Tsundere

Панель управления ботнетом называется Tsundere Netto (версия 2.4.4), и, что любопытно, в ней открыта система регистрации. Любой пользователь, открывший форму входа, может зарегистрироваться и получить доступ к панели управления и ее вкладкам:

  • Bots — панель мониторинга с указанием количества ботов, подконтрольных пользователю.
  • Settings — пользовательские настройки и функции управления.
  • Build — при наличии действующей лицензии пользователь может создавать новых ботов при помощи двух упомянутых выше способов (MSI и PowerShell).
  • Market — торговая площадка: через нее пользователи могут продвигать собственных ботов и предлагать услуги и функции другим злоумышленникам. Каждую сборку с определенным набором возможностей можно выставить на продажу.
  • Monero wallet — криптовалютный кошелек для внесения и вывода средств.
  • Socks proxy — функция, позволяющая пользователю пропускать трафик через своих ботов, используя их в качестве прокси.
Панель управления, система сборки и торговая площадка ботнета Tsundere

Панель управления, система сборки и торговая площадка ботнета Tsundere

Для каждой сборки генерируется уникальный идентификатор (build ID), который встраивается в имплант и передается на командный сервер после заражения. Этот идентификатор привязан к пользователю, создавшему сборку. Как показали наше исследование и анализ других URL‑адресов, обнаруженных в реальных инцидентах, сборки создаются через панель управления и могут быть загружены с URL-адреса вида

На момент написания этой статьи на панели отображалось от 90 до 115 ботов, одновременно подключенных к командному серверу.

Атрибуция

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

Использование текста на русском языке в коде

Использование текста на русском языке в коде

Кроме того, наш анализ выявил связь между ботнетом Tsundere и 123 Stealer — стилером на C++, распространяемым на теневых форумах за 120 долл. США в месяц. Панели управления обоих зловредов используют один и тот же сервер: основной домен выполняет роль фронтенда для панели управления 123 Stealer, а поддомен idk. отведен для ботнета Tsundere.

Панель управления 123 Stealer, работающая на той же инфраструктуре, что и Tsundere

Панель управления 123 Stealer, работающая на той же инфраструктуре, что и Tsundere

Проанализировав имеющиеся данные, мы можем связать обе угрозы с русскоязычным злоумышленником, известным как koneko. Ранее активность koneko наблюдалась на даркнет-форуме, где этот пользователь распространял 123 Stealer и другие вредоносные программы, например бэкдоры. Анализ одного из бэкдоров не выявил прямой связи с Tsundere, однако в нем наблюдаются черты сходства: он также реализован на Node.js, а его модули заражения используют PowerShell и MSI. До того как правоохранительные органы закрыли форум, в профиле koneko было указано «старший разработчик node-зловредов» (node malware senior), что подтверждает соответствующий опыт создателей ботнета.

Заключение

Мы предполагаем, что ботнет Tsundere является очередным пополнением в арсенале ранее известного злоумышленника. Бот на базе Node.js является эволюцией атаки, замеченной в октябре прошлого года. Он отличается не только новой стратегией, но и новой бизнес-моделью. Заражение может происходить через файлы MSI или PowerShell, что дает злоумышленникам гибкость в маскировке установщиков. Точкой входа могут быть как фишинговые атаки, так и другие методы проникновения, что делает угрозу особенно серьезной.

Кроме того, в ботнете реализована новая техника, набирающая популярность: использование смарт-контрактов Web3 для размещения адресов командных серверов, что повышает устойчивость инфраструктуры. Вероятный автор ботнета, koneko, также занимается распространением другого вредоносного ПО, такого как 123 Stealer. Это позволяет предположить, что активность ботнета Tsundere в ближайшие месяцы, скорее всего, будет нарастать, а не снижаться. Мы рекомендуем внимательно отслеживать эту угрозу и проявлять повышенную бдительность в отношении любых связанных с ней инцидентов.

Индикаторы компрометации

Дополнительные индикаторы компрометации доступны клиентам сервиса аналитических отчетов об APT-угрозах. Для получения более подробной информации свяжитесь с нами по адресу intelreports@kaspersky.com.

Хэш-суммы файлов
235A93C7A4B79135E4D3C220F9313421
760B026EDFE2546798CDC136D0A33834
7E70530BE2BFFCFADEC74DE6DC282357
5CC5381A1B4AC275D221ECC57B85F7C3
AD885646DAEE05159902F32499713008
A7ED440BB7114FAD21ABFA2D4E3790A0
7CF2FD60B6368FBAC5517787AB798EA2
E64527A9FF2CAF0C2D90E2238262B59A
31231FD3F3A88A27B37EC9A23E92EBBC
FFBDE4340FC156089F968A3BD5AA7A57
E7AF0705BA1EE2B6FBF5E619C3B2747E
BFD7642671A5788722D74D62D8647DF9
8D504BA5A434F392CC05EBE0ED42B586
87CE512032A5D1422399566ECE5E24CF
B06845C9586DCC27EDBE387EAAE8853F
DB06453806DACAFDC7135F3B0DEA4A8F

Путь к файлам
%APPDATA%\Local\NodeJS

Домены и IP-адреса
ws://185.28.119[.]179:1234
ws://196.251.72[.]192:1234
ws://103.246.145[.]201:1234
ws://193.24.123[.]68:3011
ws://62.60.226[.]179:3001

Криптовалютные кошельки
Примечание. Эти кошельки изменяли адрес командного сервера в смарт-контракте.
0x73625B6cdFECC81A4899D221C732E1f73e504a32
0x10ca9bE67D03917e9938a7c28601663B191E4413
0xEc99D2C797Db6E0eBD664128EfED9265fBE54579
0xf11Cb0578EA61e2EDB8a4a12c02E3eF26E80fc36
0xdb8e8B0ef3ea1105A6D84b27Fc0bAA9845C66FD7
0x10ca9bE67D03917e9938a7c28601663B191E4413
0x52221c293a21D8CA7AFD01Ac6bFAC7175D590A84
0x46b0f9bA6F1fb89eb80347c92c9e91BDF1b9E8CC

Tsundere — новый ботнет на базе Node.js, использующий блокчейн

Ваш e-mail не будет опубликован. Обязательные поля помечены *

 

Отчеты

ToddyCat — ваш скрытый почтовый ассистент. Часть 1

Эксперты «Лаборатории Касперского» разбирают атаки APT ToddyCat через корпоративную электронную почту. Изучаем новую версию TomBerBil, инструменты TCSectorCopy и XstReader, а также способы кражи токенов доступа из Outlook.

Криптоафера группы BlueNoroff: «призрачные» инвестиции и фиктивные рабочие предложения

Эксперты команды GReAT проанализировали кампании GhostCall и GhostHire APT-группы BlueNoroff: несколько цепочек вредоносного ПО для macOS, поддельные клиенты Zoom и Microsoft Teams, а также изображения, улучшенные с помощью ChatGPT.

Mem3nt0 mori – Hacking Team снова с нами!

Исследователи «Лаборатории Касперского» впервые обнаружили шпионское ПО Dante, разработанное Memento Labs (бывшей Hacking Team) в дикой природе и нашли его связь с APT ForumTroll.