Entrada

SSRF via OpenID dynamic client registration

Laboratorio de Portswigger sobre OAuth

SSRF via OpenID dynamic client registration

Certificaciones

  • eWPT
  • eWPTXv2
  • OSWE
  • BSCP

Descripción

Este laboratorio permite que las aplicaciones cliente se registren dinámicamente mediante el servicio OAuth a través de un endpoint dedicado al registro de usuarios. Algunos datos específicos del cliente se usan de forma insegura por el servicio OAuth, lo que expone a la web a un posible SSRF

Para resolver el laboratorio, debemos explotar un SSRF para acceder a http://169.254.169.254/latest/meta-data/iam/security-credentials/admin/ y robar la clave de acceso secreta del proveedor OAuth para el entorno cloud

Podemos iniciar sesión en nuestra propia cuenta 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

Cuando pulsamos sobre My account accedemos a /my-account y nos hace un redirect a /social-login donde nos muestra esto

Posteriormente nos redirige a este panel de login, donde nos podemos loguear con las credenciales wiener:peter

Posteriormente nos redirige a esta otra ventana donde nos solicita permiso para acceder a nuestro perfil e email

Si nos logueamos de forma exitosa nos saldrá este mensaje al final

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 code lo cual quiere decir que estamos ante un authorization code grant type. Además de esto también podemos ver el nombre de host del servidor de autorización, en este caso es oauth-0a8100f10476ca12818f1ebe026700b9.oauth-server.net

Me llama la atención que se cargue el logo de la aplicación cliente. Si nos fijamos el id coincide con el client_id

Si tenemos el nombre de host del servidor de autorización podemos enumerar estos endpoints para obtener información que puede resultarnos útil, es recomendable hacer esto porque puede revelar una superficie de ataque más amplia o características admitidas que no se mencionan en la documentación. En este caso es la única opción debido a que Portswigger no cuenta con una API pública y por lo tanto, tampoco cuenta con documentación de la que obtener información interesante

1
2
/.well-known/oauth-authorization-server  
/.well-known/openid-configuration  

Si hacemos una petición GET a /.well-known/oauth-authorization-server vemos que no existe

Sin embargo, si hacemos una petición GET a /.well-known/openid-configuration obtenemos información valiosa

Me llama la atención el endpoint /reg, al parecer sirve para crear nuestra propia aplicación cliente

Vamos a empezar a debuggear, si mandamos un petición GET nos devuelve un código de error 404, lo cual quiere decir que no existe

Sin embargo, si lo hacemos por POST nos devuelve el código de error 400, lo cual quiere decir que los datos enviados son erróneos o que faltan campos. En este caso nos dice que la propiedad redirect_uris es obligatoria

Si probamos a cambiar el Content-Type a x-www-form-urlencoded nos devuelve un error, el cual dice que para peticiones por POST a /reg solo admite Content-Type: application/json

Si proporcionamos solamente un elemento, nos dice que redirect_uris debe de ser un array

Una vez implementado el array y el Content-Type: application/json, el formato de la petición es el correcto y nos devuelve un código de estado 201 Created

En esta web https://openid.net/specs/openid-connect-core-1_0.html vemos que al usarse OpenID podemos añadir un logo a nuestra aplicación cliente mediante el parámetro logo_uri

Creamos una nueva aplicación cliente y esta vez le añadimos un logo_uri que apunta a un dominio de Burpsuite Collaborator

Debemos cambiar el client_id de la aplicación cliente por defecto por el de la nueva aplicación cliente que hemos creado nosotros y posteriormente enviar una petición a esa esta URL https://oauth-0a33002704c575a9807406d002d5007c.oauth-server.net/client/YOp2U3YUZ1VeDO6OMlMi2/logo

Recibimos varias peticiones, lo cual quiere decir que la web es vulnerable a SSRF

Podemos usar este SSRF para acceder a información privilegiada que se encuentra expuesta en este endpoint http://169.254.169.254/latest/meta-data/iam/security-credentials/admin/

Esta URL es una Link-Local Address, la cual es una dirección IP que se utiliza para la comunicación dentro de una única subred (segmento de red local) y no necesita de un servidor DHCP o configuración manual. Estas direcciones no son enrutables fuera de la red local y solo son válidas dentro del mismo enlace físico o lógico (como una LAN o una interfaz de red específica). Es fácil distinguirlas porque la IP en IPv4 tiene esta rango 169.254.0.0/16 y en IPV6 tiene este otro fe80::/10

Para explotar esto tenemos que crear una nueva aplicación cliente

Nos copiamos el client_id y accedemos al logo de nuestra aplicación cliente que está apuntando al endpoint http://169.254.169.254/latest/meta-data/iam/security-credentials/admin/

Pulsamos sobre Submit solution y pegamos la SecretAccessKey

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