
एक शेलकोड लोडर जनरेटर जो कई इंजेक्शन तकनीकों का समर्थन करता है, रेड टीम अभियानों के लिए बनाया गया।
हॉलो एक शेलकोड लोडर जनरेटर है। आप इसे एक रॉ शेलकोड बाइनरी और एक प्रोफ़ाइल देते हैं, और यह एक संकलित विंडोज पीई लोडर आउटपुट करता है जिसमें आपका शेलकोड एन्क्रिप्टेड होता है।
बाइनरी रिलीज़ पेज पर उपलब्ध हैं, या स्रोत से बिल्ड करें:
go build -o hollow .
क्रॉस-कम्पाइलेशन के लिए x86_64-w64-mingw32-gcc की आवश्यकता है।
आर्क लिनक्स पर: pacman -S mingw-w64-gcc
डेबियन/उबंटू पर: apt install gcc-mingw-w64-x86-64
./hollow -shellcode payload.bin -profile profiles/new_process_injection_sc.json
| फ़्लैग | विवरण |
|---|---|
-shellcode | रॉ शेलकोड (.bin) का पथ |
-profile | प्रोफ़ाइल JSON फ़ाइल का पथ |
-templates | टेम्पलेट्स निर्देशिका (डिफ़ॉल्ट: ./templates) |
हॉलो तीन-चरणीय पाइपलाइन का अनुसरण करता है: एन्क्रिप्ट, सब्स्टीट्यूट, कम्पाइल।
आपका शेलकोड हर रन पर बेतरतीब ढंग से जनरेट की गई कुंजी और IV के साथ AES-256-CBC से एन्क्रिप्ट किया जाता है। दोनों आउटपुट बाइनरी के अंदर एम्बेड होते हैं। चयनित C टेम्पलेट में इसके प्लेसहोल्डर्स को एन्क्रिप्टेड शेलकोड, कुंजी और IV से बदल दिया जाता है, और परिणाम MinGW द्वारा एक स्ट्रिप्ड, स्टैटिकली लिंक्ड PE में संकलित किया जाता है।
रनटाइम पर, लोडर विंडोज BCrypt का उपयोग करके शेलकोड को डिक्रिप्ट करता है और इसे उस इंजेक्शन तकनीक का उपयोग करके निष्पादित करता है जो टेम्पलेट लागू करता है।
टेम्पलेट्स C स्रोत फ़ाइलें हैं जो वास्तविक इंजेक्शन लॉजिक को लागू करती हैं। प्रत्येक templates/ में रहता है और इसमें प्लेसहोल्डर टोकन (${SHELLCODE}, ${KEY}, ${IV}, ${TARGET_PROCESS}) होते हैं जिन्हें हॉलो संकलन से पहले भरता है। आप अपनी प्रोफ़ाइल के माध्यम से एक टेम्पलेट चुनते हैं।
हॉलो छह टेम्पलेट्स के साथ आता है:
आप अपने स्वयं के टेम्पलेट लिख सकते हैं और उन्हें templates/ में डाल सकते हैं — हॉलो उन्हें स्वचालित रूप से उठा लेगा जब तक आपकी प्रोफ़ाइल उनकी ओर इशारा करती है।
प्रोफ़ाइल्स JSON फ़ाइलें हैं जो हॉलो को बताती हैं कि कौन सा टेम्पलेट उपयोग करना है, किस प्रक्रिया को लक्षित करना है, और आउटपुट कैसे संकलित करना है। ये profiles/ में रहते हैं और प्रति एंगेजमेंट अनुकूलित करने के लिए होते हैं।
{
"name": "New Process Injection via Direct Syscalls",
"author": "",
"template": "new_process_injection_sc",
"target_process": "C:\\Windows\\System32\\cmd.exe",
"arch": "x64",
"compile": {
"automatic": true,
"gcc": "x86_64-w64-mingw32-gcc",
"strip": true,
"output_type": "exe"
},
"output_dir": "./output"
}
output_type या तो exe या dll है। automatic: false सेट करने पर संकलन के बजाय प्रतिस्थापित C स्रोत को डिस्क पर डंप करता है, जो कोड को बनाने से पहले संशोधित करने के लिए उपयोगी है।
आउटपुट फ़ाइल output_dir में लिखी जाती है, जिसका नाम {template}_loader.{exe|dll} है।
टेम्पलेट: new_process_injection
तकनीक: ताज़ा स्पॉन की गई प्रक्रिया में रिमोट थ्रेड इंजेक्शन।
लक्ष्य प्रक्रिया को CREATE_BREAKAWAY_FROM_JOB | CREATE_NO_WINDOW के साथ स्पॉन करता है, इसके आरंभीकरण के लिए दो सेकंड प्रतीक्षा करता है, फिर उसके एड्रेस स्पेस में मेमोरी आवंटित करता है, डिक्रिप्टेड शेलकोड लिखता है, इसे निष्पादन योग्य चिह्नित करता है, और उस पर इंगित एक रिमोट थ्रेड बनाता है। BREAKAWAY ध्वज की आवश्यकता तब होती है जब लोडर WinRM से लॉन्च किया जाता है, जो सभी प्रक्रियाओं को एक जॉब ऑब्जेक्ट में लपेटता है। लक्ष्य एक पूर्ण निष्पादन योग्य पथ है।
Win32 कॉल: CreateProcessA, VirtualAllocEx, WriteProcessMemory, VirtualProtectEx, CreateRemoteThread।
टेम्पलेट: new_process_injection_sc
तकनीक: ताज़ा स्पॉन की गई प्रक्रिया में रिमोट थ्रेड इंजेक्शन, डायरेक्ट सिस्कॉल्स (हेल्स गेट) के माध्यम से।
new_process_injection के समान व्यवहार, लेकिन हर आवंटन और थ्रेडिंग कॉल Win32 परत को पूरी तरह से बायपास करता है। SSN रनटाइम पर ntdll से हल किए जाते हैं और रॉ syscall निर्देश के माध्यम से निष्पादित किए जाते हैं। बेंचमार्क अनुभाग देखें।
टेम्पलेट: remote_thread_injection
तकनीक: मौजूदा प्रक्रिया में क्लासिक रिमोट थ्रेड इंजेक्शन।
CreateToolhelp32Snapshot का उपयोग करके नाम से एक चल रही प्रक्रिया ढूंढता है, उसके लिए एक हैंडल खोलता है, फिर मेमोरी आवंटित करता है, शेलकोड लिखता है, और एक रिमोट थ्रेड बनाता है। कोई नई प्रक्रिया स्पॉन नहीं की जाती है। explorer.exe जैसी लंबे समय तक चलने वाली प्रक्रियाओं के खिलाफ सबसे अच्छा उपयोग किया जाता है। लक्ष्य एक प्रक्रिया इमेज नाम है, पूर्ण पथ नहीं।
Win32 कॉल: OpenProcess, VirtualAllocEx, WriteProcessMemory, VirtualProtectEx, CreateRemoteThread।
टेम्पलेट: remote_thread_injection_sc
तकनीक: मौजूदा प्रक्रिया में क्लासिक रिमोट थ्रेड इंजेक्शन, डायरेक्ट सिस्कॉल्स (हेल्स गेट) के माध्यम से।
remote_thread_injection के समान व्यवहार, Win32 परत को बायपास करता है। बेंचमार्क अनुभाग देखें।
टेम्पलेट: earlybird_apc
तकनीक: अर्ली बर्ड APC इंजेक्शन (CyberArk, 2018)।
लक्ष्य प्रक्रिया को निलंबित स्थिति में स्पॉन करता है (CREATE_SUSPENDED | CREATE_BREAKAWAY_FROM_JOB | CREATE_NO_WINDOW), डिक्रिप्टेड शेलकोड को इसके एड्रेस स्पेस में लिखता है, फिर QueueUserAPC के माध्यम से मुख्य थ्रेड में शेलकोड पर इंगित एक एसिंक्रोनस प्रोसीजर कॉल (APC) को कतारबद्ध करता है, और ResumeThread के साथ रिज्यूम करता है। क्योंकि APC प्रक्रिया एंट्री पॉइंट चलने से पहले फायर करता है, शेलकोड प्रक्रिया में किसी भी डिफेंसिव टूलिंग के आरंभ होने से पहले निष्पादित होता है। यह VirtualAllocEx + WriteProcessMemory + CreateRemoteThread ट्रायड को पूरी तरह से टालता है।
टेम्पलेट: dll_sideload
तकनीक: DLL साइडलोडिंग / इन-प्रोसेस शेलकोड निष्पादन।
EXE के बजाय एक DLL उत्पन्न करता है। DLL_PROCESS_ATTACH पर, एक थ्रेड स्पॉन किया जाता है जो शेलकोड को इन-प्रोसेस डिक्रिप्ट और निष्पादित करता है: VirtualAlloc, memcpy, VirtualProtect, फिर शेलकोड में सीधा फंक्शन कॉल। होस्ट प्रक्रिया को तब तक जीवित रहना चाहिए जब तक पेलोड आरंभ न हो जाए (Sliver बीकन के लिए लगभग 10 सेकंड)। DLL को ऐसे स्थान पर रखकर तैनात करें जहां एक वैध बाइनरी इसे लापता DLL खोज पथ प्रविष्टि के माध्यम से लोड करेगी।
विंडोज 10 बिल्ड 19041 पर परीक्षण किया गया, विंडोज डिफेंडर रियलटाइम सुरक्षा सक्षम, परिभाषाएँ 1.453.354.0, पेलोड के रूप में 17 MB डोनट-रैप्ड Sliver बीकन के साथ:
Trojan:Win64/AsyncRat.RPY!MTB एक मशीन-थ्रेट-व्यवहार नियम है जो क्लासिक रिमोट इंजेक्शन अनुक्रम द्वारा ट्रिगर होता है: Win32 API परत के माध्यम से रिमोट प्रक्रिया हैंडल पर VirtualAllocEx + WriteProcessMemory + CreateRemoteThread कॉल किया जाता है। डिफेंडर एक कर्नेल कॉलबैक पंजीकृत करता है जो तब फायर करता है जब ये तीन कॉल अनुक्रम में दिखाई देते हैं।
_sc टेम्पलेट उन Win32 फंक्शन को कभी कॉल न करके इससे बचते हैं। इसके बजाय, वे हेल्स गेट का उपयोग करके रनटाइम पर ntdll से सीधे संबंधित कर्नेल सिस्कॉल सर्विस नंबर (SSN) हल करते हैं: प्रत्येक अनहुक्ड ntdll स्टब चार-बाइट प्रोलॉग 4C 8B D1 B8 से शुरू होता है, और SSN ऑफसेट 4 पर बैठता है। वास्तविक syscall एक GCC नेकेड फंक्शन है जिसमें केवल movq %rcx, %r10 / movl ssn(%rip), %eax / syscall / ret होता है, जो ठीक वही अनुक्रम है जो ntdll स्टब स्वयं निष्पादित करेगा। डिफेंडर का कॉलबैक कभी फायर नहीं होता क्योंकि मॉनिटर किए गए Win32 रैपर कभी आह्वान नहीं किए जाते।
उन सिस्टमों पर जहां ntdll स्टब्स को पूर्ण EDR द्वारा पैच किया जाता है (प्रोलॉग को जंप से बदल दिया जाता है), साफ-स्टब जाँच विफल हो जाती है और लोडर जल्दी बाहर निकल जाता है। हेलो गेट (SSN का अनुमान लगाने के लिए पड़ोसी स्टब्स को स्कैन करना) लागू नहीं किया गया है।
लोडर कोड लगभग 19 KB ओवरहेड जोड़ता है। आउटपुट का आकार मूलतः इनपुट शेलकोड के आकार के बराबर है। 17 MB Sliver बीकन 18 MB लोडर उत्पन्न करता है। एक विशिष्ट Metasploit शेलकोड (~200 KB) लगभग ~220 KB लोडर उत्पन्न करेगा।
योगदान का स्वागत है। यदि आपके पास एक टेम्पलेट है जो आपने लिखा है और इसे जोड़ना चाहते हैं, या मौजूदा टेम्पलेट्स में सुधार, तो बेझिझक PR खोलें। यदि आपको कोई बग मिलता है या कोई सुझाव है, तो एक मुद्दा खोलें।
इस उपकरण का लक्ष्य लोडर विकास प्रक्रिया को आसान बनाना है, न कि एक तैयार उत्पाद होना। नए टेम्पलेट, बेहतर प्रोफ़ाइल और कोर में सुधार सभी स्वीकार्य हैं। हॉलो को शेलकोड लोडर और इंजेक्शन तकनीकों के पीछे की अवधारणाओं को समझने में लोगों की मदद करने के इरादे से भी बनाया गया था, इसलिए स्पष्ट और पठनीय टेम्पलेट कोड कार्यक्षमता के समान ही मूल्यवान है।
मैं जल्द ही अपने ब्लॉग पर प्रत्येक तकनीक के पीछे की अवधारणाओं और हॉलो के पूर्ण उपयोग के बारे में विस्तार से बताऊंगा। बने रहें।
| टेम्पलेट | तकनीक |
|---|
new_process_injection | ताज़ा स्पॉन की गई प्रक्रिया में रिमोट थ्रेड इंजेक्शन |
new_process_injection_sc | वही, डायरेक्ट सिस्कॉल्स (हेल्स गेट) के माध्यम से |
remote_thread_injection | क्लासिक रिमोट थ्रेड इंजेक्शन किसी मौजूदा प्रक्रिया में |
remote_thread_injection_sc | वही, डायरेक्ट सिस्कॉल्स (हेल्स गेट) के माध्यम से |
earlybird_apc | अर्ली बर्ड APC इंजेक्शन |
dll_sideload | DLL साइडलोडिंग, EXE के बजाय DLL उत्पन्न करता है |
| टेम्पलेट | डिफेंडर व्यवहार संबंधी चेतावनी | सत्र स्थापित |
|---|
| new_process_injection | Trojan:Win64/AsyncRat.RPY!MTB | हाँ |
| remote_thread_injection | Trojan:Win64/AsyncRat.RPY!MTB | हाँ |
| earlybird_apc | कोई नहीं | हाँ |
| dll_sideload | कोई नहीं | हाँ |
| new_process_injection_sc | कोई नहीं | हाँ |
| remote_thread_injection_sc | कोई नहीं | हाँ |