در فرآیند تیم قرمز، ممکنه با شرایطی مواجه بشیم که نیاز باشه تا محصولات امنیتی رو برای عدم شناسایی فعالیتهامون، خاموش یا از کار بندازیم.
یکی از تکنیکهایی که برای این منظور استفاده میشه، تکنیک BYOVD هستش که در اون هکرها یک درایور کرنلی آسیب پذیر رو به تارگت انتقال میدن و با توجه به اینکه این درایور در حالت کرنل اجرا میشه، از طریق اون، افزایش امتیاز میدن تا با این امتیاز بتونن محصولات امنیتی رو از کار بندازن.
این تکنیک مشکلاتی داره از جمله اینکه باید به طریقی این درایور رو به سیستم هدف انتقال و نصبش کنیم. همچنین با توجه به اینکه مکانیسم سوء استفاده از این درایورها در سطح کرنل انجام میشه، بنابراین ممکنه منجر به کرش سیستم و لو رفتن عملیات بشه.
محقق امنیتی TwoSevenOneThree از Zero Salarium، متد و ابزار جدیدی با عنوان EDR-Freeze معرفی کرده که در سطح کاربر و بدون نیاز به ابزار جانبی دیگه و با استفاده از سیستم گزارش خطای مایکروسافت (Windows Error Reporting — WER)، امکان دور زدن محصولات امنیتی رو فراهم میکنه. خوبی این روش اینه که نیاز به انتقال داریور نیست و همچنین از مولفه های قانونی و پیش فرض ویندوز استفاده میکنه. در این پست نگاهی به این متد انداختیم.
مفاهیم پایه:
- تابع MiniDumpWriteDump: در کتابخونه ی DbgHelp هستش و برای ایجاد minidump از حافظه و وضعیت پروسس طراحی شده. نکته ای که وجود داره، این تابع برای گرفتن minidump، همه ی Threadهای پروسس رو ساسپند میکنه، چون در غیر اینصورت ممکنه در حین گرفتن دامپ، Threadها، حافظه رو تغییر بدن و باعث خرابی یا ناسازگاری بشن. مایکروسافت توصیه میکنه این تابع رو از یک پروسس خارجی فراخوانی کنید و نه از داخل پروسس کرش کرده، چون این کار میتونه جلوی deadlock رو بگیره.
- minidump: در واقع یک اسنپ شات از حافظه، Threadها و وضعیت پروسس هستش. برخلاف full dump که کل حافظه پروسس رو ذخیره میکنه، minidump فایل کوچکتر و سبکتری هستش و فقط اطلاعات ضروری برای دیباگ کردن مانند پشته Threadها، وضعیت رجیسترها، لیست ماژولها و … رو داره.
- مولفه ی WerFaultSecure : یکی از مولفه های WER هستش و با امتیاز Protected Process Light (PPL) اجرا میشه و برای گرفتن کرش دامپ از پروسس های حساس سیستمی به منظور دیباگ و تشخص مشکلات، طراحی شده.
- Protected Process Light (PPL): یک مکانیزم امنیتی در ویندوز هستش که برای حفاظت از پروسس های حیاتی سیستم و برنامه های امنیتی طراحی شده.
- Windows Trusted Computing Base(WinTCB) : به یک سطح امتیاز (Privilege Level) در ویندوز اشاره داره که برای پروسس ها و سرویسهای کاملاً اعتمادپذیر و حیاتی سیستم تعریف میشه. پروسس یا سرویسی که WinTCB داره، تقریباً میتونه هر کاری در سیستم انجام بده، از جمله دسترسی به حافظه ی پروسس های دیگه، تغییر تنظیمات امنیتی یا دسترسی به توکن های امنیتی. سطح WinTCB یکی از بالاترین سطوح حفاظتی در سلسله مراتب PPL هستش.
سوء استفاده از MiniDumpWriteDump برای فریز کردن پروسس ها:
با توجه به اینکه تابع MiniDumpWriteDump همه Threadهای یک پروسس رو متوقف میکنه، اگه بتونیم این تابع رو روی یک پروسس خاص اجرا کنیم، میتونیم اون پروسس رو در حالت ساسپند قرار بدیم.
اما برای این کار دو مشکل اصلی وجود داره:
- اجرای تابع MiniDumpWriteDump بسیار سریع انجام میشه و ممکنه کسی حتی متوجه توقف موقت پروسس هدف نشه.
- پروسس هایی که میخوایم فریز کنیم اغلب مربوط به EDRها و آنتیویروسها هستن. این پروسس ها معمولاً با PPL محافظت میشن. ما باید از این موارد عبور کنیم تا بتونیم با اونا تعامل کنیم.
خب، اول مشکل سادهتر رو حل کنیم. محقق قبلا ابزاری با عنوان WSASS توسعه داده که برای دامپ گرفتن از پروسس LSASS استفاده میشه. در حین توسعه ی این ابزار اطلاعاتی درباره WerFaultSecure.exe بدست آورده:
- WerFaultSecure میتونه با امتیازات PPL در سطح WinTCB اجرا بشه.
- با استفاده از پارامترهای اجرای WerFaultSecure، میشه این برنامه رو طوری اجرا کنیم که تابع MiniDumpWriteDump رو، روی هر پروسس دلخواه فعال کنیم.
با ترکیب این موضوع با CreateProcessAsPPL (ابزاری برای اجرای برنامه با قابلیت PPL)، میتونیم از WerFaultSecure برای حل مشکل دوم استفاده کنیم.
برای حل مشکل اول، اگه یک پروسس عادی بتونه یک پروسس جدید رو با امتیازات PPL اجرا کنه، در زمان CreateProcess میشه پروسس PPL رو با فلگ CREATE_SUSPENDED در حالت ساسپند قرار داد.
اگه بتونیم یک پروسس فرزند جدید بسازیم و اونو در حالت ساسپند قرار بدیم، پس به احتمال زیاد میتونیم با تابع OpenProcess و دسترسی PROCESS_SUSPEND_RESUME دوباره اونو اجرا (resume) کنیم.
و اگه بتونیم تابع OpenProcess رو با دسترسی PROCESS_SUSPEND_RESUME روی پروسس های PPL فراخوانی کنیم، در نتیجه میتونیم اون پروسس رو هم ساسپند کنیم.
برای تست این قضیه میتونیم از Process Explorer استفاده کنیم. برای این منظور کافیه روی نام پروسس راست کلیک کنیم و از منوی ظاهر شده، گزینه Suspend رو انتخاب کنیم.

همونطور که در تصویر بالا مشاهده میکنید، Process Explorer میتونه یک پروسس محافظت شده با PPL رو ساسپند کنه.
با این حال، اگه این کار رو روی پروسس هایی که با برچسب Antimalware مشخص شدن انجام بدیم، Process Explorer قادر به ساسپند کردن این پروسس ها نیست. برای مشاهده این ستون در Process Explorer، در قسمت عنوان ستونها راست کلیک کرده و گزینه ی Select Columns رو انتخاب کنید. در پنجره باز شده، در تب Process Image تیک گزینه ی Protection رو بزنید.
با توجه به تمام اطلاعاتی که تا اینجا داریم، اگه بتونیم WerFaultSecure رو وادار کنیم که فرایند دامپ رو انجام بده و بعدش MiniDumpWriteDump رو روی پروسس های آنتی ویروس فراخوانی کنه، و درست در لحظهای که پروسس هدف در حالت ساسپند قرار گرفته، خود WerFaultSecure رو ساسپند کنیم، بنابراین پروسس هدف برای همیشه ساسپند باقی میمونه. چون پروسسی که قرار بود اونو دوباره فعال کنه، خودش هم ساسپند شده. در حقیقت اینجا ما یک حمله از نوع Race Condition انجام دادیم.
مراحل اجرا به شکل زیر:
- استفاده از CreateProcessAsPPL برای اجرای WerFaultSecure با سطح حفاظت WinTCB.
- وارد کردن پارامترهای مناسب برای WerFaultSecure تا عمل دامپ روی پروسس موردنظر انجام بشه.
- بلافاصله پس از اجرای WerFaultSecure، وضعیت پروسس هدف رو بطور پیوسته بررسی کنیم تا زمانیکه به حالت ساسپند بره.
- در همون لحظه، با استفاده از OpenProcess و دسترسی PROCESS_SUSPEND_RESUME، و سپس فراخوانی تابع NtSuspendProcess، پروسس WerFaultSecure رو ساسپند کنیم.
پس از اجرای موفق این مراحل، ما میتونیم پروسس آنتی ویروس رو با موفقیت به حالت ساسپند ببریم.
ابزار EDR-Freeze:
محقق برای پیاده سازی این حمله، ابزاری با عنوان EDR-Freeze منتشر کرده. این ابزار دو تا پارامتر میگیره، یکی PID پروسس هدف و دیگری مدت زمان توقف پروسس.

برای تست ابزار، محقق تونسته با موفقیت به مدت 5000 میلی ثانیه، پروسس MsMpEng.exe (موتور Windows Defender) رو روی ویندوز 11 نسخه 24H2 متوقف کنه.

دفاع در برابر این حمله:
میتونیم با مانیتور کردن اینکه آیا WER به شناسه یک پروسس حساس مانند LSASS یا ابزارهای امنیتی اشاره میکنه، از این حمله دفاع کنیم. برای این منظور، محقق امنیتی Steven Lim یک کوئری KQL توسعه داده که میتونه این کار انجام بده.
با توجه به اینکه در این حمله از رفتار مورد انتظار MiniDumpWriteDump و WerFaultSecure سوء استفاده میشه، بنابراین این حمله بیشتر بعنوان یک ضعف طراحی هستش تا یک آسیب پذیری. اما مایکروسافت میتونه اقداماتی برای سخت تر شدن این فرایند انجام بده.
منابع:

