خب همونطور که میدونید چند روز پیش یه وصله امنیتی روی سرویس ریموت دسکتاپ ویندوز اومد که مشخص شد مربوط به یه باگ زیرودی (0day) بوده که مایکروسافت برطرفش کرده و اکیدا توصیه شد که ویندوزا رو به روز رسانی کنید. قضیه اونقد مهم بود که مایکروسافت با اینکه مدت هاست برای ویندوز xp و 2003 وصله امنیتی نمیداد مجبور شد واسه اونا هم پچ بده. حالا میخوایم با هم یه بررسی داشته باشیم روی باگ و نحوه اکسپلویت کردنش . این یه ترجمه و جمع آوری از تحقیق گروه شرکت مکافی هست و خودم شخصا انجام ندادم. پس انتظار نداشته باشید همه چیزشو بدونم ولی دیدم خوب توضیح داده گفتم در میون بگذارم.
خب اول به این بپردازیم که چرا این باگ اینقد مهم بوده که مایکروسافت تشخیص داده حتی واسه ویندوزای قدیمیش هم پچ بده؟ این مورد رو توی باگی که به باج افزار واناکرای منجر شد هم دیدیم چون خیلی مهم بود(MS17-010) . قابلیتی که این باگ داره برا این مهمه که بدون نیاز به یوزر و پسورد صحیح فقط با یه رشته بایت توی چندتا پکت RDP ، میشه اقدام به گرفتن دسترسی و اجرای کد روی سرور کرد به نحوی که اگه درست انجام بشه، دسترسی کامل میشه گرفت که دیگه بعدش هر کاری دلت میخاد بکن. و از همه مهمتر اینکه تقریبا تنها راه ارتباطی ویندوز سرورها با ادمیناشون پروتکل ریموت دسکتاپه و توی دنیا میلیون ها ویندوز سرور هستن که ریموت دسکتاپشون فعاله !!!( این یعنی خوش بحال بد افزار نویسا)
این باگ با کد CVE-2019-0708 منتشر شده ، البته هشتگ #bluekeep هم بهش دادن که میتونید گوگل کنید و ببینید چقد برای POC های مختلف و فیک اومد توی این چند وقته. یه جورایی انگار مسابقه ی فریب شده بود . بگذریم. خب اول بگیم که توی این تحقیق شرکت مکافی چه ویندوزایی آسیب پذیریشون تایید شده:
Windows 2003
Windows XP
Windows 7
Windows Server 2008
Windows Server 2008 R2
این سری ویندوزا آسیب پذیر هستن طبق متن گزارش که با توجه به نحوه گرفتن دسترسی بعد از اکسپلویت شدن، قطعا جلگه ی حاصلخیزیه برای پرورش بدافزار. به قول دوستان کیپ کالم اند ده بلوکیپ ایز کامینگ .
پروتکل ریموت دسکتاپ یا همون RDP برای اتصال بین کلاینت و سرور استفاده میشه به این صورت که دیتایی که قراره جابجا بشه رو توی کانال های مجازی قرار میده یا همون (Virtual Channels). کانال های مجازی مسیرهای داده دوطرفه ای هستن که به RDP این قدرت رو میده که داده ها رو توی وسعت زیاد جابجا کنه.
خیلی ساده بخام بگم یه چیزی شبیه کانکشن های همزمان هست توی دانلود منیجرتون برای افزایش سرعت. البته این مثال فقط برای درک مفهومه وگرنه خودتون میدونید که اون یه چیز کاملا مجزاست.
ویندوز سرور دوهزار، 32 تا کانال استاتیک و ثابت (SVC) تعریف کرده بود توی معماری پروتکل RDP5.1 ، اما بعدا کم اومده و مجبور شدن یه تغییری داخلش اعمال کنن. بخاطر همین چون تعداد کانالا محدود بوده میان و یه ویژگی به پروتکل اضافه میکنن به نام کانال های مجازی داینامیک (DVC) که خود این داینامیکا، داخل هر یکی از اون استاتیکا قرار میگیره. امیدوارم فهمیده باشید منظورمو:)) . وقتی که یه سشن RDP برقرار میشه، اون کانالای استاتیک ایجاد میشن و تا آخر اتصال سالم میمونن. ولی اون کانالای داینامیک هر وقت لازم باشه به وجود میان و هر وقت نه از بین میرن.
خب حالا همه ی اینا رو گفتیم برا چی؟ میخایم به اینجا برسیم که مشکل توی همین کانال و تعریف و شمردن ایناست . چجوری ؟ بریم ببینم چجوری:دی
این همون 32 تا کانال استاتیک (SVC) هست که با عث این باگ شده و توی وصله امنیتی مایکروسافت توی دوتا فانکشن _IcaBindVirtualChannels و _IcaRebindVirtualChannels ، داخل فایل درایور مربوط به پروتکل ریموت دسکتاپ به نام termdd.sys پچ و اصلاح شدن. همونطور که توی شکل 1 مراحل برقراری ارتباط ریموت دسکتاپ رو جز به جز میبینید، قشنگ میفهمید که کانال ها قبل از پیاده سازی مراحل امنیتی برقرار (initiate) میشن که یکی از دلایل خطرناک بودن هم همین بود چون قبل از رمزنگاری و امن کردن ارتباط میتونیم خرابکاری بکنیم و یه ویروس یا بد افزار خیلی سریع میتونه با این ویژگی خودشو گسترش بده.
آسیب پذیری دقیقا برمیگرده به یه کانال استاتیک به نام "MS_T120" که به عنوان کانال مرجع شماره 31 برای کنترل کنفرانس ریموت دسکتاپ(Generic Conference Control : GCC) استفاده میشه.این کانال یه جورایی برای پیامای کنترلی نشست استفاده میشه. این اسم "MS_T120" که به این کانال داده شده یه چیز استاندارد و معروف نیست که مثلا بگیم مرسومه توی پروتکل نویسی و یه اسم کاملا داخلیه که مایکروسافت توی پیاده سازیش استفاده کرده. پس گیج نشید.
توی عکس شماره 2، یه پکت تبادل شده قانونی رو توی پروتکل ریموت دسکتاپ داخل وایرشارک میبینید که برای کنفرانس GCC یا همون مرحله شروع نشست ریموت دسکتاپ هست، ولی یه چیز مهم اینه که اون کانال MS_T120 رو نداره و داخلش نیست.
با این حال، زمانی که اصطلاحا نشست کنفرانس GCC داره شروع میشه، کلاینت میتونه اسم کانال رو خودش مشخص کنه(وقتی که بیاد پکت رو تو سطح پایین دستکاری کنه) ، و این یعنی چی؟ یعنی اینکه یه نفوذگر میتونه یه کانال استاتیک دیگه غیر از کانال 31 رو اسمشو بزاره "MS_T120" و این یعنی اینکه میتونه باعث خراب شدن پشته توی حافظه بشه که اصطلاحا همون سرریز بافر هم گفته میشه که بعد از اون منجر میشه به اجرای کد از راه دور یا همون حمله RCE.
شکل شماره 3 یه درخواست ایجاد کانال دستکاری شده و مخرب رو نشون میده که توی مرحله شروع نشست کنفرانس GCC ، اومده و کانال شماره 4 رو بصورت غیر قانونی اسمشو گذاشته "MS_T120".
کامپوننت هایی که با مبحث مدیریت کانال MS_T120 درگیر هستن رو توی شکل شماره 4 میتونید ببینید. کانال مرجع MS_T120 اول داخل فایل rdpwsx.dll ساخته میشه و صف پشته ی حافظه ش توی فایل rdpwp.sys اختصاص داده میشه. تخریب پشته ی حافظه در اصل توی یه فایل دیگه به اسم termdd.sys اتفاق میوفته. زمانی که کانال MS_T120 میخاد با یه شماره غیر از شماره 31 پردازش بشه.( یادتونه که گفتیم این کانال شماره خودش 31 هست؟)
همونطور که توی پچ مایکروسافت توی شکل شماره 5 میبینید، الان توی نسخه اصلاح شده یه چک به ارتباط کلاینت اضافه شده با اسم نام کانال "MS_T120" که میاد چیکار میکنه؟ میاد مطمئن میشه که این اسم فقط به کانال شماره 31 (1Fh) بایند شده باشه. برای این کار از دوتا تابع _IcaBindVirtualChannels و _IcaRebindVirtualChannels توی فایل termdd.sys استفاده شده.
بعد از اینکه ما پچ های ویندوز xp و 2003 رو بررسی کردیم تازه فهمیدیم که چطوری پروتکل RDP الان و قبل از پچ پردازش و پارس میشده. برای همین بعدش تصمیم گرفتیم با این باگی که فهمیدیم چجوری کار میکنه روی یه سیستم که آسیب پذیره تست کنیم ببینیم میشه کد رو اجرا کرد یا نه. برای همین اونایی که اکسپلویت کردن رو باهاش آشنایی دارن میدونن که برای اثبات قضیه معمولا یه کد فراخوانی و اجرای نرم افزار ماشین حساب (calc.exe) توی ویندوز استفاده میشه که خیلی مرسومه.
برای راه اندازی این آزمایش کوچیک ، یه ماشین مجازی درست کردیم که ویندوزش هنوز پچ نشده بود و برای تست نصبش کردیم. نتیجه ی آزمایش رو توی ویدیوی زیر که لینک یوتیوبه میتونید ببینید.
خب همونطور که توی ویدیو هم دیدید این دوستان تونسته بودن که مطمن بشن این باگ وجود داره و از اون مهمتر اینکه تونسته بودن شل کدش رو بنویسن و بطور موفقیت آمیز اصطلاحا اکسپلویتش کنن. هدف من فقط این بود که یه متن فارسی بنویسم که همه بتونن بفهمنش وگرنه خب همه میدونیم که رفرنس انگلیسیش هست که خیلی قشنگم گفته و لینکشو این پایین میگذارم.
امیدوارم مفید بوده باشه. توی توییتر با همین ایدی فیدبک بهم بدید. دمتون گرم.
مرجع : http://tiny.cc/rdp_CVE