آسیب‌پذیری در OpenSMTPD که امکان اجرای کد از راه دور با امتیازات ریشه را می‌دهد

در سرور ایمیل توسعه یافته توسط پروژه OpenBSD OpenSMTPD شناخته شده است آسیب پذیری بحرانی (CVE-2020-7247)، که به شما امکان می دهد دستورات پوسته را از راه دور روی سرور با حقوق کاربر ریشه اجرا کنید. این آسیب‌پذیری در طی یک بازرسی مجدد توسط Qualys Security (ممیزی OpenSMTPD قبلی) شناسایی شد. برگزار شد در سال 2015، و آسیب پذیری جدید از می 2018 وجود داشته است). مسئله حذف شده است در نسخه OpenSMTPD 6.6.2. به همه کاربران توصیه می شود فوراً به روز رسانی را نصب کنند (برای OpenBSD، پچ را می توان از طریق syspatch نصب کرد).

دو گزینه حمله پیشنهاد شده است. گزینه اول در پیکربندی پیش فرض OpenSMTPD کار می کند (پذیرش درخواست ها فقط از میزبان محلی) و به شما امکان می دهد از مشکل به صورت محلی سوء استفاده کنید، زمانی که مهاجم قادر به دسترسی به رابط شبکه محلی (Loopback) در سرور (به عنوان مثال، در سیستم های میزبانی) باشد. . گزینه دوم زمانی رخ می‌دهد که OpenSMTPD برای دریافت درخواست‌های شبکه خارجی پیکربندی شده باشد (یک سرور ایمیل که نامه‌های شخص ثالث را می‌پذیرد). محققان نمونه اولیه یک اکسپلویت را آماده کرده اند که هم با نسخه OpenSMTPD موجود در OpenBSD 6.6 و هم با نسخه قابل حمل برای سایر سیستم عامل ها (که در تست دبیان انجام شد) با موفقیت کار می کند.

مشکل ناشی از خطا در تابع smtp_mailaddr() است که برای بررسی صحت مقادیر در فیلدهای "MAIL FROM" و "RCPT TO" فراخوانی می شود که فرستنده/گیرنده را تعریف می کند و در طول اتصال ارسال می شود. با سرور پست الکترونیکی برای بررسی بخشی از آدرس ایمیل که قبل از نماد "@" قرار می گیرد، تابع smtp_mailaddr() فراخوانی می شود.
valid_localpart()، که (MAILADDR_ALLOWED) کاراکترهای "!#$%&'*/?^`{|}~+-=_" را مطابق با RFC 5322 می پذیرد.

در این حالت، فرار مستقیم رشته در تابع mda_expand_token() انجام می‌شود که تنها کاراکترهای «!#$%&'*?`{|}~» (MAILADDR_ESCAPE) را جایگزین می‌کند. پس از آن، خط آماده شده در mda_expand_token() هنگام فراخوانی عامل تحویل (MDA) با استفاده از دستور 'execle("/bin/sh"، "/bin/sh"، "-c"، mda_command،..." استفاده می‌شود. در صورت قرار دادن حروف به mbox از طریق /bin/sh، خط «/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}» راه‌اندازی می‌شود که مقدار «%» {mbox.from}" شامل داده های فرار از پارامتر "MAIL FROM" است.

ماهیت آسیب‌پذیری این است که smtp_mailaddr() دارای یک خطای منطقی است، به همین دلیل، اگر یک دامنه خالی به ایمیل ارسال شود، تابع یک کد تأیید موفقیت‌آمیز را برمی‌گرداند، حتی اگر قسمتی از آدرس قبل از «@» حاوی کاراکترهای نامعتبر باشد. . علاوه بر این، هنگام تهیه یک رشته، تابع mda_expand_token() از همه کاراکترهای خاص پوسته ممکن فرار نمی کند، بلکه فقط از کاراکترهای ویژه ای که در آدرس ایمیل مجاز هستند، فرار می کند. بنابراین، برای اجرای دستور خود کافی است از علامت ";" در قسمت محلی ایمیل استفاده کنید. و فضا، که در مجموعه MAILADDR_ESCAPE گنجانده نشده اند و از آن خارج نمی شوند. مثلا:

$nc 127.0.0.1 25

سلام استاد.falken
ایمیل از:<;خواب 66;>
RCPT به:
داده ها
.
ترک کنید

پس از این جلسه، OpenSMTPD، هنگامی که به mbox تحویل داده شد، دستور را از طریق پوسته اجرا می کند

/usr/libexec/mail.local -f ;sleep 66; ریشه

در عین حال، احتمال حمله به این دلیل محدود می شود که قسمت محلی آدرس نمی تواند از 64 کاراکتر بیشتر شود و کاراکترهای ویژه '$' و '|' هنگام فرار با ":" جایگزین می شوند. برای دور زدن این محدودیت، از این واقعیت استفاده می کنیم که بدنه نامه پس از اجرای /usr/libexec/mail.local از طریق جریان ورودی، یعنی. با دستکاری آدرس، فقط می توانید مفسر دستور sh را راه اندازی کنید و از متن نامه به عنوان مجموعه ای از دستورالعمل ها استفاده کنید. از آنجایی که هدرهای SMTP سرویس در ابتدای حرف نشان داده شده اند، پیشنهاد می شود از دستور خواندن در یک حلقه برای رد شدن از آنها استفاده کنید. یک اکسپلویت کاری چیزی شبیه به این است:

$nc 192.168.56.143 25

سلام استاد.falken
ایمیل از:<;برای ​​i در 0 1 2 3 4 5 6 7 8 9 abcd;r;done;sh;exit 0;> را بخوانید
RCPT به:[ایمیل محافظت شده]>
داده ها
#0
#1
...
#d
برای i در WOPR; انجام دادن
echo -n "($i) " && id || زنگ تفريح
انجام شد > /root/x."`id -u`.""$$"
.
ترک کنید

منبع: opennet.ru

اضافه کردن نظر