
ScareCrow - EDR बाईपास के लिए डिज़ाइन किया गया पेलोड निर्माण फ्रेमवर्क।
ScareCrow के नवीनतम संस्करण को देखने या कोई समस्या सबमिट करने के लिए, https://github.com/Tylous/ScareCrow देखें।
यदि आप इस फ्रेमवर्क में उपयोग की जाने वाली तकनीकों के बारे में अधिक जानना चाहते हैं, तो कृपया भाग 1 और भाग 2 देखें।
ScareCrow एक पेलोड निर्माण फ्रेमवर्क है जो एक वैध विंडोज प्रक्रिया में साइड लोडिंग (इंजेक्ट नहीं करना) के लिए है (एप्लिकेशन व्हाइटलिस्टिंग नियंत्रणों को बायपास करना)। एक बार जब DLL लोडर मेमोरी में लोड हो जाता है, तो यह एक तकनीक का उपयोग करके प्रक्रिया की मेमोरी में चल रहे सिस्टम DLLs से EDR के हुक को हटा देता है। यह इसलिए काम करता है क्योंकि हम जानते हैं कि EDR के हुक तब लगाए जाते हैं जब कोई प्रक्रिया स्पॉन की जाती है।
ScareCrow इन DLLs को लक्षित कर सकता है और API फंक्शन VirtualProtect का उपयोग करके उन्हें मेमोरी में हेरफेर कर सकता है, जो किसी प्रक्रिया की मेमोरी अनुमतियों के एक अनुभाग को एक अलग मान में बदलता है, विशेष रूप से Execute–Read से Read-Write-Execute में।
ScareCrow हटाने के लिए 2 विधियों में से 1 का उपयोग करता है
जब निष्पादित किया जाता है, तो ScareCrow C:\Windows\System32\ में डिस्क पर संग्रहीत सिस्टम DLLs के बाइट्स को कॉपी कर लेगा। ये DLLs EDR हुक से "स्वच्छ" डिस्क पर संग्रहीत होते हैं क्योंकि इनका उपयोग सिस्टम द्वारा एक नई प्रक्रिया में एक अपरिवर्तित प्रतिलिपि लोड करने के लिए किया जाता है जब इसे स्पॉन किया जाता है। चूंकि EDR केवल इन प्रक्रियाओं को मेमोरी में हुक करते हैं, वे अपरिवर्तित रहती हैं। ScareCrow पूरी DLL फ़ाइल की प्रतिलिपि नहीं बनाता, इसके बजाय यह केवल DLLs के .text अनुभाग पर ध्यान केंद्रित करता है। DLL का यह अनुभाग निष्पादन योग्य असेंबली रखता है, और ऐसा करके, ScareCrow पहचान की संभावना को कम करने में मदद करता है क्योंकि पूरी फ़ाइलों को फिर से पढ़ने से EDR को पता चल सकता है कि सिस्टम संसाधन में संशोधन हो रहा है। फिर डेटा को प्रत्येक फंक्शन के ऑफ़सेट का उपयोग करके मेमोरी के सही क्षेत्र में कॉपी किया जाता है। प्रत्येक फंक्शन का एक ऑफ़सेट होता है जो बेस एड्रेस से बाइट्स की सटीक संख्या को दर्शाता है जहाँ वे स्थित हैं, स्टैक पर फंक्शन का स्थान प्रदान करता है।
ऐसा करने के लिए, ScareCrow मेमोरी के .text क्षेत्र की अनुमतियों को VirtualProtect का उपयोग करके बदलता है। भले ही यह एक सिस्टम DLL है, चूंकि यह हमारी प्रक्रिया (जिसे हम नियंत्रित करते हैं) में लोड हो गया है, हम बिना उन्नत विशेषाधिकारों की आवश्यकता के मेमोरी अनुमतियों को बदल सकते हैं।
ScareCrow शेलकोड को पहले डिक्रिप्ट करके मेमोरी में लोड करता है, जो तीन एन्क्रिप्शन विधियों (नीचे उल्लिखित) में से एक द्वारा एन्क्रिप्ट किया जाता है। एक बार डिक्रिप्ट और लोड होने के बाद, शेलकोड निष्पादित किया जाता है। निर्दिष्ट लोडर विकल्पों के आधार पर, ScareCrow DLL के लिए अलग-अलग एक्सपोर्ट फंक्शन सेट करेगा। लोड किए गए DLL में मानक DLLMain फंक्शन भी नहीं होता है जो सभी DLLs को आमतौर पर संचालित करने की आवश्यकता होती है। DLL बिना किसी समस्या के निष्पादित होगा क्योंकि हम जिस प्रक्रिया में लोड करते हैं वह उन एक्सपोर्ट फंक्शन को खोजेगी और DLLMain के होने की चिंता नहीं करेगी।
बाद में
KnownDLLs उन DLLs की सूची है जो विंडोज द्वारा सिस्टम स्टार्टअप प्रक्रिया के दौरान लोड किए जाते हैं। चूंकि इन DLLs को ऑपरेटिंग सिस्टम के काम करने के लिए आवश्यक माना जाता है, इसलिए एप्लिकेशन शुरू होने पर लोड समय को कम करने और प्रदर्शन में सुधार करने के लिए इन्हें कैश किया जाता है। KnownDLLs में kernel32.dll, kernelbase.dll और ntdll.dll जैसे DLLs शामिल हैं।
इन KnownDLLs का उपयोग करते हुए, ScareCrow NtOpenSection और NtMapViewOfSection के संयोजन का उपयोग करके \KnownDlls\<dllname> से DLL की एक प्रतिलिपि मैप करता है ताकि इसे प्रक्रिया की मेमोरी में लोड किया जा सके। ScareCrow पूरे DLL को लोड नहीं करता, बल्कि यह केवल DLL के .text अनुभाग को लोड करता है (क्योंकि इसमें सभी सिस्कॉल्स शामिल हैं)। वहां से ScareCrow NtProtectVirtualMemory को कॉल करने के लिए अप्रत्यक्ष सिस्कॉल्स का उपयोग करता है और EDR के हुक को अधिलेखित करने की अनुमति देने से पहले DLL के .text मेमोरी अनुभाग की अनुमतियों को बदलता है, और फिर अनुमतियों को पुनर्स्थापित करता है।
अधिक जानकारी के लिए आप modexp का विस्तृत लेख पढ़ सकते हैं।
एक बार ये हुक हटा दिए जाने के बाद, ScareCrow तब मेमोरी में शेलकोड को लोड और चलाने के लिए कस्टम सिस्टम कॉल का उपयोग करता है। ScareCrow EDR हुक हटाए जाने के बाद भी ऐसा करता है ताकि नॉन-यूज़रलैंड, हुक-आधारित टेलीमेट्री संग्रह उपकरणों जैसे कि इवेंट ट्रेसिंग फॉर विंडोज (ETW) या अन्य इवेंट लॉगिंग तंत्रों द्वारा पहचान से बचा जा सके। इन कस्टम सिस्टम कॉल का उपयोग EDRs द्वारा लगाए गए हुक को हटाने के लिए ऊपर वर्णित VirtualProtect कॉल करने के लिए भी किया जाता है, ताकि किसी भी EDR के एंटी-टैम्पर नियंत्रणों से बचा जा सके। यह VirtualProtect सिस्कॉल के एक कस्टम संस्करण, NtProtectVirtualMemory को कॉल करके किया जाता है। ScareCrow इन लोडर को उत्पन्न करने के लिए Golang का उपयोग करता है और फिर इन कस्टम सिस्कॉल फंक्शनों के लिए असेंबली का उपयोग करता है।
लोडर के निर्माण की प्रक्रिया के दौरान, ScareCrow एक बीकन के होम कॉल करने के बाद पृष्ठभूमि में मिश्रण (blending) के लिए एक लाइब्रेरी का उपयोग करता है। यह लाइब्रेरी दो काम करती है:
कोड साइनिंग प्रमाणपत्रों के साथ हस्ताक्षरित फ़ाइलों की अक्सर कम जांच की जाती है, जिससे उन्हें चुनौती दिए बिना निष्पादित करना आसान हो जाता है, क्योंकि एक विश्वसनीय नाम द्वारा हस्ताक्षरित फ़ाइलें दूसरों की तुलना में कम संदिग्ध होती हैं। अधिकांश एंटीमैलवेयर उत्पादों के पास इन प्रमाणपत्रों को मान्य और सत्यापित करने का समय नहीं होता है (अब कुछ करते हैं, लेकिन आमतौर पर सामान्य विक्रेता नामों को व्हाइटलिस्ट में शामिल किया जाता है)। ScareCrow इन प्रमाणपत्रों को एक pfx12 फ़ाइल बनाने के लिए उपकरण limelighter के go पैकेज संस्करण का उपयोग करके बनाता है। यह पैकेज उपयोगकर्ता द्वारा निर्दिष्ट एक इनपुट डोमेन नाम लेता है, ताकि उस डोमेन के लिए एक कोड साइनिंग प्रमाणपत्र बनाया जा सके। यदि आवश्यक हो, तो आप अपने स्वयं के कोड साइनिंग प्रमाणपत्र का भी उपयोग कर सकते हैं, यदि आपके पास है, तो valid कमांड-लाइन विकल्प का उपयोग करें।
clone कमांड-लाइन विकल्प के साथ, और जिस फ़ाइल से प्रमाणपत्र कॉपी करना चाहते हैं उसके पथ के साथ कॉपी कर सकता है। लोडर को microsoft.com के साथ साइन करते समय, उनका WINDOWS DEFENDER ATP उत्पादों के विरुद्ध उपयोग करना उतना प्रभावी नहीं हो सकता है, क्योंकि वे प्रमाणपत्र को मान्य कर सकते हैं क्योंकि यह उनका है। यदि आप एक विंडोज उत्पाद के विरुद्ध लोडर का उपयोग कर रहे हैं, तो संभवतः एक अलग डोमेन का उपयोग करें।
इन फ़ाइलों और go कोड के साथ, ScareCrow उन्हें c-shared लाइब्रेरी विकल्प का उपयोग करके DLLs में क्रॉस कंपाइल करेगा। एक बार DLL संकलित होने के बाद, इसे एक टूटी हुई base64 स्ट्रिंग में अस्पष्ट (obfuscated) किया जाता है जिसे एक फ़ाइल में एम्बेड किया जाएगा। यह फ़ाइल को दूरस्थ रूप से खींचे जाने, एक्सेस किए जाने और प्रोग्रामेटिक रूप से निष्पादित किए जाने की अनुमति देता है।