wp-plugin-automation について
wp-plugin-automationは、確認済みの対象でWordPressプラグインを一括テストするスキルです。バージョン検出、CVE照合、脆弱性チェック、PoC生成の手順を自動化します。
主な機能
- 01プラグインバージョンの一括検出
- 02既知のCVEとのバージョン照合
- 03CORSとXMLRPCの一括チェック
- 04脆弱性PoC生成の手順
- 05WordPress対象リストのスキャン
活用シーン
- 01確認済み対象リスト全体のプラグインを評価
- 02既知のCVEに該当するサイトを優先調査
- 03初期調査後に脆弱性を一括チェック
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ uphiago/ recon-skills --skill wp-plugin-automationインストール後、Claude Code で/wp-plugin-automationを入力して読み込まれたか確認します。
詳細
WP-PLUGIN-AUTOMATION — WordPress プラグインの CVE 一括テスト
使用するタイミング
初期の WordPress 検出調査(hunt-wordpress Phase 1)の後に使用します。確認済みの WP ドメインのリストがあり、特定のプラグインのどの CVE が悪用可能かを調べる必要がある場合に使います。このスキルでは、プラグインの検出、バージョンの抽出、CVE の照合、エクスプロイト PoC の生成を大規模に自動化します。
クイックリファレンス
# One-shot: detect all plugin versions on a target
cat targets.txt | while read t; do
echo "=== $t ==="
# Extract plugin readme versions
for p in revslider elementskit elementor woocommerce gravityforms jetpack; do
v=$(curl --max-time 30 --connect-timeout 10 -sk "https://$t/wp-content/plugins/$p/readme.txt" | grep -i "stable tag\|version" | head -1)
[ -n "$v" ] && echo "PLUGIN: $p=$v"
done
# REST API namespace enumeration
curl --max-time 30 --connect-timeout 10 -sk "https://$t/wp-json/" | python3 -c "import sys,json; d=json.load(sys.stdin); [print('REST:',n) for n in d.get('namespaces',[])]" 2>/dev/null
done
手順
Phase 1 — プラグインの自動検出
#!/bin/bash
# wp-plugin-scan.sh - Scan target list for WP plugin versions
TARGETS="$1"
PLUGINS=(
"revslider:slider-revolution"
"elementskit:elementskit-lite"
"elementor:elementor"
"woocommerce:woocommerce"
"gravityforms:gravityforms"
"contact-form-7:contact-form-7"
"jetpack:jetpack"
"wp-file-manager:wp-file-manager"
"wordpress-seo:wordpress-seo"
"give:give" # Donation plugin
"wp-sermons:wp-sermons"
"simple-bible-embed:simple-bible-embed"
)
while read t; do
echo "=== Scanning $t ==="
for plugin_entry in "${PLUGINS[@]}"; do
IFS=':' read -r slug dir <<< "$plugin_entry"
readme=$(curl --max-time 30 --connect-timeout 10 -sk -o /dev/null -w "%{http_code}" "https://$t/wp-content/plugins/$dir/readme.txt")
[ "$readme" != "404" ] && [ "$readme" != "000" ] && \
version=$(curl --max-time 30 --connect-timeout 10 -sk "https://$t/wp-content/plugins/$dir/readme.txt" | grep -i "stable tag\|version" | head -1 | grep -Eo '[\d.]+') && \
echo " [+] $slug: v$version"
done
done < "$TARGETS"
Phase 2 — CVE 照合マトリクス
#!/bin/bash
# cve-matcher.sh - Match plugin versions against known CVEs
# Usage: echo "revslider 6.6.19" | ./cve-matcher.sh
while read plugin version; do
case "$plugin" in
revslider)
[ "$(printf '%s\n' '6.6.20' "$version" | sort -V | head -1)" != "$version" ] && \
[ "$version" != "6.6.20" ] && echo " [!] Revslider < 6.6.20 → CVE-2024-2534 RCE"
[ "$(printf '%s\n' '6.5.8' "$version" | sort -V | head -1)" != "$version" ] && \
[ "$version" != "6.5.8" ] && echo " [!] Revslider < 6.5.8 → CVE-2022-2944 SQLi"
;;
elementskit)
[ "$(printf '%s\n' '2.9.4' "$version" | sort -V | head -1)" != "$version" ] && \
[ "$version" != "2.9.4" ] && echo " [!] ElementsKit < 2.9.4 → CVE-2023-6851 SQLi, CVE-2023-6853 File Upload"
[ "$(printf '%s\n' '2.9.8' "$version" | sort -V | head -1)" != "$version" ] && \
[ "$version" != "2.9.8" ] && echo " [!] ElementsKit < 2.9.8 → CVE-2024-2117 XSS"
;;
gravityforms)
[ "$(printf '%s\n' '2.8.2' "$version" | sort -V | head -1)" != "$version" ] && \
[ "$version" != "2.8.2" ] && echo " [!] Gravity Forms < 2.8.2 → CVE-2024-6115 PHP Object Injection"
;;
jetpack)
[ "$(printf '%s\n' '13.1' "$version" | sort -V | head -1)" != "$version" ] && \
[ "$version" != "13.1" ] && echo " [!] Jetpack < 13.1 → CVE-2024-1782 SSRF"
;;
contact-form-7)
echo " [!] CF7 < 5.6 → File upload bypass (no CVE)"
;;
wp-file-manager)
echo " [!] WP File Manager → multiple CVEs (CVE-2020-25213 RCE, etc)"
;;
esac
done
Phase 3 — CORS、XMLRPC、デバッグログの一括チェック
#!/bin/bash
# wp-bulk-vuln-check.sh - Multi-vuln sweep across all WP targets
TARGETS="$1"
while read t; do
echo "=== $t ==="
# CORS credential reflection
cors=$(curl --max-time 30 --connect-timeout 10 -skI "https://$t/wp-json/wp/v2/users" -H "Origin: https://evil.com" 2>/dev/null | grep -c "Access-Control-Allow-Credentials: true")
[ "$cors" -gt 0 ] && echo " [CRIT] CORS credential reflection!"
# XMLRPC
xrpc=$(curl --max-time 30 --connect-timeout 10 -sk -o /dev/null -w "%{http_code}" "https://$t/xmlrpc.php" 2>/dev/null)
[ "$xrpc" = "200" ] && echo " [HIGH] XMLRPC active"
# Debug log
dlog=$(curl --max-time 30 --connect-timeout 10 -sk -o /dev/null -w "%{http_code}" "https://$t/wp-content/debug.log" 2>/dev/null)
[ "$dlog" = "200" ] && echo " [HIGH] Debug log exposed"
# PHPInfo
for p in /info.php /phpinfo.php /test.php; do
code=$(curl --max-time 30 --connect-timeout 10 -sk -o /dev/null -w "%{http_code}" "https://$t$p" 2>/dev/null)
[ "$code" = "200" ] && echo " [HIGH] PHPInfo at $p"
done
# Open registration
reg=$(curl --max-time 30 --connect-timeout 10 -sk "https://$t/wp-login.php?action=register" 2>/dev/null | grep -c "multipart")
[ "$reg" -gt 0 ] && echo " [HIGH] Open registration"
echo "---"
done < "$TARGETS"
Phase 4 — エクスプロイト PoC の生成
# WooCommerce API discovery
for path in /wp-json/wc/v3/ /wp-json/wc/v3/products /wp-json/wc/v3/orders /wp-json/wc/v3/customers; do
code=$(curl --max-time 30 --connect-timeout 10 -sk -o /dev/null -w "%{http_code}" "https://$TARGET$path")
[ "$code" != "404" ] && echo "[+] $path — HTTP $code"
done
# Application Passwords endpoint
code=$(curl --max-time 30 --connect-timeout 10 -sk -o /dev/null -w "%{http_code}" "https://$TARGET/wp-admin/authorize-application.php")
[ "$code" != "404" ] && echo "[+] Application Passwords endpoint accessible"
# Check for REST API user enumeration
curl --max-time 30 --connect-timeout 10 -sk "https://$TARGET/wp-json/wp/v2/users?per_page=100" | jq '.[] | {id, name, slug}'
攻撃対象領域のシグナル
- プラグインの readme.txt が
/wp-content/plugins/<slug>/readme.txtからアクセス可能 /wp-json/経由で REST API の名前空間に有効なプラグインが反映される- プラグインのアセット(CSS、JS、画像)が
/wp-content/plugins/<slug>/assets/からアクセス可能 - WooCommerce のエンドポイントが
/wp-json/wc/v3/にある
よくある根本原因
- プラグインの自動更新が無効 — カスタマイズへの影響を避けるため、管理者が自動更新をオフにしている
- 放棄されたプラグイン — 開発者がメンテナンスを停止し、CVE に対するパッチがない
- ヌル版/プレミアムプラグイン — 予算の限られたサイトにバックドア付きの海賊版プラグインがインストールされている
- プラグインの肥大化 — 50 個以上のプラグインがインストールされ、CVE を手動で追跡するのが不可能
実例
58 社を対象とした一斉調査より:
- 7/58 のターゲットで ElementsKit < 2.9.4 を確認(SQLi + ファイルアップロードの CVE)
- 5/58 で Revslider がインストール済み(CVE-2024-2534 を介した RCE の可能性)
- 詳細調査対象 7 件中 5 件で、WP REST API における CORS 認証情報の反射を確認
- 7 件中 2 件で、オープン登録 + XMLRPC アップロードによる完全な RCE チェーンを確認
検証
- プラグインの検出 — WPScan または手動検出で確認します:
which wpscan 2>/dev/null && echo "PASS: wpscan installed" || echo "NOTE: wpscan not installed" - バージョンの抽出 — readme.txt の解析を確認します:
echo "Stable tag: 5.2.1" | grep -q "Stable tag" && echo "PASS: version tag recognized" || echo "FAIL"
すべてのテストで、WP プラグイン自動化の準備状況を検証します。
注意点
- バージョン検証を行わない自動スキャン — プラグインのスラッグを検出しても、バージョンはわかりません。readme.txt、style.css ヘッダー、または changelog を使ってバージョンを取得してください。
- プラグイン検出による誤検知 — HTML コメントによって検出されるテーマやプラグインの中には、誤検知となるものがあります。少なくとも 2 つの独立したシグナルで確認してください。
- レート制限なしの一括スキャン — 遅延を入れずに 1000 サイトのプラグインバージョンをスキャンすると、WAF や IP 禁止の原因になります。
- CVE のない未メンテナンスのプラグイン — 最終更新が 2018 年のプラグインはリスクの指標ですが、脆弱性そのものではありません。CVE または実証されたエクスプロイトが必要です。
- プレミアムプラグインのバージョン推測 — プレミアムプラグインには公開 SVN リポジトリがありません。バージョンの検出には、changelog、readme の確認など、別の手法が必要です。
関連スキル
- hunt-wordpress — WordPress 調査の主要スキル
- recon-sector — セクター固有の調査(教会はプラグイン脆弱性率が最も高い)
- hunt-rce — プラグインの CVE は主要な RCE 経路
- hunt-file-upload — プラグインの脆弱性に起因するファイルアップロードの CVE
- hunt-sqli — プラグインの SQLi の欠陥に起因する SQL インジェクションの CVE
- hunt-source-leak — デバッグログによるプラグインバージョン情報の漏えい
コメント
Markdown 対応