BytesPulse-OE/wp2shell-Hestia-Scanner
GitHub: BytesPulse-OE/wp2shell-Hestia-Scanner
一款适用于 HestiaCP 服务器的只读 WordPress 安全扫描器,专门检测 wp2shell 漏洞利用链的入侵指标。
Stars: 0 | Forks: 0
# wp2shell-hestia-scanner
适用于 **HestiaCP** 服务器的只读 WordPress 安全扫描器。
检测所有托管站点中来自 **wp2shell** 漏洞利用链
(CVE-2026-63030 + CVE-2026-60137)的入侵指标,
发送每个客户端的电子邮件报告,执行深度文件分析,
并可选地通过 Claude API 进行 AI 评估。
## 什么是 wp2shell?
wp2shell 是 WordPress 核心中的一个预认证远程代码执行链,
于 2026 年 7 月 17 日披露。只需对默认安装(无插件、无特殊配置)发起一个
匿名的 HTTP 请求,就足以创建恶意管理员账户并在服务器上
执行任意代码。该利用链结合了:
- **CVE-2026-60137** — `WP_Query` 的 `author__not_in` 参数中的 SQL 注入
- **CVE-2026-63030** — REST API `/wp-json/batch/v1` 端点中的路由混淆
受损站点通常显示登录名前缀为 `wp2_` 且
电子邮件为 `@wp2shell.invalid` 的恶意管理员。该补丁已包含在 WordPress 6.8.6、6.9.5
和 7.0.2(发布于 2026 年 7 月 17 日)中。
更多信息:
## 仓库内容
| 文件 | 用途 |
|------|---------|
| `wp2shell-scan.sh` | 快速 IoC 扫描器 — 检查服务器上所有的 WP 安装,输出一份带颜色标记的报告到 stdout 和 `/root/` |
| `wp2shell-report-per-user.sh` | 完整扫描器 — 每个用户的电子邮件报告、核心文件 diff、PHP/JS/htaccess/图像分析、可选 AI 评估 |
## 系统要求
- 运行 **HestiaCP** 的 Linux 服务器
- **bash** 4.0+
- 全局安装 **[WP-CLI](https://wp-cli.org/)** 为 `wp`
- `root` 权限(两个脚本都必须以 root 身份运行)
- `sendmail`(用于 `wp2shell-report-per-user.sh` 发送电子邮件)
- `python3`(用于 AI 调用中的 JSON 处理)
- `curl`(用于 AI 评估,可选)
- `unzip`、`file`、`strings`(推荐,用于归档/二进制文件分析)
### 安装 WP-CLI(如果尚未安装)
```
curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
chmod +x wp-cli.phar
sudo mv wp-cli.phar /usr/local/bin/wp
wp --info
```
## 一行命令安装与运行
直接从 GitHub 下载并运行 — 无需克隆。
### 快速 IoC 扫描 (`wp2shell-scan.sh`)
```
curl -fsSL https://raw.githubusercontent.com/BytesPulse-OE/wp2shell-Hestia-Scanner/main/wp2shell-scan.sh | sudo bash
```
### 带有电子邮件报告的完整扫描 (`wp2shell-report-per-user.sh`)
```
curl -fsSL https://raw.githubusercontent.com/BytesPulse-OE/wp2shell-Hestia-Scanner/main/wp2shell-report-per-user.sh | sudo bash
```
## 快速开始
### 1. wp2shell-scan.sh — 快速的服务器级 IoC 扫描
检查服务器上的每个 WordPress 安装是否具有最直接的
wp2shell 指标:恶意管理员账号、孤立的 usermeta、被投毒的
`oembed_cache`、易受攻击的 WordPress 版本、核心校验和失败、
`uploads/` 中的 PHP 文件以及 webshell 特征。
```
sudo bash wp2shell-scan.sh
```
输出将写入 stdout(带颜色标记)并自动保存到
`/root/wp2shell-report-YYYYMMDD-HHMMSS.txt`。
### 2. wp2shell-report-per-user.sh — 带电子邮件报告的完整扫描
主扫描器。对于每个 HestiaCP 用户,它会:
1. 查找 `/home//web/` 下的所有 WordPress 安装
2. 检查 WordPress 版本、恶意管理员、孤立的 usermeta、uploads 中的 PHP、核心校验和
3. 为每个站点的版本和语言环境下载对应的纯净 WordPress 核心,然后运行**逐行 diff** — 显示更改了什么、添加了什么,并评估每个文件
4. 扫描 `wp-content` 中的 PHP/JS/HTML/htaccess/图像恶意模式
5. 将报告电子邮件发送到该用户在 HestiaCP 中存储的 `CONTACT` 地址
#### 首次运行(始终以 DRY_RUN=1 开始)
```
sudo bash wp2shell-report-per-user.sh
```
启动时,脚本会提出两个交互式问题:
```
+------------------------------------------------------+
| AI EVALUATION (Claude API) |
+------------------------------------------------------+
Use AI evaluation for ambiguous files? [y/N]
+------------------------------------------------------+
| SAVE REPORT |
+------------------------------------------------------+
Save a full report file for later review? [y/N]
```
如果设置了 `DRY_RUN=1`(默认值),则**不会发送任何电子邮件** — 完整的电子邮件
正文将打印到 stdout,以便您在邮件发送给客户端之前进行查看。
#### 发送真实电子邮件
打开脚本并修改:
```
DRY_RUN=1 → DRY_RUN=0
```
然后再次运行。电子邮件将通过 `sendmail` 发送到每个用户的 HestiaCP `CONTACT`
地址。
#### 仅在发现问题时发送
```
SEND_ONLY_IF_ISSUES=0 → SEND_ONLY_IF_ISSUES=1
```
## 配置
所有设置都位于每个脚本的顶部。
### wp2shell-scan.sh
| 变量 | 默认值 | 描述 |
|----------|---------|-------------|
| `WEB_ROOT` | `/home` | HestiaCP 用户的根路径 |
| `DAYS_MODIFIED` | `30` | 标记在此天数内被修改过的 PHP 文件 |
| `WP` | `wp` | WP-CLI 二进制文件的路径 |
### wp2shell-report-per-user.sh
| 变量 | 默认值 | 描述 |
|----------|---------|-------------|
| `DRY_RUN` | `1` | `1` = 仅预览,`0` = 发送电子邮件 |
| `SEND_ONLY_IF_ISSUES` | `0` | `1` = 如果站点干净则跳过发送电子邮件 |
| `MAIL_FROM` | `security@` | 信件发件人地址 |
| `MAIL_SUBJECT` | `[wp2shell] Security scan report -- %DOMAINS%` | 电子邮件主题(`%DOMAINS%` 会自动替换) |
| `CORE_CACHE` | `/root/wp2shell-cores` | 缓存纯净 WP 核心的目录(在多次扫描中重复使用) |
| `ANTHROPIC_API_KEY` | *(空)* | 用于 AI 评估的 Claude API 密钥(可选) |
## AI 评估(可选)
当无法仅通过模式匹配对模糊的 diff 或多余文件进行分类时,
扫描器可以将其发送到 **Claude API**
(`claude-sonnet-4-6`)以获取安全结论:`DANGER`、`SUSPICIOUS`、
`REVIEW` 或 `OK`,并附带一句话的解释。
AI 评估**仅**在模棱两可的区域使用 — 即当模式
无法得出明确结论时。明确的情况(例如,添加的
行中出现 `eval(base64_decode(...))` → `DANGER`)无需任何 API 调用即可
瞬间完成分类。
### 选项 A — 在脚本中设置密钥
打开 `wp2shell-report-per-user.sh` 并将:
```
ANTHROPIC_API_KEY="${ANTHROPIC_API_KEY:-}"
```
替换为:
```
ANTHROPIC_API_KEY="${ANTHROPIC_API_KEY:-sk-ant-api03-...}"
```
### 选项 B — 运行前导出
```
export ANTHROPIC_API_KEY='sk-ant-api03-...'
sudo -E bash wp2shell-report-per-user.sh
```
API 密钥可在 获取(与
claude.ai 订阅分开 — 需要按量付费额度)。
### 选项 C — 在浏览器中分析(无需 API 密钥)
如果您没有 Anthropic API 密钥,请将扫描输出粘贴到
**[wp2shell 报告分析器](https://claude.ai)** Claude 工件中 — 它会
使用 Claude API 代表您直接在浏览器中执行相同的 AI 评估。
## 扫描器检查的内容
### 数据库 / 用户检查
- WordPress 版本对比安全版本 (6.8.6 / 6.9.5 / 7.0.2+)
- 带有 `wp2_` 前缀或 `@wp2shell.invalid` 电子邮件的管理员账号
- 在漏洞披露日期(2026 年 7 月 15 日)之后创建的管理员账号
- 用户 ID 序列中的间隙(删除恶意管理员的痕迹)
- 孤立的 `wp_usermeta` 行(已删除用户的残留物)
- 被投毒的 `oembed_cache` 和 `customize_changeset` 行(漏洞利用机制)
### 核心文件完整性
- 针对官方 WordPress.org 校验和执行 `wp core verify-checksums`
- 针对为每个站点的确切版本和语言环境全新下载的纯净核心执行逐行 `diff -U5`
- 显示被修改过的文件(对比纯净核心发生更改)并提供完整的统一 diff
- 显示多余文件(纯净核心中不存在)及其内容和元数据
### 文件分析 (`wp-content` + 根目录)
- **PHP** — 模式扫描,查找 `eval(`、`base64_decode(`、`gzinflate(`、`shell_exec(`、`php://input`、`create_function(`、带有 `/e` 修饰符的 `preg_replace` 等
- **uploads/ 中的 PHP** — 此处的任何 `.php` 文件都会被标记为高危严重性
- **额外的 PHP 扩展名** — `.php7`、`.phtml`、`.phar`、`.php5`、`.shtml`
- **JS / HTML** — `eval(atob(...))`、`document.write(unescape(...))`、混淆的 `String.fromCharCode(...)`、指向未知域名的外部 `src=`
- **.htaccess** — `AddType application/x-httpd-php`(将非 PHP 作为 PHP 执行)、`auto_prepend_file`、`auto_append_file`、指向外部 URL 或 uploads 的 `RewriteRule`;区分恶意指令与保护性指令(`php_flag engine off`)
- **多语种图像 (Polyglot)** — `.jpg`、`.png`、`.gif`、`.ico`、`.webp` 文件中包含 `
标签:Bash, CISA项目, GraphQL安全矩阵, HestiaCP, Web报告查看器, WordPress, 安全扫描器, 应用安全, 系统运维