در عصر جدید اینترنت فقط کامپیوترهای شخصی نیستن که در یک شبکه محلی وجود دارن. با وجود روترهای بیسیم، سرویسهای مختلفی مثل NAS (مخازن متصل به شبکه)، کامپیتورهایی مثل رزبریپای، سیستمهای خانههوشمند، تلفن های اینترنتی، پرینترها، تلویزینهای متصل به شبکه، سنسورها، و کلی Device دیگه، شبکههای محلی پر شده از سیستمهای مختلف. در مفهومی مثل IoT که در اون دیوایسها ضعیفتر هستن، بیشتر سازوکارهای امنیتی قابل پیادهسازی در خود دیوایس نیستن و اغلب به عوامل خارجی تکیه میشه.
شبکه محلی یک شبکه امن پشت NAT شناخته میشه. جاییکه شخصی خارج از شبکه نمیتونه به اون دسترسی داشته باشه و خب در لبه (Edge) این شبکه هم دیوارآتش (Firewall) وظیفه کنترل و حراست از شبکه داخلی رو داره. اینجوری میشه که خیلیها به این شبکه اعتماد میکنن و سیاستهای ایمنی رو برای اون اغلب نادیده میگیرن.
چرا CSRF چندان کارآمد نیست؟
در پست قبلی درباره حملات CSRF خوندیم، اینکه چطوری یک وبسایت آلوده میتونه کاربر رو مجبور کنه که درخواستهای ناخواسته ارسال کنه. در این سناریو فرض کنیم که قراره از کاربر بخواهیم که به روتر (Router) خودش یه درخواست از نوع POST ارسال کنه و از روتر بخواد Remote Telnet رو فعال کنه که در نتیجه فرد متخاصم (Attacker) بتونه از راه دور به روتر کابر متصل شه و به اون دسترسی داشته باشه. اما … تمام این سناریو زمانی اتفاق میافته که کاربر در واقع تو روتر لاگین کرده باشه و Cookie در مرورگر ذخیره شده باشه و شما بتونید از اون برای یک درخواست معتبر استفاده کنید. زمان یک نشست در روترها اغلب کوتاه هست و در زمان کمی منقضی (Expired) میشه. و اینکه کاربر هنگام دریافت محتوای آلوده از شما دارای یک Cookie معتبر در مرورگر خودش باشه خیلی پایینه. باز فرض بر اینکه مرورگر واجد این شرایط بود، این نکته هم باید در نظر گرفته بشه که بیشتر روترها امروزه از سازوکارهای جلوگیری از حملات CSRF استفاده میکنن و این سناریو حمله بینتیجه میشه.
هرچند در دنیای IoT هنوز حملات CSRF از دسته حملاتی هستند که بیشتر دیده میشن. با توجه به اینکه اغلب دیوایسهایی که در دنیای IoT وبسرویس ارئه میدن دارای چهارچوب (Framework) ایمنی نیستند و توسط توسعهدهنگان بدون دقت برنامهریزی شدن، وجود مشکلات CSRF بسیار زیاد دیده میشه.
فرض کنیم یک Board کوچک مثل ESP32 داریم که قبلا توسط یک شرکت برنامهنویسی شده و قراره باز و بسته کردن در خونه رو با کمک موبایلهوشمند انجام بده. و روند این کار به این صورت هست:
- کاربر در برنامه مربوط به قفل در کلید بازکردن رو میزنه
- برنامه یک درخواست POST به ادرس http://192.168.1.165/door میفرسته که در پیام درخواست کلمه unlock هست.
- برد ESP32 این درخواست رو دریافت میکنه و با توجه به متن پیام در رو باز میکنه.
همین سناریو به سادگی میتونه توسط یک وبسایت آلوده انجام بشه و به صورت ناخواسته در خونه باز بشه. برای همین امروزه اغلب دیوایسهای IoT از سازوکارهای جلوگیری از حملات CSRF استفاده میکنند و اغلب این سناریو قابل اجرا نیست.
سناریو حمله
تا الان توضیح دادیم که چرا حملات CSRF نمیتونه خیلی کاربردی باشه. از الان میخواهیم شروع کنیم برای مطالعه درباره حملات DNS Rebinding. قبل از هرچیزی باید بدونیم که Same-Origin Policy چی هست و البته آگاهی کافی از اینکه DNS چجوری کار میکنه. و در این پست قرار نیست Demo اجرا بشه و صرفا مربوط به سازوکار این حمله هست.
اگه یکبار دیگه مرور کنیم میبینیم علت ناکارآمدی حملات CSRF این بود که ما نمیتونستیم صفحات رو بخونیم و در نتیجه CSRF Token رو داشته باشیم. و علت این SOP بود که اجازا نمیداد یک مستند یا Script از یک Origin بتونه از Origin دیگهای چیزی GET کنه.
فرض کنیم وبسایت مخرب attacker.com با آدرس آیپی 1.1.1.1 وجود داره. و یک وبسایت دیگه مثل bank.com به آدرس آی پی 2.2.2.2 هم وجود داره. طبق SOP وب سایت attacker.com نمی تونه هیچ درخواستی خواندنی به bank.com بده چون این دوتا در دو Origin متفاوت هستند. حالا چی میشه اگه به نحوی آدرس آی پی attacker.com از 1.1.1.1 به 2.2.2.2 تغییر کنه؟ براساس سازوکار مرورگرها هیچ چیز تغییر نمی کنه فقط شما از این به بعد بهجای ارتباط با attacker.com با bank.com ارتباط میگیرید. همون طور که میبینیم، DNS میتونه سازوکار SOP رو دور بزنه.
حملات DNS Rebinding مدت طولانی هست که وجود داشته و داره. که در طول این سال های زیاد خیلی کم به اون اشاره شده. بزرگترین مشکلات پیش اومده از بابت این حمله، آسیب پذیریهای چند وب سایت رمز ارز بود که به متخاصم اجازه میداد با DNS Rebinding، اکانت کاربر رو کاملا در دست بگیره. اما در ژوئن 2018 توجه ها به این حمله خیلی بیشتر شده. وقتی دست کم بیشتر از 500 میلیون دیوایس آسیب پذیر در تشکیلات مهم اقتصادی و صنعتی پیدا شد.
DNS Rebinding چطوری کار میکنه؟
- صاحب دامنه attacker.com می تونه خودش DNS Server خودش رو میزبانی کنه. با توجه به این موضوع فرد متخاصم یک سرور DNS آلوده اجرا میکنه.
- فرد با استفاده از روشهای مختلف مثل تبلیغات، ایمیل، و یا هر چیز دیگه ای آدرس attacker.com به کاربر میده.
- به محض اینکه کاربر به صفحه attacker.com درخواست بده، در ابتدا مرورگر یک درخواست DNS اجرا می کنه تا بتونه آدرس IP مرتبط با دامنه attacker.com رو دریافت کنه و بتونه درخواست رو کامل کنه. سرور DNS به مرورگر آدرس آی پی 1.1.1.1 رو برمیگرونه. همچنین مقدار TTL رو یک می میذاره تا از Cache شدن طولانی مدت جلوگیری بشه (مقدار TTL در پاسخ سرور DNS مشخص کننده زمان معتبر بودن یک پاسخ DNS هست و این پاسخ تو Cache سیستعامل ذخیره میشه تا هربار لازم به درخواست نباشه – تا اون پاسخ منقضی بشه)
- مرورگر صفحه attacker.com رو اجرا میمیکنه. این صفحه دارای یک کد ساده جاواسکریپ هست که از نظر مرورگر آلوده نیست.
- همینطور که میبینیم بعد از یک درخواست GET به URL مشخص شده فرستاده میشه و از نظر SOP مجاز هست. نکتهای که باید دقت کنیم این هست که بعد از یک ثانیه مقدار Cache شده دیگه وجود نداره پس مرورگر مجبوره یکبار دیگه درخواست DNS ارسال کنه. اینبار سرور DNS آلوده مقدار 192.168.1.156 رو به عنوان آدرس آیپی attacker.com برمیگردونه. و سپس درخواست فرستاده میشه که درواقع به این آدرس فرستاده شده:
https://192.168.1.156/temprature
- سپس مقدار بازگشتی توسط یک تصویر به سرور اصلی که 1.1.1.1 باشه برمیگرده.
- در این مرحله متخاصم مقدار دمای خونه رو در دست داره.
هرچند مقدار دما شاید چندان مهم نباشه ولی این سناریو نشون داد که چطوری DNS Rebinding میتونه SOP رو دور بزنه.
نکته مهمی که وجود داره این هستش که بعضی از مرورگرها به TTL خیلی توجه نمیکنن و به ارتباط با همون آدرس IP قبلی ادامه میدن. در این مورد بیشتر ابزارهای DNS Rebind درخواست دوم کاربر رو در فایروال DROP میکنن تا مرورگر مجبور اجرای درخواست DNS بشه.
پیاده سازی حمله با چند A Record
یکی از روشهای دیگهای که میشه توسط اون این حمله رو انجام داد Multiple A Record هست. این اصطلاح بیشتر به عنوان DNS Load Balancing شناخته میشه. برای مثال وقتی از DNS آدرس آیپی google.com رو درخواست میکنیم با چند پاسخ روبرو میشویم. که این پاسخها از بالا به پایین الویت دارن.
همون طور که شاید تا الان حدس زده باشید، سرور DNS میتونه چند A Record رو ارسال کنه. و در بالاترین الویت آدرس IP وبسایت خودش رو بذاره و در الویت بعدی آدرس IP هدف. به این ترتیب بعد از اولین درخواست کاربر به وب سرویس فایروال کاربر رو مسدود میکنه و کاربر برای درخواست بعدی مجبور به استفاده از آدرس دوم میشه. و DNS Rebind اتفاق میافته.
نکتهای که در این روش حائز اهمیت هست: مرورگر در پاسخهای بازگشتی از سرور DNS اگه A Record از نوع RFC1918 IP ببینه. بدون در نظر گرفتن الویت از اون آدرس استفاده میکنه (RFC1918 IP، اصطلاحی هست که به IPهای Private/Local گفته میشه). پس این نوع از پیاده سازی حمله فقط میتونه برای IP آدرسهای عمومی استفاده بشه.
الان متوجه شدیم که چقدر تاثیر این آسیبپذیری میتونه زیاد باشه، و سناریوهای مختلفی رو میشه با اون پیاده کرد. از جمع آوری BotNet ها گرفته تا دسترسی به روترها و دور زدن Firewall ها.
راههای جلوگیری از DNS Rebinding
راههای زیادی برای جلوگیری از این حمله وجود داره که کاوش اونها بسیار وقت گیره. از بازنویسی سیاستهای SOP گرفته تا استفاده از پروتکلهای مشخص. اما یکی از مرسومترین راه حلها بررسی هدر Host درخواست هست.
اساسا وقتی DNS Rebind اتفاق می افته تغییری در درخواستهای مرورگر داده نمیشه. به این معنی که برای مثال هدر Host به همون مقدار attacker.com میمونه. پس bank.com که این درخواست رو دریافت میکنه با چک کردن هدر Host باید اطمینان حاصل کنه که درخواست مربوط به نامدامنه Bank.com هست و نه دامنه دیگری.
یکی دیگه از روش های کاربری استفاده از HTTPS هست. البته استفاده از HTTPS چیزی رو عوض نمیکنه در صورتی که شما هنوز به HTTP اجازه برقراری ارتباط بدین. سازوکار این روش هم بهاین صورت هست که bank.com از یک اعتبارنامه SSL استفاده میکنه که برای attacker.com معتبر نیست و یک هشدار امنیتی این درخواست رو مسدود میکنه.
مطالبی که می نویسم صرفا خلاصه مطالعه RFC ها و کتابهای معروفه که همتون میشناسید. و هیچ کدوم از این ها کشفیات خودم نبوده و نیست. خوشحال میشم نقد کنید و اگه موردی از نظرتون درست نبود بهم بگید.
راه ارتباطی با من معمولا aggr3ssor@protonmail.com هست و در توییتر با 0xc0d میتونید منو پیدا کنید.
ممنونم خیلی کامل و گویا توضیح داده بودین
بسیار عالی بود دمت گرم