
CVE-2026-63030, CVE-2026-60137, escáner wp2shell
Herramientas de detección y validación para la exposición del núcleo de WordPress a wp2shell
(CVE-2026-63030 / CVE-2026-60137). Los modos se seleccionan con una bandera, y el
objetivo es posicional. --scan toma la huella de la versión del núcleo y confirma que la
ruta REST /batch/v1 es alcanzable sin enviar una carga de exploit; los
modos --check/--read/--shell/--rce/--root-prereq son el
PoC de validación para uso autorizado en laboratorio.
wp2shell.py es un script único que solo usa la biblioteca estándar; no tiene
dependencias externas. Cada invocación imprime un banner de ZephrSec en stderr antes de
ejecutarse (permanece fuera de stdout, por lo que la salida JSON de --scan -j no se ve afectada).
Se requiere exactamente una bandera de modo; el objetivo es posicional (una URL para cada
modo, o una lista de hosts para --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]
Publicación de análisis en profundidad: https://blog.zsec.uk/wp2shell-code-trace-deep-dive/
nuclei -t wp2shell-exposure.yaml -u https://target
Un solo host, varios hosts o un archivo.
python3 wp2shell.py --scan https://target
python3 wp2shell.py --scan host1 host2 host3
python3 wp2shell.py --scan -f hosts.txt
Opciones: -f/--file archivo de hosts (uno por línea), -j/--json salida JSON,
-t/--threads concurrencia (por defecto 10).
Los modos --check/--read/--shell/--rce/--root-prereq envían cargas de exploit
reales. Ejecútalos solo contra el laboratorio local incluido u otros sistemas que sean
tuyos y sobre los que tengas autorización explícita para realizar pruebas. --shell y --rce
realizan ejecución remota de código y están pensados para el laboratorio/objetivos autorizados; --rce en un
host que no sea de loopback requiere --authorized. --root-prereq usa el mismo
plugin de diagnóstico protegido por token para comprobar los requisitos previos de shell a root, pero no
ejecuta una escalada de privilegios local.
--shell necesita una contraseña de administrador recuperada/descifrada. --rce es la
cadena pre-autenticación sin credenciales: forja su propio administrador a través de la
SQLi (oEmbed → changeset → parse_request reentrante) y luego despliega el
webshell; no se requiere contraseña.
--shell, --rce y --root-prereq solicitan autorización interactiva y/N
antes de enviar cualquier carga de ejecución de código (se abortan si
stdin no es interactivo/EOF). Pasa -y/--yes para omitir el aviso en la
automatización contra el laboratorio o un objetivo 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!'
Los diffs de parches utilizados para fundamentar el PoC se guardan en poc/diffs/, con notas
de investigación en poc/RESEARCH.md. La SQLi es completamente reconstruible a partir de la
corrección de author__not_in. La cadena --rce sin credenciales (oEmbed → changeset →
reentrada → creación de administrador) reproduce el RCE predeterminado de stock contra el
laboratorio incluido; --shell es la ruta alternativa mediante una credencial de administrador
recuperada/descifrada para la carga autenticada de plugins y la ejecución de comandos.
| Bandera | Qué hace |
|---|
--scan | Comprobación de exposición no destructiva: huella de versión + confirma que la ruta REST /batch/v1 es alcanzable. No envía carga de exploit. |
--check | Confirma SQLi ciega basada en tiempo con una sonda diferencial inofensiva. |
--read | Extrae datos mediante SQLi ciega (un ajuste preestablecido o una expresión SQL escalar cruda). |
--shell | Cadena de RCE autenticada que utiliza una contraseña de administrador recuperada/descifrada. |
--rce | RCE pre-autenticación sin credenciales: forja su propio administrador a través de la SQLi y luego despliega un webshell autolimpiable. |
--root-prereq | Comprobación benigna de requisitos previos de shell a root; solo ejecuta diagnósticos, nunca una escalada de privilegios local. |
| Bandera | Se aplica a | Qué hace |
|---|
-f, --file | --scan | Lee hosts desde un archivo (uno por línea; los comentarios # se omiten). |
-j, --json | --scan | Emite resultados como JSON en stdout. |
-t, --threads | --scan | Concurrencia de escaneo (por defecto 10). |
--prefix | --check/--read | Prefijo de tabla de la base de datos (por defecto wp_). |
--delay | --check/--read | Segundos de SLEEP inyectados para el oráculo de temporización (por defecto 0.15). |
--repeats | --check/--read | Mediana sobre N sondas por bit; aumentar en enlaces ruidosos (por defecto 1). |
--preset | --read | Objetivo integrado: version, database, db_user, users, siteurl (por defecto users). |
--expr | --read | Expresión SQL escalar cruda para extraer (anula --preset). |
--max-len | --read | Longitud máxima de la cadena extraída (por defecto 128). |
--user | --shell/--root-prereq | Nombre de usuario administrador para iniciar sesión (por defecto admin). |
--password | --shell/--root-prereq | Contraseña de administrador en texto plano (descifra el hash de --read; requerida para estos modos). |
--cmd | --shell/--rce | Comando a ejecutar en el objetivo (por defecto id). |
-i, --interactive | --shell/--rce | Bucle interactivo de comandos web en lugar de un solo comando. |
--no-cleanup | --shell/--rce | Deja el plugin/webshell instalado en su lugar (solo laboratorio). |
-y, --yes | --shell/--rce/--root-prereq | Omite el aviso de autorización interactivo (para automatización). |
--sleep | --rce | Segundos de SLEEP inyectados para la detección de SQLi pre-autenticación (por defecto 4). |
--rounds | --rce | Mediana sobre N sondas para la detección de --rce (por defecto 3). |
--route | --rce | Forma de la ruta del batch: auto, rest-route o wp-json (por defecto auto). |
--proxy | --rce | Enruta las solicitudes a través de un proxy HTTP, p. ej. Burp en http://127.0.0.1:8080. |
--authorized | --rce | Afirma autorización para un objetivo --rce que no sea de loopback (requerido para hosts remotos). |
--timeout | todos | Tiempo de espera por solicitud en segundos (por defecto 15). |