Rompiendo una firma JWT

5

Estoy probando una API que usa JWT para la autenticación. Este JWT tiene una firma HS256 para evitar modificaciones. Pensé que si determinaba la clave secreta utilizada en esta firma, podía crear mis propios JWT. ¿Cómo puedo descifrar la clave secreta de una firma JWT?

Intenté usar jumbo john que parece tener soporte JWT , pero no puedo hacer que funcione:

$ ./john jwt.txt 
Using default input encoding: UTF-8
No password hashes loaded (see FAQ)

No hay opción JWT en john --list=format .

    
pregunta Sjoerd 18.08.2016 - 09:25
fuente

2 respuestas

5

Terminé escribiendo un pequeño script de Python que usa PyJWT para analizar el JWT y verificar la firma.

También hay jwtbrute . No lo he probado, pero parece ser un poco más eficiente que mi secuencia de comandos porque hace mucho trabajo como descodificar en base64 fuera del bucle.

Si quieres romper JWTs usando John the Ripper, necesitas convertir su formato a algo como esto:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOjEyMzQ1Njc4OTAsIm5hbWUiOiJKb2huIERvZSIsImFkbWluIjp0cnVlfQ#7a86835464c295175fc5465788fb377fc16624390313f5424055ea2b1a4bb2db

Como puede ver, las dos primeras partes son iguales, pero la firma ahora es hexadecimal en lugar de base64. Además, se separa de los datos con # en lugar de . . Escribí un pequeño script para hacer la conversión.

También necesitas una versión reciente de john . La versión que viene con Kali no funcionó para mí, pero sí lo hizo la versión en GitHub .

$ ./john ~/dev/crackjwt/jwt.john
Using default input encoding: UTF-8
Loaded 1 password hash (HMAC-SHA256 [password is key, SHA256 256/256 AVX2 8x])
Will run 2 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
secret           (?)
1g 0:00:00:00 DONE 2/3 (2016-08-24 15:58) 6.666g/s 218453p/s 218453c/s 218453C/s 123456..skyline!
Use the "--show" option to display all of the cracked passwords reliably
Session completed
    
respondido por el Sjoerd 24.08.2016 - 15:59
fuente
1

Según lo que publicaste, parece que estás atacando a todo el JWT, lo que no creo que JTR sea lo suficientemente inteligente como para descodificar la base64 y separar la firma.

Cómo funciona JWT:

Tienen un encabezado:

  

{       "alg": "HS256",       "typ": "JWT"}

Tienen reclamaciones

  

{"sub": "1234567890", "name": "John Doe", "admin": true}

Los codificas en base64Url y los combinas con un secreto para obtener algo como:

  & gt

Las pruebas contra esto no son buenas, ya que la fuerza bruta está intentando atacar toda esta cadena, que no es el secreto.

Mejor apuesta:

Descargue una biblioteca JWT, use su función de analizador y la tabla de arco iris y espere que la gente que usa la API sea lo suficientemente estúpida como para usar una palabra del diccionario por seguridad.

Podrías hacerlo con fuerza bruta, supongo, pero si es fuerte, estarás sentado por mucho tiempo.

    
respondido por el Shane Andrie 18.08.2016 - 22:44
fuente

Lea otras preguntas en las etiquetas