Password reset poisoning via middleware
Laboratorio de Portswigger sobre Authentication Vulnerabilities
Certificaciones
- eWPT
- eWPTXv2
- OSWE
- BSCP
Descripción
Este laboratorio es vulnerable a password reset poisoning. El usuario carlos hará click en cualquier enlace en los correos electrónicos que reciba. Para resolver el laboratorio, debemos iniciar sesión en la cuenta de Carlos. Podemos iniciar sesión en nuestra propia cuenta utilizando las credenciales wiener:peter. Cualquier correo electrónico enviado a esta cuenta puede ser leído a través del cliente de correo en el servidor de explotación
Guía de authentication vulnerabilities
Antes de completar este laboratorio es recomendable leerse esta guía de authentication vulnerabilities https://justice-reaper.github.io/posts/Authentication-Vulnerabilities-Guide/
Resolución
Al acceder a la web nos sale esto
Pulsamos sobre My account y nos logueamos usando las credenciales wiener:peter
Vemos que nuestro usuario tiene un email wiener@exploit-0a600096044304db85161267010b0093.exploit-server.net
Para resetear la contraseña pulsamos sobre Forgot password? e introducir nuestro email
Nos dirigimos al exploit server y en la parte inferior hacemos click sobre el apartado Email client
Si pinchamos sobre el enlace podemos introducir una nueva contraseña
Si interceptamos la petición con Burpsuite vemos que se está utilizando un token temporal generado para nuestro usuario wiener
Vamos a usar la extensión Param Miner y Logger ++. Hacemos click derecho y seleccionamos este apartado Guess headers
Para ver si reporta algún output, nos dirigimos a Extensions > Installed > Param Miner
Sin embargo hay casos como este en el cual nos está enviando un correo electrónico cada vez que hacemos la petición. Nos dirigimos a Logger ++, pinchamos sobre cualquier petición y vemos que siempre se envía un payload con unos primeros caracteres en común
Nos vamos a la web, accedemos a nuestro email client, pulsamos Ctrl + f y filtramos por zwrt
Nos copiamos este texto zwrtxqvav5xuq82tzfz25g5, nos dirigimos al Logger ++, pulsamos sobre Grep values y copiamos ahí el texto
Vemos que se está usando x-forwarded-host: zwrtxqvav5xuq82tzfz25g5
Esta cabecera ayuda a determinar el host original, ya que el nombre de host o el puerto del proxy inverso (equilibrador de carga) pueden diferir del servidor original que gestiona la solicitud, por eso si nos vamos a nuestro email client el host cambia https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-Host
Nos dirigimos a nuestro exploit server y copiamos la url de nuestro servidor
Pulsamos sobre Forgot password? y capturamos la petición con Burpsuite
Añadimos la cabecera X-Forwarded-Host: exploit-0a85000d038ac10781b91fd8015b0001.exploit-server.net y como valor añadimos la url de nuestro servidor
Si nos vamos a nuestro email client vemos que aparece un nuevo mensaje con el host de nuestro servidor
Al hacer click en el link, aparece en el log de nuestro servidor la ruta a la que le hemos hecho la petición
Lo que debemos hacer ahora es acceder al enlace que nos llega, pero cambiarle el host por el del servidor https://0a5000dd0380c140814c206500a0007a.web-security-academy.net/forgot-password?temp-forgot-password-token=b5uqs2jv2kl8npjrir2z9zw7z8b7kqaq y setear una nueva contraseña
Una vez hemos comprobado que esto funciona para nuestro usuario, vamos a hacerlo ahora con el usuario víctima carlos. Si la víctima pulsa sobre el enlace que le enviamos a su correo recibiremos en nuestro servidor una petición con el token temporal que podemos usar para cambiarle la contraseña a carlos. No hace falta que tengamos el email de carlos debido a que la web también admite nombres de usuario
Capturamos la petición, agregamos esta cabecera con el valor de nuestro servidor X-Forwarded-Host: exploit-0a85000d038ac10781b91fd8015b0001.exploit-server.net
Una vez tramitada la petición, el usuario víctima hará click sobre el enlace que le llegará a su correo electrónico y nos hará una petición a nuestro servidor
Accedemos a https://0a5000dd0380c140814c206500a0007a.web-security-academy.net/forgot-password?temp-forgot-password-token=x2kx3lq2b1vgwl01udaxh40a754j3513 y le cambiamos la contraseña al usuario carlos
Accedemos a la cuenta del usuario carlos
En este laboratorio, hay un middleware que se encarga de verificar la cabecera X-Forwarded-Host. Esto se hace para tener un dominio dinámico, para que sea seguro, debería haber una lista de dominios whitelisteados y que solo actúe sobre estos, no sobre cualquier dominio aleatorio. Un middleware es un software o componente que actúa como intermediario entre diferentes aplicaciones, sistemas o capas de un programa. Su función principal es gestionar la comunicación, el procesamiento de datos o la ejecución de tareas específicas antes o después de que una solicitud llegue a su destino. En el contexto del desarrollo web, un middleware suele ser una función que se ejecuta en cada solicitud HTTP antes de llegar a la lógica principal de una aplicación. Se usa para:
Autenticación y autorización(verificar usuarios, tokens, roles)Registro y monitoreo(almacenar logs de actividad)Compresión y manipulación de respuestas(como comprimir datos antes de enviarlos)Protección contra ataques(CSRF, CORS, validaciones)



























