En este writeup vamos a resolver una de las máquinas de la plataforma Dockerlabs llamada Pequeñas Mentirosas, con el nivel de dificultad «Fácil».
Estructura del contenido
TL;DR – RESUMEN DE LA MÁQUINA PEQUEÑAS MENTIROSAS
Te resumo a continuación la resolución de la máquina pero si quieres ver el detalle, te invito a leer el resto del write-up:
| La máquina expone los puertos 22 (SSH) y 80 (HTTP). A partir de una pista en la web se identifica el usuario a, cuya contraseña se obtiene mediante fuerza bruta con Hydra sobre SSH. Tras acceder al sistema, se descubre el usuario spencer, cuya contraseña también se obtiene por fuerza bruta, permitiendo pivotar lateralmente. El usuario spencer puede ejecutar python3 como root sin contraseña ( sudo -l), lo que permite escalar privilegios mediante GTFOBins y obtener acceso como root. |
Si quieres conocer más sobre la plataforma Dockerlabs y ver cómo se configura, etc, en este post te cuento cómo hacerlo.
Básicamente los pasos son: 1 – Creas una carpeta con el nombre de la máquina (es opcional, yo las creo por organización), 2 – Descargas la máquina de Dockerlabs y la mueves al directorio que has creado anterior, y 3 – Descomprimes y despliegas.
Para todas las máquinas, la IP de Dockerlabs es siempre la misma: 172.17.0.2

Una vez hemos descargado la máquina víctima de Dockerlabs y desplegada en nuestro entorno, empezamos con el escaneo.
RECONOCIMIENTO Y ESCANEO DE PUERTOS
Comenzamos primero viendo si la máquina está activa y podemos conectarnos a ella, y después continuamos con el descubrimiento de puertos para luego hacer un escaneo de sus servicios y versiones.

El TTL es de 64 por lo que estamos ante una máquina Linux y vemos que la máquina está activa por la respuesta «Host is up«.
Ahora que sabemos que la máquina víctima está activa, procedemos escanear la red lanzando un nmap para detectar qué puertos están abiertos con el siguiente comando:
nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 172.17.0.2 -oN Escaneo_TCP

Vistos estos dos puertos abiertos, ahora lo que hacemos es analizar qué servicios y versiones corren por esos puertos con el objetivo de poder analizar a detalle posibles vulnerabilidades.
Para ello lanzamos el siguiente comando:
nmap -sCV -p22,80 172.17.0.2

Ambas versiones que corren para esos dos servicios de OpenSSH y Apache, no parecen tener de primeras ninguna vulnerabilidad pública concreta que explotar.
Por lo que paso a hacer un análisis del puerto 80 web introduciendo la IP en el navegador, y nos muestra ese mensaje «Pista: Encuentra la clave para A en los archivos.»:

No encuentro nada en el código fuente, ni robots.txt, etc, por lo que el siguiente paso es hacer fuzzing web.
Pruebo con distintas herramientas y distintos wordlists pero no me saca nada más allá de un /index.html que es la propia página en sí…


Si leemos de nuevo la pista que nos da la página, dice que «Pista: Encuentra la clave para A en los archivos.». Por lo que quizás ese «A» sea el nombre de un usuario? (aunque sería raro).
FUERZA BRUTA CON HYDRA
Vamos a probar si haciendo un ataque de fuerza bruta con Hydra al puerto 22ssh abierto para ese usuario «a» y el diccionario rockyou, nos encuentra algo…
hydra -l a -P /usr/share/wordlists/rockyou.txt ssh://172.17.0.2

Y parece que sí, que tenemos una password para ese usuario «a», por lo que la probamos, pero antes me aparece este mensaje:

Esto es un aviso de seguridad de SSH porque la huella del servidor ha cambiado respecto a la que tienes guardada en tu Kali.
Para corregirlo, simplemente ejecuta este comando, y vuelve a acceder:
ssh-keygen -f "/root/.ssh/known_hosts" -R "172.17.0.2"
Hecho esto, y usando el usuario «a» y contraseña «secret», accedemos por ssh al servidor de la máquina como el usuario «a».

Si nos movemos al directorio «home» vemos que además del usuario «a», está el usuario «spencer».

Si nos movemos entre las carpetas de ambos usuarios, no vemos a priori nada relevante. No devuelve permisos SUID relevantes, ni privilegios de abuso de binarios con «sudo -l», …
Intento pivotar a «spencer» desde el usuario «a» pero al no tener la contraseña, no puedo continuar. Sin embargo se me ocurre volver a lanzar un Hydra pero solo para el usuario «spencer» por si estuviera en ese diccionario y así intentar pivotar…

Y nos devuelve para el usuario «spencer» la contraseña «password1», por lo que pivotamos dentro de la máquina hacia el usuario «spencer»:

ABUSO DE BINARIOS ESCALADA DE PRIVILEGIOS
Dentro como spencer, vemos que tenemos privilegios como root sin introducir contraseña ejecutando el siguiente comando en python3.

De acuerdo con el repositorio de GTFObins para el binario python, la forma de poder escalar privilegios sería ejecutando el siguiente comando como sudo pero para python3:

sudo python3 -c 'import os; os.system("/bin/sh")'
y nos abre la consola como el usuario root:

