
CVE-2026-63030、CVE-2026-60137、wp2shell スキャナー
WordPress コアにおける wp2shell(CVE-2026-63030 / CVE-2026-60137)への露出を検出・検証するためのツールです。モードはフラグで選択し、ターゲットは位置引数で指定します。--scan はコアのバージョンをフィンガープリントし、REST /batch/v1 ルートが到達可能であることをエクスプロイトペイロードを送信せずに確認します。--check/--read/--shell/--rce/--root-prereq モードは、許可されたラボ環境での使用を目的とした検証 PoC です。
wp2shell.py は標準ライブラリのみを使用する単一のスクリプトで、外部依存関係はありません。実行時には毎回、実行前に ZephrSec バナーが stderr に出力されます(stdout には出力されないため、--scan -j の JSON 出力には影響しません)。
モードフラグは必ず 1 つだけ指定します。ターゲットは位置引数です(すべてのモードで URL、--scan ではホストリスト)。
wp2shell.py (--scan | --check | --read | --shell | --rce | --root-prereq)
[targets ...] [-f FILE] [-j] [-t THREADS] [--prefix PREFIX]
[--delay DELAY] [--repeats REPEATS] [--preset PRESET] [--expr EXPR]
[--max-len MAX_LEN] [--user USER] [--password PASSWORD] [--cmd CMD]
[-i] [--no-cleanup] [-y] [--sleep SLEEP] [--rounds ROUNDS]
[--route {auto,rest-route,wp-json}] [--proxy PROXY] [--authorized]
[--timeout TIMEOUT]
詳細解説ブログ記事:https://blog.zsec.uk/wp2shell-code-trace-deep-dive/
nuclei -t wp2shell-exposure.yaml -u https://target
単一ホスト、複数ホスト、またはファイルから実行できます。
python3 wp2shell.py --scan https://target
python3 wp2shell.py --scan host1 host2 host3
python3 wp2shell.py --scan -f hosts.txt
オプション:-f/--file ホストファイル(1 行に 1 つ)、-j/--json JSON 出力、-t/--threads 並行数(デフォルト 10)。
--check/--read/--shell/--rce/--root-prereq モードは、実際のエクスプロイトペイロードを送信します。同梱の localhost ラボ、または自分が所有しテストを明示的に許可されているシステムに対してのみ実行してください。--shell と --rce はリモートコード実行を行うため、ラボまたは承認済みターゲットを対象としています。ループバック以外のホストに対する --rce には --authorized が必要です。--root-prereq は同じトークンゲート式診断プラグインを使用してシェルから root への前提条件を確認しますが、ローカル権限昇格は実行しません。
--shell には、復元またはクラックした管理者パスワードが必要です。--rce は 資格情報不要の pre-auth チェーンです。SQLi(oEmbed → changeset → 再入可能な parse_request)を通じて独自の管理者を偽造し、ウェブシェルを展開します。パスワードは不要です。
--shell、--rce、--root-prereq は、コード実行ペイロードを送信する前に対話式の y/N 承認を求めます(非対話式/EOF の stdin では中止します)。ラボまたは承認済みターゲットに対する自動化では、-y/--yes を渡してプロンプトをスキップできます。
docker compose -f poc/lab/docker-compose.yml up -d
python3 wp2shell.py --check http://127.0.0.1:8080
python3 wp2shell.py --read http://127.0.0.1:8080 --expr @@version
python3 wp2shell.py --shell http://127.0.0.1:8080 --user admin --password 'Summer2026!' --cmd id
python3 wp2shell.py --shell http://127.0.0.1:8080 --user admin --password 'Summer2026!' -i
python3 wp2shell.py --rce http://127.0.0.1:8080 --cmd id
python3 wp2shell.py --rce http://127.0.0.1:8080 -i
python3 wp2shell.py --root-prereq http://127.0.0.1:8080 --user admin --password 'Summer2026!'
PoC の根拠となったパッチ差分は poc/diffs/ に、調査メモは poc/RESEARCH.md に保存されています。SQLi は author__not_in の修正から完全に再構築可能です。資格情報不要の --rce チェーン(oEmbed → changeset → 再エントリ → 管理者作成)は、同梱ラボに対する標準デフォルトの RCE を再現します。--shell は、復元/クラックした管理者資格情報を介して認証済みプラグインのアップロードとコマンド実行を行う代替パスです。
| Flag | 説明 |
|---|
--scan | 非破壊的な露出チェック:バージョンのフィンガープリントと、REST /batch/v1 ルートが到達可能であることの確認を行います。エクスプロイトペイロードは送信しません。 |
--check | 無害な差分プローブで、ブラインド時間ベースの SQLi を確認します。 |
--read | ブラインド SQLi でデータを抽出します(プリセットまたは生の SQL スカラー式)。 |
--shell | クラック/復元した管理者パスワードを使用した認証済み RCE チェーン。 |
--rce | 資格情報不要の pre-auth RCE:SQLi を通じて独自の管理者を偽造し、自己消去型ウェブシェルを展開します。 |
--root-prereq | 無害なシェルから root への前提条件チェック。診断のみを実行し、ローカル権限昇格は実行しません。 |
| Flag | 対象 | 説明 |
|---|
-f, --file | --scan | ファイルからホストを読み込みます(1 行に 1 つ。# コメントはスキップ)。 |
-j, --json | --scan | 結果を JSON として stdout に出力します。 |
-t, --threads | --scan | スキャンの並行数(デフォルト 10)。 |
--prefix | --check/--read | DB テーブルプレフィックス(デフォルト wp_)。 |
--delay | --check/--read | タイミングオラクル用に注入する SLEEP 秒数(デフォルト 0.15)。 |
--repeats | --check/--read | ビットごとに N 回のプローブの中央値を使用します。ノイズの多いリンクでは増やします(デフォルト 1)。 |
--preset | --read | 組み込みターゲット:version、database、db_user、users、siteurl(デフォルト users)。 |
--expr | --read | 抽出する生の SQL スカラー式(--preset を上書き)。 |
--max-len | --read | 抽出する文字列の最大長(デフォルト 128)。 |
--user | --shell/--root-prereq | ログインする管理者ユーザー名(デフォルト admin)。 |
--password | --shell/--root-prereq | 管理者の平文パスワード(--read で取得したハッシュをクラックします。これらのモードでは必須)。 |
--cmd | --shell/--rce | ターゲット上で実行するコマンド(デフォルト id)。 |
-i, --interactive | --shell/--rce | 単一コマンドの代わりに、対話式の Web コマンドループを実行します。 |
--no-cleanup | --shell/--rce | 展開したプラグイン/ウェブシェルを削除せず残します(ラボのみ)。 |
-y, --yes | --shell/--rce/--root-prereq | 対話式の承認プロンプトをスキップします(自動化用)。 |
--sleep | --rce | pre-auth SQLi 検出用に注入する SLEEP 秒数(デフォルト 4)。 |
--rounds | --rce | --rce 検出用に N 回のプローブの中央値を使用します(デフォルト 3)。 |
--route | --rce | バッチルート形式:auto、rest-route、wp-json(デフォルト auto)。 |
--proxy | --rce | HTTP プロキシ経由でリクエストをルーティングします。例:http://127.0.0.1:8080 の Burp。 |
--authorized | --rce | ループバック以外の --rce ターゲットに対する承認を表明します(リモートホストでは必須)。 |
--timeout | すべて | リクエストごとのタイムアウト秒数(デフォルト 15)。 |