باگ خطرناک در برنامه SupportAssist از Dell

120

باگ CVE-2019-3719 در برنامه SupportAssist از Dell

هکر جوان 17 ساله ای به نام ‌‌Bill Demirkapi یک باگ از نوع RCE در برنامه SupportAssist که بطور پیشفرض در اکثر سیستم های Dell نصب شده است، پیدا کرده و بعد از گزارش به شرکت Dell جزئیات آن را به اشتراک گذاشته که به شرح زیر می باشد.

برنامه SupportAssistant برنامه ایست که توسط شرکت Dell برای آپدیت های مختلف، چک کردن، عیب یابی و همچنین مانتیتورینگ منابع سیستم و مشخصات سخت افزاری و نرم افزاری سیستم های آن به کار میرود. و به صورت پیش فرض بر روی لپتاپ های Dell نصب می باشد.

طبق گفته های ‌‌Bill Demirkapi وقتی که ایشون قابلیت “تشخیص PC” رو در وبسایت پشتیبانی Dell و همچنین نصب اتوماتیک درایورها را در این برنامه دیده کنجکاو شده تا ببیند این سیستم در زیر بنای خود چگونه کار میکند.

بعد از کمی مانیتورینگ سیستم متوجه شد که این برنامه دو سرویس به نام های SupportAssist Agent و Dell Hardware Support دارد که توسط این برنامه اجرا شده و بر روی پورت 8884 یک وب سرویس RESTful ارائه می دهند. بعد از کمی دنبال کردن متوجه شد که برنامه .NET می باشد که مهندسی معکوس آن خیلی راحت است. سپس تصمیم گرفته تا آن را مهندسی معکوس کند و متوجه شود این وب سرویس ایجاد شده چه امکاناتی را به وب سایت میدهد. بهتر است بگوییم به کد جاوا اسکریپت وبسایت چون سرویس بر روی 127.0.0.1 بایند می شود.

البته این برنامه بر روی یکی از پورت های 8884, 8883, 8886 یا 8885 (هرکدام که در دسترس باشند) بایند می شود. وبسایت از یک signature و یک expire date برای درخواست به وب سرویس سیستم استفاده می کند که می توان با درخواست به این آدرس آنها را بدست آورد.

یکی از درخواست هایی که با کلیک بر روی Download Drivers ایشون مشاهده کرده و خیلی جالب بوده, به شکل زیر است:

و بدنه درخواست:

همونطور که میبینید به نظر وبسایت در مرورگر به وب سرویس درخواست میده که این برنامه رو دانلود و بطور دستی نصب کن، که در نهایت این برنامه قراره اجرا بشه. لیستی از endpoint ها اینجا میتوانید ببینید.

یکی از endpoint هایی که از نظر آقای بیل جالب بود, downloadservice_downloadandautoinstall است. که بنظر مثل نمونه download and install manual هست اما بدون دخالت کاربر یعنی بصورت اتوماتیک فایل را دانلود و نصب یا اجرا می کند.

این عملیات به شکل زیر انجام می شود.

1- مرورگر یک درخواست POST به آدرس

می فرستد. با بدنه JSON زیر:

2- وب سرویس بعد از اعمال یکسری چک بر روی Referrer که باید از سوی یکی از زیر دامنه های dell.com باشد توسط تابع ClientServiceHandler.ProcessRequest تابع ClientServiceHandler.HandlePost صدا زده می شود.

3- سپس تابع ClientServiceHandler.HandlePost اول پارامترها را در یک آرایه قرار داده و بعد تابع ServiceMethodHelper.CallServiceMethod را فراخوانی می کند.

4- سپس تابع ServiceMethodHelper.CallServiceMethod مانند یک router یا تابع dispatch عمل کرده و آرگومان های مشخص را به تابع سرویس درخواست داده شده ارسال می کند. برای سرویس downloadservice_downloadandautoinstallبه طریق زیر عمل میکند:

فایل هایی که به تابع DownloadServiceLogic.DownloadAndAutoInstall میدهد همان هایی هستند که از طریق درخواست JSON فرستاده شده بودند. سپس

5- کد زیر برای آدرس ها اجرا می شود تا از دانلود از لینک غیر https جلوگیری کند:

که البته اگر دقت کنید بعد از اینکه آدرس را تبدیل به حروف کوچک میکند تا چک کند که آیا با “http://” شروع میشود، اصلا خروجی را strip نم یکند تا اگر فاصله ای قبل از آدرس بود حذف شود. این بعنی این مکانیزم با قرار دادن یک حرف فاصله در اول آن دور زده تا اگر آدرس فایل مورد نظر ما بر روی یک وب سرور بدون https هم بود قابل دانلود باشد.

6- تابع چک کردن دامنه که در flag3 استفاده شده چک میکند که دامنه ارائه شده یکی از دامنه های شرکت Dell باشد و در اصل whitelist میکند:

که البته اگر بتوانیم یک DNS Spoof بعنوان مثال از طریق DNS Hijacking انجام دهیم یا یک endpoint دارای Redirection در آن دامنه ها پیدا کنیم می توانیم به راحتی این مکانیزم را هم دور بزنیم.

7- در آخر اگر تمام این مکانیزم ها پاس شوند, فایل ها توسط DownloadHandler.RegisterDownloadRequest دانلود و توسط برنامه SupportAssist بعنوان کاربر Administrator اجرا خواهند شد.

اکسپلویت کردن باگ dell

فایل های مربوط به اکسپلویت کردن رو میتونید از این respository دریافت کنید.

  1. اول از همه برنامه ای که میخواهیم در سیستم قربانی اجرا کنیم را حاضر می  کنیم.
  2. یک وب هاست تهیه کرده تا مشکل Access-Control-Allow-Origin را دور بزنیم. آقای Bill از کد زیر استفاده کردند:
  3. کد WebServer.py را ویرایش کرده تا آدرس url هاست خود را قرار دهیم. به جای “https://bills-sandbox.000webhostapp.com/GetDellSignatures.php”.
  4. برنامه main.py را با آرگومان های مناسب اجرا کرده و هدف را به طریقی ترغیب تا به وبسایت با دامنه ای که تنظیم کرده ایم سر بزند.

امیدوارم پست مفیدی بوده باشه. پست اصلی که توسط خود آقای Bill نوشته شده را می توانید در اینجا مشاهده کنید.

ارسال یک پاسخ

آدرس ایمیل شما منتشر نخواهد شد.