
Windows Debugging API का उपयोग करके Shellcode इंजेक्शन
DbgNexum विंडोज डीबगिंग API और शेयर्ड मेमोरी (फ़ाइल मैपिंग) का उपयोग करके शेलकोड इंजेक्ट करने के लिए एक प्रूफ-ऑफ-कॉन्सेप्ट है। यह सीधे रिमोट मेमोरी को लिखने और पढ़ने से बचता है; इसके बजाय, यह टारगेट प्रोसेस को पेलोड को स्वयं लोड करने और निष्पादित करने के लिए बाध्य करने हेतु कॉन्टेक्स्ट मैनिपुलेशन का उपयोग करता है।
इंजेक्टर एक टारगेट प्रोसेस से अटैच होता है और एक सस्पेंडेड थ्रेड बनाता है। डीबग लूप के माध्यम से, यह एक विशिष्ट रिटर्न एड्रेस पर निष्पादन को रोकने के लिए हार्डवेयर ब्रेकपॉइंट सेट करता है। प्रत्येक ट्रैप पर, इंजेक्टर फ़ंक्शन कॉल्स की नकल करने के लिए CPU रजिस्टरों को संशोधित करता है, जिससे टारगेट प्रोसेस के अंदर Windows API फ़ंक्शन कॉल्स का एक क्रम व्यवस्थित होता है।
इस README को लिखने के समय, मैंने इस तकनीक का परीक्षण MDE और Elastic के विरुद्ध किया, और इनमें से किसी ने भी इसका पता नहीं लगाया।
WriteProcessMemory / VirtualAllocEx का उपयोग नहीं: पेलोड को CreateFileMapping और MapViewOfFile के माध्यम से स्थानांतरित किया जाता है।ReadProcessMemory का उपयोग नहीं: यह दृष्टिकोण थ्रेड कॉन्टेक्स्ट से सभी महत्वपूर्ण जानकारी प्राप्त करता है।यह PoC एक XORed msfvenom शेलकोड का उपयोग करता है जो "calc.exe" चलाता है। लेकिन कृपया अपना स्वयं का शेलकोड उपयोग करें!
shellcode.h में शामिल करें।DbgNexum.exe <PID>
उदाहरण आउटपुट:
[i] Section 'MZ' created and shellcode copied
[+] Bait thread created. Setting HWBP on FileTimeToSystemTime
[i] Execution Redirected:
|-> [0] Preparation & anchoring stack
|-> [1] Setting HWBP & buffer alloc
|-> [2] Copying File-Mapping name
|-> [3] Zeroing stack slot
|-> [4] Opening handle to named file mapping
|-> [5] Mapping payload into mem. with exec. perm.
|-> [6] Cleanup & shellcode execution
[+] Successfully detached from process 19256
[i] Orchestration complete.
निष्पादन प्रवाह इंजेक्टर के डीबग लूप और टारगेट प्रोसेस के बीच लगातार आगे-पीछे चलता रहता है।
इंजेक्शन के चरण
DebugLoop फ़ंक्शन में मुख्य इंजेक्शन लॉजिक होता है और यह "स्टेट मशीन" का संचालन करता है:
0. तैयारी:
ret कॉल पर सेट करते हैं।1. मेमोरी आवंटन:
LocalAlloc कॉल करने हेतु तैयार करें और बाध्य करें।2. डेटा सेटअप:
MZ की प्रतिलिपि बनाने के लिए थ्रेड को memcpy कॉल करने हेतु तैयार करें और बाध्य करें।3. स्टैक तैयारी:
memset कॉल करने के लिए बाध्य करें। यह चरण 5 की तैयारी है, जो MapViewOfFile को कॉल करेगा। चूंकि फ़ंक्शन 4 से अधिक आर्ग्युमेंट्स का उपयोग करेगा, इसलिए 5वाँ आर्ग्युमेंट स्टैक के माध्यम से पास किया जाता है (जिसे हम यहाँ सेट करते हैं)।4. मैपिंग खोलें:
MZ नाम का उपयोग करके थ्रेड को OpenFileMappingA कॉल करने के लिए बाध्य करें।5. पेलोड मैप करें:
MapViewOfFile कॉल करने के लिए बाध्य करता है। यह शेयर्ड मेमोरी सेक्शन (जिसमें शेलकोड होता है) को EXECUTE अनुमतियों के साथ टारगेट के एड्रेस स्पेस में मैप करता है।6. निष्पादन:
MapViewOfFile द्वारा लौटाए गए एड्रेस पर RIP को पुनर्निर्देशित करता है।