<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: user32</title>
    <description>The latest articles on DEV Community by user32 (@user32).</description>
    <link>https://dev.to/user32</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3747806%2F790bbc94-ee16-4a5a-b384-bb24564a75a5.png</url>
      <title>DEV Community: user32</title>
      <link>https://dev.to/user32</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/user32"/>
    <language>en</language>
    <item>
      <title>7.8 Million Free DDoS Amplifiers, Courtesy of State Censorship Infrastructure</title>
      <dc:creator>user32</dc:creator>
      <pubDate>Sun, 08 Feb 2026 03:25:11 +0000</pubDate>
      <link>https://dev.to/user32/78-million-free-ddos-amplifiers-courtesy-of-state-censorship-infrastructure-14ba</link>
      <guid>https://dev.to/user32/78-million-free-ddos-amplifiers-courtesy-of-state-censorship-infrastructure-14ba</guid>
      <description>&lt;h4&gt;
  
  
  Nation state filtering systems that inject block pages can also reflect and amplify traffic at internet scale.
&lt;/h4&gt;

&lt;p&gt;On February 7, 2026, I ran internet-wide scans and found millions of censorship and deep packet inspection middleboxes that send real HTTP responses to invalid TCP traffic with no handshake. That single design shortcut turns content filtering infrastructure into a pool of TCP reflected amplification DDoS reflectors.&lt;/p&gt;

&lt;p&gt;This is not a flaw in TCP. TCP is doing what it is supposed to do. The break happens when middleboxes violate TCP session rules to enforce filtering.&lt;/p&gt;

&lt;p&gt;Key findings include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scale:&lt;/strong&gt; 7,800,378 distinct reflector IPs observed in one scan&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Worst case:&lt;/strong&gt; 2,160,868x maximum amplification observed, matching routing loop scenarios described in prior research&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Behavior changes by blocked domain:&lt;/strong&gt; the hostname you probe changes which middleboxes respond, how often they retransmit, and how large the responses are&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hard to filter:&lt;/strong&gt; the reflected traffic looks like plausible HTTP coming from millions of legitimate IPs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fixes exist:&lt;/strong&gt; but many operators would have to trade filtering aggressiveness for TCP correctness&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Why this exists
&lt;/h2&gt;

&lt;p&gt;Classic amplification is usually a UDP problem because UDP is connectionless and easy to spoof. TCP should resist spoofed reflection because a connection normally requires a three-way handshake.&lt;/p&gt;

&lt;p&gt;Censorship middleboxes break that assumption. Many are built to spot a blocked hostname inside HTTP and immediately inject a block page, even if they have not seen a valid TCP handshake or a valid sequence state. If a network still allows source address spoofing, the injected response can be reflected to a victim.&lt;/p&gt;




&lt;h2&gt;
  
  
  Prior work
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;2021:&lt;/strong&gt; &lt;a href="https://www.usenix.org/conference/usenixsecurity21/presentation/bock" rel="noopener noreferrer"&gt;Bock, Alaraj, and collaborators&lt;/a&gt; (University of Maryland and University of Colorado Boulder) demonstrated TCP reflected amplification via middleboxes at scale, including extreme amplification from routing loops. The work appeared at USENIX Security 2021 and received a Distinguished Paper Award.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2022:&lt;/strong&gt; &lt;a href="https://www.akamai.com/blog/security/tcp-middlebox-reflection" rel="noopener noreferrer"&gt;Akamai reported&lt;/a&gt; confirmed in-the-wild attacks using this technique.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2022:&lt;/strong&gt; &lt;a href="https://www.shadowserver.org/news/over-18-8-million-ips-vulnerable-to-middlebox-tcp-reflection-ddos-attacks/" rel="noopener noreferrer"&gt;Shadowserver scanned&lt;/a&gt; IPv4 and reported 18.8 million IPs vulnerable to middlebox TCP reflection.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2026:&lt;/strong&gt; My scans show the population remains large, and the routing loop worst-case behavior still exists.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Scan methodology and results
&lt;/h2&gt;

&lt;p&gt;I ran multiple internet-wide scans using a custom module and captured every response on a separate listener. Each probe used PSH+ACK flags (no SYN and no handshake), carried a small HTTP request in the payload, and targeted port 8000 to show that inspection is not limited to ports 80 or 443. The probes carried an HTTP request that included a blocked hostname in the &lt;code&gt;Host&lt;/code&gt; header. Different hostnames trigger different filtering policies and therefore different middlebox populations.&lt;/p&gt;

&lt;p&gt;The example payload was simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET / HTTP/1.1
Host: wikileaks.org

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Scan comparison
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;youporn.com&lt;/th&gt;
&lt;th&gt;wikileaks.org&lt;/th&gt;
&lt;th&gt;telegram.org&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total reflectors&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;7,800,378&lt;/td&gt;
&lt;td&gt;6,761,041&lt;/td&gt;
&lt;td&gt;6,713,687&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total packets received&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;13,982,071&lt;/td&gt;
&lt;td&gt;13,570,929&lt;/td&gt;
&lt;td&gt;7,457,830&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total bytes received&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1.84 GB&lt;/td&gt;
&lt;td&gt;1.73 GB&lt;/td&gt;
&lt;td&gt;1.20 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Average amplification&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;3.30x&lt;/td&gt;
&lt;td&gt;3.47x&lt;/td&gt;
&lt;td&gt;2.46x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Max amplification&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1,131,487x&lt;/td&gt;
&lt;td&gt;2,160,868x&lt;/td&gt;
&lt;td&gt;103,255x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Packets per reflector&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1.79&lt;/td&gt;
&lt;td&gt;2.01&lt;/td&gt;
&lt;td&gt;1.11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Average bytes per packet&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;141&lt;/td&gt;
&lt;td&gt;136&lt;/td&gt;
&lt;td&gt;172&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Request size&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;77 bytes&lt;/td&gt;
&lt;td&gt;79 bytes&lt;/td&gt;
&lt;td&gt;78 bytes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Analysis by hostname
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Pornography blocks produce the largest footprint
&lt;/h3&gt;

&lt;p&gt;The youporn.com probe produced the largest reflector population: 7.8 million distinct IPs. This aligns with the fact that pornography is widely blocked across many regions, which broadens the number of networks with matching rules.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fieikswpnrgofua37d5tp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fieikswpnrgofua37d5tp.png" alt="Terminal output from the youporn.com scan" width="650" height="562"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Terminal output from the youporn.com scan showing 13.98 million packets from 7.8 million unique IPs, plus TCP flag statistics.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. WikiLeaks blocks retransmit more frequently
&lt;/h3&gt;

&lt;p&gt;The standout metric is packets per reflector:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;wikileaks.org: 2.01&lt;/li&gt;
&lt;li&gt;youporn.com: 1.79&lt;/li&gt;
&lt;li&gt;telegram.org: 1.11&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A value above 2 means many devices send a block page, then retransmit when no ACK arrives because the session never existed. In this dataset, political and whistleblower filtering shows higher retransmission rates.&lt;/p&gt;

&lt;p&gt;That retransmission behavior explains why wikileaks.org has the highest average amplification (3.47x) and also hit the largest maximum amplification (2,160,868x).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fogr38vj28lto0pn2zzk2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fogr38vj28lto0pn2zzk2.png" alt="Full results for the wikileaks.org scan" width="651" height="734"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Full scan results for the wikileaks.org payload: 6,761,041 reflectors, 13.57 million packets, 1.73 GB reflected, max amplification above 2.16 million.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Telegram blocks generate larger responses
&lt;/h3&gt;

&lt;p&gt;The telegram.org probe produced fewer total packets and the lowest packets per reflector, but the largest average bytes per packet (172). Many Telegram block pages appear more complex and include branding elements.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd4vv53973e6iibb66tqt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd4vv53973e6iibb66tqt.png" alt="Full results for the telegram.org scan" width="636" height="594"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Extreme amplification cases
&lt;/h2&gt;

&lt;p&gt;All three probes found reflectors above 100,000x amplification. Two probes found reflectors above 1,000,000x.&lt;/p&gt;

&lt;p&gt;These extremes are consistent with routing loop behavior described in academic work. In that failure mode, injected packets re-enter filtering paths and trigger repeated injections. If the loop does not terminate quickly, the response traffic grows until something breaks.&lt;/p&gt;




&lt;h2&gt;
  
  
  Response traffic characteristics
&lt;/h2&gt;

&lt;p&gt;Two observations from the response patterns:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Different vendors and configurations behave differently. This shows up in retransmission rates, response sizes, and how devices close the connection.&lt;/li&gt;
&lt;li&gt;Some devices emit non-standard TCP flag patterns. Reserved bits and other anomalies act as vendor fingerprints, and some appear more often for particular content categories.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;High-level response patterns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;For youporn.com and wikileaks.org, most responses followed "send block page, then close" or "send block page and leave hanging" patterns.&lt;/li&gt;
&lt;li&gt;For telegram.org, many responses left the phantom connection open, suggesting stateful behavior even though no real connection exists.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Example block pages
&lt;/h2&gt;

&lt;p&gt;These are examples of actual responses to invalid TCP traffic carrying a blocked hostname.&lt;/p&gt;

&lt;p&gt;Kuwait STC block page&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmod7ubr4amkpau57qhdj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmod7ubr4amkpau57qhdj.png" alt="Kuwait STC block page" width="800" height="592"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Uzbekistan (ogohlantirish.uz) block page&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdo77nq144ki0c1gkd34e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdo77nq144ki0c1gkd34e.png" alt="Uzbekistan (ogohlantirish.uz) block page" width="800" height="575"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Qatar (censor.qa) block page&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb9jspm30b8v2yicbryoa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb9jspm30b8v2yicbryoa.png" alt="Qatar (censor.qa) block page" width="800" height="629"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;UAE (lighthouse.du.ae) block page&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvba4zb8gkmx2f1flai15.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvba4zb8gkmx2f1flai15.png" alt="UAE (lighthouse.du.ae) block page" width="800" height="674"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Attack traffic characteristics
&lt;/h2&gt;

&lt;p&gt;In a controlled test (using only 7,000,000 pps for under 30 seconds), reflected traffic quickly rose, nearing 100 Gbps. The DSTAT stalled during the run, so the peak only appeared after the test stopped, implying the actual rate was higher than what DSTAT recorded. The receiving monitoring stack saturated before the reflector pool.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv12jgpnrshrafb55ndu2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv12jgpnrshrafb55ndu2.png" alt="DSTAT from controlled test" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Two practical consequences for defenders:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Source-based blocking is ineffective.&lt;/strong&gt; The traffic comes from large numbers of legitimate IPs tied to governments and ISPs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The payload resembles normal HTTP.&lt;/strong&gt; It is harder to classify than classic UDP amplification replies.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Filtering design impacts amplification power
&lt;/h2&gt;

&lt;p&gt;Filtering design choices map directly to amplification capability:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A device that drops traffic or sends a small reset is a weak reflector&lt;/li&gt;
&lt;li&gt;A device that injects a full multi-kilobyte HTML block page is a strong reflector&lt;/li&gt;
&lt;li&gt;A device that retransmits that block page is stronger&lt;/li&gt;
&lt;li&gt;A device caught in a routing loop can become an extreme outlier&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Countries that invest heavily in national filtering also operate some of the most capable reflector infrastructure as a side effect.&lt;/p&gt;




&lt;h2&gt;
  
  
  Comparison to UDP amplification
&lt;/h2&gt;

&lt;p&gt;This attack has several advantages over classic UDP amplification:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Many unique sources:&lt;/strong&gt; Millions of IPs can participate, which makes filtering and attribution harder&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Legitimate-looking responses:&lt;/strong&gt; Appears as ordinary HTTP from real networks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trigger-dependent:&lt;/strong&gt; The filtering category you hit changes which infrastructure answers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not tied to one port:&lt;/strong&gt; Almost all middleboxes inspect beyond TCP 80&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Mitigation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Network operators and ISPs
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Stop source spoofing at the edge with BCP38 and BCP84 style egress filtering. If spoofing fails, reflection fails.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Middlebox operators
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Do not inject responses outside a valid TCP session. Only inject after a full handshake and validated sequence state.&lt;/li&gt;
&lt;li&gt;Ensure injected traffic follows normal IP forwarding behavior, including TTL handling, so routing loops terminate.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  DDoS mitigation teams
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Treat unsolicited HTTP-like traffic as suspect when it arrives at scale from diverse sources.&lt;/li&gt;
&lt;li&gt;Akamai has recommended watching for anomalies such as SYN packets that carry payload data as a practical signal in some environments.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Governments
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Filtering infrastructure can be exploited both outward and inward. Fixing it requires making it TCP-correct and loop-free, even if that reduces filtering flexibility.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;On February 7, 2026, my scans observed 7.8 million distinct IPs willing to reflect HTTP responses over TCP without a handshake. The top-end behavior reached 2.16 million times amplification from a single reflector, consistent with the routing loop failure mode described in prior research.&lt;/p&gt;

&lt;p&gt;This is not a new vulnerability. It is a design shortcut that has scaled up as censorship infrastructure expanded.&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>networking</category>
      <category>learning</category>
      <category>backend</category>
    </item>
    <item>
      <title>React2Shell in the Wild: Tracking and Disrupting Scanner Pipelines</title>
      <dc:creator>user32</dc:creator>
      <pubDate>Mon, 02 Feb 2026 15:53:21 +0000</pubDate>
      <link>https://dev.to/user32/react2shell-cve-2025-55182-in-the-wild-analyzing-probing-chains-and-infrastructure-fingerprints-42f3</link>
      <guid>https://dev.to/user32/react2shell-cve-2025-55182-in-the-wild-analyzing-probing-chains-and-infrastructure-fingerprints-42f3</guid>
      <description>&lt;h2&gt;
  
  
  What is React2Shell and why are scanners so noisy?
&lt;/h2&gt;

&lt;p&gt;React2Shell (CVE-2025-55182) is described as a pre-authentication remote code execution vulnerability in React Server Components. The issue affects specific React Server Components-related packages and versions where server function endpoints may unsafely deserialize attacker-controlled data from HTTP requests.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Affected versions (as published):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React Server Components versions 19.0.0, 19.1.0, 19.1.1, and 19.2.0&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Fixed versions (as published):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;19.0.1, 19.1.2, and 19.2.1&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because React Server Components are widely used downstream (notably via frameworks like Next.js), downstream advisories and patched releases rapidly followed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why the Internet got loud:&lt;/strong&gt; scanners do not need credentials, and they only need an HTTP surface that hits a server function endpoint path. Many deployments also expose non-standard ports (dev, preview, internal, and misconfigured edge paths), so "enumerate everything and spray a probe" works.&lt;/p&gt;




&lt;h2&gt;
  
  
  Telemetry source: a React2Shell-oriented honeypot with rule-based classification
&lt;/h2&gt;

&lt;p&gt;The honeypot used rule matching to classify inbound probes. React2Shell-specific probes dominated the sample window, with the honeypot rule &lt;code&gt;react2shell_probe_root&lt;/code&gt; at 2222 hits and &lt;code&gt;react2shell_probe_next&lt;/code&gt; also significant. A background baseline of common recon (.env, .git/config, robots.txt) was present, but secondary in volume.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcv72ikdx1r2tu1jy981b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcv72ikdx1r2tu1jy981b.png" alt=" " width="800" height="318"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Figure:&lt;/strong&gt; Matched rule frequency on the honeypot, showing React2Shell probes (&lt;code&gt;react2shell_probe_root&lt;/code&gt; at 2222 hits and a large &lt;code&gt;react2shell_probe_next&lt;/code&gt; component) outweighing generic recon (.env, .git/config, robots.txt, etc.).&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Initial scanning waves and endpoint selection
&lt;/h2&gt;

&lt;p&gt;Two early views illustrate bulk scanning behavior. The notable signals are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Consistent use of HTTP POST&lt;/li&gt;
&lt;li&gt;Targeting both &lt;code&gt;/&lt;/code&gt; and &lt;code&gt;/_next&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Payloads delivered as &lt;code&gt;multipart/form-data&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Fast repetition, indicative of automated tooling rather than manual testing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftd52wdpm4mo59ythpwxu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftd52wdpm4mo59ythpwxu.png" alt=" " width="800" height="749"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Figure:&lt;/strong&gt; High volume request list showing repeated React2Shell-style POST probes, consistent with automated scanning against the honeypot.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdw92qjs5thedqmsjcgzr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdw92qjs5thedqmsjcgzr.png" alt=" " width="800" height="220"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Figure:&lt;/strong&gt; Additional high volume request list showing repeated POST probes against &lt;code&gt;/_next&lt;/code&gt;, indicating the scanner targets multiple framework-specific paths.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;From a defensive logging perspective, the &lt;code&gt;/_next&lt;/code&gt; targeting matters because it immediately suggests a Next.js-aware scan strategy rather than generic "POST /" spraying.&lt;/p&gt;




&lt;h2&gt;
  
  
  Honeypot filtering via deterministic command execution
&lt;/h2&gt;

&lt;p&gt;The clearest "are you real" validation probe used a small deterministic computation executed server-side. The payload attempted to run a shell expression that evaluates &lt;code&gt;41*271&lt;/code&gt;, which equals &lt;code&gt;11111&lt;/code&gt;. The use of a highly recognizable result (11111) is typical: it is easy to check automatically and avoids issues with whitespace or localization.&lt;/p&gt;

&lt;p&gt;Observed attributes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The request body included React2Shell-style structures like &lt;code&gt;resolved_model&lt;/code&gt; and &lt;code&gt;__proto__&lt;/code&gt; references, consistent with known exploit patterns.&lt;/li&gt;
&lt;li&gt;The payload executed a command via Node.js facilities (&lt;code&gt;process.mainModule.require('child_process')...&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;The probe also used a redirect-style construct (&lt;code&gt;NEXT_REDIRECT&lt;/code&gt;) to force a realistic-looking response flow, which helps filter naive traps that return static error pages.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhgsqg1zt5zy0lgl5gsk3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhgsqg1zt5zy0lgl5gsk3.png" alt=" " width="800" height="215"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Figure:&lt;/strong&gt; Pre-probe validation from 45.156.87.99 using an RCE check that echoes a math result (41*271 = 11111) and attempts to blend into expected framework behavior by triggering a redirect-style response.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fumczk0isluif8p7f1p4y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fumczk0isluif8p7f1p4y.png" alt=" " width="800" height="352"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Figure:&lt;/strong&gt; ASN and hosting provider identified for 45.156.87.99, which ran the honeypot filtering probe.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  How scanners confirm execution before escalation
&lt;/h3&gt;

&lt;p&gt;Many decoys respond with static templates or obvious canned content. A deterministic arithmetic check is a cheap way to confirm "my payload executed and I got output that depends on my input." If your honeypot returns a plausible redirect chain and a correct computed value, scanners that use a two-stage pipeline will often escalate immediately, which is exactly what happened in other samples.&lt;/p&gt;




&lt;h2&gt;
  
  
  Second stage payload delivery (dropper behavior)
&lt;/h2&gt;

&lt;p&gt;After the validation step, the next behavior observed was a staged payload retrieval:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A follow-up exploit payload attempted to fetch a resource from an attacker-controlled HTTP endpoint.&lt;/li&gt;
&lt;li&gt;The response body was piped into a local file on disk.&lt;/li&gt;
&lt;li&gt;The file permissions were modified to make it executable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is classic "RCE to installer" behavior. The attacker is not interested in the application itself; they want a persistent or monetizable agent.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpm5znjywcqw9pte78hy6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpm5znjywcqw9pte78hy6.png" alt=" " width="800" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Figure:&lt;/strong&gt; Second stage payload from 143.20.64.84 that attempts to download a file from a remote host and write it to disk (&lt;code&gt;/dev/lrt&lt;/code&gt;), then chmod it executable.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw0tbu8zomzruqf249v71.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw0tbu8zomzruqf249v71.png" alt=" " width="800" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Figure:&lt;/strong&gt; ASN and hosting provider identified for 143.20.64.84, the host used in the second stage payload chain.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Observed dropper IOCs worth extracting
&lt;/h3&gt;

&lt;p&gt;Even without reproducing full exploit strings, the operational intent is clear and yields useful defender indicators:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Suspicious file targets: &lt;code&gt;/dev/lrt&lt;/code&gt;, &lt;code&gt;/etc/lrt&lt;/code&gt;, and execution references to &lt;code&gt;/lrt&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;A recurring remote path pattern: &lt;code&gt;/nuts/poop&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Repeated use of &lt;code&gt;process.mainModule.require(...)&lt;/code&gt; to access &lt;code&gt;http&lt;/code&gt;, &lt;code&gt;fs&lt;/code&gt;, and &lt;code&gt;child_process&lt;/code&gt; from within the injected context&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Command execution beyond payload retrieval (rudimentary defense evasion)
&lt;/h2&gt;

&lt;p&gt;Another request in the same general pattern attempted to kill a process named &lt;code&gt;watcher&lt;/code&gt; via &lt;code&gt;pkill -9 watcher&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That suggests one of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A real-world expectation that some environments run a process with that name (monitoring agent, sandbox tool, a competitor miner, or a honeypot component).&lt;/li&gt;
&lt;li&gt;A simple "kill obvious monitoring" step copied from prior campaigns.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fftsfkc8er1klkdpjm5al.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fftsfkc8er1klkdpjm5al.png" alt=" " width="800" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Figure:&lt;/strong&gt; React2Shell payload attempt from 195.3.222.78 issuing a command to terminate a process named &lt;code&gt;watcher&lt;/code&gt;, indicating post-exploitation command execution and possible defense evasion.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F893m5khq94ylu8l4cus4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F893m5khq94ylu8l4cus4.png" alt=" " width="800" height="322"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Figure:&lt;/strong&gt; ASN and hosting provider identified for 195.3.222.78, the host that attempted the &lt;code&gt;pkill -9 watcher&lt;/code&gt; step.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Same toolkit, different node, different staging server
&lt;/h2&gt;

&lt;p&gt;A near-identical second stage download attempt came from 87.121.84.24, but it retrieved the payload from a different host (77.110.115.3) and wrote to a different location (&lt;code&gt;/etc/lrt&lt;/code&gt;) before chmod. This can indicate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multiple staging servers for redundancy&lt;/li&gt;
&lt;li&gt;A/B testing to see what file paths survive&lt;/li&gt;
&lt;li&gt;A split between "scanner" infrastructure and "payload CDN" infrastructure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0owl1xmo300wfj7u69uc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0owl1xmo300wfj7u69uc.png" alt=" " width="800" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Figure:&lt;/strong&gt; React2Shell dropper variant from 87.121.84.24 fetching a payload from 77.110.115.3 and writing it to &lt;code&gt;/etc/lrt&lt;/code&gt; before chmod.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fktg3hx6r07wki8p50v6t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fktg3hx6r07wki8p50v6t.png" alt=" " width="800" height="322"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Figure:&lt;/strong&gt; ASN and hosting provider identified for 87.121.84.24, one of the core scanner nodes in the observed cluster.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Infrastructure inference from the payload hosts
&lt;/h3&gt;

&lt;p&gt;At this point, the data supports an operator that maintains at least:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One or more scanner sources (hitting targets)&lt;/li&gt;
&lt;li&gt;One or more payload servers (hosting the retrieved binary)&lt;/li&gt;
&lt;li&gt;A separate reporting endpoint (covered later)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Grouping activity by request header fingerprinting
&lt;/h2&gt;

&lt;p&gt;The strongest clustering feature in this dataset is a pair of custom request identifiers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;x-nextjs-request-id: poop1234&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;x-nextjs-html-request-id: ilovepoop_&amp;lt;number&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These appear repeatedly across multiple requests and multiple source IPs, even as user agents vary widely (macOS Chrome 134, Android Chrome 127, ChromeOS, Linux Chrome 134).&lt;/p&gt;

&lt;p&gt;That combination is not something real browsers emit by default. It looks like the actor's scanner is stamping a constant "tool id" and a per-request numeric id.&lt;/p&gt;

&lt;p&gt;Two later screenshots show the same header scheme reappearing from additional IPs, reinforcing that the operator is rotating sources while keeping the same tooling fingerprint.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F34v24nzjxceexnowv5nm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F34v24nzjxceexnowv5nm.png" alt=" " width="800" height="281"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Figure:&lt;/strong&gt; Follow-on attempt from 82.23.183.131 that matches the same tool family based on the reused &lt;code&gt;x-nextjs-request-id&lt;/code&gt; value and consistent dropper behavior.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffbf9jmuo9htxe15zijav.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffbf9jmuo9htxe15zijav.png" alt=" " width="800" height="245"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Figure:&lt;/strong&gt; Follow-on attempt from 45.194.92.20 using the same tool headers and a payload that attempts to execute &lt;code&gt;/lrt&lt;/code&gt; in the background, further confirming toolkit reuse across source IPs.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Fingerprinting the operator from the dataset
&lt;/h3&gt;

&lt;p&gt;In this scenario, to determine if a single operator is responsible, ignore the geolocation data and focus on these persistent artifacts:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Header fingerprints&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Presence of &lt;code&gt;next-action: x&lt;/code&gt; plus the two &lt;code&gt;x-nextjs-*&lt;/code&gt; ids with distinctive constant values.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Multipart body shapes&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Similar &lt;code&gt;multipart/form-data&lt;/code&gt; structure with small fixed content lengths for command-only payloads and larger for download actions.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Payload semantic patterns&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The same file paths and remote resource path segments (&lt;code&gt;/nuts/poop&lt;/code&gt;, &lt;code&gt;lrt&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Response handling strategy&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reuse of redirect behavior or other framework-like artifacts to keep responses consistent.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here the IP address alone is weak because these samples show deliberate rotation.&lt;/p&gt;




&lt;h2&gt;
  
  
  A separate actor identified: direct reverse shell attempt
&lt;/h2&gt;

&lt;p&gt;Not all probes followed the staged dropper path. One attempt tried to establish an interactive shell channel back to the source via a TCP socket, by spawning &lt;code&gt;/bin/sh&lt;/code&gt; and wiring stdin/stdout/stderr through a network connection.&lt;/p&gt;

&lt;p&gt;This is typical of operators who want immediate control rather than a deployed agent.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fafmy6akmk05nunuf6u5o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fafmy6akmk05nunuf6u5o.png" alt=" " width="800" height="342"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Figure:&lt;/strong&gt; Separate React2Shell attempt from 193.142.147.209 using a reverse shell-style payload (spawn shell, connect back on TCP port 12323).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9ubqe8m037itooue04as.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9ubqe8m037itooue04as.png" alt=" " width="800" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Figure:&lt;/strong&gt; ASN and hosting provider identified for 193.142.147.209, associated with the reverse shell-style attempt.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This attempt did not display the same custom request id headers seen in the &lt;code&gt;poop1234&lt;/code&gt; cluster, so it is a reasonable candidate for a different operator or toolkit.&lt;/p&gt;




&lt;h2&gt;
  
  
  IP and ASN analysis: roles, providers, and relationships
&lt;/h2&gt;

&lt;p&gt;The collected IPs fall into two broad categories:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scanner and execution sources:&lt;/strong&gt; the hosts that directly sent exploit-shaped requests to the honeypot.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Support infrastructure:&lt;/strong&gt; payload servers and result collection endpoints.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Core tool family (the request id cluster)
&lt;/h3&gt;

&lt;p&gt;Observed sources with the reused &lt;code&gt;x-nextjs-request-id&lt;/code&gt; fingerprint include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;87.121.84.24 and 45.194.92.20, both tied to AS215925 (VPSVAULT.HOST LTD) with originated /24 ranges that include 87.121.84.0/24 and 45.194.92.0/24.&lt;/li&gt;
&lt;li&gt;82.23.183.131, within 82.23.183.0/24 announced by AS214062 (ITITAN HOSTING SOLUTIONS SRL), labeled "Private Customer" for that netblock on IPinfo and BGP sources.&lt;/li&gt;
&lt;li&gt;195.3.222.78 (shown in screenshot as a Polish hosting org, MEVSPACE)&lt;/li&gt;
&lt;li&gt;143.20.64.84 (shown in screenshot as Poland-based, also used as a payload host in a dropper chain)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Payload and logging infrastructure
&lt;/h3&gt;

&lt;p&gt;Two key support nodes appear:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Payload host:&lt;/strong&gt; 77.110.115.3 (referenced in the download attempt from 87.121.84.24)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Logging endpoint:&lt;/strong&gt; 217.144.184.100:8080, receiving bulk scan results via POST &lt;code&gt;/log&lt;/code&gt; (which we will see later)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The logging endpoint's /24 is associated with AS216246 (Aeza Group LLC) in IPinfo range data.&lt;br&gt;
The payload infrastructure used in the observed sample is consistent with Aeza-related hosting as well (Aeza International is AS210644).&lt;/p&gt;

&lt;h3&gt;
  
  
  A separate validation probe cluster
&lt;/h3&gt;

&lt;p&gt;The math-based probe from 45.156.87.99 used a different user agent string (&lt;code&gt;Scanner/24.10&lt;/code&gt;) and did not show the "poop1234" header pattern. That is a strong indicator of a second tooling family.&lt;/p&gt;




&lt;h2&gt;
  
  
  The misconfigured VPS network that let me see inside the scanner's outbound activity
&lt;/h2&gt;

&lt;p&gt;One of the scanning nodes sat on a VPS provider network where isolation was not properly enforced. That let me observe network traffic that should have been isolated, including the scanner's outbound probes to other targets.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxcgk12s49mx902wvmijl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxcgk12s49mx902wvmijl.png" alt=" " width="800" height="674"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Figure:&lt;/strong&gt; Intercepted outbound scan traffic originating from 87.121.84.24 targeting external hosts on non-standard ports. The payload shape matched my inbound observations, including the same request id markers and "math expression" proof logic.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpao7v0e2drluqry75s7a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpao7v0e2drluqry75s7a.png" alt=" " width="800" height="461"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Figure:&lt;/strong&gt; Additional intercepted outbound scans showing the scanner sweeping multiple IPs and ports while reusing the same header fingerprint and payload structure.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A few things jumped out immediately once I could observe outbound behavior:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The scanner did not just hit obvious web ports.&lt;/li&gt;
&lt;li&gt;It reused the same "solve this arithmetic and reflect it back" validation approach I had already seen inbound.&lt;/li&gt;
&lt;li&gt;It treated targets as vulnerable or not based on response semantics, not just status code.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That combination directly set up what happened next.&lt;/p&gt;

&lt;h2&gt;
  
  
  Poisoning the scanner's results feed
&lt;/h2&gt;

&lt;p&gt;This phase only became possible because the VPS network the scanner ran on was misconfigured. The lack of proper tenant isolation let me observe how the scanner validated targets and how it reported findings, which gave me a clear view of what it would accept as "proof."&lt;/p&gt;

&lt;p&gt;Once I understood the validation logic, I shifted from passively collecting probes into actively shaping responses. I started answering probes in a way that satisfied the scanner's proof checks, which made it record false positives at scale.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgvsmyzm0kqn8j8msc8ua.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgvsmyzm0kqn8j8msc8ua.png" alt=" " width="800" height="122"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Figure:&lt;/strong&gt; My interception layer responding to outbound probes in a way that satisfied the scanner's proof logic. The logs showed it embedding arithmetic like &lt;code&gt;146197+true+7467704&lt;/code&gt; and &lt;code&gt;343175+true+6374154&lt;/code&gt;, which I computed and reflected back so the scanner recorded them as vulnerable.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Those arithmetic expressions were the scanner's verification mechanism. It tested whether it could get the target to evaluate something and reflect the result. By returning correct results, I caused the scanner to mark a large number of probes as successful.&lt;/p&gt;

&lt;p&gt;Then I saw the part that turned this from "generic scanning" into a structured pipeline. The scanner pushed its findings to a centralized endpoint.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F67a079gox0v61fktaohj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F67a079gox0v61fktaohj.png" alt=" " width="800" height="123"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Figure:&lt;/strong&gt; The scanner posting results to a centralized logging endpoint over HTTP with a static access token and a JSON body containing a large list of discovered URLs, revealing a results aggregation channel separate from the scanning nodes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The structure was as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTTP POST to a &lt;code&gt;/log&lt;/code&gt; endpoint&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Content-Type: application/json&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;a static &lt;code&gt;X-Access-Token&lt;/code&gt; header value&lt;/li&gt;
&lt;li&gt;a JSON object containing a long array of URL strings&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That was enough to infer separation of roles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multiple egress nodes did scanning and exploitation attempts.&lt;/li&gt;
&lt;li&gt;One central service aggregated "hits" into a database.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At that point, I pushed the poisoning further by injecting large volumes of bogus "hits" into the same logging mechanism the scanner used.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs1ykkw4plrpleof7e6b2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs1ykkw4plrpleof7e6b2.png" alt=" " width="800" height="97"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Figure:&lt;/strong&gt; My bulk injection run sending high volume requests containing thousands of bogus URLs per request to the same results endpoint the scanner used, with the goal of polluting the dataset and stressing ingestion.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Eventually the endpoint stopped responding, and the scanner activity from that cluster stopped.&lt;/p&gt;




&lt;h2&gt;
  
  
  What this means for defenders
&lt;/h2&gt;

&lt;p&gt;React2Shell was loud not because it was unusually powerful, but because it was unusually cheap to test at scale. A single unauthenticated HTTP surface was enough to trigger automated tooling, and scanners quickly converged on the same small set of framework-specific paths and payload shapes.&lt;/p&gt;

&lt;p&gt;From a defensive perspective, several takeaways stand out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Volume does not imply sophistication.&lt;/strong&gt; Most of the traffic observed here was automated, repetitive, and driven by simple validation logic. The same arithmetic checks, headers, and payload semantics were reused across many source IPs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Framework awareness matters.&lt;/strong&gt; Targeting of &lt;code&gt;/_next&lt;/code&gt; and the presence of Next.js-specific headers immediately distinguishes informed scanners from generic recon. Logging these paths separately is useful signal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Execution confirmation is the real pivot.&lt;/strong&gt; Deterministic computation checks are the gate between scanning and exploitation. Anything that reliably satisfies or breaks that logic changes attacker behavior.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Infrastructure reuse is a stronger fingerprint than IPs.&lt;/strong&gt; Headers, body structure, file paths, and staging URLs persisted even as source addresses rotated.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The most important lesson is that large-scale exploitation pipelines often depend on brittle assumptions. In this case, a misconfigured VPS network exposed the scanner's validation and reporting flow, which ran over HTTP. That made it possible to poison its results and disrupt the pipeline.&lt;/p&gt;

&lt;p&gt;This will not stop the next scanner, or the next RCE. But it does reinforce a pattern that shows up repeatedly in real-world exploitation: attackers optimize for speed and scale, not resilience. When you can see how their tooling actually works, the whole pipeline gets easier to break.&lt;/p&gt;

</description>
      <category>security</category>
      <category>react</category>
      <category>nextjs</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
