WPScanを使ってWordpressをスキャンする

# WPScan WordPress Security Scannerとは
WPScanは、セキュリティの専門家やブログの管理者がサイトのセキュリティをテストするために作成された、非営利目的の無料のブラックボックスWordPressセキュリティスキャナーです。インターネット経由で、外からWordPressに対してスキャンして、WordPressやインストールされているプラグイン、テーマの脆弱性を発見してくれます。さらに、ユーザIDを検知し弱いパスワードが使われてないか、バックアップファイルが置かれてないか、意図しないエラーログの公開、など、WordPressを使う上でよくある問題をチェックします。

詳しくは、[Security Scanner](https://wpscan.com/wordpress-security-scanner)の「What does WPScan check for?」を参考にしてください。

ちなみに、WPScanには、WordPress向けのPluginもあります。Pluginは内部からスキャンします。詳しくは、[Security Plugin](https://wordpress.org/plugins/wpscan/)へ。

## スキャンできること

- インストールさているWordPressのバージョンと関連する脆弱性
- インストールさているプラ​​グインと関連する脆弱性
- インストールさているテーマと関連する脆弱性
- ユーザー名の列挙
- パスワードブルートフォーシングによる弱いパスワードを持つユーザー
- バックアップされ、アクセス可能なwp-config.phpファイル
- アクセス可能なデータベースダンプ
- エラーログがプラグインによって公開されている場合
- メディアファイルの列挙
- 脆弱なTimthumbファイル
- WordPressのreadmeファイルが存在する場合
- WP-Cronが有効になっている場合
- ユーザー登録可能になっている場合
- フルパス開示
- ディレクトリリスティング
- など


## インストール
インストール方法は、色々な手段が用意されています。RubyGemsからインストールや、Homebrew経由、Kali Linuxであればパッケージマネージャーからインストールできます。詳しくは、[Git HubのINSTALLの章](https://github.com/wpscanteam/wpscan#install)をみてください。

### Docker版
この記事では、自分が使っているMacでDocker版を使います。なお、スキャンは自身が管理しているなど、管理者が許可したサイト以外には、絶対にやらないようにしてください。

Dockerイメージをpullします。

```
$ docker pull wpscanteam/wpscan
```

## 使ってみる[Docker版]
簡単な使い方を説明します。詳しくは、[ユーザドキュメント](https://github.com/wpscanteam/wpscan/wiki/WPScan-User-Documentation)を参考にしてください。

https://github.com/wpscanteam/wpscan/wiki/WPScan-User-Documentation

### ユーザー名を見つける
ユーザー名を見つけるには、`enumerate`オプションに`u`を指定します。

```
$ docker run -it --rm wpscanteam/wpscan --url https://target.tld/ --enumerate u
```

実際にやってみる。なお、スキャンは自身が管理しているなど、管理者が許可したサイト以外には、絶対にやらないようにしてください。（大事なことなので繰り返し。）

```
$ docker run -it --rm wpscanteam/wpscan --url http://XXXXXX/WordPress/ --enumerate u                                           
_______________________________________________________________
         __          _______   _____
         \ \        / /  __ \ / ____|
          \ \  /\  / /| |__) | (___   ___  __ _ _ __ ®
           \ \/  \/ / |  ___/ \___ \ / __|/ _` | '_ \
            \  /\  /  | |     ____) | (__| (_| | | | |
             \/  \/   |_|    |_____/ \___|\__,_|_| |_|

         WordPress Security Scanner by the WPScan Team
                         Version 3.8.13
       Sponsored by Automattic - https://automattic.com/
       @_WPScan_, @ethicalhack3r, @erwan_lr, @firefart
_______________________________________________________________

[i] It seems like you have not updated the database for some time.
[?] Do you want to update now? [Y]es [N]o, default: [N]y
[i] Updating the Database ...
[i] Update completed.

[+] URL: http://XXXXXX/WordPress/ [XXXXXX]
[+] Started: Sun Jan 31 02:15:51 2021

Interesting Finding(s):

.... 中略


[i] User(s) Identified:

[+] admin
 | Found By: Author Posts - Author Pattern (Passive Detection)
 | Confirmed By:
 |  Rss Generator (Passive Detection)
 |  Wp Json Api (Aggressive Detection)
 |   - http://XXXXXX/WordPress/wp-json/wp/v2/users/?per_page=100&page=1
 |  Rss Generator (Aggressive Detection)
 |  Author Id Brute Forcing - Author Pattern (Aggressive Detection)

.... 中略

```

`admin`は、実際に設定している管理者のユーザ名です。インターネット経由でのスキャンで管理者のユーザ名が見えちゃいます。

### enumerateオプション
`--enumerate` もしくは`-e`オプションの指定で、列挙する内容を変更できます。上述のユーザー名の場合は、`-e u`とします。

- vp (Vulnerable plugins)  脆弱なプラグイン
- ap (All plugins)　全てのプラグイン
- p (Popular plugins)　人気のプラグイン
- vt (Vulnerable themes)　脆弱なテーマ
- at (All themes)　全てのテーマ
- t (Popular themes)　人気のテーマ
- tt (Timthumbs) Timthumbファイル
- cb (Config backups)　wp-configのバックアップ
- dbe (Db exports)　DBバックアップ
- u (User IDs range. e.g: u1-5)　ユーザー名　u1-5とするとIDのレンジ
- m (Media IDs range. e.g m1-15)　メディア　m1-5とするとIDのレンジ

複数指定する場合は、`,`で連結します。例：`-e u,m`
何も指定しない場合は、`vp,vt,tt,cb,dbe,u,m`となります。

### WordPress Vulnerability Database APIを使う
WPScanスキャンでは、WordPress Vulnerability Database APIを使用して、WordPress脆弱性データをリアルタイムで取得して検出します。APIトークンを`--api-token`オプションまたはconfigファイルを介して指定する必要があります。

APIトークンは、[WPScan.com](https://wpscan.com/)にアカウントを登録することで取得できます。1日あたり最大25のAPIリクエストが無料で提供されます。大体、1サイトを1日1回スキャンするのに適しているようです。毎日25のAPIリクエストが使い果たされると、WPScanは通常どおり機能しますが、脆弱性データは参照されません。もっと必要な場合は、有料のAPIを使用にアップグレードしてください。

ちなみに、APIは、WordPressバージョンに対して1つのAPIリクエスト、インストールされたプラグインごとに1つのリクエスト、インストールされたテーマごとに1つのリクエストを行います。なので、使ってないテーマやプラグインは消しておくとリクエスト数が節約できます。

https://wpscan.com/

### 脆弱なプラグインを見つける
脆弱なプラグインを見つけるためには、`-e vp`を使います。WordPress Vulnerability Database APIを使いますので、必ずAPIトークンを設定して使いましょう。

```
$ docker run -it --rm wpscanteam/wpscan --url http://XXXXXX/WordPress/ -e vp --api-token xxxxxxxxxxxxxxxxxxxxxxxx
_______________________________________________________________
         __          _______   _____
         \ \        / /  __ \ / ____|
          \ \  /\  / /| |__) | (___   ___  __ _ _ __ ®
           \ \/  \/ / |  ___/ \___ \ / __|/ _` | '_ \
            \  /\  /  | |     ____) | (__| (_| | | | |
             \/  \/   |_|    |_____/ \___|\__,_|_| |_|

         WordPress Security Scanner by the WPScan Team
                         Version 3.8.13
       Sponsored by Automattic - https://automattic.com/
       @_WPScan_, @ethicalhack3r, @erwan_lr, @firefart
_______________________________________________________________

[i] It seems like you have not updated the database for some time.
[+] URL: http://XXXXXXXXX/WordPress/ [XXXXXXXXX]
[+] Started: Sun Feb 28 02:47:15 2021

Interesting Finding(s):

.... 中略
                                        

[+] contact-form-7
 | Location: http://XXXXXXXXX/WordPress/wp-content/plugins/contact-form-7/
 | Last Updated: 2021-02-24T12:24:00.000Z
 | [!] The version is out of date, the latest version is 5.4
 |
 | Found By: Urls In Homepage (Passive Detection)
 | Confirmed By: Urls In 404 Page (Passive Detection)
 |
 | [!] 1 vulnerability identified:
 |
 | [!] Title: Contact Form 7 < 5.3.2 - Unrestricted File Upload
 |     Fixed in: 5.3.2
 |     References:
 |      - https://wpscan.com/vulnerability/7391118e-eef5-4ff8-a8ea-f6b65f442c63
 |      - https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-35489
 |      - https://www.getastra.com/blog/911/plugin-exploit/contact-form-7-unrestricted-file-upload-vulnerability/
 |      - https://www.jinsonvarghese.com/unrestricted-file-upload-in-contact-form-7/
 |      - https://contactform7.com/2020/12/17/contact-form-7-532/#more-38314
 |
 | Version: 5.3.1 (100% confidence)
 | Found By: Query Parameter (Passive Detection)
 |  - http://XXXXXXXXX/WordPress/wp-content/plugins/contact-form-7/includes/css/styles.css?ver=5.3.1
 |  - http://XXXXXXXXX/WordPress/wp-content/plugins/contact-form-7/includes/js/scripts.js?ver=5.3.1
 | Confirmed By:
 |  Readme - Stable Tag (Aggressive Detection)
 |   - http://XXXXXXXXX/WordPress/wp-content/plugins/contact-form-7/readme.txt
 |  Readme - ChangeLog Section (Aggressive Detection)
 |   - http://XXXXXXXXX/WordPress/wp-content/plugins/contact-form-7/readme.txt

[+] WPScan DB API OK
 | Plan: free
 | Requests Done (during the scan): 5
 | Requests Remaining: 20

 .... 中略

```

```
[!] 1 vulnerability identified:
```
とあるように、`contact-form-7`の脆弱性を発見しました。

```
 | [!] Title: Contact Form 7 < 5.3.2 - Unrestricted File Upload
```

この部分が、脆弱性のタイトルです。タイトルだけ見ると、無制限にファイルがアップロードできる脆弱性のようです。

```
 |     Fixed in: 5.3.2
```

5.3.2で修正されていることがわかります。

```
 |     References:
 |      - https://wpscan.com/vulnerability/7391118e-eef5-4ff8-a8ea-f6b65f442c63
 |      - https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-35489
 |      - https://www.getastra.com/blog/911/plugin-exploit/contact-form-7-unrestricted-file-upload-vulnerability/
 |      - https://www.jinsonvarghese.com/unrestricted-file-upload-in-contact-form-7/
 |      - https://contactform7.com/2020/12/17/contact-form-7-532/#more-38314
```

脆弱性の詳細な情報が記載されたサイトが紹介されています。更なる情報は、ここをみてみましょう。

```
 | Version: 5.3.1 (100% confidence)
 | Found By: Query Parameter (Passive Detection)
 |  - http://XXXXXXXXX/WordPress/wp-content/plugins/contact-form-7/includes/css/styles.css?ver=5.3.1
 |  - http://XXXXXXXXX/WordPress/wp-content/plugins/contact-form-7/includes/js/scripts.js?ver=5.3.1
 | Confirmed By:
 |  Readme - Stable Tag (Aggressive Detection)
 |   - http://XXXXXXXXX/WordPress/wp-content/plugins/contact-form-7/readme.txt
 |  Readme - ChangeLog Section (Aggressive Detection)
 |   - http://XXXXXXXXX/WordPress/wp-content/plugins/contact-form-7/readme.txt
```

この部分に脆弱性を発見した根拠が書かれています。この記述だと、バージョン5.3.1であることをクエリパラメータやReadme.txtから読み取ったのでしょう。


### Enumerationモード
WPScanが、WordPressのバージョン、インストールされているプラ​​グイン、またはインストールされているテーマを見つける際に、次の3つの「モード」があります。

- passive
- aggressive
- mixed

デフォルトは、「mixed」モードを使用します。ただし、サーバーが多数のリクエストを処理できない可能性がある場合は、「passive」モードを使用してください。デフォルトのモードは「mixed」ですが、プラグインは「passive」モードで見つけるため、高速ですが見落とす可能性もあります。
全てプラグイン見つけたい場合は、モードを明示的に指定してください。デフォルト以外のものを使用する場合は、`-plugins-detection`オプションを使用します。

### チートシート

#### 脆弱性を持つすべてのプラグイン見つける
```
$ docker run -it --rm wpscanteam/wpscan --url http://XXXXXX/WordPress/ -e vp --plugins-detection mixed --api-token YOUR_TOKEN
```

mixedモードでプラグインを探します。結構時間かかります。

#### データベース内のすべてのプラグインを見つける

```
$ docker run -it --rm wpscanteam/wpscan --url http://XXXXXX/WordPress/ -e ap --plugins-detection mixed --api-token YOUR_TOKEN
```

#### Wordpressでなかった場合

`Scan Aborted`となった場合、Wordpressではない可能性があります。WPScanが間違っている場合は、-forceオプションを指定して、WPScanにサイトのスキャンを強制することができます。

#### リダイレクト

WPScanはデフォルトでは、リダイレクトしてドメインが変わる場合は、スキャンをしません。`--ignore-main-redirect`オプションを指定するか、リダイレクト先をURLに指定します。

### Docker版のチートシート
#### 結果を出力する
`--output`オプションで、WPScanの結果をテキストで出力できますが、Docker版の場合hはコンテナ内に出力されるため、Dockerの`Bind mounts`を使って取得します。

```
$ docker run -it --rm --mount type=bind,source={ローカルの保存したいフォルダ} wpscanteam/wpscan -o /output/wpscan-output.txt　--url http://XXXXXX/WordPress/
```

#### パスワードブルートフォース
パスワードリストファイルを作成し、Dockerに渡してあげることでパスワードブルートフォースのスキャンも可能です。Dockerの`Volumes`を使って渡します。

```
$ docker run -it --rm -v {ファイルを置いているフォルダ}:/wordlists wpscanteam/wpscan --url http://3.19.64.150/WordPress/ --passwords /wordlists/passwords.txt
```

## まとめ
手軽にWordpressのスキャンができますので、もしこれでユーザを発見できたり、脆弱性のあるプラグインやテーマが発見できた場合、攻撃者にもバレている可能性があります。なので早めに対処しましょう。Wordpressサイトの管理者は一度やってみると良いと思います。
ただし、スキャンは自身が管理しているなど、管理者が許可したサイト以外には、絶対にやらないようにしてください。