PHP2Shell in the wild: the first 48 hours on a honeypot fleet

Updated 4 min read php2shell.eu

Advisories describe what an attack could do. This guide summarises what actually arrived. OffSeq, which maintains this site, runs a fleet of decoy servers called Mirage, and recorded the PHP2Shell traffic that reached it between 18 and 22 October 2026. The full research report, with its method and limits, is linked at the end; this page keeps to what a defender needs.

The short version

  • Nine source addresses in seven countries sent PHP2Shell-shaped requests to the fleet, eight of them between 20 and 22 October.
  • Two groups. Five addresses used the session upload progress route that the PHP advisories describe; four sent oversized request bodies consistent with the out-of-memory route. OffSeq attributes the second group with lower confidence, by request shape only.
  • It started before the fix. The earliest request with the full memory-pressure pattern reached the fleet at 21:57 UTC on 20 October, about sixteen hours before the fixed releases shipped. One oversized WordPress request, attributed by shape only, arrived on 18 October.
  • The trigger was new. The PHP_SESSION_UPLOAD_PROGRESS field name appeared zero times across the fleet in the six weeks before 20 October. Every occurrence falls in the 20 to 22 October window.
  • The lead tool labels itself. Its requests carry the literal string p2shell in the multipart boundary, which legitimate traffic does not contain.

How the first two days unfolded

PHP2Shell traffic on the Mirage fleet, as reported by OffSeq
Time (UTC)What the fleet recorded
18 OctOne oversized request against a WordPress endpoint, attributed by shape only
20 Oct, 21:57First oversized memory-pressure request, from a cloud-hosted address, before any fix was public
21 Oct, 14:00PHP ships 8.5.12, 8.4.27, 8.3.36 and 8.2.35
21 Oct, 16:21First session upload progress requests; the lead source runs a rapid, automated series of requests of increasing size
21 Oct, 18:16 to 21:55Three more sources appear, each with its own recognisable variant of the request
22 Oct, 02:30The lead source repeats its run
22 Oct, 10:06A manual check from a further address
A burst of near-identical requests from one source whose body sizes climb steadily is, in OffSeq's analysis, an automated tool searching for the memory threshold of a particular target. It is one of the clearest patterns to look for.

What to search your own logs for

These signals are taken from the detection section of OffSeq's report. None is proof on its own, and a determined attacker can change most of them, so match on several together.

  • The string p2shell in a Content-Type header. OffSeq reports that no legitimate traffic contains it.
  • A PHP_SESSION_UPLOAD_PROGRESS field in multipart uploads, especially on sites with no upload progress feature. The field name is configurable, so treat it as strong but not sole evidence.
  • Form field names with very deep array nesting, far beyond anything your forms use.
  • Bursts from one source whose request sizes climb steadily over a minute or two.
  • Multipart bodies of several hundred kilobytes or more carrying a single field of repeated characters.
  • On the server: a PHP-FPM, Apache or httpd process starting a shell or download tool, and memory-limit errors or worker crashes that line up in time with multipart POST requests.

The detection and response guide explains how to search error logs and what to do if anything matches.

Indicators

OffSeq published the source addresses and strings below. The addresses span VPS, cloud and anonymisation networks and several are shared infrastructure, so investigate matches rather than blocking them outright, and expect the list to age quickly.

Indicators published by OffSeq from the Mirage fleet, 18 to 22 October 2026
IndicatorTypeContext
94.154.43.7IP addressLead source, AS219502, GB; session upload progress with increasing request sizes
38.180.45.91IP addressAS34702, EE; session upload progress variant, user agent B8RAT/1.0
80.66.66.66IP addressAS209702, FI; session upload progress variant
217.60.242.76IP addressAS197974, IR; single minimal probe
87.192.237.19IP addressAS8193, IE; manual check with curl
34.19.34.88IP addressGoogle Cloud, US; oversized body, about 16 hours before the fix
34.76.232.95IP addressGoogle Cloud, BE; oversized body
34.76.218.47IP addressGoogle Cloud, BE; oversized body
194.42.196.44IP addressUS; 2 MB body against a WordPress endpoint on 18 October
p2shellStringLiteral substring in the lead tool's multipart boundary
B8RAT/1.0StringUser agent of one session upload progress variant
PHP_SESSION_UPLOAD_PROGRESSStringMultipart field name used by the session route
po10nn060000_efc8bc7e3e52_000000000000JA4HHTTP fingerprint of the lead source
po10nn150000_94b423c72d17_000000000000JA4HHTTP fingerprint of the cloud-hosted oversized-body cluster
JA4H fingerprints need tooling that computes them, such as the open-source JA4+ plugins. Absence of these indicators says nothing about whether you were targeted: other tools and sources exist.

Indicators published by Amazon

Amazon's threat intelligence team, which runs the MadPot honeypot network, published the addresses below with its report of the earliest known attempt. Amazon notes they include shared anonymisation infrastructure that is not exclusive to this activity, and advises investigating observations rather than blocking.

Indicators published by Amazon Threat Intelligence, 21 October 2026
IP addressObserved
103.216.220.9217 October 2026, four days before disclosure
31.223.184.16621 October 2026
37.19.200.521 October 2026
134.209.159.6421 October 2026
103.114.163.18821 October 2026
95.217.98.3721 October 2026
None of these addresses overlaps with those OffSeq observed. Amazon says the attempts it saw on 21 October came from multiple actors, and OffSeq's session-route sources each sent a distinct variant.

What this changes for you

  • Exploit tooling was circulating before the patch. Amazon's earliest observation is from 17 October, and it advises starting investigations from at least that date. If a server was internet-facing and unpatched in that window, treat the question "were we reached?" as open until you have looked.
  • The traffic is automated and broad. Several sources, different variants, repeated runs against decoys that belong to no particular organisation: this is opportunistic scanning, and Amazon reports broad exploitation in the wild.
  • Patching is still the fix. Nothing in the field data changes the remediation: install 8.5.12, 8.4.27, 8.3.36 or 8.2.35, or your vendor's fixed package, restart every PHP worker, and use the stop-gaps only where you cannot patch yet.

Sources

  1. Amazon Threat Intelligence identifies PHP2Shell exploitation prior to public disclosure in MadPot AWS Security Blog · 2026 The earliest known attempt on 17 October, broad exploitation after release, indicators, and the advice to investigate from 17 October.
  2. PHP2Shell in the wild: the first 48 hours on a honeypot fleet OffSeq · 2026 The full research report: method and limits, the timeline, the per-source variants, detection signals and the complete indicator table.
  3. RCE via OOM corruption PHP project, GitHub · 2026 The out-of-memory route the oversized bodies are consistent with.
  4. RCE via stale global state PHP project, GitHub · 2026 The session upload progress route.

Questions

Related questions

Should we block these IP addresses?
Investigate first. OffSeq notes that several are shared cloud, hosting or anonymisation infrastructure, so a block can hit legitimate users and an attacker can simply move. Searching your logs for them, and for the strings, is more useful than a block list.
We found the p2shell string in our logs. Were we compromised?
Not necessarily: it shows you were targeted by that tool. What matters is whether the server was on a vulnerable PHP version at the time, and whether anything followed, such as worker crashes, new files or PHP processes starting shells. The detection and response guide covers how to check.
Do the decoys prove the attacks work?
No. The decoys cannot be exploited, so they record attempts, not success. Whether an attempt succeeds depends on the target's PHP version, configuration and server setup.