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