Devil
Introducción
Sección titulada «Introducción»Este documento presenta la resolución completa de la máquina Devil, desarrollada por kaikoperez para la plataforma DockerLabs, clasificada con una dificultad Media.
El objetivo del laboratorio es comprometer un servidor WordPress vulnerable mediante la identificación de un plugin malicioso expuesto, el abuso de una funcionalidad de subida arbitraria de archivos que permite ejecución remota de comandos, y una posterior escalada de privilegios local basada en binarios mal configurados con privilegios elevados.
La metodología empleada se divide en los siguientes pasos:
- Reconocimiento: enumeración del servicio HTTP y análisis de la aplicación web.
- Explotación: abuso de un plugin vulnerable para obtener una reverse shell.
- Escalada de privilegios: abuso de binarios locales inseguros hasta obtener acceso como
root.
El laboratorio se realizó íntegramente dentro del entorno controlado proporcionado por DockerLabs, con fines exclusivamente educativos.
Información Técnica
Sección titulada «Información Técnica»| Atributo | Valor |
|---|---|
| Nombre | Devil |
| Autor | kaikoperez |
| Dificultad | Medio |
| Fecha | 12/05/2024 |
| Plataforma | DockerLabs |
| IP Objetivo | 172.17.0.2 |
Paso 0 — Despliegue y preparación
Sección titulada «Paso 0 — Despliegue y preparación»Se descomprime la máquina y se despliega utilizando el script proporcionado:
unzip Devil.zipsudo bash auto_deploy.sh Devil.tar
Se organiza el entorno de trabajo:
mkdir -p Devil/{content,exploits,nmap,scripts}cd DevilPaso 1 — Reconocimiento
Sección titulada «Paso 1 — Reconocimiento»1.1 Escaneo de puertos
Sección titulada «1.1 Escaneo de puertos»Se realiza un escaneo completo de puertos TCP:
nmap -p- --open -sS --min-rate 5000 -vvv -n 172.17.0.2 -oG allPortsextractPorts allPortsPuertos abiertos identificados:
- 80/tcp — HTTP

1.2 Enumeración web
Sección titulada «1.2 Enumeración web»Se realiza fuzzing de rutas y archivos:
feroxbuster -u http://172.17.0.2/ \ -w /usr/share/seclists/Discovery/Web-Content/DirBuster-2007_directory-list-2.3-big.txt \ -x php,html,txt,js -t 100 -C 404Al acceder a la página principal se observa que el sitio utiliza WordPress:

Para una correcta resolución de rutas, se añade el dominio al archivo /etc/hosts:
172.17.0.2 devil.labSe realiza un escaneo con wpscan, sin resultados relevantes:
wpscan --url http://devil.lab --detection-mode aggressive -e ap,at,u -t 32Tras continuar con el fuzzing manual, se identifica el directorio:
/wp-content/plugins/backdoorAl acceder desde el navegador se observa un formulario de subida de archivos:

Paso 2 — Explotación (Acceso inicial)
Sección titulada «Paso 2 — Explotación (Acceso inicial)»El plugin backdoor permite subir archivos sin ningún tipo de validación:
- No restringe extensiones
- No valida tipo MIME
- No sanitiza el contenido
- Guarda los archivos en una ruta accesible desde el navegador
Esto permite subir directamente una web shell en PHP, obteniendo ejecución remota de comandos.
Se inicia un listener:
nc -nlvp 443Se sube una reverse shell en PHP y se accede al directorio:
/wp-content/plugins/backdoor/uploads
Al ejecutar el archivo subido, se obtiene una conexión como www-data:

Paso 3 — Escalada de privilegios
Sección titulada «Paso 3 — Escalada de privilegios»3.1 De www-data → lucas
Sección titulada «3.1 De www-data → lucas»Se enumeran los directorios de /home y se observa acceso al directorio del usuario andy. Dentro de este se identifica el binario:
/home/andy/.secret/ftpserverAl ejecutarlo, el binario cambia el contexto de usuario y proporciona una shell como lucas:

Esto indica un binario mal configurado con privilegios elevados.
3.2 De lucas → root
Sección titulada «3.2 De lucas → root»Dentro del directorio /home/lucas/.game se encuentran dos archivos:
game.cEligeOMuere(binario compilado)
El código fuente revela el problema:
#include <stdio.h>#include <stdlib.h>#include <unistd.h>
int main() { int guess; int secret_number = 7; // Número secreto para ganar
printf("¡Bienvenido al juego de adivinanzas!\n"); printf("Adivina el número secreto (entre 1 y 10): "); scanf("%d", &guess);
if (guess == secret_number) { printf("¡Felicidades! Has adivinado el número.\n"); printf("Iniciando shell como root...\n");
// Cambia el UID efectivo a root (0) setuid(0); system("/bin/bash"); } else { printf("Número incorrecto. Intenta de nuevo.\n"); }
return 0;}El binario cambia su UID efectivo a root si el usuario introduce el número correcto (7). Esto indica un binario SUID inseguro que permite escalada directa de privilegios.
Se ejecuta el binario:
./EligeOMuereSe introduce el número 7 y se obtiene una shell como root:

Análisis de Vulnerabilidades
Sección titulada «Análisis de Vulnerabilidades»Fallos de Seguridad Identificados
Sección titulada «Fallos de Seguridad Identificados»| Vulnerabilidad | Severidad | Impacto |
|---|---|---|
| Plugin WordPress con subida arbitraria de archivos | Crítica | Ejecución remota de comandos |
| Falta de validación de archivos subidos | Crítica | Compromiso total del servidor |
| Binarios locales con privilegios elevados | Alta | Escalada de privilegios |
Uso inseguro de setuid(0) | Crítica | Acceso directo a root |
Recomendaciones de Mitigación
Sección titulada «Recomendaciones de Mitigación»- Eliminar plugins innecesarios o no confiables.
- Validar estrictamente la subida de archivos (extensión, MIME, contenido).
- Evitar binarios con permisos SUID innecesarios.
- Nunca utilizar
setuid(0)sin controles estrictos. - Auditar periódicamente permisos y binarios del sistema.