Entrada

JWT Lab 4

JWT Lab 4

Skills

  • JWT authentication bypass via jwk header injection

Certificaciones

  • eWPT
  • eWPTXv2
  • OSWE
  • BSCP

Descripción

Este laboratorio utiliza un mecanismo basado en JWT para manejar las sesiones. El servidor admite el parámetro jwk en el encabezado del JWT. Esto se utiliza a veces para incrustar directamente en el token la clave correcta de verificación. Sin embargo, no verifica si la clave proporcionada proviene de una fuente confiable. Para resolver el laboratorio, debemos modificar y firmar un JWT que nos dé acceso al panel de administración en /admin y eliminar al usuario carlos. Podemos iniciar sesión en nuestra propia cuenta utilizando las credenciales wiener:peter


Resolución

Al acceder a la web nos sale esto

Pulsamos sobre My account y nos logueamos con credenciales wiener:peter

Recargamos la página y capturamos la petición mediante Burpsuite

Debemos tener instalado la extensión JWT Editor, esta extensión nos avisará si detecta un token

Los JWT pueden ser de dos tipos: JWS (JSON Web Signature) y JWE (JSON Web Encryption). Los JWS se utilizan para garantizar la integridad y la autenticidad de los datos mediante una firma digital, pero no cifran la información, por lo que los datos pueden ser leídos, aunque no modificados sin invalidar la firma. En cambio, los JWE están diseñados para proteger la confidencialidad de los datos mediante cifrado, asegurando que solo las partes autorizadas puedan acceder a la información, pero no garantizan la autenticidad sin mecanismos adicionales

De acuerdo con la especificación de JWS, solo el parámetro alg del encabezado es obligatorio. Sin embargo, en la práctica, los encabezados de JWT (también conocidos como encabezados JOSE) a menudo contienen otros parámetros

El jwk (JSON Web Key) proporciona un objeto JSON incrustado que representa la clave, el jku (JSON Web Key Set URL) proporciona una URL desde la cual los servidores pueden obtener un conjunto de claves que contiene la clave correcta y el kid (Key ID) que proporciona un ID que los servidores pueden usar para identificar la clave correcta en casos donde hay varias claves para elegir. Dependiendo del formato de la clave, esto puede tener un parámetro kid correspondiente

La especificación de JSON Web Signature (JWS) describe un parámetro opcional en el encabezado llamado jwk, que los servidores pueden usar para incrustar su clave pública directamente dentro del token en formato JWK. Idealmente, los servidores deberían utilizar solo una lista limitada de claves públicas autorizadas para verificar las firmas de los JWT

Sin embargo, los servidores mal configurados a veces aceptan cualquier clave incrustada en el parámetro jwk. Podemos explotar este comportamiento firmando un JWT modificado utilizando nuestra propia clave privada RSA y luego incrustando la clave pública correspondiente en el encabezado jwk. Para hacer esto no dirigimos al Burpsuite, hacemos click sobre JWT Editor y pulsamos sobre New RSA Key para generar nuestra propia clave privada

Nos dirigimos al repeater pulsamos en Attack y pulsamos sobre Embedded JWK, de esta forma Burpsuite extrae la clave pública de la clave privada y la inyecta en el parámetro jwk

Cambiamos el nombre de usuario a administrador y firmamos el JWT con la clave privada. En este caso la extensión JWT Editor de Burpsuite nos actualiza el parámetro kid, pero si realizamos este ataque de forma manual deberemos actualizarlo nosotros para que funcione

Pulsamos Ctrl + Shift + i y pegamos el nuevo JWT

Refrescamos la web con F5, accedemos al panel de administrador y borramos al usuario carlos

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