
PoC em Python que forja um JWT HS256 codificado de forma fixa para explorar a CVE-2026-89026 no Issabel pbxapi, permitindo execução remota de comandos do SO sem autenticação através do endpoint originate.
Issabel pbxapi JWT RCE com chave codificada fixa POC
Issabel Framework pbxapi — forja de JWT não autenticada (chave HS256 codificada fixa) e depois GET /pbxapi/manager/originate com Application=System para executar comandos do SO como o usuário Asterisk. Corrigido no commit b97dbaf (chave carregada de /etc/issabel.conf). A Shadowserver observou exploração a partir de 2026-09-09.
Apenas para testes autorizados. Não execute isto contra sistemas que você não possui ou não tem permissão para testar.
Requer: Python 3, apenas biblioteca padrão.
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 | O que faz |
|---|---|
-u / --url | URL base do Issabel (obrigatório). http:// ou https://. Um hostname sem esquema é tentado como HTTPS primeiro, depois HTTP. Redirecionamentos http→https mantêm o POST. Certificados TLS inválidos são tentados novamente sem verificação; --insecure ignora a verificação desde o início (o Issabel frequentemente usa um certificado autoassinado) |
--test | Faz fingerprint de /pbxapi e prova que um JWT de admin forjado é aceito. Sem originate / sem comando |
--read PATH | Executa cp PATH para a raiz web via System, depois faz GET do arquivo (é assim que você vê /etc/passwd) |
--cmd CMD | GET /pbxapi/manager/originate?application=System&data=CMD. O AMI não retorna stdout — use --read para visualizar um arquivo |
--channel | Originate Channel (padrão Local/s@default) |
--insecure | Ignora a verificação TLS |
--timeout | Timeout HTTP em segundos (padrão 30) |
Endpoints do --test: GET /pbxapi/ sem Authorization (espera 403), depois a mesma URL com Authorization: Bearer <JWT forjado>. Um JSON 200 listando controllers / manager (ou JSON de conexão AMI após autenticação) é VULNERABLE. Ele não chama originate.
Autenticação: não há nenhuma para o atacante. A API pensa que tem autenticação Bearer JWT. Antes do patch, pbxapi/index.php define JWT_KEY como uma string compilada em todas as instalações. O PoC assina em HS256 {iat, exp, data.name=admin} com essa chave. Após o patch, a chave é base64_decode(pbxapijwtsecret) de /etc/issabel.conf e o token padrão é rejeitado (NOT_VULNERABLE).
Stdout: PBXAPI, VULNERABLE, NOT_VULNERABLE, NOT_FOUND, HANDLER, HTTP.

CVE: CVE-2026-89026. Crédito: Shadowserver Foundation / VulnCheck. Patch: b97dbaf.