Entrada

JWT Lab 3

JWT Lab 3

Skills

  • JWT authentication bypass via weak signing key

Certificaciones

  • eWPT
  • eWPTXv2
  • OSWE
  • BSCP

Descripción

Este laboratorio utiliza un mecanismo basado en JWT para manejar las sesiones. Utiliza una clave secreta extremadamente débil para tanto firmar como verificar tokens. Esto puede ser fácilmente forzado utilizando un diccionario con secretos conocidos. Para resolver el laboratorio, primero debemos bruteforcear la clave secreta del sitio web. Una vez que la hayamos obtenido, la usaremos para firmar un token de sesión modificado 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

Vemos que el algoritmo usado para cifrar el JWT es HS256, este algoritmo es HMAC + SHA-256. Existen otros como HS384, HS512, los cuales también son algoritmos débiles y a los cuales se les puede aplicar fuerza bruta fácilmente. Esto se debe a que usan una cadena aleatoria e independiente como clave secreta. Este diccionario https://github.com/wallarm/jwt-secrets.git está formado por secretos usados para firmar JWT's. Lo primero para bruteforcear el JWT es crearnos un archivo con el JWT en su interior

1
eyJraWQiOiI3MWU1ZTNjZC00Y2I3LTQzOGUtOGEwMS00MmE0ZGQ0MTAxYjgiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJwb3J0c3dpZ2dlciIsImV4cCI6MTczMzUxODcyOCwic3ViIjoid2llbmVyIn0.xdeZIgHdZ9lGwCo7se19SIAFan1F-dVO8ELke5bVB-o

Usamos john para bruteforcar el JWT

1
2
3
4
5
6
7
8
9
10
# john -w:jwt.secrets.list jwt
Created directory: /home/justice-reaper/.john
Using default input encoding: UTF-8
Loaded 1 password hash (HMAC-SHA256 [password is key, SHA256 256/256 AVX2 8x])
Will run 8 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
secret1          (?)     
1g 0:00:00:00 DONE (2024-12-06 21:18) 100.0g/s 1638Kp/s 1638Kc/s 1638KC/s ..6959156
Use the "--show" option to display all of the cracked passwords reliably
Session completed. 

También podemos usar hashcat para bruteforcear el JWT

1
# hashcat -a 0 -m 16500 jwtx jwt.secrets.list 

Con la contraseña obtenida secret1, no dirigimos a JWT Editor en Burpsuite y pulsamos sobre New Symmetric Key

Una vez hecho esto nos vamos al repeater, cambiamos nuestro usuario por administrator, en el apartado JSON Web token pulsamos en Sign y ya podríamos enviar la petición

Otra opción hacerlo en jwt.io https://jwt.io/ , cambiamos nuestro nombre por el de administrator e introducimos el secreto. La opción secret base64 encoded es para encodear el secreto en base64, en este caso al no estar encodeado el secreto no debemos marcar la casilla

Hacemos Ctrl + Shift + i y pegamos el nuevo valor en el parámetro session

Recargamos la web con F5 y panel de administrador, lo que quiere decir que nos hemos convertidos en ese usuario

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