InstaWP/wp2shell-scan
GitHub: InstaWP/wp2shell-scan
一款用于批量检测并清理 WordPress wp2shell 漏洞利用后遗留的恶意管理员账户和伪装插件型 webshell 的 Bash 脚本工具。
Stars: 1 | Forks: 0
# wp2shell-scan
**检测并清理一个或多个 WordPress 站点上的 [wp2shell](https://wordpress.org/news/2026/07/wordpress-7-0-2-release/) (CVE‑2026‑63030) 入侵。**
wp2shell 是一个在 **WordPress 7.0.2 / 6.9.5 / 6.8.6** (2026-07-17) 中修复的认证前远程代码执行漏洞。其公开的 PoC 在一天内出现,随后在约 48 小时内遭到了大规模利用。打补丁可以堵住漏洞——但在修补之前遭到利用的站点**已经被入侵**,而且更新**并不能**移除攻击者的持久化访问。
该工具用于查找并移除这些持久化访问。它是一个轻量级、低依赖的 Bash 脚本,**默认以只读方式运行**,并且可以**一次性扫描数千个站点**。
## 它能检测什么
在漏洞利用后,wp2shell 工具通常会留下两个持久化痕迹,本工具可以检测到这两者:
1. **恶意的管理员账户** —— `user_login = wpsvc_`,邮箱为 `@wordpress-svc.internal` / `@wordpress-noreply.net`(或任何 `*.internal`),具有 `administrator` 角色,且是在既有站点的攻击窗口期内创建的。
2. **伪装成插件的 webshell** —— `wp-content/plugins/-<6hex>/.php`:一个极小(约 1.3 KB)的 PHP 文件,带有伪造的 `Author: WordPress.org Community` 头部信息,由 token 进行控制,并暴露了 `?c=` 接口。
它还能检测通用情况:`wp-content/` 下任何将 `$_GET['c']` 传递给命令/eval 接收器的小型 PHP 文件。
## 安装
```
curl -fsSLO https://raw.githubusercontent.com/InstaWP/wp2shell-scan/main/wp2shell-scan.sh
chmod +x wp2shell-scan.sh
```
需要 `bash`、`find`、`grep` 以及 `mysql`/`mariadb` 客户端。如果存在 [WP‑CLI](https://wp-cli.org) 则会调用它(以更干净地删除用户),但这并不是必须的——webshell 检测根本不需要数据库。
## 用法
```
# 扫描单个站点(只读)
./wp2shell-scan.sh --path /var/www/example.com
# 扫描基础目录下的所有 WordPress 安装(批量)
./wp2shell-scan.sh --base /var/www
./wp2shell-scan.sh --base /home # shared hosting
# 自动检测常见布局(/var/www/*, /home/*/public_html, ...)
./wp2shell-scan.sh
# 机器可读
./wp2shell-scan.sh --base /var/www --json > report.json
# CLEAN — 隔离 + 移除后门,轮换 wp-config salts(使所有人登出)
./wp2shell-scan.sh --base /var/www --clean --yes
```
被移除的痕迹会被移动到**隔离目录**中(而不是直接删除),以便您保留证据。发现入侵(扫描)或清理完成(清理)时退出码为 `1`,未受入侵时为 `0`——这非常适合用于 cron/CI。
### 示例输出
```
[COMPROMISED] /var/www/example.com — 2 backdoor admin(s), 2 webshell(s)
admin: ID=41 wpsvc_2e1487df8abb (2026-07-19 06:41:48)
webshell: .../wp-content/plugins/security-headers-manager-8d1d21/security-headers-manager-8d1d21.php
[clean] /var/www/other-site.com
----------------------------------------------------------------
scanned=812 clean=811 compromised=1 cleaned=0
```
## 清理之后
`--clean` 会移除恶意管理员账户 + webshell 并轮换 salts。**您仍然必须:**
1. **将 WordPress 核心**更新至 7.0.2 / 6.9.5 / 6.8.6(真正的修复方案)。
2. **重置所有管理员密码**并重新安装/验证核心及插件(`wp core verify-checksums`)。
3. **轮换站点可能读取到的任何密钥** —— DB 密码、API 密钥、SMTP 凭证 —— 应将它们视为已泄露。
4. **审查 webshell 执行了什么操作** —— 您的访问日志会记录 `?c=` 命令的具体数值。
5. 在所有站点打上补丁之前,在您的边缘/源站阻断批量路由(`/wp-json/batch/v1`、`?rest_route=/batch/v1`,包括 `%2f` 编码的形式)。如果 CDN 可能会放行 REST 路径,请将其设置在**源站**。
## 手动检查(无需工具)
恶意管理员账户:
```
SELECT u.ID,u.user_login,u.user_email,u.user_registered
FROM wp_users u JOIN wp_usermeta m ON u.ID=m.user_id
WHERE m.meta_key='wp_capabilities' AND m.meta_value LIKE '%administrator%'
ORDER BY u.user_registered DESC;
```
Webshell 插件:
```
find wp-content/plugins -maxdepth 1 -type d -regextype posix-extended -regex '.*-[0-9a-f]{6}$'
grep -rl "\$_GET\['c'\]" wp-content/plugins/
```
## 想使用 AI agent?
请参阅 [`CLEANUP-WITH-CLAUDE.md`](./CLEANUP-WITH-CLAUDE.md) 获取一份可直接粘贴的 prompt,它可以引导 [Claude Code](https://claude.com/claude-code)(或任何功能强大的编程 agent)在单个站点上执行相同的检测和清理工作,并在执行每个破坏性步骤之前由人工进行确认。
## 许可证
MIT —— 详见 [LICENSE](./LICENSE)。按“原样”提供,不提供任何担保。由 [InstaWP](https://instawp.com) 团队在一次真实的安全事件中构建并经过实战检验。
标签:Bash, WordPress, 库, 应急响应, 应用安全, 恶意代码清理