مقدمه
روشی که در این مقاله شرح داده شده است، در رسانههای امنیتی آنچنان که باید مورد توجه متخصصین قرار نگرفته اما در واقع یکی از روشهای مورد استفادهی تیمهای APT است و در نوع خود میتواند بسیار خطرناک باشد. به خصوص که این روش هنوز توسط آنتی ویروسها به عنوان یک فعالیت مخرب شناسایی نمیشود. در این مقاله سعی بر این است تا جای ممکن، سادگی در بیان مطلب رعایت شود لذا ابتدا به توضیح برخی مفاهیم پرداخته سپس در انتها شیوهی اجرای این روش و راهکار شناسایی و مقابله با آن در ویدیو شرح داده شده است.
Persistent به چه معناست؟
در زمینهی امنیت سایبری Persist به این معناست که مهاجم بعد از گرفتن دسترسی اولیه به سرور یا سامانهی کاربر، در راستای محافظت از دسترسی خود اقدام به پیادهسازی فرآیندهایی میکند که این امکان را به او بدهد تا هر زمان که لازم باشد، بتواند به سرور یا سامانهی کاربر قربانی بازگردد. تکنیکهای بسیاری در زمینهی Persistent به صورت Public و Private (که به آنها 0Day نیز گفته می شود) وجود دارد. بهطور خلاصه Persist یعنی نگهداری از دسترسی جهت سو استفاده در زمانهای مختلف.
Windows Context-Menu چیست ؟
Context-Menu یا منوی زمینه ، بخشی از رابط کاربری ویندوز است که اغلب با «کلیک راست» موس در قالب یک منو مشابه شکل زیر برای کاربر نمایش داده میشود.
روشی که در این مقاله یاد شرح داده شده، عبارت است از اینکه چطور میتوانیم روی این Context-Menu یک فرآیند Persist پیاده سازی کنیم. شاید کمی متعجب شده باشید اما در ادامه خواهید دید که چگونه این روش توسط مهاجمان استفاده میشود.
سیستمعامل ویندوز به نرمافزارهای مختلف این امکان را میدهد تا بتوانند یک Handler (به عبارت سادهتر یک گزینه) به Context-menu جهت تعامل راحتتر کاربران خود، اضافه کنند. برای مثال اگر به عکس بالا توجه کنید متوجه میشوید که با نصب شدن نرم افزار 7-zip یک گزینه به منوی راست کلیک ویندوز اضافه شده است.
DLL Proxy چیست؟
نوعی DLL Hijacking است که در آن رفتار یک نرمافزار را بدون اختلال در عملکرد آن کنترل میکنیم. به این صورت که ابتدا یکی از DLL نرم افزار آسیبپذیر را بررسی کرده سپس DLL دیگری با همان نام میسازیم بهگونهای که تمام توابع مورد نیاز نرمافزار مورد نظر را با استفاده از Forwarder به DLL اصلی منتقل کند. این کار با هدف ایجاد قابلیت Intercept فراخوانهای نرمافزار انجام میشود. یعنی DLL را طوری میسازیم که در عین برآورده کردن نیازهای نرمافزار، کد مخرب ما را نیز اجرا کند. به DLL مربوطه که با این روش ساخته شود، DLL Wrapper نیز گفته میشود. این فرآیند به صورت ساده در شکل زیر نمایش داده شده است.
به طور کلی فایلهای DLL دارای جدولی از Functionها یا توابع هستند، این جدول Export Table نامیده میشود. در این جدول آدرس تمام توابع قرار دارد که در اصل ورودیهای فایل DLL هستند. حال زمانی که نرمافزار یکی از این توابع را فراخوانی کند،این جدول (Export Table) به آدرس تابع مورد نظر اشاره خواهد کرد.
نکته ی مهمی که در اینجا وجود دارد این است که این جدول میتواند شامل Forwarderها هم باشد یعنی به جای اشاره به آدرس توابع، به یک رشته اشاره میکند که تابع مورد نظر آنجا قرار دارد. در واقع اصل کار ما هم همین نکته است ، یعنی یک DLL باید بسازیم تا هر تابعی که نرم افزار درخواست کرد، آن را Forward کند به DLL اصلی تا بتوانیم روند اجرای توابع را کنترل کنیم. توجه داشته باشید که DLL اصلی نرمافزار همچنان کار خودش را انجام میدهد اما در واقع این DLL ماست (و نه خود نرم افزار) که درخواستها را دریافت و به آن ارسال میکند. در حالت کلی از Forwarder ها جهت حرکت بین DLLها استفاده میشود و ما هم از همین قابلیت استفاده میکنیم تا بتوانیم کد مخرب مورد نظر را هم در این بین اجرا نماییم. برای درک بهتر این فرآیند به شکل زیر توجه کنید.
حال که با این مفاهیم آشنا شدیم به موضوع اصلی میپردازیم. همانطور که احتمالا میدانید زمانیکه ویندوز Boot میشود همواره یک سری از فایلهای مورد نیاز خود را اجرا میکند، مانند Explorer.exe که رابط کاربری سیستمعامل را مدیریت میکند. Explorer.exe از نظر ویندوز یک برنامهی کاملا قابل اعتماد است. Context-Menu نیز یکی از Objectهای Explorer.exe میباشد. هرHandler که در Context-Menu باشد چه استفاده شود و چه استفاده نشود، در اولین درخواست Context-Menu (یعنی زمانی که اولین راست کلیک انجام شود) DLLهای مربوط به خود را اجرا میکند. بدین معنی که به عنوان مثال اگر نرم افزاری مانند 7-zip یا Notepad++ روی ویندوز نصب شده باشند بعد از بوت شدن ویندوز، DLL مربوط به آنها در اولین راست کلیک (چه مورد استفاده قرار بگیرند یا خیر) اجرا خواهد شد.
همانطور که در شکل بالا مشاهده میکنید آدرس آن DLL هایی که در زمان راست کلیک توسط Context-Menu اجرا میشوند به دست آمده است که ما با این DLLها کار خود را شروع کنیم. وقتی با این روش، عملیات Persist را پیادهسازی کنیم چون همهی این DLLها به عنوان زیر مجموعهای از Explorer.exe اجرا میشوند لذا نمیتوانیم آنها را Kill یا End Task کنیم مگر اینکه Threadهای آنها را ببندیم و یا بهطور کلی Explorer.exe را Kill کنیم که در این صورت User Interface ویندوز را از دست میدهیم. حال متوجه شدید که این روش چقدر میتواند به سود مهاجمان باشد. از آنجاییکه Explorer.exe در هر بار راهاندازی ویندوز اجرا شده و هر کاربر نیز به احتمال بسیار زیاد حداقل یکبار در ویندوز راست کلیک میکند بنابراین DLL مخرب مهاجم اجرا میشود و مهاجم ضمن حفظ دسترسی خود به اطلاعات شما نیز همواره دسترسی خواهد داشت.
در ادامه، اجرای عملی این روش به همراه روشهای مقابله و شناسایی آن در ویدیوی زیر نمایش داده شده است. همچنین در صورت نیاز، اسکریپتها و کدهای مورد استفاده در این ویدیو را میتوانید از آدرس زیر دریافت کنید:
https://github.com/ravinacademy/DllFunctionProxy
نویسنده: