چگونه با یک باینری امضا‌شده‌ی مایکروسافت از 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 مغشوش.

مثلاً اسکریپتی می‌نویسیم که به‌صورت زیر اجرا بشه:

cdb -cf bypass.txt "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"

اسکریپت 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 غیرمعتبر یا باینری‌های ناشناس.



#آکادمی_روزبه
مرکز تخصصی CISSP

Comments

Be the first to add a comment