چگونه با یک باینری امضاشدهی مایکروسافت از AMSI، ETW و CLM عبور میکنند
مقدمه
در چند سال اخیر، ابزارهای امنیتی ویندوز مثل ضدبدافزار و EDRها اتکا زیادی به AMSI (رابط اسکن ضدبدافزاری) پیدا کردهاند. این قابلیت تقریباً هر اسکریپت Powershell، Jscript، VBScript، VBA یا .NET رو زمان اجرا میگیره و به آنتیویروس ارسال میکنه تا بررسی بشه
حالا، یه روش جالب پیدا شده که با استفاده از یک ابزار امضا شده توسط مایکروسافت – یعنی CDB یا NTSD – بدون نیاز به نوشتن کد مخرب یا پچ کردن مستقیم DLL، نه فقط AMSI رو دور میزنه، بلکه قابلیت کنترل زبان (CLM) و ETW هم دورش زدنیه. گام اول: فهمیدن ایراد AMSI
تو دنیای امنیت، رایجترین بایپسها روی تابع AmsiScanBuffer انجام میشد؛ اغلب توجه به مقدار بازگشتی داشتند. اگر تابع همیشه 0x80070057 (مقدار E_INVALIDARG) برگردونه، اسکن انجامنشده بهحساب میاد
قبلاً میتونستیم این مقدار رو با چند خط PowerShell یا پچ ساده دستی اعمال کنیم، ولی حالا EDRها نسبت بهش حساس شدن و اون روشها دیگه اثربخش نیستند. گام دوم: رسیدگی با CDB/NTSD
اینجا وارد بازی میشیم: CDB و NTSD ابزارهای دیباگر کنسولی مایکروسافت هستن که توسط خود مایکروسافت امضا و بهصورت پیشفرض امن و معتبرند
ما میتونیم با نوشتن اسکریپت خاص، PowerShell رو با CDB اجرا کنیم، breakpoint بذاریم روی AmsiScanBuffer، وقتی اجرا شد مقدار برگردونده رو دستکاری کنیم و ادامه بدیم—بدون دست زدن مستقیم به DLL مغشوش.
اسکریپت bypass.txt اجرای PowerShell رو نظارت میکنه، موقعی که تابع AMSI فراخوانی شد سریع مقدار بازگشتی رو تغییر میده و ادامه اجرا رو بدون اسکن امن میکنه
گام سوم: کنترل محدودیت زبان (CLM)
حالا که AMSIبا روش CDB قابل دورزدن بود، سراغ بخشی جذابتر میریم: کنترل کردن زبان PowerShell. تابع SystemPolicy.GetSystemLockdownPolicyمسئول وضعیت محدودیت زبانه. با استفاده از ویژگیهای دیباگر CDB و بارگذاری sos.dll، میتونیم breakpoint بذاریم روی این تابع و بهصورت مستقیم مقدار بازگشتی رو تغییر بدیم — و مثلاً مقدار 0 (بدون محدودیت) یا 2 (ConstrainedLanguage) رو برگردونیم
این کار تو محیط x86/x64 امتحان شده و واقعا جواب داده: امکان تغییر وضعیت زبان PowerShell پیش از اینکه حتی ماژولها بارگذاری بشن فراهم میشه
گام چهارم: خاموشکردن ETW
نکته جالب دیگه اینه که با پچ مشابه میشه ETW (Event Tracing for Windows) رو هم دور زد، بدون اینکه در سطح هسته تغییر محسوسی بدیم . آزمون شده که رویدادهایی مثل EventID 4103 (اجرای pipeline) ثبت نمیشن—یعنی بار کاملاً پنهانکارانهای اجرا شده
نتیجهگیری
این روش ابزار خیلی قدرتمندی به ما میده:
دور زدن AMSI
تنظیم وضعیت محدودیت زبان (CLM)
خاموش کردن یا محدود کردن ETW
و مهمتر اینکه همه با استفاده از ابزارهای امضاشده مایکروسافت انجام میگیره—بدون نیاز به فایلهای DLL غیرمعتبر یا باینریهای ناشناس.