Vamos con un CTF sencillo de Tryhackme, Brute it, que se centra, como bien dice, en usar fuerza bruta como técnica principal para ganar accesos y privilegios.

Reconocimiento

Nos hacen una serie de preguntas sobre la máquina, que podemos responder usando herramientas de escaneo.

¿Cuántos puertos abiertos hay?

Podemos usar el atajo de Rustscan y el escaneo agresivo para ahorrar tiempo.

rustscan -a IP_Objetivo -- -A

Vemos abiertos los puertos 80 y 22.

2

¿Qué versión de SSH está corriendo?

OpenSSH 7.6p1

¿Y qué versión de Apache?

2.2.29

¿Qué distribución Linux se está usando?

Ubuntu

Buscamos ahora directorios ocultos, ¿Cuál es el que encontramos?

Usamos Gobuster.

gobuster dir -u IP_Objetivo -w /usr/share/wordlists/dirb/common.txt

/admin

Obteniendo una consola

Tenemos que encontrar una forma de obtener una shell en SSH.

¿Cuáles son las credenciales usuario:contraseña del panel de administración?

En el código fuente de la página nos dice que el usuario es admin, así que una cosa menos que averiguar y reducimos tiempos porque hay que romper por fuerza bruta.

Aquí es donde entra Hydra, a la hora de asaltar con diccionario un formulario web personalizado, Hydra necesita:

  1. El nombre de usuario (argumento -l) o una lista de usuarios (-L) con la que probar. Esto lo tenemos, es admin.
  2. La contraseña (-p) o lista de contraseñas (-P) con las que probar. Usaremos la lista clásica rockyou.txt
  3. La dirección IP o el hostname. También la tenemos.
  4. El método HTTP al ser un formulario web, será GET o POST, seguramente POST, lo que se traduce en el parámetro http-post-form según el manual de Hydra.
  5. La ruta hasta la página de autenticación. En este caso /admin/index.php
  6. El cuerpo de la petición de Usuario/Contraseña.
  7. Una manera de identificar intentos fallidos.

5, 6 y 7 se especifican juntos entre comillas (y separados por «:») de la forma que veremos.

Los obtendremos fijándonos en el código fuente de la página, las peticiones que hace cuando realizamos un intento de autenticación y la respuesta fallida que nos dará al realizar un intento con cualquier dato que se nos ocurra.

Al poner cualquier cosa, vemos que la página nos avisa del fallo de autenticación con: «Username or Password invalid», que será lo que usaremos para el punto 7.

Así, construimos esta instrucción:

hydra -l admin -P /usr/share/wordlists/rockyou.txt 10.10.248.61 http-form-post "/admin/index.php:user=admin&pass=^PASS^:Username or password invalid"

Ojo, en el placeholder del nombre de usuario no ponemos ^USER^, sino admin porque ya lo conocemos.

Al poco tiempo, Hydra nos da la contraseña, así que:

admin:xavier

Ahora nos pide romper la llave RSA que encontramos en la página una vez nos autenticamos. Allí hay otros datos también que nos pedirán en otras preguntas o nos serán útiles, como que el usuario se llama john y también una bandera web.

Copiamos la llave RSA y la pegamos en un archivo de texto, que llamamos id_rsa y al que le damos permisos adecuados para que ssh no se queje.

chmod 600 id_rsa

Nos avisa de que la llave ssh tiene contraseña, así que hay que romperla primero con John the Ripper. Para eso, primero tenemos que pasarle la llave a un formato que John entienda.

Buscamos en Internet ssh2john.py (si no lo tenemos) y lo descargamos a nuestra máquina de ataque.

Ahora hacemos:

python3 ssh2john.py id_rsa > rsa.txt # Pasamos a formato adecuado en un archivo txt
john rsa.txt --wordlist=/usr/share/wordlists/rockyou.txt # Rompemos la contraseña

¿Cuál es esa contraseña?

rockinroll

¿Cuál es el contenido del fichero user.txt? Entramos por ssh y está en el directorio del usuario john.

THM{a_password_is_not_a_barrier}

¿Cuál es la bandera web? (Estaba en la página de administración).

THM{brut3_f0rce_is_e4sy}

Escalada de privilegios

Para la escalada, nos piden dos cosas, la bandera del root, pero también su contraseña. Haciendo:

sudo -l

Vemos que el usuario puede ejecutar cat como administrador. Casi nada, con eso podemos leer directamente la bandera de root sin más, haciendo:

sudo cat /root/root.txt

THM{pr1v1l3g3_3sc4l4t10n}

Pero también nos pide la contraseña de administrador, para eso, echamos un vistazo a /etc/shadow, el lugar donde se guardan las contraseñas en una máquina Linux, gracias a cat.

sudo cat /etc/shadow

Ahí vemos la contraseña en hash del administrador root. Copiamos toda esa fila que le corresponde y la pegamos en un archivo password.txt

Y ahora, rompemos el hash con John de la manera más sencilla.

john password.txt --wordlist=/usr/share/wordlists/rockyou.txt

Enseguida aparece la contraseña que nos piden:

football

Con eso terminamos esta máquina sencilla.