Sploitus

Exploit for CVE-2026-64638

githubexploit Β· 2026-08-07

Exploit Code

README264 lines
## https://sploitus.com/exploit?id=2F9CB88F-45B0-53EF-953B-2455889C1EB2
# XSS2Shell β€” PoC de CVE-2026-64638

> Proof of Concept educativa de la cadena **XSS2Shell** (CVE-2026-64638),
> vulnerabilidad pre-autenticaciΓ³n XSS β†’ RCE en WordPress Core descubierta
> de forma autΓ³noma por **pwn.ai** y divulgada el 7 de agosto de 2026.

---
 
## Tabla de contenidos

1. [Resumen ejecutivo](#resumen-ejecutivo)
2. [Aviso legal](#aviso-legal)
3. [Arquitectura de la cadena](#arquitectura-de-la-cadena)
4. [Requisitos](#requisitos)
5. [Estructura del repositorio](#estructura-del-repositorio)
6. [GuΓ­a rΓ‘pida de uso](#guΓ­a-rΓ‘pida-de-uso)
7. [VerificaciΓ³n de la explotaciΓ³n](#verificaciΓ³n-de-la-explotaciΓ³n)
8. [DocumentaciΓ³n adicional](#documentaciΓ³n-adicional)

---

## Resumen ejecutivo

**CVE-2026-64638** es una vulnerabilidad de tipo *cross-site scripting* (XSS)
reflejado, pre-autenticaciΓ³n, en la pantalla de inicio de sesiΓ³n de WordPress
(`wp-login.php`). Afecta a **todas las versiones** de WordPress bajo
mantenimiento anteriores a la 7.0.3, publicada el 6 de agosto de 2026 como
*security release* de emergencia. Se le asignΓ³ un CVSS v4.0 de **8.9**.

La cadena bautizada **XSS2Shell** demuestra cΓ³mo, partiendo ΓΊnicamente de un
intento de *login* fallido con un *username* manipulado, un atacante puede:

1. Inyectar elementos DOM vivos en la pΓ‘gina de *login* aprovechando una
   discrepancia entre dos analizadores sintΓ‘cticos de PHP (`strip_tags`) y de
   WordPress (`wp_kses_post`).
2. Secuestrar el flujo de ejecuciΓ³n del JavaScript propio de WordPress
   (`user-profile.js`) para realizar una peticiΓ³n REST JSONP al propio origen.
3. Convertir la respuesta JSONP en ejecuciΓ³n de JavaScript en el origen de
   WordPress mediante `jQuery.globalEval()`.
4. Encadenar todo ello con la tΓ©cnica *Same Origin Method Execution* (SOME) de
   Paulos Yibelo (2022) para hacer *click* automΓ‘ticamente en el botΓ³n de
   aprobaciΓ³n de *Application Passwords* dentro de la sesiΓ³n autenticada de un
   administrador.
5. Capturar la credencial *Application Password* resultante, publicar una
   pΓ‘gina con JavaScript malicioso y, finalmente, subir un *plugin* en formato
   ZIP que ejecuta PHP en el servidor.

El resultado es **ejecuciΓ³n remota de cΓ³digo** (RCE) en el servidor WordPress,
bajo el usuario del proceso *web* (tΓ­picamente `www-data`), partiendo de un
ΓΊnico *click* del administrador sobre un enlace controlado por el atacante.

---

## Aviso legal

Este repositorio contiene material estrictamente **educativo y defensivo**.

- **PropΓ³sito:** demostrar la cadena de explotaciΓ³n con fines de formaciΓ³n,
  auditorΓ­a propia y validaciΓ³n de *patches*.
- **Uso autorizado:** ejecΓΊtalo **ΓΊnicamente** contra instalaciones de
  WordPress que te pertenezcan o sobre las que dispongas de autorizaciΓ³n
  escrita explΓ­cita.
- **Prohibido:** cualquier uso contra sistemas de terceros sin consentimiento.
  El autor del repositorio no se responsabiliza del uso indebido del material
  aquΓ­ incluido.
- **Responsabilidad:** el operador es el ΓΊnico responsable del cumplimiento de
  la legislaciΓ³n aplicable (LOPD/RGPD en EspaΓ±a, CFAA en EE. UU., etc.).

La PoC se entrega con un entorno Docker autocontenido cuya ΓΊnica finalidad es
servir como blanco local y reproducible.

---

## Arquitectura de la cadena

```
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  1. XSS pre-auth en wp-login.php                                    β”‚
β”‚     log=           β”‚
β”‚     (discrepancia strip_tags ↔ wp_kses_post)                        β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                           β”‚
                                           β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  2. user-profile.js dispara .trigger('click')                       β”‚
β”‚     DOM clobbering de ajaxurl β†’ peticiΓ³n POST al origen             β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                           β”‚
                                           β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  3. REST JSONP responde application/javascript                      β”‚
β”‚     jQuery.globalEval() ejecuta el callback en el origen WP         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                           β”‚  callback = window.opener
                                           β”‚            .approve.click
                                           β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
│  4. SOME: click() cruza la frontera opener→admin                    │
β”‚     authorize-application.php#approve se pulsa en sesiΓ³n admin      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                           β”‚
                                           β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  5. WP crea Application Password β†’ redirige a success_url           β”‚
β”‚     El atacante captura user_login + password en callback.php       β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                           β”‚  HTTP Basic REST
                                           β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  6. POST /wp-json/wp/v2/pages  β†’ publica pΓ‘gina con         β”‚
β”‚     El admin visita la pΓ‘gina β†’ JS en origen WP con sesiΓ³n admin    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                           β”‚
                                           β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  7. fetch update.php?action=upload-plugin  β†’ sube payload.zip       β”‚
β”‚     PHP del plugin es accesible directamente sin activarlo          β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                           β”‚
                                           β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  8. RCE confirmada: GET /wp-content/plugins/payload/shell.php       β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
```

---

## Requisitos

La PoC estΓ‘ construida para ejecutarse en **macOS** o **Linux** con:

- **Docker** 24+ y **Docker Compose** v2 (para el blanco local).
- **Python** 3.9+ (para el orquestador opcional).
- **PHP** 8.1+ con extensiΓ³n `zip` (para construir el *payload* manualmente,
  opcional; el ZIP ya construido se incluye en `payload/`).
- Un navegador moderno basado en Chromium o Firefox.

No es necesario instalar WordPress manualmente: el `docker-compose.yml`
levanta un WordPress 7.0.2 vulnerable (la ΓΊltima versiΓ³n anterior al parche)
junto con MariaDB.

---

## Estructura del repositorio

```
POC XSS2Shell (CVE-2026-64638)/
β”œβ”€β”€ README.md                       ← Este archivo
β”œβ”€β”€ docker-compose.yml              ← Blanco: WordPress 7.0.2 + MariaDB
β”œβ”€β”€ .env.example                    ← Variables de configuraciΓ³n
β”œβ”€β”€ exploit.py                      ← Orquestador en Python (opcional)
β”œβ”€β”€ attacker/                       ← Infraestructura del atacante
β”‚   β”œβ”€β”€ index.html                  ← PΓ‘gina cebo con la cadena SOME
β”‚   β”œβ”€β”€ callback.php                ← Receptor de la Application Password
β”‚   └── server.py                   ← Servidor estΓ‘tico + PHP embebido
β”œβ”€β”€ payload/                        ← Plugin ZIP malicioso
β”‚   β”œβ”€β”€ build_payload.py            ← Generador del ZIP
β”‚   β”œβ”€β”€ shell.php                   ← Webshell mΓ­nimo
β”‚   └── payload.zip                 ← ZIP preconstruido (listo para usar)
└── docs/
    β”œβ”€β”€ ANALISIS.md                 ← AnΓ‘lisis tΓ©cnico detallado
    └── MITIGACION.md               ← GuΓ­a de mitigaciΓ³n y hardening
```

---

## GuΓ­a rΓ‘pida de uso

### 1. Levantar el blanco (WordPress 7.0.2 vulnerable)

```bash
cp .env.example .env
docker compose up -d
```

WordPress quedarΓ‘ accesible en . Sigue el asistente de
instalaciΓ³n y crea un usuario **administrador** (por ejemplo `admin` /
`admin-password`).

> El Dockerfile ancla la imagen a `wordpress:7.0.2-php8.2-apache`, que es la
> ΓΊltima versiΓ³n anterior al parche 7.0.3.

### 2. Levantar la infraestructura del atacante

```bash
# En otro terminal, dentro de attacker/
python3 server.py
```

El servidor atacante escucha en  y expone:

- `/`            β†’ `index.html` (la pΓ‘gina cebo).
- `/callback.php` β†’ receptor de la Application Password.

### 3. Simular el *click* del administrador

1. Inicia sesiΓ³n como administrador en .
2. En la **misma sesiΓ³n del navegador**, abre una nueva pestaΓ±a y visita
   .
3. VerΓ‘s un ΓΊnico botΓ³n Β«Approve ApplicationΒ». Al pulsarlo se ejecuta toda la
   cadena de forma automΓ‘tica.

### 4. Observar la captura de credenciales

En el terminal donde corre `server.py` aparecerΓ‘ una lΓ­nea del tipo:

```
[+] Application Password recibida para el usuario 'admin':
    XXXX XXXX XXXX XXXX XXXX XXXX
```

La credencial se guarda tambiΓ©n en `attacker/captured_credentials.txt`.

### 5. Ver el RCE

Tras unos segundos, el orquestador de `index.html` habrΓ‘:

- Publicado una pΓ‘gina que ejecuta JavaScript en el origen de WordPress.
- Subido el plugin `payload.zip` a `wp-content/plugins/payload/`.

Verifica la ejecuciΓ³n de cΓ³digo con:

```bash
curl -sI http://localhost:8080/wp-content/plugins/payload/shell.php
```

Una cabecera `Hacked: true` y un cuerpo JSON confirman el RCE.

---

## VerificaciΓ³n de la explotaciΓ³n

Una vez completada la cadena, los siguientes *endpoints* sirven de evidencia:

| Recurso                                            | Evidencia esperada                          |
|----------------------------------------------------|---------------------------------------------|
| `GET /wp-content/plugins/payload/shell.php`        | Cabecera `Hacked: true` + JSON `{"rce":true,"user":"www-data"}` |
| `attacker/captured_credentials.txt`                | Application Password capturada              |
| `wp-admin β†’ Aplicaciones β†’ ContraseΓ±as de aplicaciΓ³n` | Una nueva entrada llamada Β«SomeAppΒ»     |

---

## DocumentaciΓ³n adicional

- [`docs/ANALISIS.md`](docs/ANALISIS.md) β€” AnΓ‘lisis tΓ©cnico detallado de cada
  fase de la cadena, con referencias al cΓ³digo fuente de WordPress.
- [`docs/MITIGACION.md`](docs/MITIGACION.md) β€” Mitigaciones recomendadas,
  *hardening* y verificaciΓ³n del *patch* 7.0.3.

---

## CrΓ©ditos

- InvestigaciΓ³n original y divulgaciΓ³n: **pwn.ai** β€” 
- TΓ©cnica SOME subyacente: **Paulos Yibelo** (2022), publicada en el blog de
  pwn.ai y nominada a *Top Web Hacking Techniques* de 2022.
- PoC y empaquetado de este repositorio: trabajo propio con fines educativos.

---

## Licencia

Distribuido bajo licencia MIT. Consulta el archivo `LICENSE` para mΓ‘s detalles.