bahartanir/wp2shell-scanner

GitHub: bahartanir/wp2shell-scanner

针对 WordPress 核心预认证 RCE 漏洞(CVE-2026-63030/63037)的多模式检测与授权环境 PoC 验证工具。

Stars: 7 | Forks: 3

# wp2shell-scanner 用于检测和验证 WordPress 核心暴露于 wp2shell 的工具 (CVE-2026-63030 / CVE-2026-60137)。通过标志选择模式,目标为位置参数。`--scan` 会对核心版本进行指纹识别,并确认 REST `/batch/v1` 路由可访问,且不会发送 exploit payload;`--check`/`--read`/`--shell`/`--rce`/`--root-prereq` 模式是用于授权实验室环境的验证 PoC。 `wp2shell.py` 是一个仅依赖标准库的单文件脚本 —— 没有任何外部依赖。每次运行前都会将横幅信息输出到 stderr(不会输出到 stdout,因此 `--scan -j` 的 JSON 输出不会受到影响)。 ## 命令标志 必须且只能指定一个模式标志;目标为位置参数(所有模式均接受 URL,但 `--scan` 接受主机列表)。 ### 用法摘要 ``` wp2shell.py (--scan | --check | --read | --shell | --rce | --root-prereq) [targets ...] [-f FILE] [-j] [-t THREADS] [--prefix PREFIX] [--delay DELAY] [--repeats REPEATS] [--preset PRESET] [--expr EXPR] [--max-len MAX_LEN] [--user USER] [--password PASSWORD] [--cmd CMD] [-i] [--no-cleanup] [-y] [--sleep SLEEP] [--rounds ROUNDS] [--route {auto,rest-route,wp-json}] [--proxy PROXY] [--authorized] [--timeout TIMEOUT] ``` ### 模式标志(任选其一) | 标志 | 功能说明 | | --- | --- | | `--scan` | 非破坏性暴露检测:版本指纹识别 + 确认 REST `/batch/v1` 路由可访问。不发送 exploit payload。 | | `--check` | 通过无害的差分探测确认基于时间的盲注 SQLi。 | | `--read` | 通过盲注 SQLi 提取数据(支持预设目标或原始 SQL 标量表达式)。 | | `--shell` | 使用破解/恢复的管理员密码进行认证后的 RCE 攻击链。 | | `--rce` | **无需凭据的预认证** RCE:通过 SQLi 伪造自身管理员权限,随后部署自清理的 webshell。 | | `--root-prereq` | 良性的 shell 到 root 提权前置条件检查;仅运行诊断,绝不执行本地提权。 | ### 选项标志 | 标志 | 适用模式 | 功能说明 | | --- | --- | --- | | `-f`, `--file` | `--scan` | 从文件读取主机列表(每行一个;跳过 `#` 注释)。 | | `-j`, `--json` | `--scan` | 在 stdout 上输出 JSON 格式的结果。 | | `-t`, `--threads` | `--scan` | 扫描并发数(默认 10)。 | | `--prefix` | `--check`/`--read` | 数据库表前缀(默认 `wp_`)。 | | `--delay` | `--check`/`--read` | 为时间盲注注入的 `SLEEP` 秒数(默认 0.15)。 | | `--repeats` | `--check`/`--read` | 对每个 bit 进行 N 次探测并取中位数;网络不稳定时可调高(默认 1)。 | | `--preset` | `--read` | 内置提取目标:`version`, `database`, `db_user`, `users`, `siteurl`(默认 `users`)。 | | `--expr` | `--read` | 要提取的原始 SQL 标量表达式(覆盖 `--preset`)。 | | `--max-len` | `--read` | 提取字符串的最大长度(默认 128)。 | | `--user` | `--shell`/`--root-prereq` | 要登录的管理员用户名(默认 `admin`)。 | | `--password` | `--shell`/`--root-prereq` | 明文形式的管理员密码(通过 `--read` 提取的哈希值破解得出;这些模式必需)。 | | `--cmd` | `--shell`/`--rce` | 在目标上运行的命令(默认 `id`)。 | | `-i`, `--interactive` | `--shell`/`--rce` | 启动交互式 Web 命令循环,而不是运行单条命令。 | | `--no-cleanup` | `--shell`/`--rce` | 保留已植入的插件/webshell 不进行清理(仅限实验室环境)。 | | `-y`, `--yes` | `--shell`/`--rce`/`--root-prereq` | 跳过交互式授权提示(用于自动化流程)。 | | `--sleep` | `--rce` | 用于预认证 SQLi 检测的注入 `SLEEP` 秒数(默认 4)。 | | `--rounds` | `--rce` | 用于 `--rce` 检测的 N 次探测中位数(默认 3)。 | | `--route` | `--rce` | 批量路由格式:`auto`、`rest-route` 或 `wp-json`(默认 `auto`)。 | | `--proxy` | `--rce` | 通过 HTTP 代理路由请求,例如 Burp `http://127.0.0.1:8080`。 | | `--authorized` | `--rce` | 声明对非环回 `--rce` 目标的授权(远程主机必需)。 | | `--timeout` | 所有模式 | 单次请求超时时间(秒,默认 15)。 | 原始深度分析:https://blog.zsec.uk/wp2shell-code-trace-deep-dive/ ## Nuclei 模板 ``` nuclei -t wp2shell-exposure.yaml -u https://target ``` ## 扫描(非破坏性) 支持单个主机、多个主机或通过文件指定。 ``` python3 wp2shell.py --scan https://target python3 wp2shell.py --scan host1 host2 host3 python3 wp2shell.py --scan -f hosts.txt ``` 选项:`-f/--file` 主机文件(每行一个),`-j/--json` JSON 输出,`-t/--threads` 并发数(默认 10)。 ## 验证 PoC `--check`/`--read`/`--shell`/`--rce`/`--root-prereq` 模式会发送真实的 exploit payload。请仅针对内置的 localhost 实验室环境,或您拥有且获得明确测试授权的系统运行。`--shell` 和 `--rce` 会执行远程代码执行,专为实验室/授权目标设计;在非环回主机上执行 `--rce` 必须提供 `--authorized`。`--root-prereq` 使用相同的 token 限制诊断插件来检查 shell 到 root 的提权前置条件,但它不会执行本地权限提升。 `--shell` 需要恢复/破解的管理员密码。`--rce` 是**无需凭据的预认证**攻击链:它通过 SQLi 伪造自身的管理员权限(oEmbed → 更改集 → 重入 `parse_request`),随后部署 webshell —— 无需密码。 `--shell`、`--rce` 和 `--root-prereq` 在发送任何代码执行 payload 之前,都会提示进行交互式的 `y/N` 授权确认(如果 stdin 处于非交互模式或遇到 EOF,则会终止执行)。针对实验室环境或已授权目标进行自动化测试时,可以传递 `-y/--yes` 跳过提示。 ``` docker compose -f poc/lab/docker-compose.yml up -d python3 wp2shell.py --check http://127.0.0.1:8080 python3 wp2shell.py --read http://127.0.0.1:8080 --expr @@version python3 wp2shell.py --shell http://127.0.0.1:8080 --user admin --password 'Summer2026!' --cmd id python3 wp2shell.py --shell http://127.0.0.1:8080 --user admin --password 'Summer2026!' -i python3 wp2shell.py --rce http://127.0.0.1:8080 --cmd id python3 wp2shell.py --rce http://127.0.0.1:8080 -i python3 wp2shell.py --root-prereq http://127.0.0.1:8080 --user admin --password 'Summer2026!' ``` 用于构建 PoC 基础的补丁差异保存在 `poc/diffs/` 下,研究笔记位于 `poc/RESEARCH.md` 中。通过 `author__not_in` 的修复程序可以完全重构出该 SQLi。无需凭据的 `--rce` 攻击链(oEmbed → 更改集 → 重入 → 创建管理员)复现了针对内置实验室环境的默认 RCE;而 `--shell` 是通过恢复/破解的管理员凭据进行认证后上传插件并执行命令的替代路径。
标签:CISA项目, Python, WordPress, 加密, 无后门, 漏洞扫描器, 演示模式, 请求拦截, 逆向工具