
PoC en Python que falsifica un JWT HS256 codificado de forma rígida para explotar CVE-2026-89026 en Issabel pbxapi, permitiendo la ejecución remota de comandos del sistema operativo sin autenticación a través del endpoint originate.
Issabel pbxapi JWT hardcodeado RCE POC
Issabel Framework pbxapi — falsificación de JWT no autenticada (clave HS256 hardcodeada) y luego GET /pbxapi/manager/originate con Application=System para ejecutar comandos del sistema operativo como el usuario de Asterisk. Parcheado en el commit b97dbaf (clave cargada desde /etc/issabel.conf). Shadowserver observó explotación desde el 2026-09-09.
Solo para pruebas autorizadas. No ejecutes esto contra sistemas que no poseas o para los que no tengas permiso de prueba.
Requiere: Python 3, solo biblioteca estándar.
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
Endpoints de --test: GET /pbxapi/ sin Authorization (se espera 403), luego la misma URL con Authorization: Bearer <JWT falsificado>. Un JSON 200 que liste controllers / manager (o JSON de conexión AMI tras autenticación) es VULNERABLE. No llama a originate.
Auth: no hay ninguna para el atacante. La API cree que tiene autenticación Bearer JWT. Antes del parche, pbxapi/index.php establece JWT_KEY a una cadena compilada en cada instalación. El PoC firma con HS256 {iat, exp, data.name=admin} con esa clave. Tras el parche, la clave es base64_decode(pbxapijwtsecret) de /etc/issabel.conf y el token estándar es rechazado (NOT_VULNERABLE).
Stdout: PBXAPI, VULNERABLE, NOT_VULNERABLE, NOT_FOUND, HANDLER, HTTP.

CVE: CVE-2026-89026. Crédito: Shadowserver Foundation / VulnCheck. Parche: b97dbaf.
| Flag | Qué hace |
|---|
-u / --url | URL base de Issabel (obligatorio). http:// o https://. Un nombre de host sin esquema se prueba primero como HTTPS, luego HTTP. Las redirecciones http→https mantienen POST. Los certificados TLS incorrectos se reintentan sin verificación; --insecure omite la verificación desde el principio (Issabel a menudo usa un certificado autofirmado) |
--test | Huella digital de /pbxapi y demuestra que se acepta un JWT de administrador falsificado. Sin originate / sin comando |
--read PATH | Ejecuta cp PATH en la raíz web mediante System, luego hace GET del archivo (así es como ves /etc/passwd) |
--cmd CMD | GET /pbxapi/manager/originate?application=System&data=CMD. AMI no devuelve stdout — usa --read para ver un archivo |
--channel | Originate Channel (por defecto Local/s@default) |
--insecure | Omite la verificación TLS |
--timeout | Segundos de timeout HTTP (por defecto 30) |