
🐍 Un kit de herramientas para probar, ajustar y descifrar JSON Web Tokens
jwt_tool.py es un kit de herramientas para validar, forjar, escanear y manipular JWTs (JSON Web Tokens).

Su funcionalidad incluye:
Esta herramienta está escrita para pentesters, que necesitan comprobar la fortaleza de los tokens en uso y su susceptibilidad a ataques conocidos. Hay disponibles varias opciones de manipulación, firma y verificación para ayudar a profundizar en las posibles debilidades presentes en algunas librerías JWT.
También ha tenido éxito entre los participantes de CTF, ya que los CTFs parecen estar muy interesados en los JWTs actualmente.
También puede ser útil para desarrolladores que usan JWTs en sus proyectos, pero quieren probar la estabilidad y las vulnerabilidades conocidas al usar tokens forjados.
Esta herramienta está escrita de forma nativa en Python 3 (versión 3.6+) usando las librerías comunes; sin embargo, varias funciones criptográficas (y el aspecto/legibilidad general) requieren la instalación de unas pocas librerías comunes de Python.
(Una versión anterior de esta herramienta para Python 2.x está disponible en la rama legacy para quien la necesite, aunque ya no recibe soporte ni actualizaciones)
El uso preferente de jwt_tool es con la imagen docker oficial de jwt_tool alojada en Dockerhub
El comando base para ejecutarlo es el siguiente:
Comando base para ejecutar jwt_tool:
docker run -it --network "host" --rm -v "${PWD}:/tmp" -v "${HOME}/.jwt_tool:/root/.jwt_tool" ticarpi/jwt_tool
Usando el comando anterior puedes añadir cualquier otro argumento con normalidad.
Ten en cuenta que los archivos locales de tu directorio de trabajo actual se asignarán al directorio /tmp del contenedor docker, por lo que puedes usarlos empleando esa ruta absoluta en tus argumentos.
es decir,
/tmp/localfile.txt
La instalación consiste simplemente en descargar el archivo jwt_tool.py (o hacer git clone del repositorio).
(chmod al archivo también si quieres añadirlo a tu $PATH y ejecutarlo desde cualquier lugar.)
$ git clone https://github.com/ticarpi/jwt_tool
$ python3 -m pip install -r requirements.txt
En la primera ejecución, la herramienta generará un archivo de configuración, algunos archivos de utilidad, un archivo de log y un conjunto de claves públicas y privadas en varios formatos.
jwtconf.ini como el valor "jwkloc".Para arreglar los colores rotos en cmd/Powershell de Windows: descomenta las dos líneas siguientes en jwt_tool.py (elimina el "# " del principio de cada línea)
También necesitarás instalar colorama: python3 -m pip install colorama
# import colorama
# colorama.init()
El primer argumento debe ser el propio JWT (a menos que se proporcione en un valor de cabecera o cookie). Si no se proporcionan argumentos adicionales, se mostrarán los valores decodificados del token para su revisión.
$ python3 jwt_tool.py <JWT>
o el comando base de Docker:
$ docker run -it --network "host" --rm -v "${PWD}:/tmp" -v "${HOME}/.jwt_tool:/root/.jwt_tool" ticarpi/jwt_tool
El kit de herramientas validará el token y listará los valores de la cabecera y el payload.
Los muchos argumentos adicionales te llevarán directamente a la función apropiada y te devolverán un token listo para usar en tus pruebas.
Por ejemplo, para manipular el token existente ejecuta lo siguiente:
$ python3 jwt_tool.py eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.aqNCvShlNT9jBFTPBpHDbt2gBB1MyHiisSDdp8SQvgw -T
Muchas opciones necesitan valores adicionales para configurarse.
Por ejemplo, para ejecutar un tipo concreto de exploit debes elegir la opción eXploit (-X) y seleccionar la vulnerabilidad (aquí usando "a" para el exploit alg:none):
$ python3 jwt_tool.py eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.aqNCvShlNT9jBFTPBpHDbt2gBB1MyHiisSDdp8SQvgw -X a
Algunas opciones, como verificar tokens, requieren que se proporcionen parámetros/archivos adicionales (aquí se proporciona la clave pública en formato PEM):
$ python3 jwt_tool.py eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.aqNCvShlNT9jBFTPBpHDbt2gBB1MyHiisSDdp8SQvgw -V -pk public.pem
Todos los modos permiten ahora enviar el token directamente a una aplicación.
Debes especificar:
$ python3 jwt_tool.py -t https://www.ticarpi.com/ -rc "jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.bsSwqj2c2uI9n7-ajmi3ixVGhPUiY7jO9SUn9dm15Po;anothercookie=test" -rh "Origin: null" -cv "Welcome" -M erSe muestran varias respuestas de la petición:
Aquí tienes un repaso rápido a una evaluación básica de una implementación JWT. Si no hay éxito con estas opciones, profundiza en otros modos y opciones para buscar nuevas vulnerabilidades (¡o zero-days!).
Lee el valor del token para hacerte una idea de los claims/valores esperados en la aplicación:
$ python3 jwt_tool.py eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.aqNCvShlNT9jBFTPBpHDbt2gBB1MyHiisSDdp8SQvgw
Ejecuta un Playbook Scan usando el token proporcionado directamente contra la aplicación para buscar malas configuraciones comunes:
$ python3 jwt_tool.py -t https://www.ticarpi.com/ -rc "jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.bsSwqj2c2uI9n7-ajmi3ixVGhPUiY7jO9SUn9dm15Po;anothercookie=test" -M pb
Si se encuentra alguna vulnerabilidad con éxito, cambia los claims relevantes para intentar explotarla (aquí usando el exploit Inject JWKS e inyectando un nuevo nombre de usuario):
$ python3 jwt_tool.py -t https://www.ticarpi.com/ -rc "jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.bsSwqj2c2uI9n7-ajmi3ixVGhPUiY7jO9SUn9dm15Po;anothercookie=test" -X i -I -pc name -pv admin
Profundiza probando valores y claims inesperados para identificar comportamientos inesperados de la aplicación, o ejecuta ataques contra la lógica de programación o el procesamiento de tokens:
$ python3 jwt_tool.py -t https://www.ticarpi.com/ -rc "jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.bsSwqj2c2uI9n7-ajmi3ixVGhPUiY7jO9SUn9dm15Po;anothercookie=test" -I -hc kid -hv custom_sqli_vectors.txt
Revisa cualquier explotación exitosa consultando los logs para leer más datos sobre la petición y :
$ python3 jwt_tool.py -t https://www.ticarpi.com/ -rc "jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.bsSwqj2c2uI9n7-ajmi3ixVGhPUiY7jO9SUn9dm15Po;anothercookie=test" -X i -I -pc name -pv admin
Para obtener una lista de opciones, ejecuta la función de uso:
Algunas opciones, como verificar tokens, requieren que se proporcionen parámetros/archivos adicionales:
$ python3 jwt_tool.py -h
Puedes encontrar una guía de usuario más detallada en la página wiki.

Dirígete al JWT Attack Playbook para ver un repaso detallado de qué son los JWTs, qué hacen, y un flujo de trabajo completo de cómo probarlos a fondo en busca de vulnerabilidades, debilidades comunes y errores de codificación no intencionados.
Regex para encontrar JWTs en Burp Search
(asegúrate de que las opciones 'Case sensitive' y 'Regex' están marcadas)
[= ]eyJ[A-Za-z0-9_-]*\.[A-Za-z0-9._-]* - versión JWT url-safe
[= ]eyJ[A-Za-z0-9_\/+-]*\.[A-Za-z0-9._\/+-]* - todas las versiones JWT (mayor posibilidad de falsos positivos)
JWT Attack Playbook (https://github.com/ticarpi/jwt_tool/wiki) - para una metodología exhaustiva de prueba de JWTs
Una gran introducción a los JWTs - https://jwt.io/introduction/
Gran parte de la inspiración inicial de esta herramienta proviene de las vulnerabilidades descubiertas por Tim McLean.
Mira su blog sobre debilidades de JWT aquí: https://auth0.com/blog/critical-vulnerabilities-in-json-web-token-libraries/
Pentesterlab (https://www.pentesterlab.com) ofrece un montón de ejercicios para probar vulnerabilidades JWT. Recomiendo encarecidamente una suscripción PRO si estás interesado en el pentesting de aplicaciones web.
TEN EN CUENTA: Este kit de herramientas resolverá la mayoría de los ejercicios JWT de Pentesterlab en unos segundos si se usa correctamente; sin embargo, te animo encarecidamente a que trabajes estos ejercicios por ti mismo, descubriendo la estructura y las debilidades. Después de todo, todo se trata de aprender...