WPSeku で WordPress の脆弱性をスキャンする方法

セキュリティTech

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 を構築した際や、既存サイトのセキュリティを確認する際に便利です。
対策をしていないと外から見える情報も多いため、注意が必要そうです。