WPSeku で WordPress の脆弱性をスキャンする方法
脆弱性スキャンツール「WPSeku」で、WordPress の脆弱性をスキャンできます。
WordPress の URL を指定するだけで、ブラックボックスのテストが実行されます。
外から取得できる WP 情報を可視化したり、脆弱性情報の確認が行えます。
ツールの詳細や利用方法、スキャン結果の例についてまとめました。
WPSeku とは
オープンソースの WordPress 脆弱性スキャンツールです。
Python で書かれており、簡単に WordPress のセキュリティチェックが行えます。
スキャンには大きく2種類あります。
- 外部の WordPress へリクエストを送信して検証
- サーバ内でファイルをスキャン
同様のツールとしては、WPScan などが存在します。
WPSeku で取得できる脆弱性情報
外部から WordPress を検証する場合、環境にもよりますが以下の情報が取得できます。
- Web サーバ
- WordPress が格納された物理パス
- アクセス可能なバックアップファイル
- 使用中のテーマ
- 使用中のプラグイン
- ログインユーザ一覧
WordPress の実ファイルにアクセスできる場合、PHP の脆弱性をスキャン可能です。
以下のディレクトリがスキャン対象となります。
- WordPress 本体
- テーマ
- プラグイン
パスワード辞書を用いてブルートフォースを行う機能もありますが、悪用は厳禁です。
WPSeku の動作に必要な環境
Python 3 が動く環境であれば OK です。
インストール時に pip を使用するため、pip も準備しておきます。
- Python 3
- pip
WPSeku のセットアップ
Python が動作する環境で git clone します。
$ git clone git@github.com:m4ll0k/wpseku.git
もしくは
$ git clone https://github.com/m4ll0k/wpseku.git
pip で依存モジュールをセットアップ。
$ cd wpseku
$ pip3 install -r requirements.txt
引数なしで実行すると、オプションを確認できます。
$ python3 wpseku.py
----------------------------------------
_ _ _ ___ ___ ___| |_ _ _
| | | | . |_ -| -_| '_| | |
|_____| _|___|___|_,_|___|
|_| v0.4.0
WPSeku - WordPress Security Scanner
by Momo Outaadi (m4ll0k)
----------------------------------------
Usage: wpseku.py [options]
-u --url Target URL (e.g: http://site.com)
-b --brute Bruteforce login via xmlrpc
-U --user Set username for bruteforce, default "admin"
-s --scan Checking wordpress plugin code
-p --proxy Use a proxy, (host:port)
-c --cookie Set HTTP Cookie header value
-a --agent Set HTTP User-agent header value
-r --ragent Use random User-agent header value
-R --redirect Set redirect target URL False
-t --timeout Seconds to wait before timeout connection
-w --wordlist Set wordlist, default "db/wordlist.txt"
-v --verbose Print more informations
-h --help Show this help and exit
Example:
wpseku.py --url http://site.com/
wpseku.py --url http://site.com --brute --user test
wpseku.py --url http://site.com/ --brute --user admin --wordlist wordlist.txt
WPSeku の使い方 (WordPress サイトをスキャン)
--url
オプションで WordPress サイトを指定します。--verbose
を付加すると詳細表示となります。
$ python3 wpseku.py --url https://wordpress.example.com/ --verbose
スキャン結果の一例です。 一部省略していますが、WP バージョン・物理パス・テーマ・プラグイン・ユーザ情報などが一部取得できています。
----------------------------------------
_ _ _ ___ ___ ___| |_ _ _
| | | | . |_ -| -_| '_| | |
|_____| _|___|___|_,_|___|
|_| v0.4.0
WPSeku - WordPress Security Scanner
by Momo Outaadi (m4ll0k)
----------------------------------------
[ + ] Target: https://wordpress.example.com/
[ + ] Starting: 12:47:18
[ + ] Server: nginx
[ + ] Uncommon header "X-Mod-Pagespeed" found, with contents: Powered By mod_pagespeed
[ + ] Full Path Disclosure: /home/hoge/wordpress.example.com/public_html/wp-includes/rss-functions.php
[ + ] wp-config.php available at: https://wordpress.example.com/wp-config.php
[ + ] readme.html file was found at: https://wordpress.example.com/readme.html
[ i ] Checking WordPress version...
[ + ] Running WordPress version: 4.9.8
[ i ] Passive enumeration themes...
[ + ] Name: yswallow
| Not found vulnerabilities
[ + ] Name: yswallow_custom
| Not found vulnerabilities
[ i ] Passive enumeration plugins...
[ + ] Name: contact-form-7
| Not found vulnerabilities
[ + ] Name: add-to-any
| Not found vulnerabilities
[ + ] Name: jetpack
| Not found vulnerabilities
[ i ] Enumerating users...
------------------------------
| ID | Username | Login |
------------------------------
| 0 | hoge-user | hoge |
| 1 | hoge-user | None |
------------------------------
検出したプラグインで既知となっている脆弱性情報も出力されます。
使用中のバージョンは把握できないため、参考程度の情報です。
[ i ] Checking plugin vulnerabilities...
b'{"add-to-any":{"latest_version":"1.7.30","last_updated":"2018-09-15T01:09:00.000Z","popular":true,"vulnerabilities":[{"id":8885,"title":"AddToAny Share Buttons <= 1.7.14 - Conditional Host Header Injection","created_at":"2017-08-16T08:32:36.000Z","updated_at":"2017-08-16T08:32:48.000Z","published_date":"2017-08-16T00:00:00.000Z","references":{"url":["https://plugins.trac.wordpress.org/changeset/1713858/add-to-any"]},"vuln_type":"UNKNOWN","fixed_in":"1.7.15"}]}}'
WPSeku の使い方 (サーバローカル)
WordPress と同じサーバ内にインストールした場合の例です。
物理パスを --scan
オプションで指定すると、PHP ファイルをスキャンできます。
$ python3 wpseku.py --scan /path/to/wordpress/
----------------------------------------
_ _ _ ___ ___ ___| |_ _ _
| | | | . |_ -| -_| '_| | |
|_____| _|___|___|_,_|___|
|_| v0.4.0
WPSeku - WordPress Security Scanner
by Momo Outaadi (m4ll0k)
----------------------------------------
[ + ] Checking PHP code...
[ + ] Scanning directory...
[ i ] Scanning /path/to/wordpress/wp-content/plugins/contact-form-7/modules/checkbox.php file
---------------------------------------------------------
| Line | Possibile Vuln. | String |
---------------------------------------------------------
| 151 | Cross-Site Scripting | $_POST[$free_text_name] |
---------------------------------------------------------
[ i ] Scanning /path/to/wordpress/wp-content/plugins/jetpack/modules/contact-form/admin.php file
-------------------------------------------------------------------------
| Line | Possibile Vuln. | String |
-------------------------------------------------------------------------
| 180 | Cross-Site Request Forgery | check_admin_referer('bulk-posts') |
-------------------------------------------------------------------------
[ i ] Scanning /path/to/wordpress/wp-content/plugins/jetpack/sync/class.jetpack-sync-actions.php file
------------------------------------------
| Line | Possibile Vuln. | String |
------------------------------------------
| 75 | Authorization Hole | is_admin() |
------------------------------------------
XSS や CSRF など、脆弱性に繋がる恐れのあるコードが指摘されています。
ドキュメントルートを指定すると大量に出力されてしまいます。
独自カスタマイズした PHP や、特定プラグインのみをスキャンする方が現実的です。
WPScan Vulnerability Database の脆弱性情報
WPSeku では、WPScan Vulnerability Database のデータベースを使用しています。
https://wpvulndb.com/
WordPress の脆弱性に関する公開データベースで、プラグインやテーマに関する情報も含まれています。また、脆弱性の発見した場合は Web から情報提供も可能です。
参考記事
まとめ
- WPSeku で WordPress のセキュリティチェックが行なえます
- 外部から見えている WordPress のメタ情報を調査できます
- PHP ファイルのスキャン機能も搭載しています
WordPress を構築した際や、既存サイトのセキュリティを確認する際に便利です。
対策をしていないと外から見える情報も多いため、注意が必要そうです。