elqahtani/wphunter

GitHub: elqahtani/wphunter

一款Python编写的WordPress全栈漏洞扫描器,支持离线和远程两种模式扫描插件、主题及核心程序的已知CVE,集成多源POC查询、赌博黑产检测和AI智能分析能力。

Stars: 1 | Forks: 0

# wphunter 一款用于扫描 WordPress **插件、主题和核心** 程序已知 CVE 漏洞的 Python CLI 工具,支持**查找公开 exploits/POCs**,检测 **judol (赌博垃圾邮件) 注入**,并通过 Claude 提供 **AI 驱动的分析**。既支持离线工作(从导出的列表),也支持远程工作(从 URL)。支持 Anthropic API 密钥(按 token 付费)或通过 Claude Code SDK 使用 Claude Pro/Max 订阅。 [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/) [![CI](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/230df2b367225101.svg)](https://github.com/elqahtani/wphunter/actions) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)

wphunter banner

## 为什么选择这款工具? 我想审计我 WordPress 网站上的插件——快速检查哪些插件存在已知的 CVE。但现有的每一款工具要么需要一个在线 URL,要么根本不支持 WordPress: | 工具 | 离线扫描? | POC 查找? | Judol 检测? | AI 分析? | 免费? | |------|:------------:|:-----------:|:----------------:|:------------:|:-----:| | WPScan CLI | 否 (需要 URL) | 否 | 否 | 否 | 免费增值 | | Wordfence CLI | 否 (需要文件系统) | 否 | 否 | 否 | 免费增值 | | Sucuri SiteCheck | 否 (需要 URL) | 否 | 部分 | 否 | 免费 | | Trivy | 否 | 否 | 否 | 否 | 免费 | | osv-scanner | 否 | 否 | 否 | 否 | 免费 | | **wphunter** | **是** | **是 (6 个来源)** | **是 (200+ 品牌)** | **是 (Claude AI)** | **是** | **wphunter** 填补了这一空白。导出你的插件/主题列表和核心版本,传输到你的机器上,离线扫描。没有 WAF 触发,没有防火墙问题,不需要认证。此外:提供其他 WordPress 扫描器所不具备的 AI 驱动分析。 ## 功能特性 ### 漏洞扫描 - **离线扫描** —— 不需要访问你的 WordPress 站点,只需插件/主题列表 - **远程扫描** —— 通过 URL 扫描在线 WordPress 站点,自动进行指纹识别 - **插件、主题和核心** —— 扫描所有三种 WordPress 组件类型的已知 CVE - **多种漏洞来源** —— WPScan API、WPVulnerability.net 或两者结合 - **默认免费** —— WPVulnerability.net 不需要 API 密钥,并聚合了 6 个数据库 (CVE, WPScan, Wordfence, Patchstack, EUVD, JVN) - **智能去重** —— 当同时使用两个来源时,合并重复项并保留最丰富的数据 - **版本感知匹配** —— 只报告影响你已安装版本的漏洞 ### Judol (赌博垃圾邮件) 检测 - **200+ 已知运营商品牌** —— judol 品牌数据库 (WDBOS, Arena303, Slot88 等),来源于执法部门突击检查、安全研究和黑客数据库 - **全站地图爬取** —— 爬取 WordPress 站点地图中的每一页以查找隐藏的感染 - **伪装检测** —— 比较 Googlebot 与人类的响应以检测 SEO 伪装 - **隐藏元素分析** —— 查找 CSS 隐藏的赌博内容 (display:none, position:absolute, font-size:0, opacity:0) - **可疑链接/脚本检测** —— 识别赌博域名、外部脚本和黑客 C2 基础设施 - **关键词数据库** —— 高/中/低置信度关键词匹配,支持多语言 (印尼语, 英语, 波兰语) ### AI 驱动分析 (Claude) - **智能威胁评估** —— Claude AI 分析扫描结果并提供结构化的安全报告 - **执行摘要** —— 为非技术利益相关者提供双语 (英语 + 印尼语) 摘要 - **感染媒介分析** —— AI 根据检测到的漏洞和感染模式识别可能的攻击媒介 - **可操作的修复步骤** —— 针对特定感染定制的分步清理说明 - **两种认证选项** —— 使用你的 Anthropic API 密钥 (按 token 付费, Sonnet 4) 或通过 Claude Code SDK 使用 Claude Pro/Max 订阅 (无额外费用) - **Token 用量追踪** —— 在每次 AI 调用后显示输入/输出 token 和预估成本 ### POC / Exploit 查找 - **公开 exploit 检测** —— 检查每个发现的 CVE 是否存在即用型 exploit 代码 - **6 个免费来源** —— Shodan CVEDB, CISA KEV, Exploit-DB, nomi-sec PoC-in-GitHub, Nuclei Templates, NVD exploit 引用 - **EPSS 评分** —— 通过 Shodan CVEDB 显示 EPSS 模型的利用概率评分 (0–100%) - **CISA KEV 匹配** —— 标记在野外被主动利用的 CVE (立即修补) - **优先级分类** —— 每个 CVE 被分类:在野外被利用 > 公开 Exploit > 公开 POC > Nuclei 模板 > Exploit 引用 > 无已知 POC - **智能缓存** —— CISA KEV 目录 (24h TTL) 和 Exploit-DB CSV (7d TTL) 在本地缓存于 `~/.wphunter/cache/` - **无需 API 密钥** —— 所有 6 个来源都是免费的,不需要认证 ### 通用 - **多种输入格式** —— 简单 CSV、`wp-cli` CSV 输出或制表符分隔 - **多种输出格式** —— 终端表格、JSON 或 CSV - **NVD 丰富化** —— 可选地从 NIST NVD 获取缺失 CVSS 评分的条目 - **并发请求** —— 使用 `--threads` 进行并行 API 调用,快速扫描大型列表 - **API 密钥轮换** —— 轮换多个 WPScan API 密钥以绕过 25 次/天的限制 - **严重性过滤** —— 用于 CI/CD 管道的 `--min-severity` 标志 - **CI/CD 友好** —— 发现漏洞时以代码 1 退出,发现 judol 感染时以代码 2 退出 ## 快速开始 ### 安装 ``` git clone https://github.com/elqahtani/wphunter.git cd wphunter pip install -r requirements.txt ``` ### 基本扫描 (无需 API 密钥) ``` python scanner.py -i plugins.csv ``` 就是这样。这使用的是完全免费的 WPVulnerability.net。 ### 带 POC 查找 ``` # 检查发现的 CVE 是否存在公开漏洞 python scanner.py -i plugins.csv --poc ``` ### 远程扫描 (从 URL) ``` # 扫描一个在线 WordPress 站点 python scanner.py --url https://example.com # 包含 judol 检测 python scanner.py --url https://example.com --detect-judol # 完整扫描: aggressive + POC lookup + judol + AI 分析 python scanner.py --url https://example.com --aggressive --poc --detect-judol --ai ``` ### 获取你的插件/主题列表和核心版本 在你的 WordPress 服务器上: ``` # Plugins wp plugin list --format=csv > plugins.csv # Themes wp theme list --format=csv > themes.csv # Core version wp core version # 输出: 6.4.3 ``` 将 CSV 文件传输到你的机器。然后进行扫描。 ## 用法 ### 离线扫描 (从导出的列表) ``` # 使用免费源扫描 plugins (默认) python scanner.py -i plugins.csv # 扫描 themes python scanner.py -i themes.csv --type theme # 扫描 WordPress core version python scanner.py --wp-version 6.4.3 # 组合: plugins + core python scanner.py -i plugins.csv --wp-version 6.4.3 # 组合: themes + core python scanner.py -i themes.csv --type theme --wp-version 6.4.3 # 使用 WPScan API 扫描 python scanner.py -i plugins.csv --source wpscan # 最大覆盖范围: 两个来源,去重 python scanner.py -i plugins.csv --source both # JSON 输出 python scanner.py -i plugins.csv -f json -o report.json # 用于电子表格的 CSV 输出 python scanner.py -i plugins.csv -f csv -o report.csv # 跳过 NVD enrichment (更快) python scanner.py -i plugins.csv --no-enrich # 并行请求 (对于大型列表更快) python scanner.py -i plugins.csv --threads 10 # 仅限 critical + high (CI/CD: 仅在出现严重漏洞时使构建失败) python scanner.py -i plugins.csv --min-severity high # POC lookup: 检查发现的 CVE 是否存在公开漏洞 python scanner.py -i plugins.csv --poc # POC lookup + 两个来源 + core version python scanner.py -i plugins.csv --wp-version 6.4.3 --source both --poc # 带 JSON 输出的 POC lookup python scanner.py -i plugins.csv --poc --format json -o report.json ``` ### 远程扫描 (从 URL) ``` # 指纹识别 WordPress 站点并扫描检测到的 plugins/themes python scanner.py --url https://example.com # Aggressive 模式: 暴力破解 top 100 plugins python scanner.py --url https://example.com --aggressive # 添加 judol (赌博垃圾信息) 检测 python scanner.py --url https://example.com --detect-judol # 完整扫描: aggressive + POC lookup + judol + AI 分析 python scanner.py --url https://example.com --aggressive --poc --detect-judol --ai # 请求之间的自定义延迟 (毫秒) python scanner.py --url https://example.com --aggressive --delay 200 # 跳过确认提示 python scanner.py --url https://example.com --yes ``` ### 认证 (用于 AI 分析) ``` # 使用 Anthropic API key 连接 python scanner.py connect # 检查认证状态 python scanner.py auth-status # 断开连接 python scanner.py disconnect ``` ### CLI 选项 | 标志 | 默认值 | 描述 | |------|---------|-------------| | `-i, --input` | — | 插件/主题列表文件路径 | | `-t, --type` | `plugin` | 组件类型: `plugin` 或 `theme` | | `--wp-version` | — | 要扫描的 WordPress 核心版本 (例如 `6.4.3`) | | `--url` | — | 用于远程扫描的 WordPress 站点 URL | | `-s, --source` | `wpvulndb` | 漏洞来源: `wpscan`, `wpvulndb`, 或 `both` | | `-f, --format` | `table` | 输出格式: `table`, `json`, 或 `csv` | | `-o, --output` | *(stdout)* | 将结果写入文件 | | `--no-enrich` | `false` | 跳过 NVD CVSS 丰富化 | | `--no-banner` | `false` | 跳过 ASCII banner | | `--threads` | `1` | 并发 API 请求数 | | `--min-severity` | — | 最低严重性: `critical`, `high`, `medium`, 或 `low` | | `--aggressive` | `false` | 激进的插件枚举 (远程扫描) | | `--delay` | `100` | 请求之间的延迟 (毫秒) (远程扫描) | | `--detect-judol` | `false` | 启用 judol (赌博垃圾邮件) 检测 | | `--poc` | `false` | 查找发现的 CVE 的公开 exploits/POCs | | `--ai` | `false` | 启用 AI 驱动的分析 (需要认证) | | `--ai-model` | `claude-sonnet-4-20250514` | 用于 AI 分析的 Claude 模型 | | `--yes` | `false` | 跳过确认提示 | 至少需要 `--input`、`--wp-version` 或 `--url` 中的一个。 ### 子命令 | 命令 | 描述 | |---------|-------------| | `connect` | 设置 Anthropic API 认证 | | `auth-status` | 显示当前认证状态 | | `disconnect` | 删除已保存的凭证 | ## 输入格式 该工具会自动检测你的文件格式。插件和主题使用相同的格式。 **简单 CSV** (手动): ``` elementor,3.6.0 contact-form-7,5.5.0 woocommerce,6.0.0 ``` **wp-cli CSV 输出** (`wp plugin list --format=csv` 或 `wp theme list --format=csv`): ``` name,status,update,version,update_version,auto_update elementor,active,none,3.6.0,,off contact-form-7,active,none,5.5.0,,off ``` **制表符分隔** (`wp plugin list` 或 `wp theme list`): ``` elementor active none 3.6.0 contact-form-7 active none 5.5.0 ``` 以 `#` 开头的行被视为注释并被忽略。 ## 漏洞来源 | 来源 | 发现的漏洞* | API 密钥? | 频率限制 | 数据库 | |--------|:-----------:|:--------:|:----------:|-----------| | **WPVulnerability.net** | 108 | 否 | 无 | CVE + WPScan + Wordfence + Patchstack + EUVD + JVN | | **WPScan API** | 74 | 必需 | 25 次/天/密钥 | WPScan 精选数据库 | | **两者 (去重)** | 120 | 仅 WPScan | 组合 | 以上所有 | *\*使用相同的 8 个插件测试* **推荐:** 使用 `--source both` 以获得最大覆盖率。该工具会自动去重。 ### WPScan API 设置 1. 在 [wpscan.com](https://wpscan.com/register) 注册一个免费账户 2. 获取你的 API token (免费层每天 25 次请求) 3. 设置环境变量: ``` export WPSCAN_API_KEYS="your_key_here" ``` **密钥轮换:** 注册多个账户并提供以逗号分隔的密钥: ``` export WPSCAN_API_KEYS="key1,key2,key3" ``` 该工具使用轮询方式在密钥之间轮换,并自动跳过已耗尽的密钥。 ### NVD 丰富化 (可选) 某些漏洞条目缺少 CVSS 评分。该工具可以从 NIST NVD 获取它们: ``` # 无 key: 每 6 秒 1 个请求 python scanner.py -i plugins.csv # 有 key: 快 10 倍 export NVD_API_KEY="your_nvd_key" python scanner.py -i plugins.csv ``` 在 [nvd.nist.gov](https://nvd.nist.gov/developers/request-an-api-key) 获取免费的 NVD API 密钥。 使用 `--no-enrich` 完全跳过丰富化。 ## 输出 ### 表格 (默认)

wphunter table output

颜色编码的严重性级别,包含 CVSS 评分、修复版本和摘要面板。
完整扫描输出 (文本) ``` ┬ ┬┌─┐┬ ┬┬ ┬┌┐┌┌┬┐┌─┐┬─┐ │││├─┘├─┤│ ││││ │ ├┤ ├┬┘ └┴┘┴ ┴ ┴└─┘┘└┘ ┴ └─┘┴└─ WordPress Plugin, Theme & Core Vulnerability Scanner Sources: WPScan API | WPVulnerability.net | NVD [*] Found 8 plugins in live-plugins.csv akismet@5.3.1 all-in-one-seo-pack@4.2.0 elementor@3.6.0 hello@1.7.2 jetpack@11.0 really-simple-ssl@6.0.0 updraftplus@1.22.24 woocommerce@6.0.0 [*] --- WPVulnerability.net --- [*] WPVulnerability.net: free API, no key required [+] akismet@5.3.1: 0 vulns [+] all-in-one-seo-pack@4.2.0: 10 vulns [+] elementor@3.6.0: 31 vulns [+] hello@1.7.2: 0 vulns [+] jetpack@11.0: 16 vulns [+] really-simple-ssl@6.0.0: 4 vulns [+] updraftplus@1.22.24: 12 vulns [+] woocommerce@6.0.0: 35 vulns [*] WPVulnerability.net: 108 vulnerabilities wphunter -- live-plugins.csv (Critical + High) ┏━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━┓ ┃ CVE ┃ Plugin ┃ CVSS ┃ Severity ┃ Summary ┃ Fix ┃ ┡━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━┩ │ CVE-2023-48777 │ elementor@3.6.0 │ 9.9 C │ CRITICAL │ Contributor+ Arbitrary File Upload to │ 3.18.2 │ │ │ │ │ │ RCE │ │ ├──────────────────┼─────────────────────────┼────────┼────────────┼────────────────────────────────────────┼──────────┤ │ CVE-2024-10924 │ really-simple-ssl@6.0.0 │ 9.8 C │ CRITICAL │ Authentication Bypass (admin takeover) │ 9.1.1.1 │ ├──────────────────┼─────────────────────────┼────────┼────────────┼────────────────────────────────────────┼──────────┤ │ CVE-2022-1329 │ elementor@3.6.0 │ 8.8 H │ HIGH │ Subscriber+ Arbitrary File Upload │ 3.6.2 │ ├──────────────────┼─────────────────────────┼────────┼────────────┼────────────────────────────────────────┼──────────┤ │ CVE-2024-10957 │ updraftplus@1.22.24 │ 8.8 H │ HIGH │ PHP Object Injection via Backup │ 1.24.12 │ ├──────────────────┼─────────────────────────┼────────┼────────────┼────────────────────────────────────────┼──────────┤ │ CVE-2024-24934 │ elementor@3.6.0 │ 8.5 H │ HIGH │ Contributor+ Arbitrary File Upload │ 3.19.1 │ ├──────────────────┼─────────────────────────┼────────┼────────────┼────────────────────────────────────────┼──────────┤ │ CVE-2023-47504 │ elementor@3.6.0 │ 7.5 H │ HIGH │ Missing Authorization to Setting │ 3.16.5 │ │ │ │ │ │ Change │ │ ├──────────────────┼─────────────────────────┼────────┼────────────┼────────────────────────────────────────┼──────────┤ │ CVE-2023-32960 │ updraftplus@1.22.24 │ 7.1 H │ HIGH │ Sensitive Data Exposure via Backup Log │ 1.23.4 │ └──────────────────┴─────────────────────────┴────────┴────────────┴────────────────────────────────────────┴──────────┘ Total: 108 vulnerabilities (2 CRITICAL, 5 HIGH, 37 MEDIUM, 1 LOW) Source: wpvulndb (WPVulnerability.net) Recommended: elementor -> 3.18.2, really-simple-ssl -> 9.1.1.1 ```
### JSON ``` python scanner.py -i plugins.csv -f json -o report.json ```
JSON 输出示例 ``` { "scan": { "input_file": "plugins.csv", "source": "wpvulndb", "type": "wordpress" }, "summary": { "total": 108, "critical": 2, "high": 5, "medium": 37, "low": 1, "unknown": 63 }, "vulnerabilities": [ { "plugin": "elementor", "version": "3.6.0", "cve_id": "CVE-2023-48777", "cvss_score": 9.9, "severity": "CRITICAL", "summary": "Contributor+ Arbitrary File Upload to RCE", "fix_version": "3.18.2", "url": "https://nvd.nist.gov/vuln/detail/CVE-2023-48777", "source": "wpvulndb", "references": [ "https://www.wordfence.com/threat-intel/vulnerabilities/id/...", "https://patchstack.com/database/vulnerability/elementor/..." ] }, { "plugin": "really-simple-ssl", "version": "6.0.0", "cve_id": "CVE-2024-10924", "cvss_score": 9.8, "severity": "CRITICAL", "summary": "Authentication Bypass (admin takeover)", "fix_version": "9.1.1.1", "url": "https://nvd.nist.gov/vuln/detail/CVE-2024-10924", "source": "wpvulndb", "references": ["..."] } ] } ```
### CSV ``` python scanner.py -i plugins.csv -f csv -o report.csv ``` 可在任何电子表格应用程序中打开。单元格内的引用以分号分隔。 ### POC 查找输出 使用 `--poc` 时,将显示一个额外的表格,展示每个 CVE 的 exploit/POC 可用性: ``` POC / Exploit Lookup ┌──────────────────┬──────┬────────────────────┬─────────────────────────┐ │ CVE │ EPSS │ Status │ Details │ ├──────────────────┼──────┼────────────────────┼─────────────────────────┤ │ CVE-2023-48777 │ 0.94 │ 🔴 EXPLOITED IN │ CISA KEV, 3 GitHub │ │ │ │ WILD │ repos (★47) │ ├──────────────────┼──────┼────────────────────┼─────────────────────────┤ │ CVE-2024-27956 │ 0.91 │ 🟠 PUBLIC EXPLOIT │ EDB-51942 │ ├──────────────────┼──────┼────────────────────┼─────────────────────────┤ │ CVE-2023-6553 │ 0.72 │ 🟡 PUBLIC POC │ 5 GitHub repos (★47) │ ├──────────────────┼──────┼────────────────────┼─────────────────────────┤ │ CVE-2024-1234 │ 0.15 │ 🟡 NUCLEI TEMPLATE │ nuclei template │ ├──────────────────┼──────┼────────────────────┼─────────────────────────┤ │ CVE-2024-5678 │ 0.03 │ ⚪ NO KNOWN POC │ — │ └──────────────────┴──────┴────────────────────┴─────────────────────────┘ 3/5 CVEs have public exploits or POCs 1 CVE actively exploited in the wild (CISA KEV) Top EPSS: CVE-2023-48777 (94% exploit probability) ``` **POC 状态分类 (优先级顺序):** | 状态 | 图标 | 来源 | 含义 | |--------|------|--------|---------| | 在野外被利用 | 🔴 | CISA KEV | 正被主动利用,尽快修补 | | 公开 Exploit | 🟠 | Exploit-DB | 存在即用型 exploit 代码 | | 公开 POC | 🟡 | nomi-sec PoC-in-GitHub | GitHub 上的 POC 仓库 | | Nuclei 模板 | 🟡 | nuclei-templates | 存在检测模板 | | Exploit 引用 | 🔵 | NVD API | 标记为 "Exploit" 的引用 | | 无已知 POC | ⚪ | (未匹配) | 未发现公开 exploit | **EPSS** (Exploit Prediction Scoring System) 表示 CVE 在未来 30 天内被利用的概率。高于 0.5 (50%) 的分数以红色高亮显示。
带 POC 数据的 JSON 输出 当使用 `--poc --format json` 时,添加一个 `poc` 键: ``` { "scan": { "..." : "..." }, "summary": { "..." : "..." }, "vulnerabilities": ["..."], "poc": { "CVE-2023-48777": { "cve_id": "CVE-2023-48777", "status": "EXPLOITED IN WILD", "epss_score": 0.9421, "epss_percentile": 0.9935, "exploited_in_wild": true, "ransomware_use": "Known", "exploit_db": [{"id": "51234", "title": "Elementor RCE", "url": "..."}], "github_pocs": [{"url": "...", "name": "user/repo", "stars": 47, "description": "..."}], "has_nuclei_template": true, "nuclei_template_url": "https://raw.githubusercontent.com/...", "nvd_exploit_refs": ["https://..."] }, "CVE-2024-5678": { "cve_id": "CVE-2024-5678", "status": "NO KNOWN POC", "epss_score": 0.03, "exploited_in_wild": false, "exploit_db": [], "github_pocs": [], "has_nuclei_template": false } } } ```
## 退出代码 | 代码 | 含义 | |:----:|---------| | `0` | 干净 —— 未发现漏洞或感染 | | `1` | 发现漏洞 | | `2` | 检测到 Judol (赌博垃圾邮件) 感染 | 在 CI/CD 管道中使用此代码,以便在检测到易受攻击的插件时使构建失败。结合 `--min-severity high` 可仅在出现严重和高危漏洞时失败。 ## 严重性级别 基于 CVSS v3 评分: | 级别 | CVSS 范围 | 指示器 | |-------|:----------:|:---------:| | Critical | 9.0 - 10.0 | `9.8 C` | | High | 7.0 - 8.9 | `8.8 H` | | Medium | 4.0 - 6.9 | `5.3 M` | | Low | 0.1 - 3.9 | `2.1 L` | | Unknown | 无评分 | `? ?` | ## 工作原理 ### 模式 1: 离线 (从导出的列表) ``` [WordPress Server] [Your Machine] | | wp plugin list wphunter/ wp theme list scanner.py wp core version | | v v +------------------+ +--------------+ | Parse plugins/ | | plugins.csv | --------> | themes from | | themes.csv | scp | CSV/TXT | | core: 6.4.3 | +---+----+---------+ +--------------+ | | +------------+ +--------+ | | v v +----------------+ +-----------------+ | WPVulnerability| | WPScan API | | .net (FREE) | | (API key) | +-------+--------+ +--------+--------+ | | v v [Deduplicate + NVD Enrich] --> [POC Lookup (--poc)] --> [Table/JSON/CSV] ``` ### 模式 2: 远程 (从 URL) ``` [Target WordPress Site] [Your Machine] | | | <--- HTTP requests --- scanner.py --url | | v v +--------------+ +------------------+ | HTML source | --------> | Remote Scanner | | REST API | | (fingerprint) | | readme.txt | +--------+---------+ +--------------+ | +--------+--------+ | | v v +-----------------+ +-------------+ | Vuln Scanning | | Judol | | (same as above) | | Detection | +--------+--------+ +------+------+ | | v v [Combined Report: vulns + POC + judol + AI] ``` ### 全站审计示例 ``` # 在 WordPress 服务器上: 导出所有内容 wp plugin list --format=csv > plugins.csv wp theme list --format=csv > themes.csv wp core version > wp-version.txt # 在你的机器上: 扫描所有组件 WP_VER=$(cat wp-version.txt) # Plugins + core + POC lookup python scanner.py -i plugins.csv --wp-version $WP_VER --source both --poc # Themes (需单独运行,因为 --type 不同) python scanner.py -i themes.csv --type theme --source both --poc ``` ## 项目结构 ``` wphunter/ ├── scanner.py # CLI entry point ├── config.py # API keys, URLs, rate limits ├── models.py # VulnResult dataclass ├── reporter.py # Output: table, JSON, CSV, judol reports ├── auth.py # Authentication system (API key, OAuth) ├── requirements.txt # requests, rich, beautifulsoup4, lxml, claude-agent-sdk ├── .env.example # Environment variable template ├── apis/ │ ├── wpscan.py # WPScan API v3 client │ ├── wpvulndb.py # WPVulnerability.net client │ ├── nvd.py # NVD CVSS enrichment │ ├── poc_lookup.py # POC/exploit lookup (6 sources) │ ├── ai_analyzer.py # Claude AI analysis │ └── token_tracker.py # API token usage & cost tracking ├── parsers/ │ ├── wordpress.py # Plugin/theme list parser (3 formats) │ └── remote.py # Remote WordPress fingerprinting ├── detectors/ │ └── judol.py # Judol (gambling spam) injection detector ├── tests/ # pytest test suite (111 tests) ├── test_fixtures/ # HTML fixtures for testing ├── docker-test/ # Docker WordPress for testing │ └── docker-compose.yml └── .github/workflows/ └── ci.yml # GitHub Actions CI (Python 3.10-3.13) ``` ## Docker 测试环境 想用真实的 WordPress 进行测试?使用 Docker 启动一个: ``` cd docker-test docker compose up -d db wordpress # 安装 WordPress docker compose run --rm wpcli core install \ --url=http://localhost:8888 \ --title="Test Site" \ --admin_user=admin \ --admin_password=admin123 \ --admin_email=admin@test.local \ --skip-email # 安装一些旧 plugins docker compose run --rm wpcli plugin install elementor --version=3.6.0 --activate docker compose run --rm wpcli plugin install contact-form-7 --version=5.5.0 --activate docker compose run --rm wpcli plugin install woocommerce --version=6.0.0 --activate # 导出并扫描 docker compose run --rm wpcli plugin list --format=csv > live-plugins.csv docker compose run --rm wpcli theme list --format=csv > live-themes.csv WP_VER=$(docker compose run --rm wpcli core version | tr -d '\r') cd .. # 扫描 plugins + core python scanner.py -i docker-test/live-plugins.csv --wp-version $WP_VER --source both # 扫描 themes python scanner.py -i docker-test/live-themes.csv --type theme --source both ``` ## POC / Exploit 查找 漏洞扫描后,`--poc` 标志检查每个发现的 CVE 是否存在公开的 exploit 代码或概念验证。这有助于确定修补的优先级——一个拥有即用型 exploit 的 CVE 远比没有已知 POC 的危险得多。 ### 工作原理 该工具查询 **6 个免费公开来源** (无需 API 密钥): | 来源 | 提供内容 | 缓存 | |--------|-----------------|-------| | **Shodan CVEDB** | EPSS 评分 (利用概率) + KEV 标志 | 每次 CVE 实时查询 | | **CISA KEV** | 确认在野外被主动利用 | 本地, 24h TTL (~2MB) | | **Exploit-DB** | 即用型 exploit 代码条目 | 本地, 7d TTL (~12MB) | | **nomi-sec PoC-in-GitHub** | GitHub POC 仓库及 star 数 | 每次 CVE 实时查询 | | **Nuclei Templates** | 检测模板是否存在 | 实时 HEAD 检查 | | **NVD API** | 标记为 "Exploit" 的引用 | 每次 CVE 实时查询 | 首次运行时,CISA KEV 和 Exploit-DB 会被下载并缓存在 `~/.wphunter/cache/`。后续运行会重用缓存直到 TTL 过期。 ### 频率限制 - **Shodan CVEDB / nomi-sec**: 请求间隔 0.5s (保守) - **NVD API**: 使用现有的 NVD 频率限制 (无密钥 6s, 有密钥 0.6s) - **Nuclei / KEV / Exploit-DB**: 无每次请求限制 (缓存或仅 HEAD) 对于包含约 20 个 CVE 的扫描,总 POC 查找时间约为 30–40 秒。 ### 用法 ``` # 基本 POC lookup python scanner.py -i plugins.csv --poc # 结合远程扫描 python scanner.py --url https://example.com --poc -y # 跳过 NVD enrichment 但仍执行 POC lookup python scanner.py -i plugins.csv --no-enrich --poc # 完整流程: 两个来源 + POC + judol + AI python scanner.py --url https://example.com --source both --poc --detect-judol --ai -y ``` ## Judol 检测 ### 此工具检测什么 wphunter 的 `--detect-judol` 标志检查 WordPress 站点**是否已被感染**了赌博垃圾邮件注入。它不能防止攻击——它检测现有的感染以便你进行清理。 检测工作覆盖**所有页面**,通过 WordPress 站点地图爬取,而不仅仅是主页。 ### 检测层 | 层 | 检查内容 | 方式 | |-------|---------------|-----| | **1. SERP 检查** | 赌博页面是否被 Google 收录? | 查询 Google CSE API 或生成手动搜索 URL | | **2. 伪装** | 站点是否向 Googlebot 提供不同的内容? | 比较人类与 Googlebot User-Agent 的响应 | | **3. 内容分析** | 页面中是否有隐藏的赌博内容? | 扫描关键词、隐藏的 CSS 元素、可疑链接 | | **4. 站点地图爬取** | 单个页面是否被感染? | 获取 sitemap.xml/wp-sitemap.xml,爬取页面,逐一分析 | | **5. 垃圾目录** | 攻击者是否创建了赌博目录? | 对常见垃圾路径 的 HEAD 请求 | | **6. AI 分析** | 更深层的上下文分析 (可选) | 将发现发送到 Claude API 进行专家级评估 | ### 用法 ``` # 基本 judol 扫描 python scanner.py --url https://example.com --detect-judol # 包含 AI 分析 python scanner.py --url https://example.com --detect-judol --ai # 完整扫描: 漏洞 + judol + aggressive 指纹识别 python scanner.py --url https://example.com --aggressive --detect-judol # 用于集成的 JSON 输出 python scanner.py --url https://example.com --detect-judol -f json -o report.json ``` ### 攻击媒介 (站点如何被感染) wphunter 还通过扫描插件、主题和 WordPress 核心中的已知 CVE,帮助识别攻击者可能的**入侵方式**。judol 注入的常见攻击媒介: | 攻击媒介 | 示例 | wphunter 是否检测? | |---------------|---------|:-----------------:| | **易受攻击的插件** | Elementor RCE (CVE-2023-48777, CVSS 9.9) | 是 —— `--url` 或 `-i plugins.csv` | | **易受攻击的主题** | 主题文件上传漏洞 | 是 —— `--type theme` | | **过时的 WordPress 核心** | 核心 XSS/CSRF/认证绕过 | 是 —— `--wp-version` 或通过 `--url` 自动检测 | | **认证绕过** | Really Simple SSL (CVE-2024-10924, CVSS 9.8) | 是 —— CVE 扫描 | | **弱凭证** | 被暴力破解的管理员密码 | 否 —— 使用 Wordfence/WPScan | | **被入侵的主机** | 共享主机邻居攻击 | 否 —— 需要服务器级检查 | | **供应链** | 破解/盗版插件/主题 | 否 —— 需要文件系统访问 | | **文件上传滥用** | wp-content/uploads/ 中的恶意文件 | 否 —— 需要文件系统访问 | | **数据库注入** | 被修改的 wp_options, wp_posts | 否 —— 需要数据库访问 | ### 修复指南 (如果被感染) 如果 wphunter 报告你的站点已感染 (INFECTED),请执行以下步骤: **1. 立即行动** - 在进行更改之前对站点进行**完整备份** (文件 + 数据库) —— 你可能需要它进行取证 - 将站点置于**维护模式**以停止向 Google 提供赌博内容 **2. 清除感染** - 检查 `wp-content/mu-plugins/` —— 攻击者通常在此投放自动加载的 PHP 文件 - 检查 `wp-content/uploads/` —— 查找 `.php` 文件 (uploads 中不应有任何 PHP 文件) - 检查被修改的主题文件: `functions.php`, `header.php`, `footer.php`, `index.php` - 检查根目录和 `wp-content/` 中的 `.htaccess` —— 查找可疑的重写规则 - 搜索数据库 `wp_options` 表中的可疑条目: SELECT * FROM wp_options WHERE option_value LIKE '%slot%' OR option_value LIKE '%togel%' OR option_value LIKE '%gacor%'; - 检查 `wp_posts` 和 `wp_postmeta` 中注入的赌博内容: SELECT ID, post_title FROM wp_posts WHERE post_content LIKE '%slot gacor%' OR post_content LIKE '%judi online%'; **3. 封堵攻击媒介** - **更新所有插件**到最新版本 —— `wp plugin update --all` - **更新所有主题** —— `wp theme update --all` - **更新 WordPress 核心** —— `wp core update` - **删除未使用的插件和主题** —— 攻击者经常利用已安装但未激活的组件 - 考虑**完全替换 WordPress 核心文件**: `wp core download --force` **4. 保护凭证** - **更改所有 WordPress 管理员密码** —— 假设它们已被泄露 - **更改数据库密码**并更新 `wp-config.php` - **重新生成 WordPress salts** —— 从 [api.wordpress.org/secret-key](https://api.wordpress.org/secret-key/1.1/salt/) 添加新的 salts - **更改主机/FTP/SSH 密码** - **审查用户账户** —— 删除任何未知的管理员用户: SELECT * FROM wp_users; SELECT * FROM wp_usermeta WHERE meta_key = 'wp_capabilities' AND meta_value LIKE '%administrator%'; **5. 加固站点** - 安装安全插件 (Wordfence, Sucuri, 或 iThemes Security) - 为所有管理员账户启用双因素认证 - 在 WordPress 中禁用文件编辑: 在 `wp-config.php` 中添加 `define('DISALLOW_FILE_EDIT', true);` - 设置正确的文件权限: 目录 `755`, 文件 `644`, `wp-config.php` `440` - 阻止在 uploads 中执行 PHP: 在 `wp-content/uploads/.htaccess` 中添加 `php_flag engine off` **6. 请求重新收录** - 如果你的站点被标记,在 Google Search Console 中提交**重新审核请求** - 使用 **URL 检查工具**请求重新抓取已清理的页面 - 监控 Google Search Console 的 "安全问题" 警告 ### AI 分析设置 要使用 `--ai`,你需要 **Anthropic API 密钥**或 **Claude Code OAuth token**: ``` # 选项 1: API key (按 token 付费) export ANTHROPIC_API_KEY="sk-ant-api03-..." # 选项 2: OAuth token (使用 Claude Pro/Max 订阅配额) python scanner.py connect # -> 选择选项 [2] 并粘贴你的 OAuth token # -> 通过以下方式获取 token: claude setup-token # 选项 3: 交互式设置 (保存到 ~/.wphunter/auth.json) python scanner.py connect ``` **两种认证路径:** | 认证方法 | 工作原理 | 模型 | |---|---|---| | **API Key** (`sk-ant-api03-*`) | 直接 Anthropic API 调用 | Claude Sonnet 4 (可通过 `--ai-model` 使用任何模型) | | **OAuth Token** (`sk-ant-oat01-*`) | 通过 Claude Agent SDK → Claude Code CLI | Claude Sonnet 4 (使用订阅配额) | 在 [console.anthropic.com](https://console.anthropic.com/) 获取 API 密钥,或通过 OAuth 使用你的 Claude Pro/Max 订阅。两种路径都包含在 `requirements.txt` 中。 ### Docker 测试环境 (Judol 模拟) `docker-test/` 目录包含一个测试恶意软件文件 (`judol-infection.php`),用于模拟真实的 judol 攻击以进行测试。有关完整的测试过程,请参见 `docker-test/test-commands.sh`。 ## 限制 - **仅限已知 CVE** —— 此工具检查公开的漏洞数据库。它无法检测零日漏洞、自定义代码错误或配置错误。 - **Slugs 必须匹配** —— CSV 中的 slug 必须与 WordPress.org 的 slug 匹配 (例如,插件应为 `wordpress-seo` 而不是 `yoast-seo`)。 - **远程扫描是尽力而为** —— 并非所有插件/主题都可以从 HTML 源代码中检测到。使用激进模式 (`--aggressive`) 以获得更广泛的覆盖。 - **Judol 检测是基于启发式的** —— 在包含合法赌博内容的站点上可能会产生误报。 - **无文件系统访问** —— wphunter 在外部工作。它无法检查上传的文件、数据库条目或服务器配置。对于深度取证,你需要服务器端工具,如 Wordfence CLI 或手动调查。 - **完整页面爬取需要站点地图** —— 如果站点没有 sitemap.xml 或 wp-sitemap.xml,则仅检查主页和常见的垃圾目录。 ## 需求 - Python 3.10+ - `requests` >= 2.28.0 - `rich` >= 13.0.0 - `beautifulsoup4` >= 4.12 (用于 HTML 解析) - `lxml` >= 5.0 (用于快速 HTML 解析) - `claude-agent-sdk` >= 0.1.0 (用于通过 Claude Code 订阅进行 AI 分析) ## 相关 - [WPScan](https://github.com/wpscanteam/wpscan) —— WordPress 安全扫描器 (在线站点扫描, Ruby) - [wordpress-vulnerable-scanner](https://github.com/robdotec/wordpress-vulnerable-scanner) —— WordPress CVE 扫描器 (Rust, 在线站点 + manifest) - [WPVulnerability.net](https://www.wpvulnerability.net/) —— 免费的 WordPress 漏洞数据库 (6 个聚合来源) ## 许可证 MIT 许可证 —— 详情见 [LICENSE](LICENSE)。 ## 免责声明 本工具仅供**授权的安全测试和审计**使用。使用本工具即表示你同意: - 你将**仅扫描你拥有的网站**或拥有明确书面授权测试的网站。 - 远程扫描 (`--url`) 会向目标站点发送 HTTP 请求。虽然是非破坏性的,但可能会被目标的 WAF 或安全插件记录。 - 激进模式 (`--aggressive`) 会向目标发送大约 100+ 个 HTTP 请求。请负责任地使用并尊重频率限制。 - **judol 检测测试文件** (`docker-test/judol-infection.php`) 仅用于测试目的。它们模拟真实的攻击模式,**绝不能**部署在生产站点上。 - Jud 检测结果是**基于启发式的**,可能包含误报或漏报。在采取行动之前,务必手动验证发现。 - 本工具**不能防止攻击** —— 它检测现有的感染和已知的漏洞。将其作为更广泛的安全策略的一部分使用。 - 作者**不对**因使用本工具而导致的任何滥用、损害或未经授权的访问负责。
标签:AI安全分析, Anthropic API, Claude, Claude AI, CVE检测, Judol检测, PE 加载器, POC利用, SEO垃圾清理, WordPress安全, 主题扫描, 公开漏洞查询, 加密, 域名收集, 密码管理, 插件安全, 操作系统监控, 核心漏洞, 漏洞扫描器, 离线扫描, 网站防护, 网络安全, 网络安全审计, 赌博垃圾邮件检测, 远程扫描, 隐私保护