Skip to content

Express

This content is not available in your language yet.

Este documento presenta la resolución completa de la máquina Express, desarrollada por d1se0 para la plataforma DockerLabs, clasificada con una dificultad Media.

El laboratorio expone múltiples vectores de ataque derivados de configuraciones inseguras, incluyendo la exposición de información sensible mediante SNMP, el uso de credenciales embebidas en binarios, la ausencia de controles contra fuerza bruta en SSH y una escalada de privilegios crítica mediante la ejecución de scripts Python con privilegios elevados y dependencias inseguras.

A partir del acceso inicial como un usuario legítimo del sistema, se realiza una escalada de privilegios hasta obtener acceso completo como root.

La metodología seguida se estructura en las siguientes fases:

  1. Reconocimiento: enumeración de servicios TCP/UDP y recolección de información.
  2. Explotación: obtención de credenciales válidas y acceso por SSH.
  3. Escalada de privilegios: abuso de configuraciones inseguras en sudo y librerías Python.

Todo el proceso se llevó a cabo dentro de un entorno controlado con fines estrictamente educativos.


AtributoValor
NombreExpress
Autord1se0
DificultadMedio
Fecha11/01/2025
PlataformaDockerLabs
IP Objetivo172.17.0.2

Se descomprime la máquina y se despliega utilizando el script proporcionado:

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

Una vez iniciado el contenedor, se identifica la dirección IP asignada.

Se organiza el entorno de trabajo para mantener una estructura clara durante el análisis:

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

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

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

Posteriormente, se ejecuta un escaneo de puertos UDP al sospechar la presencia de servicios adicionales:

Ventana de terminal
sudo nmap -sU --top-ports 500 -n -Pn 172.17.0.2

Servicios identificados:

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

Se verifica el uso de comunidades SNMP por defecto:

Ventana de terminal
snmp-check 172.17.0.2 -c public -v 2c

El servicio responde correctamente utilizando la comunidad public, revelando información sensible del sistema, incluyendo un correo asociado a un dominio interno:

admin@express.dl

Este dominio se añade al archivo /etc/hosts para facilitar la enumeración posterior.


Se realiza fuzzing de rutas y archivos sobre el servicio web:

Ventana de terminal
feroxbuster -u http://express.dl \
-w /usr/share/seclists/Discovery/Web-Content/DirBuster-2007_directory-list-2.3-big.txt \
-x php,html,txt,js -t 100 -C 404

Recursos relevantes encontrados:

  • index.html Página principal con información general del servicio.

  • robots.txt Contiene información básica del sitio.

  • /binary/ Directorio accesible públicamente que contiene un binario llamado game.


El binario game se descarga y se analiza localmente. Su funcionamiento consiste en solicitar la adivinanza de un número repetidas veces.

Se realiza un análisis estático inicial utilizando strings, donde se identifica una posible contraseña embebida en el binario.

Para confirmar, se decompila el archivo con Ghidra, verificando que efectivamente se trata de una credencial válida.

Con la contraseña obtenida, se procede a identificar el usuario correspondiente mediante fuerza bruta sobre SSH:

Ventana de terminal
hydra -L top-usernames-shortlist.txt -p 'PASSWORD' ssh://172.17.0.2

El ataque devuelve un usuario válido. Con estas credenciales se obtiene acceso al sistema:

Ventana de terminal
ssh admin@172.17.0.2

Se listan los privilegios asignados al usuario:

Ventana de terminal
sudo -l

El usuario puede ejecutar el script /opt/script.py como root utilizando python3.

Al revisar el código del script, se observa la importación de la librería pytest. Al localizar dicha librería en el sistema, se comprueba que el usuario tiene permisos de escritura sobre ella.

Se modifica el archivo para ejecutar un comando que otorga el bit SUID a /bin/bash:

import os
os.system("chmod u+s /bin/bash")

Posteriormente, se ejecuta el script con privilegios elevados:

Ventana de terminal
sudo python3 /opt/script.py

Finalmente, se obtiene una shell privilegiada:

Ventana de terminal
bash -p

Con esto se logra acceso completo como root.


VulnerabilidadSeveridadImpacto
Uso de comunidad SNMP por defecto (public)AltaExposición de información sensible
Divulgación de dominio y correo internoMediaFacilita enumeración y ataques dirigidos
Binario accesible con credenciales embebidasCríticaCompromiso de cuentas legítimas
Ausencia de controles contra fuerza bruta en SSHAltaAcceso no autorizado
Ejecución de scripts Python con sudoCríticaEscalada directa de privilegios
Permisos inseguros sobre librerías del sistemaCríticaSecuestro de dependencias (library hijacking)

  • Deshabilitar SNMP o restringirlo mediante comunidades seguras y control de acceso por IP.
  • Eliminar información sensible expuesta por servicios auxiliares.
  • Evitar credenciales hardcodeadas en binarios o scripts.
  • Implementar protección contra fuerza bruta en SSH (rate-limit, bloqueo temporal).
  • Restringir el uso de sudo para scripts interpretados.
  • Asegurar que las librerías del sistema no sean modificables por usuarios no privilegiados.
  • Aplicar el principio de mínimo privilegio en todo el sistema.