JWT de Lado del Atacante

Project (7)

Un JSON Web Token (JWT) es un estándar abierto (RFC 7519) que define un formato compacto y autocontenido para la transmisión segura de información entre dos partes. Esta información puede ser verificada y confiable, ya que está firmada digitalmente. Los JWTs son comúnmente utilizados para autenticación y para compartir información entre diferentes partes en un sistema seguro.

Un JWT consta de tres partes separadas por puntos (.):

1. Encabezado (Header):
El encabezado contiene dos partes: el tipo del token (que es JWT) y el algoritmo de firma utilizado, que puede ser HMAC SHA256, RSA, o cualquier otro algoritmo de firma compatible.

Ejemplo de encabezado:

2. Cuerpo (Payload):
El cuerpo contiene las reclamaciones (claims). Las reclamaciones son declaraciones sobre una entidad (generalmente el usuario) y metadatos adicionales. Hay tres tipos de reclamaciones: reservadas, públicas y privadas.

Ejemplo de cuerpo:

Firma (Signature): Para crear la firma de un JWT, se toma el encabezado codificado en base64, el cuerpo codificado en base64, y se firma utilizando una clave secreta (en el caso de HMAC) o una clave pública/privada (en el caso de RSA). La firma se añade al JWT, lo que lo hace completo y listo para ser enviado.

La firma se ve algo como esto (solo para propósitos de ilustración, no es un ejemplo real):

Ejemplo de Uso en un Escenario Real

Imagina un servicio web de autenticación. Cuando un usuario se autentica correctamente, el servidor genera un JWT y lo devuelve al cliente. El cliente almacena este token y lo incluye en las cabeceras de las solicitudes posteriores al servidor.

1 – Autenticación:

°°° Un usuario inicia sesión con su nombre de usuario y contraseña en un servicio web.
°°° El servidor autentica al usuario y genera un JWT con las reclamaciones del usuario (por ejemplo, ID de usuario, roles, etc.).
°°° El servidor firma el JWT con una clave secreta y lo devuelve al cliente.

2 – Solicitud con JWT:

°°° El cliente recibe el JWT y lo almacena de forma segura (por ejemplo, en el almacenamiento local del navegador).
°°° El cliente realiza una solicitud a una API del servidor y agrega el JWT en la cabecera de la solicitud.

SQL
GET /api/user/profile
Authorization: Bearer eyJhbGciOiAiSFMyNTYiLCAidHlwIjogIkpXVCJ9.eyJzdWIiOiAiMTIzNDU2Nzg5MCIsICJuYW1lIjogIkpvaG4gRG9lIiwgImFkbWluIjogdHJ1ZQ.8RtTgXjTlH4EoihR6SQH8XGYUKCX_i11T0XK-LVlQz4

3 – Verificación en el Servidor:

°°° El servidor recibe la solicitud y extrae el JWT de la cabecera.
°°° El servidor verifica la firma del JWT utilizando la clave secreta que solo el servidor conoce.
°°° Si la firma es válida y el token no ha caducado, el servidor confía en las reclamaciones del JWT y procesa la solicitud del cliente.
°°° Si la firma no es válida o el token ha caducado, el servidor rechaza la solicitud del cliente.

Este proceso permite una autenticación segura y autorización en las aplicaciones web modernas, ya que los JWTs son resistentes a la manipulación y proporcionan una forma eficiente y escalable de manejar la autenticación del usuario

Escenario del lado del atacante

En el siguiente escenario, la empresa PLAYER está a punto de sacar un nuevo producto para sus clientes, pero debido a las malas prácticas de los integrantes del proyecto, han dejado expuesto un archivo que podría comprometer no solo el producto, sino también a toda la empresa. Veamos este escenario.

En la página principal de la empresa PLAYER, anuncian el tiempo restante para la salida del nuevo producto para sus clientes. Sin embargo, no saben que detrás de escena ya existe un ciberatacante que está constantemente buscando una brecha de seguridad en sus servidores. Por lo tanto, inspecciona el código fuente como reconocimiento de algún dato crítico expuesto.

El atacante a podido localizar un archivo con un nombre extraño con extendió PHP, por lo cual verifica contenido.

Cuando se intenta buscar el archivo dee8dc8a47256c64630d803a4c40786c.php, se aplica un redireccionamiento a index.html. Para el atacante, esto ya es algo sospechoso. Por lo tanto, intentará verificar mediante métodos más eficientes qué está ocurriendo detrás.

Al darse cuenta de que existe un código de estado 302 y de que por detrás se está seteando una Cookie (JWT), es más que suficiente para que el atacante comience a pensar en posibles acciones que este programa está llevando a cabo. Por ejemplo, podría estar creando un JWT, pero antes necesita acceder al contenido de este archivo. Podría suponer que se trata de un archivo con alguna extensión adicional, como .bak o backup, o algún otro signo, ya que, considerando las malas prácticas de algún integrante del proyecto, este archivo podría no estar bien asegurado.

Después de varias búsquedas por intentar localizar algo que le permita ver este archivo, da con el signo faltante que es una ~

Ahora que el ciber atacante tiene vista completa del script de PHP,  efectivamente esta creando un JWT donde contiene la key ‘_S0_R@nd0m_P”ss_’, un código de acceso que si se proporciona el correcto, devolverá una localización que comienza con 7F2, de lo contrario si no se proporciona el codito de acceso correcto, lo redireccionara a index.html.

Esto al atacante le resultara fácil ya que puede crear su propio JWT con el código de acceso y pasando la key requerida para obtener la localización secreta.

punto numero 1: Tenemos el JWT proporcionado por el archivo encontrado en el código fuente

punto numero 2: Tenemos el código de acceso el cual modificara para poner el correcto y obtener la dirección secreta

punto numero 3: Es donde se pondrá la key para obtener el JWT correcto 

punto numero 4: Por ultimo, selecciona el recuadro para encodearlo 

quedando de la siguiente manera:

Ahora solo tiene que modificar los parámetros obtenidos con la herramienta curl, para obtener la dirección secreta que es de la siguiente manera:    

Mandara la misma petición por get pero modificara la cabecera Set-Cookie por Cookie: access= y el JWT que genero en la plataforma JWT.io

Antes:

Despues:

Espero que te guste el contenido de mi blog, actualizo mi pagina cada que detecto nuevas vulnerabilidades o elijo una maquina de cualquier plataforma para practicar ciberseguridad.

Mi nombre es Luis Valentin Roque Diaz de León, soy actualmente JPentester y con gusto te apoyare para que sigamos creciendo en este campo tan grande que nunca deja de sorprendernos, no dudes en contactarme si tienes alguna duda, feliz aprendizaje.

Scroll to Top