در این بخش از دوره SEC504 از موسسه SANS به آشنایی با Rootkit ها و انواع آن ها خواهیم پرداخت. البته در این بخش به User Mode Rootkit می پردازیم.
User Mode Rootkit
بر خلاف آنچه که از نام آن پیداست، روتکیتها اجازه نمیدهند که یک مهاجم دسترسی روت پیدا نماید. روتکیتها اجازه میدهند که مهاجم یک Backdoor را بر روی سیستم قربانی قرار دهند تا کنترل آن را از راه دور داشته باشند. برخی از روتکیتها شامل قابلیتی برای جمع آوری اطلاعات از شبکه داخلی از طریق sniffing میباشند.
اگر چه نام روتکیتها، این تصور را تداعی میکند که این ابزارها تنها در لینوکس کاربرد دارند، ولی روتکیتهای مختص سیستمعامل ویندوز نیز منتشرشده است.
یکی از زمینه های مهم در ابزارهای روتکیت، مخفی سازی حضور نفوذگر در سیستم میباشد. روتکیتها باید فرآیند ورود، برنامه ها، فایلها و پروسسهای خود را از دید مدیر سیستم (administrator) مخفی نمایند. برای رسیدن به این هدف، به جای اضافه نمودن یک برنامه مانند کاری که در Application Level Trojan صورت میگیرد، میبایست در سیستمعامل قربانی تغییراتی را ایجاد نمود.
User Mode Rootkits
روتکیتها ابتدا بر روی سیستمهای SunOS متمرکز شده بودند ولی در حال حاضر روتکیتها برای انواع سیستمعاملها منتشر میشوند. امروزه متناسب با نوع سیستمعامل، روتکیتهای مختص به آن نیز ایجاد میشوند. به عنوان مثال Linux RootKit 4 برای سیستمعامل های مبتنی بر لینوکس منتشر شده است که به اختصار آن را LRK4 مینامند و البته نسخه های 5 و 6 آن نیز منتشر شدهاند. همچنین مهاجمان روتکیتهای قدرتمندی برای دستگاه های ویندوز نیز منتشر نمودهاند.
Linux User Mode Rootkit
علاوه بر تغییر برنامه Login و ifconfig، روتکیتها چندین فایل مهم دیگر را نیز در سیستم جایگزین خواهند کرد که هر یک از این تغییرات برای کمک به نفوذگر جهت مخفی سازی خود طراحی شدهاند.
تصویر زیر اجزای مختلف Backdoor ای که در روتکیتهای رایج وجود دارد را نمایش میدهد.
سرویس های Login، rshd، sshd، inetd و tcpd همگی تغییر پیدا کرده تا رمز عبور Backdoor را پشتیبانی نمایند. اگر نفوذگر به هر یک از این پروسسها از طریق شبکه متصل شود و رمز عبور(backdoor) را وارد کند، دسترسی root بلافاصله به وی داده خواهد شد.
علاوه بر این، دستورات محلی مختلفی به منظور ایجاد دسترسی Root نیز تغییر میکنند. از جمله این دستوارت chfn، chsh، passwd و su میباشد که دچار تغییر میشوند.
اگر یک کاربر غیر Root هر کدام از این برنامهها را با یک آرگومان دستور که همان رمز عبور Backdoor میباشد اجرا کند، دسترسی این کاربر بلافاصله به Root افزایش مییابد. (شبیه یک teleporters)
تصویر فوق برخی از برنامه هایی که توسط روتکیتهای مختلف بازنویسی شدهاند را نمایش میدهد. این کار جهت مخفی نمودن حضور مهاجم میباشد.
اساسا چهار بخش برای پنهان سازی وجود دارد: پنهان سازی پروسس ها، پنهان کردن شبکه، پنهان کردن فایل و پنهان نمودن رویداد.
برای پنهان سازی پروسس ها، روتکیتهای رایج لینوکسی در واقع شامل یک جایگزینی یا تغییر مسیر برای ps، top و pidof میباشند.علاوه بر این بسیاری از روتکیتها killall را جایگزین میکنند بنابراین پروسس مربوط به نفوذگر با استفاده از این دستور kill نخواهد شد.
در نهایت، برنامه corntab اغلب تغییر مییابد به طوری که پس از بوت شدن سیستم، در یک زمان خاص پروسس نفوذگر را راه اندازی میکند. این کار معمولا بدون اضافه نمودن خطی در فایل پیکربندی corn صورت میگیرد.
آشنایی با روت کیت های سطح اپلیکیشن
مخفی سازی فایلها با تغییر در ls و find انجام میشود تا فایلهای مربوط به مهاجم را نمایش ندهند.
دستور du به گونهای تغییر میکند تا فایلهایی که مربوط به نفوذگر میباشد را از محاسبه فضای استفاده شده از دیسک حذف کند.
سرانجام مهاجمان با تغییر در syslogd، موجب عدم ثبت رویدادهای مرتبط با دستگاه خود میشوند.
Fontanini Rootkit
یک PoC یا Proof of concept خوب برای User Mode Rootkit ، روتکیت Fontanini است که توسط Matias Fontanini توسعه داده شده است. این روتکیت، پروسسها، ارتباطات و کاربران وارد شده را مخفی نموده و به تمامی پروسسها دسترسی UID صفر یا root را میدهد. این روتکیت، read Function را در File System Function Hooking جایگزین میکند.
به عنوان مثال، هنگامیکه یک برنامه مانند Netstat اجرا میشود، این برنامه دادهها را از مسیر /proc/net/tcp میخواند. این روتکیت بر روی لینوکسهای با کرنل جدیدتر از 3 قابل کامپایل و کار کردن است. نصب آن بسیار آسان بوده و بدین منظور دو دستور زیر اجرا میگردد.
make
insmod rootkit.ko
Windows User Mode Rootkit
برای درک بهتر User Mode Rootkit در ویندوز، ابتدا باید مفهوم تزریق DLL در ویندوز را مورد بررسی قرار دهیم.
یک برنامه اجرایی (EXE) برحسب نیاز، DLL های مختلفی را بارگذاری مینماید که برای انجام اقدامات خود به آنها متکی میباشد.
نفوذگران از یک تکنیک به نام DLL Injection استفاده میکنند تا پروسس EXE را بدون هیچ شکی مجبور نمایند تا DLL ای که هرگز درخواست نکرده بوده را قبول کند. تزریق DLL نیاز به چندین مرحله دارد که توسط مهاجم انجام میشود:
اختصاص فضا در پروسس قربانی برای کد DLL:
مایکروسافت یک API داخلی برای این منظور در ویندوز قرار داده است که Virtual AllocEx نامیده میشود.
اختصاص فضا در پروسس قربانی برای پارامترهای مورد نیاز جهت DLL Injection:
این مرحله نیز با استفاده از قابلیت VirtualAllocEx انجام میشود.
نوشتن نام و کد DLL داخل فضای مموری در پروسس قربانی:
مجددا ویندوز شامل یک API با یک تابع برای انجام این مرحله است. فراخوانی تابع WriteProcessMemory میتواند برای نوشتن اطلاعات دلخواه مموری در یک پروسس در حال اجرا استفاده شود.
ایجاد یک Thread در پروسس قربانی برای اجرای DLL Injection:
همانطور که ممکن است حدس زده باشید، ویندوز یک API با این قابلیت دارد. مایکروسافت این فرآیندها را با فراخوانی API های مختلف بسیار ساده تر نموده است. CreateRemoteThread یک Execution Thread را در پروسس دیگر آغاز میکند که میتواند هر کدی را در آن پروسس تزریق کند (DLL تزریق شده جدید)
آزادسازی منابع در پروسس قربانی پس از تکمیل اجرا:
اگر مهاجم دلسوزانه رفتار کند، میتواند با استفاده از تابع VirtualFreeEx پس از اتمام اجرای پروسس و یا Thread، منابع مصرف شده را آزاد نماید.
OverWriting API Calls: این تکنیک که به آن API Hooking هم گفته میشود، به نفوذگر اجازه میدهد تا هر پروسس در حال اجرا در تعامل با خودش و با ویندوز را در اختیار بگیرد. با استفاده از تغییر در Call های متصل شده، نفوذگر با لیست نمودن پروسسهای در حال اجرا، مشاهده پورت های باز، مشاهده رجستری و تعامل با فایل سیستم، میتواند خود را پنهان نماید.
نکته: شما میتوانید در سیستمعامل ویندوز، کاربرانی که دسترسی Debug را دارند مشاهده نموده و آن را ویرایش نمایید. برای این کار شما باید در پنجره Run عبارت secpol.msc را وارد کنید. سپس از بخش Security Setting به زیرمجموعه Local Policy رفته و سپس وارد بخش User Right Assigment شوید. در این بخش از سمت راست بر روی گزینه Debug Programs کلیک نمایید. در این قسمت به صورت پیشفرض دسترسی Debug به اعضای گروه Administrators داده شده است. پیشنهاد میشود که این دسترسی تنها برای کاربران خاص ایجاد شود.
Where and What to Inject
با توجه به مطالب مطرح شده در بخش قبل، نفوذگر میتواند کد مربوط به خود را به هر پروسسی که در حال اجرا میباشد، تزریق نماید. سوال این جاست که کدام پروسسها برای این منظور مناسب هستند؟
یکی از اهداف جالب برای این کار پروسس Explorer.exe میباشد. این پروسس مربوط به محیط گرافیکی ویندوز میباشد. لازم به ذکر است که این پروسس همواره در حال اجرا میباشد. این پروسس اطلاعات مربوط به کاربر را نیز نمایش میدهد بنابراین نفوذگر میتواند از آن استفاده نموده و کد خود را در آن تزریق نماید. با این کار پروسسها، کلیدهای رجیستری، فعالیتهای شبکه و فایلهای مربوط به نفوذگر را مخفی میماند. به عبارت دیگر مهاجم میتواند یک روتکیت را اجرا نماید.
Windows Rootkit Hiding
نفوذگر تنها کافی است که روتکیت را بر روی سیستم هدف در یک دایرکتوری با دسترسی ادمین اجرا نماید. در این حالت هر فایلی که در آن پوشه قرار دارد، هر پروسسی که با فایل اجرایی آن در ارتباط است، هر کلید رجیستری ایجاد شده توسط فرآیندهای اجرا شده از آن دایرکتوری و البته پورت های TCP و UDP که Listen شده از آن دایرکتوری پنهان میشوند.
Rootkit Hooking in Action
هنگامیکه یک روتکیت بر روی سیستم قربانی اجرا میشود، فایل اجرایی روتکیت ابتدا یک کپی از خود را در دایرکتوری system32 قرار میدهد. مطابق تصویر، در مرحله یک و دو، دو فایل دیگر در همان دایرکتوری ایجاد میشود. یکی explorer.dll و یکی iexplore.dll
این فایلها مشابه فایلهایی است که در سیستم وجود دارد. دو فایل با نامهای iexplore.exe که مربوط به برنامه اینترنت اکسپلور بوده و فایل explorer.exe که مربوط به ویندوز اکسپلورر میباشد.
اما باید توجه داشت که پسوند فایلهای مربوط به روتکیتها dll است. در سیستمعامل ویندوز هیچ فایل با نامهای iexplore و explorer با پسوند dll وجود ندارد. این یک ترفندی است که روتکیتها از آن استفاده میکنند.
پس از نوشتن این dllها در دایرکتوری System32، در مرحله سوم، روتکیت explorer.dll را به پروسس در حال اجرای explorer.exe تزریق میکند.
در مرحله 4، هنگامیکه explorer.dll در پروسس explorer.exe قرار گرفت، سپس API Hooking انجام میشود. با این کار کد های داخل iexplore.dll دریافت میشود.
برای تکمیل فرآیند، در مرحله 5، explorer.dll سپس iexplore.dll را داخل پروسس explorer.exe تزریق میکند. در این مرحله توابع فراخوانی شده (function calls) مرتبط با پروسسهای در حال نمایش، فایل ها، کلید های رجیستری و ارتباطات جایگزین میشوند.
در این حالت هنگامیکه یک ابزار استاندارد مانند Task Manager، file viewer، registry editor یا دستورات Netstat اجرا میشوند، کدهای API مخرب تزریق شده داخل Windows Explorer، موارد مخفی را از خروجی فیلتر میکنند که موجب میشود اقدامات مخرب نفوذگر بر روی دستگاه پنهان شود.
Defenses : Prep and Identification
همانطور که مشاهده کردید، روتکیتها برنامه های موجود بر روی سیستم را دچار تغییر میکنند. بنابراین چگونه میتوان حضور یک روتکیت در دستگاه خود را شناسایی نمود؟
یکی از راههای تشخیص حضور یک روتکیت این است که خروجی دستور LS را با خروجی دستور echo * مقایسه کنید. خروجی هر دو دستور باید یکسان باشد. این دستور به پوسته یا shell میگوید که محتویات دایرکتوری را نمایش دهد. معمولا دستور echo در روتکیتها آلوده نمیشود. بنابراین اگر خروجی این دو دستور با یکدیگر متفاوت باشد شما باید به این سیستم مشکوک شوید. اگر چه این روش به خوبی کار میکند ولی استفاده از آن برای تمام دایرکتوری های سیستم، کاربردی نخواهد بود.
ابزارهای متعددی در دسترس هستند که میتوانند /bin/login را تجزیه تحلیل کنند تا مشخص شود که آیا روتکیت بر روی سیستم نصب شده است یا خیر. ابزارهایی مانند chkrootkit یا بسیاری از ابزارهای تشخیص نفوذ مبتنی بر میزبان میتوانند روتکیتها را شناسایی نمایند.
Defenses: Identification
بهترین راه برای دفاع در برابر روتکیتها، پیشگیری از آن است. شما باید از ابزارهای کنترل یکپارچکی فایل سیستم یا file system integrity checking tool استفاده نمایید. چنین ابزارهایی میتوانند یک پایگاه داده فقط خواندنی از هشهای رمزنگاری برای فایل سیستمهای حساس ایجاد کنند.
شما باید این فایل را به صورت آفلاین ذحیره کنید و به طور منظم سیستمعامل خود را بررسی کنید تا یکپارچگی فایلها از بین نرود. با این کار شما میتوانید به سرعت بیشتری روتکیتها را شناسایی نمایید. با توجه به برخی از نگرانیها و مشکلاتی که برای الگوریتمهای هش وجود دارد، اطمینان حاصل کنید که از هر دو الگوریتم MD5 و SHA-1 استفاده میکنید. سازمان NIST هشهای مربوط به صدها برنامه و سیستمعامل را در قالب یک ISO ایمیج فراهم نموده است. این فایل از سایت nist.gov با عنوان National Software Reference Library در دسترس میباشد.
Defenses: Contain, Erad, and Recov
هنگامیکه یک روتکیت شناسایی میشود، باید درایو را کاملا پاک نمایید و دوباره Format نمایید. همچنین تمام اجزای مربوط به سیستمعامل باید مجدد نصب شوند و وصلههای جدید را نیز باید به صورت کامل بر روی آن نصب نمایید. پس از آن باید دادهها را از یک نسخه Backup ای که اخیرا تهیه شده است، بازگردانی نمایید. البته در انتها نیز باید بررسی مناسبی انجام دهید تا اطمینان حاصل کنید که دادهها دچار مشکل نشده باشند.