Saltearse al contenido

CMS (WordPress, Joomla, Drupal)

Los gestores de contenido corren una porción enorme de la web, y su superficie real no es el core —que suele estar razonablemente parcheado— sino plugins, temas y configuraciones. Un WordPress “actualizado” con 30 plugins es 30 bases de código de calidad dispar expuestas bajo el mismo dominio. El patrón de ataque es casi siempre el mismo: fingerprint → enumerar versión de core/plugins/temas/usuarios → CVE conocido o credencial débil → shell.

El atacante no necesita 0-day: necesita un plugin vulnerable sin actualizar, un usuario con contraseña reutilizada, o un panel de administración expuesto. La monocultura ayuda: la misma versión del plugin X es vulnerable en miles de sitios, así que los escáneres masivos encuentran víctimas sin apuntar a nadie en concreto.

# fingerprint rápido
curl -s https://target/ | grep -i 'wp-content\|generator'
# readme con versión del core
curl -s https://target/readme.html | grep -i version
# plugins por rutas
https://target/wp-content/plugins/<plugin>/readme.txt
# enumerar usuarios (varias vías)
https://target/?author=1 -> redirige a /author/<login>/
https://target/wp-json/wp/v2/users -> JSON con logins

Herramienta de referencia:

wpscan --url https://target --enumerate u,vp,vt --api-token TOKEN
# u=usuarios vp=plugins vulnerables vt=temas vulnerables
  • Fuerza bruta a xmlrpc.php: system.multicall permite cientos de intentos de login en una sola petición (amplificación). Si está abierto, acelera el bruteforce enormemente.
  • Login por wp-login.php con la lista de usuarios enumerados + contraseñas reutilizadas.
  • Subida de shell desde admin: con acceso al panel → Appearance → Theme Editor editando 404.php, o subiendo un plugin ZIP con webshell. Ruta típica tras colar: /wp-content/uploads/ o /wp-content/plugins/<x>/.
  • Plugin vulnerable concreto: casi todo RCE/SQLi/LFI de WP vive aquí; identifica versión y busca el PoC.
  • CVE-2022-21661 — SQLi en WP_Query del core (parcheado en 5.8.3).
  • File Manager (wp-file-manager) CVE-2020-25213 — RCE sin autenticar, explotado masivamente.
  • Elementor / Elementor Pro — múltiples RCE/subida de archivos sin auth en distintas versiones.
  • CVE-2023-32243 (Essential Addons) — escalada a cualquier usuario (reset de contraseña).
# versión
curl -s https://target/administrator/manifests/files/joomla.xml
curl -s https://target/language/en-GB/en-GB.xml
  • CVE-2023-23752 — divulgación de información sin auth en la API REST: filtra usuario y contraseña de la base de datos (/api/index.php/v1/config/application?public=true). Devastador y muy explotado.
  • CVE-2015-8562 — RCE por deserialización en el header User-Agent (histórico, aún aparece).
  • Enumeración con joomscan.
# versión
curl -s https://target/CHANGELOG.txt | head
  • CVE-2018-7600 (Drupalgeddon2) — RCE sin auth por render arrays; uno de los bugs web más explotados de la historia.
  • CVE-2018-7602 (Drupalgeddon3) — continuación del anterior.
  • CVE-2019-6340 — RCE vía REST/JSON:API con deserialización.
  • Enumeración con droopescan.
  • wpscan (WP), joomscan (Joomla), droopescan (Drupal, Silverstripe).
  • nuclei con plantillas http/cves/ y http/technologies/ para fingerprint + CVE en masa.
  • ffuf para fuzzear rutas de admin/plugins ocultos.

Con un plugin RCE o un admin comprometido: webshell, pivote al servidor, robo de la base de datos de usuarios (hashes reutilizables), defacement, inyección de malware/SEO spam a todos los visitantes.

  • Peticiones a xmlrpc.php con system.multicall, ráfagas a wp-login.php.
  • Accesos a /wp-json/wp/v2/users, ?author=N, joomla.xml, CHANGELOG.txt.
  • Creación de archivos nuevos en uploads/, modificación de .php de temas, usuarios admin nuevos.

Monitoriza integridad de ficheros (FIM) en el webroot, logs de creación de usuarios y de instalación de plugins/temas.

  • Actualiza core, plugins y temas —y elimina los que no uses; cada plugin inactivo sigue siendo código expuesto.
  • Deshabilita xmlrpc.php si no se usa; restringe /wp-admin y /administrator por IP o 2FA.
  • Bloquea la enumeración de usuarios (REST users, ?author), desactiva el editor de temas/plugins (DISALLOW_FILE_EDIT).
  • WAF específico de CMS (reglas para firmas conocidas), permisos de archivo estrictos, deshabilita ejecución PHP en uploads/.
  • Principio de mínimo plugin: menos superficie, menos CVEs heredados.

Aísla el sitio, busca webshells en uploads/ y temas, rota todas las credenciales y claves (wp-config.php salts), reinstala el core desde fuente limpia y audita la base de datos por usuarios/opciones inyectadas.

  • ¿Qué CMS y versión de core? (readme/CHANGELOG/manifests)
  • ¿Plugins/temas con versión vulnerable conocida? (wpscan/droopescan/joomscan)
  • ¿Enumeración de usuarios posible? (REST, ?author)
  • ¿xmlrpc.php abierto? (amplificación de bruteforce)
  • ¿Panel de admin expuesto sin 2FA / sin filtro de IP?
  • ¿Subida de archivos / editor de temas accesible tras login?
  • ¿CVEs críticos sin parchear? (Drupalgeddon, Joomla 2023-23752, WP file-manager)
  • ¿uploads/ ejecuta PHP?