PHP2Shell in the wild: confirmed RCE, probing, and exposed attacker infrastructure
PHP2Shell is no longer just a vulnerability disclosure: independent sensors have confirmed code execution in the wild, and the infrastructure around it was sitting in the open.
A 24 October honeypot investigation links crafted HTTP requests to 35 shells spawned by Apache workers across three vulnerable PHP targets. huntback adds two perspectives the report does not have. Our decoys recorded PHP2Shell traffic before the patch and working payloads after it, and our loot harvesting recovered exploit tooling and post-exploitation-style files from exposed infrastructure, including both of the report's source addresses.
These are different types of evidence. The external report establishes code execution on its targets. huntback's request events show who sent what and when; our decoys do not run PHP, so they cannot show execution. Recovered files show what was hosted on reachable infrastructure when we collected it; they do not, by themselves, prove that those files were used in any particular intrusion.
Every decoy request and recovered file below is in huntback. Open one of the confirmed source addresses, or browse what the network is finding right now.
The vulnerability and the fix
The PHP security team identifies two critical flaws in PHP web runtimes. CVE-2026-109618 involves out-of-memory handling that can leave partially initialised request data for cleanup to process. CVE-2026-109619 involves stale request state being used after its backing memory was freed. Both can permit unauthenticated remote code execution. PHP says web-serving installations are at risk, including Apache mod_php, PHP-FPM, php-cgi, FrankenPHP and LiteSpeed; the demonstrated pre-application-code path makes mod_php especially urgent. (PHP security advisory)
The fixed supported releases are 8.2.35, 8.3.36, 8.4.27 and 8.5.12. PHP 8.1 and older are unsupported upstream, although some vendors may supply backports. Updating the actual runtime used by each web worker is the complete fix.
What the confirmed exploitation report proves
The 0x4D31 report reviewed disposable targets running PHP 8.4.26 under single-worker Apache mod_php, with a 128 MiB PHP memory limit. Its authors correlated target-side packet captures, Apache worker identities, PHP errors and Tetragon process events. The reviewed snapshot contained 35 complete final-stage HTTP requests followed by /bin/sh starts directly parented by Apache. Three shell events came from 15.204.59.70; 32 came from 162.35.99.94. Those are two source-address episodes, not proof of two distinct operators.
The successful traffic used a four-stage pattern:
The report's first confirmed chain began at 15:35:32 UTC on 24 October. A shell started at 15:35:38.673 UTC, and the Apache worker then crashed. Other observed commands ran identity checks or called PHP CLI, curl and wget. Some network calls timed out and some tools were absent, but the parent-child process evidence establishes that the commands reached execution. The report associates the observed chain with CVE-2026-109618; it does not establish use of a separate CVE-2026-109619 path.
An HTTP 200, an out-of-memory error or a worker crash alone is not a successful-exploitation verdict. The decisive observation is the unexpected shell launched by an Apache worker after a matched final request. A crashing worker can also leave that request absent from the completed Apache access log, which is why packet and process records matter.
What huntback's decoys recorded
huntback keeps the full request body for every decoy hit, so we searched for the field the exploit is built around, PHP_SESSION_UPLOAD_PROGRESS, rather than for a CVE label or a user-agent. Our 23 October analysis found 110 upload-progress POSTs from three sources between 21 and 23 October; a search on 25 October found two more:
| Source | When | What it sent | Limit |
|---|---|---|---|
85.11.167.243 | 21 Oct 08:41 to 22 Oct 14:25 | 40 large upload-progress probes, mostly with php2shell user-agents, the first two 5 h 18 min before PHP's 14:00 UTC release | Probes, no command |
217.60.242.76 | 21 Oct 20:48 to 20:51 | Three minimal 388-byte checks: a random token and an empty file | A reachability check |
77.90.185.20 | 22 Oct 20:30 to 23 Oct 07:10 | 67 POSTs carrying a one-line PHP dropper that fetches an installer from 217.60.102[.]5; huntback had already harvested that installer, a RedTail-style cryptominer | A working payload; our decoys do not run PHP |
204.76.203.7 | 24 to 25 Oct | Repeated small multipart POSTs (about 201 to 235 bytes) to / and /index.php across different decoy types, all carrying PHP_SESSION_UPLOAD_PROGRESS | No disclosure-sized response or full four-stage chain |
77.91.71.3 | 25 Oct | A short upload-progress probe among broader web probing | A single field match |
The dropper is the important row. The external report's shells ran proof commands; 77.90.185.20 was already sending a payload built to install a miner, about 30 hours after the release and well before the first confirmed shell on 24 October. We found no events from the report's two source addresses in our decoy data, which describes our sensor set; it does not contradict observations on 0x4D31's separate sensors.
The missing piece: huntback's recovered loot
huntback also scans attacker-side infrastructure and harvests what operators leave in exposed directories and panels. A search of that collection for php2shell returned 84 files. That is a set of filename and content matches, not 84 distinct attacks or 84 validated exploits. Several clusters stand out:
| Infrastructure | Recovered material | What it supports |
|---|---|---|
217.160.132.82:9003 | A p2s_weap directory with an 88,990-byte php2shell_exp.py, usage, research and test-report documents, plus a separate p2s_scan directory with a 66 KB scanner and its documentation. Collected 25 Oct. | PHP2Shell-labelled scanning and exploitation tooling was exposed on this host when huntback fetched it. Claims inside the files about working exploit chains remain unverified. |
31.56.228.136:9999 | A 33-file PHP2Shell research tree, including a Docker lab, a race harness, proof notes and root-cause notes. Collected 24 Oct. | Publicly reachable development and test material existed. Its presence does not establish operational use against victims. |
15.204.59.70 | stager.sh, sh.php and hits.log on port 9999, and s2_new on port 81. sh.php was labelled a webshell and s2_new a C2-related file. Collected 25 Oct. | The same source IP as episode A in the confirmed-RCE report. It connects the reported source infrastructure to hosted post-exploitation-style files, but does not prove those files were delivered to the honeypot. |
162.35.99.94 | A small poc.sql, an HTTP access log and a minimal .git/config response. The SQL preview references Metabase-style command execution, and the access log records requests to /metabase-rce-<ip> paths. Collected 25 Oct. | The second confirmed source also hosted exposed material, pointing at a second target family. These files should not be presented as PHP2Shell payloads or proof of what ran in episode B. |
The search returned files from six additional IPs: 45.115.26.30, 204.168.225.59, 31.128.39.24, 41.223.30.7, 54.169.109.7 and 58.221.60.160. 41.223.30.7 hosted PHP2Shell reference material and a copy of the murrez PoC tree, collected on 22 October; seven of its file hashes are identical to copies on 31.56.228.136, so these are mirrors or shared files, not independent exploit families. 31.128.39.24 hosted five PHP2Shell scanner, race and trigger scripts, collected on 23 October, whose previews claim authorised bug-bounty use. 54.169.109.7 exposed three local test helpers, and 58.221.60.160 exposed two Python 2 verification or probe scripts. 204.168.225.59 yielded only a lab log. The 45.115.26.30 item is an index.php whose preview resembles a multipart request body; its automated webshell label is not enough to conclude that a working webshell was deployed there. None of these six IPs is a confirmed-RCE source in the 0x4D31 report.
The recovered sh.php has SHA-256 eb6eec59468d83d4f3a80d98a567a3616bf9709e736615f5c9d7f848a51b6962; the recovered stager.sh has SHA-256 c9216d9d45d0c1b11af23df7e66f4f5cd6fc252076e98192ea52d617c6dccf30. These are file identifiers, not reliable standalone detection rules. A recovered file can be renamed, changed or hosted by a party other than the one who sent the observed requests. The shared IP is a strong lead for investigation, while the packet-to-process evidence remains the basis for calling the honeypot activity confirmed RCE.
The loot search also shows why indiscriminate keyword counts mislead. A CVE-identifier query hit unrelated files that merely contain the identifier, including exposed Git metadata and reports. Source content and automated labels are investigative clues; neither is independent verification of an exploit claim.
Putting the timeline together
Read together, the three sources describe a fast cycle: probes before the patch, a miner dropper about 30 hours after it, public exploit kits on exposed hosts from 22 October, confirmed shells on 24 October, and post-exploitation-style files on one of the confirmed sources a day later. Each step is documented by a different kind of evidence, and each keeps its own limits.
A misleading repository in circulation
The 0x1c1101/CVE-2026-109618-PoC README describes a partial reproduction, says it does not establish reliable code execution, and then states outright that it is fake. Its usage instructions also point to a poc/ directory, while the repository contains an exploit/ directory instead. It should not be used to validate exploitability or build a signature. For the vulnerability and patch state, use the PHP advisory; for the observed execution, use the packet-to-process report.
Defensive priorities
- Patch the PHP runtime used by every web worker. Inventory containers, appliances, hosting images and vendor packages as well as directly managed servers, and confirm the running worker version after restart. The PHP advisory and CISA call for immediate updates.
- Correlate network and host telemetry. Hunt for large or high-part-count multipart requests, PHP startup memory errors (
Unknown on line 0), unusually large session cookies and worker crashes. The confirmed chains sent noUser-Agent, used a multipart boundary of tenCcharacters, and began with a POST carrying five numberedq...=vquery parameters. Escalate when an Apache or PHP worker launches a shell, identity utility, scripting runtime or download tool: a single request marker is a lead, while process parentage and a linked request sequence are much stronger evidence. - Pivot carefully on the recovered infrastructure. Check historical connections to the addresses below and the file hashes in endpoint or proxy records. Treat hits as leads that need context; do not infer that a file was deployed merely because it was hosted on an IP that also sent exploit traffic.
- Use temporary controls while patching. PHP documents request-size and multipart limits and configuration measures for specific attack paths. They reduce exposure but do not replace an updated build.
Indicators
| Indicator | Type | Context |
|---|---|---|
15.204.59.70 | IP | Confirmed-RCE source, episode A (0x4D31); hosted sh.php, stager.sh, s2_new |
162.35.99.94 | IP | Confirmed-RCE source, episode B (0x4D31); hosted poc.sql and a Metabase-callback access log |
77.90.185.20 | IP | Sent PHP2Shell POSTs carrying a RedTail-style dropper (huntback decoys) |
217.60.102.5 | IP | Hosted the RedTail-style installer fetched by that dropper |
85.11.167.243 | IP | Pre-release PHP2Shell probes (huntback decoys) |
217.160.132.82 | IP | Exposed PHP2Shell exploit and scanner kits |
31.56.228.136 | IP | Exposed PHP2Shell research tree |
eb6eec59468d83d4f3a80d98a567a3616bf9709e736615f5c9d7f848a51b6962 | SHA-256 | sh.php recovered from 15.204.59.70 |
c9216d9d45d0c1b11af23df7e66f4f5cd6fc252076e98192ea52d617c6dccf30 | SHA-256 | stager.sh recovered from 15.204.59.70 |
8e8fc166e6b326d20bb7611d8ef3cee3bd5da46447985312c1492ab0a44d1eb6 | SHA-256 | A1 decoded request body (0x4D31 report) |
b6c547e0e9a2bb26607df1521de96f4d5c9adf4621c28b7ab491587b21ae40f2 | SHA-256 | B1 decoded request body (0x4D31 report) |
7af66c8f35c5fa6b47a539da6dca361d19543d9f62d61e4af891c2802bd5e236 | SHA-256 | A2 decoded request body (0x4D31 report) |
The combined picture is clearer with the loot included: independent sensors documented PHP2Shell requests reaching shell execution, huntback's decoys captured probing before the patch and a miner payload after it, and huntback recovered tooling and post-exploitation-style files from exposed infrastructure, including both confirmed source addresses. Those findings reinforce the urgency to patch, while their different evidentiary limits keep the analysis defensible.