در این بخش از دوره SEC504 از موسسه SANS به آشنایی با Rootkit ها و انواع آن ها خواهیم پرداخت. البته در این بخش به Kernel Mode Rootkits می پردازیم.
Kernel Mode Rootkits
روتکیتهای سطح هسته یا کرنل، نشاندهنده آخرین پیشرفت ابزارهای روتکیت هستند. به دلیل اینکه این دسته از روتکیتها در مد کرنل اجرا میشوند، قدرت بیشتری نسبت به روتکیتهایی که در سطح Process، Program و Application اجرا میشوند، دارند. شناسایی این دسته از روتکیتها بسیار مشکل است، زیرا برنامههای تشخیصی خودشان در سطح Process، Program و Application اجرا میشوند و متکی بر هسته میباشند. یکی از روتکیتهای سطح کرنل، روتکیت Rooty میباشد.
به عنوان مثال برنامهای مانند Tripwire در صورتی که به درستی تنظیم شده باشد میتواند روتکیتهای مبتنی بر کاربر و برنامه های اسب تروا را با باز کردن برنامه و نگاه کردن به آن تشخیص دهد. با این حال به خاطر داشته باشید که برای باز کردن یک فایل برنامه، File System Integrity Checher باید با هسته سیستم در تماس باشد. تمام دسترسی هارددیسک و یا سایر اجزای سخت افزاری سیستم باید از هسته استفاده کنند.
با یک Kernel Mode Rootkits که بر روی سیستم نصب شده است، نفوذگر دیگر مجبور نیست که برنامههای کاربردی را تغییر دهد. هنگامی که هسته تغییر پیدا کرده است تا مدیران را گمراه کرده و به آنهادروغ بگوید (تغییر اطلاعات و خروجی ها)، همه فایلها دست نخورده باقی میماند، در حالی که هسته اصلی میتواند دسترسی یک Backdoor را به نفوذگر داده و حضور وی را مخفی نماید.
توسط انجام عملیات در هسته، یک نفوذگر میتواند در کامپیوتر شما یک جهان دیگری را ایجاد نماید در حالی که به نظر میرسد همه چیز سالم و عالی است. ولی در واقع فراتر از این ظاهر سالم، سیستم شما میتواند توسط برنامههای تروجان در بند کشیده شود.
The Kernel
در اکثر سیستمعاملها، از جمله ویندوز و یونیکس، کرنل در واقع نرم افزار ویژهای است که اجزای بسیار مهمی از ماشین را کنترل میکند. کرنل خود را بین برنامههای در حال اجرا و سخت افزار قرار میدهد. بسیاری از کرنلها از جمله آنهایی که در ویندوز و یونیکس هستند، ویژگیهای اصلی زیر را شامل شده و وظایف زیر را بر عهده دارند:
• کنترل پروسس و Thread
• کنترل ارتباط بین پروسسهایا Inter-Process
• کنترل حافظه یا مموری
• کنترل فایل سیستم
• کنترل سخت افزارهای دیگر
• کنترل وقفه یا Intrupt
همانطور که کرنل در حال اجرا میباشد، به حفاظت سخت افزاری که در سیستم پردازنده طراحی شده است، متکی میباشد. با استفاده از حفاظت سخت افزاری یا Hardware-level Protection، کرنل تلاش میکند تا ساختارهای اطلاعات بحرانی خود را از دستکاریهای تصادفی یا عمدی با پروسسهای سطح کاربر، محفوظ نگه دارد.
اکثر CPUها شامل ویژگیهای سخت افزاری هستند که به نرم افزار اجازه میدهند تا با سطوح دسترسی مختلفی اجرا شود. فضای مربوط به حافظه یا مموری و دیگر اجزایی نرم افزاری با حساسیت بالا و سطح بالا مانند کرنل، نمیتوانند توسط کدهای اجرا شده در سطوح پایینتر مانند پروسسهای کاربر، قابل دسترسی باشند. در CPUهای سازگار با معماری x86، این سطوح حساسیت مختلف با نام Ring شناخته میشوند. این Ringها از صفر تا سه شماره گذاری میشوند که Ring0 شامل بخش حساسیت سطح بالا و Ring3 شامل بخش با حساسیت سطح پایین میباشد.
در سیستمعاملهای ویندوز و لینوکس، تنها از Ring0 و Ring3 استفاده میشود، در حالی که Ring1 و Ring2 هم توسط CPU های x86 پشتیبانی میشوند ولی در این سیستمعاملها از آنها استفاده نمیشود. خود کرنل هم در ویندوز و هم در لینوکس بر روی Ring0 اجرا میشود.
آشنایی با روت کیت های سطح کاربر
پروسسهای مربوط به مد کاربر بر روی Ring3 اجرا میشوند و در اکثر شرایط قادر به دسترسی مستقیم به فضای کرنل نمیباشند. پروسسهای مربوط به مد کاربر، برای برقراری ارتباط با هسته، متکی به یک مفهومیبه نام System Call میباشند. این System Callها شامل توابعی برای اجرا کردن یک برنامه یا باز کردن یک فایل میباشند. در حال حاضر بیشتر پروسسهای مربوط به مد کاربر، System Callها را به صورت مستقیم فعال نمیکنند. در عوض سیستمعامل شامل یک کتابخانه سیستمی میباشد که دارای کدهای زیادی است که در صورت نیاز، System Call را فراخوانی میکنند. بنابراین پروسس مربوط به مد کاربر که در حال اجرا میباشد، یک کتابخانه سیستمی را برای انجام اقدامات خود فراخوانی خواهد کرد.
کتابخانه سیستمی، به نوبه خود، یک System Call را در کرنل فعال میکند. برای فعال نمودن یک System Call، کتابخانه سیستمی، یک وقفه یا Intrupt را به CPU ارسال میکند و میگوید که نیاز دارد تا Ring0 تغییر کند و با استفاده از کد مربوط به مد کرنل، یک System Call برقرار شود.
مورد دیگر، System Call Table میباشد که در واقع یک آرایه نگه داشته شده توسط کرنل است. این جدول نام و شماره مربوط به System Call داخل کد مربوط به داخل کرنل مورد نیاز برای رسیدگی به هر System Call را اصطلاحا Map مینماید. System Call Table فقط مجموعهای از اشارهگرها به تکههای مختلف کرنل است که System Callها را پیاده سازی میکنند.
تصویر زیر موارد مطرح شده را نمایش میدهد.
Kernel Mode Rootkits
روتکیتهای سطح کرنل همچنان توجه مهاجمان را به خود جلب میکند. زیرا این روتکیتها به مهاجمان اجازه میدهند تا به طور کامل به سیستم دسترسی داشته و آن را تحت تاثیر قرار دهند. آنها نیاز به دسترسی Root برای نصب دارند. با این حال هنگامیکه آنها در سیستم هستند، به نفوذگر اجازه میدهند تا فعالیت های خود را پنهان نماید. یک روتکیت سطح کرنل به نفوذگر اجازه میدهد تا:
• پروسسها را مخفی نماید، بنابراین Backdoorها در یک لیست پروسس نمایش داده نمیشود.
• مخفی کردن فایلها، بنابراین نرم افزارهای مخرب مهاجم که در سیستم وجود دارند، در سیستم فایل نمایش داده نمیشوند.
• مخفی نمودن استفاده از شبکه، در این حال پورتهای استفاده شده توسط Backdoor مهاجم که شامل پورتهای TCP و UDP میشوند، نمایش داده نمیشود. همچنین مد بی قاعده یا Promiscuous Mode نیز در این حالت مخفی میشود.
• اجرای تغییر مسیر یا Execute Redirection، هنگامیکه کاربر یک برنامه را اجرا میکند کرنل یک برنامه مخرب را جایگزین آن خواهند کرد.
Altering the Kernel
برای پیاده سازی یک روتکیت سطح کرنل، مهاجم با دو روش این کار را انجام میدهد که در شکل در بخش A و B نشان داده شده است.
مهاجم Malware را داخل کرنل وارد میکند و با استفاده از روشهایی که در ادامه خدمتتان توضیح خواهیم داد، فاصله بین Ring0 و Ring3 را میپیماید. پس از وارد شدن، Kernel Mode Rootkits مربوط به مهاجم که به عنوان عنصر A در شکل نشان داده شده است، شامل کدی است که کاملا مشابه با کد اصلی System Call داخل کرنل عمل میکند. در مثال ما نفوذگر کد کرنلی را ایجاد کرده است که System Call با نام SYS_execve را پیاده سازی میکند که برای اجرای برنامهها استفاده میشود.
هنگامیکه SYS_execve System Call مخرب فراخوانی شد، بررسی میکند تا متوجه شود کدام برنامه خواسته شده تا اجرا شود. اگر درخواست اجرا برای یک برنامهای است که نفوذگر سیستم را برای تغییر مسیر آن پیکربندی کرده است، ماژول کرنل بد یا Evil Kernel Module یک برنامه متفاوت را اجرا میکند. در غیر این صورت اگر درخواست اجرا برای برنامه دیگری باشد که نفوذگر علاقمند به تغییر مسیر آن نبوده است، برنامه معمولی یا Normal اجرا خواهد شد. در واقع SYS_execve System Call دارای هوشمندی خاصی است که میتواند تصمیم بگیرد چه چیزی را به صورت کامل و درست اجرا کند و چه زمانی عملیات تغییر مسیر را انجام دهد.
اینها همه خیلی خوب هستند ولی چگونه SYS_execve مخرب مربوط به نفوذگر در وهله اول اجرا میشود؟
این جا زمانی است که عنصر B موجود در تصویر وارد بازی میشود. کد کرنل مربوط به مهاجم، System Call Table را دچار تغییر میکند و به این ترتیب آن دیگر به SYS_execve Call در کرنل اشاره نخواهد کرد. در عوض ورودی داخل System Call Table مرتبط با SYS_execve، اکنون به کد اصلی مهاجم اشاره خواهد کرد.
به جای پیاده سازی تمامی توابع از ابتدا، نفوذگر تنها میتواند SYS_execve System Call Code را با کدهای متعلق به خود بپوشاند (Wrap) که شامل هوشمندی خاصی برای تعیین اینکه آیا درخواست اجرا باید SYS_execve اصلی اجرا شده یا باید برنامه دیگر به جای آن فراخوانی شود. توجه داشته باشید که با استفاده از هر دو مدل دستکاری (ایجاد کد System Call جدید و یا پوشانیدن یا Wrapping یک System Call موجود) نتیجه نهایی یکسان است و در نهایت SYS_execve Call درون کرنل شامل تغییر مسیر اجرایی یا Execution Redirection خواهد شد.