
CVE-2026-29000 - pac4j-jwt (< 4.5.9 / < 5.7.9 / < 6.3.3) JwtAuthenticator प्रमाणीकरण बाइपास PoC
JwtAuthenticator प्रमाणीकरण बाइपास PoCCVE-2026-29000 के लिए एक प्रूफ-ऑफ-कॉन्सेप्ट, जो pac4j-jwt JwtAuthenticator घटक में एक प्रमाणीकरण बाइपास है (CVSS 10.0, गंभीर)।
यह स्क्रिप्ट एक ऐसा टोकन बनाती है जो किसी भी उपयोगकर्ता और किसी भी भूमिका का प्रतिरूपण करता है — बिना किसी रहस्य को जाने — जब तक लक्ष्य अपनी RSA सार्वजनिक कुंजी को उजागर करता है।
[!WARNING] यह उपकरण केवल शैक्षिक उद्देश्यों और अधिकृत सुरक्षा परीक्षण के लिए प्रदान किया गया है। इसे हैक द बॉक्स मशीन "Principal" को हल करने के लिए लिखा गया था, और डिफ़ॉल्ट (
iss,role,kid) उस बॉक्स के लिए अनुकूलित हैं। इसका उपयोग केवल उन सिस्टम के खिलाफ करें जिनके आप मालिक हैं या जिनका परीक्षण करने के लिए आप स्पष्ट रूप से अधिकृत हैं।
pac4j-jwt संस्करण < 4.5.9, < 5.7.9, और < 6.3.3 में JwtAuthenticator में एक तर्क दोष है जब यह एन्क्रिप्टेड JWT (JWE) को संसाधित करता है।
जब JwtAuthenticator एक JWE को डिक्रिप्ट करता है, तो यह आंतरिक टोकन को SignedJWT के रूप में पार्स करने का प्रयास करता है। यदि आंतरिक टोकन एक अहस्ताक्षरित PlainJWT (alg: none) है, तो SignedJWT ऑब्जेक्ट null वापस आता है और, तर्क त्रुटि के कारण, हस्ताक्षर-सत्यापन पथ पूरी तरह से छोड़ दिया जाता है। प्रमाणक तब अप्रमाणित दावों से सीधे एक उपयोगकर्ता प्रोफ़ाइल बनाता है।
दूसरे शब्दों में, बाहरी JWE एन्क्रिप्शन — जिसके लिए केवल सर्वर की सार्वजनिक कुंजी की आवश्यकता होती है — प्रामाणिकता के प्रमाण के लिए गलत समझा जाता है, इसलिए कोई भी हमलावर जो सार्वजनिक कुंजी पढ़ सकता है, वह पूरी तरह से विश्वसनीय टोकन बना सकता है।
/api/auth/jwks) से प्राप्त करें।sub, role, iss, …) के साथ एक अहस्ताक्षरित PlainJWT (alg: none) बनाएं।PlainJWT को लक्ष्य की सार्वजनिक कुंजी पर एन्क्रिप्टेड JWE लिफाफे में लपेटें।Bearer टोकन के रूप में भेजें। कमजोर JwtAuthenticator इसे डिक्रिप्ट करता है, हस्ताक्षर सत्यापन छोड़ता है, और नकली दावों पर भरोसा करता है।requirements.txt:pip install -r requirements.txt
(requests, jwcrypto, cryptography)
python3 exploit.py -u <username> [options]
आपको या तो --target (नेटवर्क पर JWKS प्राप्त करने के लिए) या --jwks-file (इसे स्थानीय रूप से प्रदान करने के लिए) प्रदान करना होगा।
लक्ष्य से सार्वजनिक कुंजी प्राप्त करके एक व्यवस्थापक टोकन बनाएं और इसे stdout पर प्रिंट करें:
python3 exploit.py -t http://target:8080 -u admin
एक टोकन बनाएं, फिर स्वचालित रूप से एक संरक्षित एंडपॉइंट के खिलाफ इसका परीक्षण करें:
python3 exploit.py -t http://target:8080 -u admin \
--verify-endpoint /api/settings -v
स्थानीय रूप से सहेजे गए JWKS का उपयोग करें और टोकन को एक फ़ाइल में सहेजें:
python3 exploit.py --jwks-file jwks.json -u admin -o token.jwe
org.pac4j:pac4j-jwt को पैच किए गए रिलीज़ में अपग्रेड करें:
MIT License के तहत जारी किया गया।
| फ़्लैग | विवरण | डिफ़ॉल्ट |
|---|
-t, --target | लक्ष्य का आधार URL (जैसे http://host:8080) | — |
--jwks-url | JWKS एंडपॉइंट पथ | /api/auth/jwks |
--jwks-file | --target से लाने के बजाय स्थानीय फ़ाइल से JWKS लोड करें | — |
-u, --username | sub दावे के लिए मान (आवश्यक) | — |
--role | role दावे के लिए मान | ROLE_ADMIN |
--iss | iss दावे के लिए मान | principal-platform |
--exp | सेकंड में टोकन वैधता | 3600 |
--verify-endpoint | नकली टोकन का परीक्षण करने के लिए संरक्षित एंडपॉइंट (जैसे /api/settings) | — |
-k, --insecure | TLS प्रमाणपत्र सत्यापन अक्षम करें | off |
-o, --output | नकली JWE को stdout के बजाय फ़ाइल में लिखें | stdout |
-v, --verbose | नकली JWT पेलोड को stderr पर प्रिंट करें | off |