
CVE-2026-63030, CVE-2026-60137, scanner wp2shell
Ferramenta de deteção e validação para exposição do WordPress core ao wp2shell
(CVE-2026-63030 / CVE-2026-60137). Os modos são selecionados com uma flag, e o
alvo é posicional. --scan recolhe a versão do core e confirma que a rota REST
/batch/v1 está acessível sem enviar um payload de exploração; os modos
--check/--read/--shell/--rce/--root-prereq são o PoC de validação
para uso autorizado em laboratório.
wp2shell.py é um script único, apenas com a biblioteca padrão — sem dependências
externas. Cada invocação imprime um banner ZephrSec no stderr antes de executar
(permanece fora do stdout, por isso a saída JSON de --scan -j não é afetada).
Exatamente uma flag de modo é obrigatória; o alvo é posicional (uma URL para cada modo, ou uma lista de hosts para ).
--scanwp2shell.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]
| Flag | O que faz |
|---|---|
--scan | Verificação de exposição não destrutiva: impressão digital da versão + confirmação de que a rota REST /batch/v1 está acessível. Nenhum payload de exploração enviado. |
--check | Confirma SQLi cego baseado em tempo com uma sonda diferencial inócua. |
--read | Extrai dados via SQLi cego (uma predefinição ou uma expressão SQL escalar bruta). |
--shell | Cadeia RCE autenticada usando uma palavra-passe de administrador recuperada/quebrada. |
--rce | RCE pré-autenticação sem credenciais: forja o seu próprio administrador através da SQLi e depois implementa uma webshell auto-limpante. |
--root-prereq | Verificação benigna de pré-requisitos shell-to-root; apenas executa diagnósticos, nunca uma escalada de privilégios local. |
| Flag | Aplica-se a | O que faz |
|---|---|---|
-f, --file | --scan | Lê hosts de um ficheiro (um por linha; comentários # ignorados). |
-j, --json | --scan | Emite resultados como JSON no stdout. |
-t, --threads | --scan | Concorrência da verificação (padrão 10). |
--prefix | --check/--read | Prefixo da tabela da base de dados (padrão wp_). |
--delay | --check/--read | Segundos de SLEEP injetados para o oráculo de temporização (padrão 0.15). |
--repeats | --check/--read | Mediana sobre N sondas por bit; aumentar em ligações ruidosas (padrão 1). |
--preset | --read | Alvo incorporado: version, database, db_user, users, siteurl (padrão users). |
--expr | --read | Expressão SQL escalar bruta a extrair (substitui --preset). |
--max-len | --read | Tamanho máximo da string extraída (padrão 128). |
--user | --shell/--root-prereq | Nome de utilizador administrador para autenticação (padrão admin). |
--password | --shell/--root-prereq | Palavra-passe de administrador em texto simples (quebrar o hash de ; obrigatório para estes modos). |
Artigo de análise aprofundada: https://blog.zsec.uk/wp2shell-code-trace-deep-dive/
nuclei -t wp2shell-exposure.yaml -u https://target
Host único, vários hosts ou um ficheiro.
python3 wp2shell.py --scan https://target
python3 wp2shell.py --scan host1 host2 host3
python3 wp2shell.py --scan -f hosts.txt
Opções: -f/--file ficheiro de hosts (um por linha), -j/--json saída JSON,
-t/--threads concorrência (padrão 10).
Os modos --check/--read/--shell/--rce/--root-prereq enviam payloads de
exploração ao vivo. Execute-os apenas contra o laboratório local fornecido, ou
outros sistemas que possui e para os quais tem autorização explícita para testar.
--shell e --rce realizam execução remota de código e são destinados ao
laboratório/alvos autorizados; --rce num host não loopback requer --authorized.
--root-prereq usa o mesmo plugin de diagnóstico com token para verificar
pré-requisitos shell-to-root, mas não executa uma escalada de privilégios local.
--shell precisa de uma palavra-passe de administrador recuperada/quebrada. --rce é a
cadeia pré-autenticação sem credenciais: forja o seu próprio administrador através da
SQLi (oEmbed → changeset → parse_request reentrante) e depois implementa a
webshell — sem palavra-passe necessária.
--shell, --rce e --root-prereq solicitam autorização interativa y/N
antes de qualquer payload de execução de código ser enviado (abortam se o stdin
não for interativo/EOF). Passe -y/--yes para ignorar o prompt para automação
contra o laboratório ou um alvo autorizado.
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!'
Os diffs de patch usados para fundamentar o PoC estão guardados em poc/diffs/, com
notas de pesquisa em poc/RESEARCH.md. A SQLi é totalmente reconstruível a partir da
correção author__not_in. A cadeia --rce sem credenciais (oEmbed → changeset →
reentrada → criação de admin) reproduz a RCE padrão de stock contra o laboratório
fornecido; --shell é o caminho alternativo através de uma credencial de administrador
recuperada/quebrada para upload de plugin autenticado e execução de comandos.
--read--cmd | --shell/--rce | Comando a executar no alvo (padrão id). |
-i, --interactive | --shell/--rce | Loop interativo de comandos web em vez de um único comando. |
--no-cleanup | --shell/--rce | Deixar o plugin/webshell descartado no lugar (apenas laboratório). |
-y, --yes | --shell/--rce/--root-prereq | Ignorar o prompt de autorização interativo (para automação). |
--sleep | --rce | Segundos de SLEEP injetados para deteção de SQLi pré-autenticação (padrão 4). |
--rounds | --rce | Mediana sobre N sondas para deteção --rce (padrão 3). |
--route | --rce | Forma da rota batch: auto, rest-route, ou wp-json (padrão auto). |
--proxy | --rce | Roteia pedidos através de um proxy HTTP, p.ex., Burp em http://127.0.0.1:8080. |
--authorized | --rce | Afirmar autorização para um alvo --rce não loopback (obrigatório para hosts remotos). |
--timeout | todos | Tempo limite por pedido em segundos (padrão 15). |