جدول محتوا
- بررسی Trusted Installer
- بررسی Protected Processها
- بررسی تکنیک DLL Side Loading
- از کار انداختن سرویس آنتیویروس
- جلوگیری از Load شدن درایور آنتیویروس
- تثبیت دسترسی
بررسی Trusted Installer
قبل از شروع مبحث، با هم ببنیم Trusted Installer چیه؟ از ویندوز 7 به بعد، شرکت مایکروسافت یه built-in user account به نام Trusted Installer به سیستمعامل ویندوز اضافه کرد. این اکانت قابلیت اینو داره که توی خیلی از سرویسها و فایلهای خود سیستمعامل، تغییر ایجاد کنه. در واقع شرکت مایکروسافت این اکانت رو درست کرد تا کسی غیر از خودش نتونه به بخشهای مهم سیستمعامل دسترسی داشته باشه. یکی از استفادههای مهمش هم توی پروسهی بهروزرسانی سیستمعامل هست. مثلا وقتی که برای فایل kernel32.dll بهروزرسانی میاد و میخواد یه بخشیشو تغییر بده فقط این کاربره که دسترسی جایگزین کردن فایل جدید با فایل قدیمی رو داره. هیچکس نمیتونه کارهایی مثل rename یا Delete رو با این فایلها انجام بده.


بررسی Protected Processها
خب حالا که فهمیدیم Trusted Installer چیه و چطوری کار میکنه، لازمه که یه مرور کلی هم روی شیوهی عملکرد Protected Processها داشته باشیم. این پروسسها از ویندوز ویستا به بعد به وجود اومدن. ایده شکل گیریشون هم به این صورت بود که اون زمان هیچ مکانیزمی برای جلوگیری از کپی شدن اطلاعات CD/DVDها وجود نداشت. حتی وقتی میومدن دیتای روی CD رو Encrypt میکردن، باز موقع پخش مجبور بودن دیتای Decrypt شده رو به پروسسی که صدا و تصویر رو توی ویندوز هندل میکرد ارسال کنن. همین جا هم بود که افراد سودجو با خوندن فضای حافظهی کارت صدا یا پخش کنندهی تصویر، اطلاعات رو سرقت میکردند و دوباره روز از نو، روزی از نو. تا اینکه صدای خیلی از شرکتها به اعتراض بلند شد و از مایکروسافت خواستند که یه فکری برای این داستان بکنه و اینجا بود که ایدهی Protected Processها شکل گرفت. به این معنی که وقتی پروسسی به صورت Protected اجرا میشد هیچ Non-Protectedای نمیتونست از اون پروسس هندل قوی بگیره، اون رو ببنده یا حتی داخلش کد Inject کنه. حتی DLLهایی که Sign مایکروسافت نبودند هم نمیتونستند توی این پروسسها اجرا شن. اما اینجا این قابلیت فقط دست مایکروسافت بود و به هیچ شرکت Third-Partyای این امکان رو نداده بود که بتونه از این قابلیت استفاده کنه. تا اینکه ویندوز 8.1 رو عرضه و تو این سیستمعامل قابلیت مذکور رو برای شرکتهای آنتیویروس فراهم کرد. این شرکتها باید درخواست خودشونو ثبت میکردن و اگه مایکروسافت تایید میکرد یک Sign در اختیار اونها قرار میداد که به وسیله اون میتونستن سرویس خودشون رو به صورت Protected اجرا کنن. دیگه اینجا نمیشد دستکاریای روی این سرویسها انجام داد یا اختلالی توی کارشون به وجود آورد. فقط یه هندل بسیار ضعیف میشد از این پروسسها گرفت که اطلاعات محدودی مثل اسم فایل رو برمیگردوند و در نتیجه این هندلها هم بسیار ناکارآمد بودن. حالا اگه یادتون باشه گفتیم سرویس Trusted Installer که یه سرویس خیلی مهم توی ویندوز هست به صورت Protected بالا نمیاد. پس میتونیم ازش هندل بگیریم و هرکاری که میخوایم رو انجام بدیم.بررسی تکنیک DLL Side Loading
یکی از تکنیکهای مورد علاقه بسیاری از APTهای دنیاست و توی گزارشاتی که هر روز منتشر میشه، میبینیم که از طرق مختلف و همچنین توی فازهای مختلف اومدن از این روش استفاده کردن. حالا این روش چطوری کار میکنه؟ ویندوز یه سری قواعد برای بارگذاری DLL توی برنامه داره که در این لینک میتونید جزییاتشو بخونید:https://docs.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-search-order
نکتهی مهمش اینه که غیر از Known-DLLها، برای اجرای بقیه ماژولهای سیستمی، اولین جایی که سیستم جستجو میکنه، فولدر جاری خودش هست. اینجا نفوذگرها میان یه DLL همنام مثلا Advapi32.dll رو میزارن توی فولدر یه برنامهی شناخته شده مثل Word و در نتیجه سیستم هم اونو اجرا میکنه. حالا اینجا برای جلوگیری از کرش کردن برنامه، نفوذگرها میان تابعهایی که توی DLL اصلی هست رو برمیدارن و توی دل DLL خودشون وارد میکنن. به این صورت هم DLL نفوذگر اجرا میشه، هم DLL اصلی. مزیت این روش هم اینه که DLL مورد نظر شما رو یه برنامه با Sign مایکروسافت اجرا میکنه و به همین دلیل Payload ما از چشم آنتیویروسها و EDRها مخفی میشه. چون پیادهسازیهای زیادی ازش توی اینترنت هست دیگه به جزییات بیشتر دربارهی این موضوع نمیپردازیم و میریم سراغ مبحث بعدی.از کار انداختن سرویس آنتیویروس
خب حالا که فهمیدیم Trusted Installer چیه و چطوری کار میکنه، قصد داریم تا با سو استفاده از اون، بیایم سرویس آنتیویروس رو از کار بندازیم. شاید براتون سوال باشه که با وجود درایورهای آنتیویروسها، از کار انداختن سرویسشون به تنهایی چه مزیتی داره؟ اینجا باید یه نکته مهم رو یادآور بشم که توی بسیاری از EDRها و آنتیویروسها، کرنل فقط اطلاعات رو جمع آوری میکنه و تصمیمگیر اصلی سرویس سمت User-mode هست. پس یعنی اگه ما بیایم و اونو از کار بندازیم، دیگه هیچ کسی نیست که تصمیم بگیره و حتی فایلی مثل mimikatz رو بدون هیچ مشکلی میتونیم اجرا کنیم. اما شیوهی انجام اینکار به چه شکل هست؟ ما باید بتونیم توکن Trusted Installer رو بدست بیاریم و بعد اونو روی Thread جاری خودمون بزاریم و بعدش دستورات مورد نظر خودمونو اجرا کنیم! اول از همه ما باید با تابع OpenProcess یک Handle از TrustedInstaller بگیریم.


جلوگیری از Load شدن درایور آنتیویروس
یه مشکلی که تو روش قبلی وجود داشت این بود که با ریست شدن سیستم، آنتیویروس دوباره شروع به فعالیت خواهد کرد. حالا میخوایم با توجه به دسترسی که داریم، کاری کنیم که دیگه درایور آنتیویروس اجرا نشه. اگه یادتون باشه گفتیم که دسترسی Trusted Installer میتونه فایلهای سیستمعامل رو دستکاری کنه. خب اینجا فقط کافیه ما بیایم فایل درایور Windows Defender رو Rename کنیم. برای اینکار باید اول سرویسی که این درایور رو Load میکنه پیدا کنیم.

تثبیت دسترسی
خب حالا که ما قابلیت تغییر توی فایلهای موجود در فولدر SYSTEM32 رو داریم، میخوایم بیایم تغییری به وجود بیاریم که Payload ما همیشه در هر بار ریست اجرا شه و ما تحت Explorer بیایم بالا. البته اینجا محدود نیستیم به اینکه بخوایم فقط تحت Explorer بیایم بالا ولی باید به یک نکتهی مهم دقت کنیم که ما DLLهایی رو میتونیم دستکاری کنیم که Sign مایکروسافت نداشته باشند. چون در اینصورت برنامههای Protected نمیتونن اجرا بشن و عملکرد سیستم با مشکل مواجه میشه. من تو اینجا DLLهای Load شده توی Explorer رو بررسی کردم و یکی از اونهارو پیدا کردم که Sign هم نداره. کاری که انجام میدیم اینه که فایل اصلی رو Rename میکنیم، فایل خودمونو به جای فایل اصلی میزاریم و در نهایت Exportهای DLLای که تغییرش دادیم(DLL اصلی( رو روی DLL خودمون ایجاد و روی DLL اصلی Proxy میکنیم. اینجا من AtlThunk رو تغییر دادم.

