تاریخ امروزپنج شنبه , ۸ خرداد ۱۳۹۹

تحلیل و اکسپلویت آسیب پذیری CVE-2020-0688 در Exchange Server

نرم‌افزار Exchange Server که سرویس دهنده ایمیل شرکت Microsoft است دارای آسیب پذیری ترکیبی از Deserialize و کلید رمزنگاری ثابت است (CVE-2020-0688). که با داشتن یک کاربر عادی در این سرویس، می‌توان به دسترسی RCE یعنی اجرای کد بر روی آن سرور رسید. تحلیل و نحوه اکسپلویت این آسیب پذیری در ادامه قرار داده شده است.

آشنایی ViewState در ASP.NET

برای این که در ASP.NET بتوان اطلاعات صفحات، کاربر و برخی داده‌های دیگر را در سمت کلاینت ذخیره کرد از متغیری با نام __VIEWSTATE استفاده می‌شود.

در وبسایت‌هایی که با زبان ASP.NET طراحی شده‌اند وقتی یک صفحه بارگذاری می‌شود یا یک فرم پرشده و ارصال می‌شود، این متغیر نیز همراه آنها ارسال می‌گردد.

ViewState به طور معمول دارای کلید Machine Key رمزنگاری و امضا است. کلید آن در سمت سرور، به صورت کاملا ایمن باید نگه داری شود. اگر در سیستمی، رمزنگاری غیرفعال شود یا بتوان به کلید دسترسی پیدا کرد در این صورت می‌توان در سمت سرور کد اجرا کرد (RCE).

برای قدرتمند‌تر شدن رمزنگاری، از .net 4.5 به بعد Microsoft امکانات رمزنگاری بیشتری را در اختیار کاربران قرار داده است.

  • در نسخه‌های قبل از .net 4.5 فقط با داشتن Validation Key می‌توان ViewState تولید کرد.
  • در .net 4.5 به بعد، علاوه بر Validation Key باید Encryption Key و الگوریتم هش نگاری نیز مشخص باشد.
نمونه ViewState رمزنگاری و کدگزاری شده

مشکلات Deserialize و اکسپلویت آن در ASP.NET

کتابخانه‌های Deserialize وظیفه تبدیل داده JSON ،XML به داده‌های ساختارمند (داده، تابع و کلاس) را دارند.

ViewState با ساختار XML به رشته تبدیل شده و سپس رمزنگاری می‌شود. بعد از ارسال دوباره به سرور، با کلاس LosFormatter از حال XML در آمده و در واقع عمل Deserialize بر روی آن انجام می‌شود.

درحالت معمول داده‌های ذخیره شده در ViewState به صورت رشته یا عدد هستند. ولی امکان قرار دادن توابع اجرایی نیز وجود داد. به عنوان مثال، اگر تابع Process.Start به درستی در ViewState قرار گیرد، در هنگام Deserialize می‌تواند فرآیند جدیدی در سیستم اجرا نمود. فایل زیر به صورت XML همین عملکرد را نشان می‌دهد.

https://gist.github.com/exploitio/5ebce8fd9636408deddc2d9d373bbc04#file-01-deserialized-process-exec-xml

برای راحتی اکسپلویت کردن آسیب پذیری Deserialize، ابزاری تحت عنوان YSOSerial.NET طراحی شده که در ادامه از آن کمک گرفته می‌شود.

آسیب پذیری Exchange Server

در شرح آسیب پذیری CVE-2020-0688 آمده است که بخش Exchange Control Panel (ECP) در MS Exchange Server دارای کلید رمزنگاری Machine Key ثابتی است، در زمان نصب تولید نمی‌شود و در تمامی نسخه‌ها مقدار ثابتی دارد. باید نام کاربری و رمزعبور یک فرد در Exchange را داشته باشیم

برای اکسپلویت این آسیب پذیری چند مرحله ساید باید انجام شود:

  1. کلید رمزنگاری Machine Key را بدست آورد تا بتوان ViewState جدید تولید و امضا کرد.
  2. چون ECP بدون ورود در دسترس نیست با نام کاربری و رمز عبور یک فرد در Exchange Server وارد شد.
  3. مقادیر __VIEWSTATEGENERATOR و ASP.Net_SessionId آن کاربر را از سورس صفحه برداشت.
  4. با ysoserial یک Payload برای قرار دادن در ViewState تولید کرد
  5. با آدرس AA برای اجرای Payload رفت.

اکسپلویت آسیب پذیری

برای بدست آوردن کلید Exchange Server ECP باید از مسیر exchange-path\ClientAccess\ecp\web.config کلید Machine Key را برداشت. لازم به ذکر است که این کلید برای تمامی نسخه‌های Exchange Server یکسان است.

اطلاعات اولیه بدست آمده از فایل:

validationKey=CB2721ABDAF8E9DC516D621D8B8BF13A2C9E8689A25303BF
decryptionKey=E9D2490BD0075B51D1BA5288514514AF
validation=SHA1
decryption=3DES

باید با نام کاربری و رمز عبور یک نفر در Exchange وارد شده و __VIEWSTATEGENERATOR و ASP.Net_SessionId را برداشت.

داده‌های بدست آمده نهایی:

View State Generator = B97B4E27
ASP.Net Session Id = a8fc50ff-761a-4d9b-8247-83333a134f8d

حال که تمامی اطلاعات مورد نیاز فراهم شده، براساس نسخه .net باید Payload را تولید کرد. برای نسخه .net پایین‌تر از ۴٫۵ چون encryption لازم نیست، فقط از کلید ValidationKey استفاده می‌شود (در کدها تمامی متغیرها جاگذاری شده‌اند لذا با دثت استفاده نمایید).

https://gist.github.com/exploitio/5ebce8fd9636408deddc2d9d373bbc04#file-02-lessthan45-bat

ولی اگر در هدف encryption فعال است یا نسخه .net بیشتر از ۴٫۵ است باید از کد زیر جهت تولید Payload استفاده نمود.

https://gist.github.com/exploitio/5ebce8fd9636408deddc2d9d373bbc04#file-05-gt-45-bat

بعد از اینکه Payload تولید و آماده شد، مقدار ViewState در خط فرمان به شکل زیر دیده خواهد شد.

بعد از اجرای این دستور و تولید ViewState نهایی زمان اجرای کد بر روی سیستم است. URL نهایی همانند مورد قبل طبق نسخه .net به دو مدل تولید می‌شود.

برای .net کمتر از ۴٫۵ و موارد بدون encryption از آدرس /ecp/default.aspx?__VIEWSTATEGENERATOR={}&__VIEWSTATE= استفاده خواهد شد. ولی اگر نسخه .net بیشتر از ۴٫۵ باشد یا encryption داشته باشد از آدرس /ecp/default.aspx?__VIEWSTATEENCRYPTED=&__VIEWSTATE= استفاده می‌شود. اگر پارامترها در جای خود قرار داده شود، درنهایت آدرس زیر حاصل می‌شود:

اگر این کد را در مرورگر اجرا کنید، در جواب کد ۵۰۰ حاصل می‌شود ولی در واقعیت اکسپلویت اجرا شده است.

و اجرا شدن calc.exe در سرور هدف:

برای اینکه این اکسپلویت به صورت اتوماتیک انجام شود، را در کنار کد زیر قرار داده و آنرا اجرا کنید.

https://gist.github.com/exploitio/bd794ed3671ccf56c8370f82b4f2d68b#file-cve-2020-0688-py

منابع

https://www.zerodayinitiative.com/blog/2020/2/24/cve-2020-0688-remote-code-execution-on-microsoft-exchange-server-through-fixed-cryptographic-keys
https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/

محقق امنیت مهندسی معکوس برنامه‌نویس

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *