由 @bahartanir (katherinepierce) 编写 基于 ZephrFish/wp2shell-scanner 的分支,并包含额外改进。 研究贡献:Adam Kues (Assetnote) 与 Mustafa Can İPEKÇİ (nukedx)。
用于检测和验证 WordPress 核心是否暴露于 wp2shell(CVE-2026-63030 / CVE-2026-60137)的工具。通过标志选择模式,目标为位置参数。--scan 对核心版本进行指纹识别,并确认 REST /batch/v1 路由可达,不发送利用载荷;--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]
深度分析原文: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 授权(如果 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!'
python3 wp2shell.py --lpe http://127.0.0.1:8080
用于支撑 PoC 的补丁差异保存在 poc/diffs/ 下,研究笔记见 poc/RESEARCH.md。SQLi 完全可通过 author__not_in 修复重构。无凭据 --rce 链(oEmbed → changeset → 重入 → 创建管理员)可在附带的实验室上复现默认配置下的 RCE;--shell 则是通过恢复/破解的管理员凭据进行认证插件上传和命令执行的替代路径。
--lpe)--lpe 将完整的预认证 RCE(SQLi → 伪造管理员 → webshell)与自动化的 root 提权尝试串联起来。它按以下顺序尝试,并在首次成功时停止:
python3 wp2shell.py --lpe http://127.0.0.1:8080
python3 wp2shell.py --lpe http://127.0.0.1:8080 -y # skip auth prompt
python3 wp2shell.py --lpe https://target --authorized # non-loopback
--lpe 对非回环目标执行时需要 --authorized。在附带的实验室(Ubuntu 22.04 基础镜像 + 易受攻击的 GameOverlay 内核)上,CVE-2023-2640/32629 无需编译器即可成功。
| 标志 | 作用 |
|---|
--scan | 非破坏性暴露检测:版本指纹识别 + 确认 REST /batch/v1 路由可达。不发送利用载荷。 |
--check | 通过无害的差分探测确认基于时间的盲 SQL 注入。 |
--read | 通过盲 SQL 注入提取数据(使用预设或原始 SQL 标量表达式)。 |
--shell | 使用破解/恢复的管理员密码进行认证 RCE 链。 |
--rce | 无凭据的预认证 RCE:通过 SQLi 伪造自身管理员身份,然后部署自清理 webshell。 |
--root-prereq | 良性的 shell 到 root 前置条件检查;仅运行诊断,绝不执行本地权限提升。 |
--lpe | 完整链条:预认证 SQLi → 伪造管理员 → webshell → root。依次尝试 CVE-2023-2640/32629 (GameOverlay overlayfs)、CVE-2023-4911 (Looney Tunables glibc)、CVE-2026-31431 (AF_ALG Copy Fail)、CVE-2026-23111 (nf_tables UAF 探测),然后回退到 SUID/sudo/cap。 |
| 标志 | 适用模式 | 作用 |
|---|
-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 | 每个 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 代理路由请求,例如位于 http://127.0.0.1:8080 的 Burp。 |
--authorized | --rce | 对非回环地址的 --rce 目标声明已获授权(远程主机必需)。 |
--timeout | 全部 | 每个请求的超时秒数(默认 15)。 |
| CVE | 影响范围 | 技术 | 编译器 |
|---|
| CVE-2023-2640 / CVE-2023-32629 | Ubuntu 22.04 / 23.04,内核 < 6.3.3 且带 GameOverlay 驱动 | 在用户命名空间中进行非特权 overlayfs 挂载,在上层目录上保留 chmod +s | 无(纯 shell) |
| CVE-2023-4911 | glibc 2.34–2.38(Ubuntu 22.04、Debian 12、Fedora 37–38) | _dl_parse_tunables() 中的 GLIBC_TUNABLES 栈溢出 → 在 SUID 执行时注入 LD_PRELOAD | 需要 gcc |
| CVE-2026-31431 | 带 algif_aead + authencesn(hmac(sha256),cbc(aes)) 的 Linux 内核 | AF_ALG AEAD 原地优化 + splice() 向 SUID 二进制页缓存写入 4 字节;前置条件探测——链接至 AliHzSec/CVE-2026-31431 | 需要 gcc |
| CVE-2026-23111 | Ubuntu 22.04 / 24.04、Debian Bookworm / Trixie | nft_map_catchall_activate() 中的 nf_tables 反转检查 UAF → chain->use 下溢 → 已释放链;前置条件探测——链接至 Baba01hacker666/CVE-2026-23111 | 需要 gcc |
| 回退 | 任意 | SUID GTFOBins + sudo NOPASSWD 滥用 | 无 |