
Freeze is a payload toolkit for bypassing EDRs using suspended processes, direct syscalls, and alternative execution methods
Freeze के नवीनतम संस्करण को देखने या कोई समस्या सबमिट करने के लिए, https://github.com/Tylous/Freeze पर जाएं।
यदि आप इस फ्रेमवर्क में उपयोग की गई तकनीकों के बारे में अधिक जानना चाहते हैं, तो कृपया SourceZero Blog देखें।
Freeze एक पेलोड निर्माण उपकरण है जिसका उपयोग EDR सुरक्षा नियंत्रणों को दरकिनार करते हुए शेलकोड को गुप्त रूप से निष्पादित करने के लिए किया जाता है। Freeze न केवल यूज़रलैंड EDR हुक्स को हटाने के लिए, बल्कि शेलकोड को इस तरह से निष्पादित करने के लिए भी कई तकनीकों का उपयोग करता है जो अन्य एंडपॉइंट निगरानी नियंत्रणों को दरकिनार करता है।
जब कोई प्रक्रिया बनाई जाती है, तो Ntdll.dll पहली DLL होती है जो लोड होती है। ऐसा किसी भी EDR DLL के लोड होने से पहले होता है। इसका मतलब है कि EDR के लोड होने और सिस्टम DLLs की असेंबली को हुक और संशोधित करने शुरू करने से पहले थोड़ी देरी होती है। Ntdll.dll में विंडोज सिस्कॉल्स को देखने पर, हम देख सकते हैं कि अभी तक कुछ भी हुक नहीं किया गया है। यदि हम एक प्रक्रिया को निलंबित अवस्था (समय में जमी हुई) में बनाते हैं, तो हम देख सकते हैं कि Ntdll.dll को छोड़कर कोई अन्य DLL लोड नहीं होती है। आप यह भी देख सकते हैं कि कोई EDR DLL लोड नहीं है, जिसका अर्थ है कि Ntdll.dll में स्थित syscalls अपरिवर्तित हैं।
इस स्वच्छ निलंबित प्रक्रिया का उपयोग Freeze लोडर से हुक्स हटाने के लिए करने के लिए, हमें स्वच्छ निलंबित प्रक्रिया की मेमोरी को प्रोग्रामेटिक रूप से खोजने और पढ़ने का एक तरीका चाहिए। यह वह जगह है जहाँ एड्रेस स्पेस लेआउट रैंडमाइज़ेशन (ASLR) काम आता है। ASLR एक सुरक्षा तंत्र है जो स्टैक मेमोरी करप्शन-आधारित कमजोरियों को रोकने के लिए है। ASLR एक प्रक्रिया के अंदर एड्रेस स्पेस को रैंडमाइज़ करता है, ताकि यह सुनिश्चित किया जा सके कि सभी मेमोरी-मैप की गई वस्तुएं, स्टैक, हीप, और निष्पादन योग्य प्रोग्राम स्वयं अद्वितीय हों। अब, यह वह जगह है जहाँ यह दिलचस्प हो जाता है क्योंकि जबकि ASLR काम करता है, यह स्थिति-स्वतंत्र कोड जैसे DLLs के लिए काम नहीं करता है। DLLs (विशेष रूप से ज्ञात सिस्टम DLLs) के साथ क्या होता है कि एड्रेस स्पेस बूट समय पर एक बार रैंडमाइज़ किया जाता है। इसका मतलब है कि हमें अपने ntdll.dll का बेस एड्रेस खोजने के लिए रिमोट प्रक्रिया की जानकारी को एन्यूमरेट करने की आवश्यकता नहीं है क्योंकि यह सभी प्रक्रियाओं में समान है, जिसमें वह प्रक्रिया भी शामिल है जिसे हम नियंत्रित करते हैं। चूँकि प्रत्येक DLL का पता प्रति बूट एक ही स्थान पर होता है, हम इस जानकारी को अपनी प्रक्रिया से प्राप्त कर सकते हैं और कभी भी निलंबित प्रक्रिया को एन्यूमरेट करने की आवश्यकता नहीं है ताकि पता मिल सके।
इस जानकारी के साथ, हम किसी प्रक्रिया की मेमोरी पढ़ने के लिए API ReadProcessMemory का उपयोग कर सकते हैं। यह API कॉल आमतौर पर किसी भी क्रेडेंशियल-आधारित हमले के हिस्से के रूप में LSASS को पढ़ने से जुड़ा होता है; हालाँकि, अपने आप में यह स्वाभाविक रूप से दुर्भावनापूर्ण नहीं है, खासकर यदि हम केवल मेमोरी का एक मनमाना भाग पढ़ रहे हैं। ReadProcessMemory को केवल तभी संदिग्ध के रूप में चिह्नित किया जाएगा जब आप कुछ ऐसा पढ़ रहे हों जो आपको नहीं पढ़ना चाहिए (जैसे LSASS की सामग्री)। EDR उत्पादों को कभी भी इस तथ्य को ध्वजांकित नहीं करना चाहिए कि ReadProcessMemory को कॉल किया गया था, क्योंकि इस फ़ंक्शन के वैध परिचालन उपयोग हैं और इसके परिणामस्वरूप कई झूठी सकारात्मकता होगी।
हम इसे एक कदम आगे ले जा सकते हैं केवल Ntdll.dll के उस भाग को पढ़कर जहाँ सभी syscalls संग्रहीत हैं - इसका .text सेक्शन, पूरी DLL को पढ़ने के बजाय।
इन तत्वों को मिलाकर, हम प्रोग्रामेटिक रूप से Ntdll.dll के .text सेक्शन की एक प्रतिलिपि प्राप्त कर सकते हैं ताकि शेलकोड निष्पादित करने से पहले अपने मौजूदा हुक किए गए .text सेक्शन को ओवरराइट किया जा सके।
ETW इस टेलीमेट्री को उत्पन्न करने के लिए अंतर्निहित syscalls का उपयोग करता है। चूँकि ETW भी विंडोज में निर्मित एक मूल सुविधा है, सुरक्षा उत्पादों को जानकारी तक पहुँचने के लिए ETW syscalls को "हुक" करने की आवश्यकता नहीं है। परिणामस्वरूप, ETW को रोकने के लिए, Freeze कई ETW syscalls को पैच करता है, रजिस्टरों को फ्लश करता है और निष्पादन प्रवाह को अगले निर्देश पर लौटाता है। ETW पैचिंग अब सभी लोडरों में डिफ़ॉल्ट है।
चूँकि केवल Ntdll.dll बहाल किया गया है, शेलकोड निष्पादित करने के लिए सभी बाद के कॉल Ntdll.dll में रहने चाहिए। Go का उपयोग करके (ध्यान दें कि आप इसे अन्य भाषाओं में कर सकते हैं लेकिन Go में, इसे लागू करना काफी आसान है) हम शेलकोड को आवंटित, लिखने और सुरक्षित करने के लिए आवश्यक NT syscalls को परिभाषित और कॉल कर सकते हैं, जो kernel32d.dll और Kernelbase.dll में स्थित मानक कॉलों को छोड़ते हुए, क्योंकि ये अभी भी हुक हो सकते हैं।
Freeze को Golang में विकसित किया गया था।
Freeze को स्थापित करने के लिए, निम्नलिखित कमांड चलाएँ, या संकलित बाइनरी का उपयोग करें:
go build Freeze.go
___________
\_ _____/______ ____ ____ ________ ____
| __) \_ __ \_/ __ \_/ __ \\___ // __ \
| \ | | \/\ ___/\ ___/ / /\ ___/
\___ / |__| \___ >\___ >_____ \\___ >
\/ \/ \/ \/ \/
(@Tyl0us)
जल्द ही वे सीखेंगे कि बदला एक ऐसा व्यंजन है... जो ठंडा परोसा जाता है...
./Freeze का उपयोग:
-I स्ट्रिंग
कच्चे 64-बिट शेलकोड का पथ।
-O स्ट्रिंग
आउटपुट फ़ाइल का नाम (जैसे loader.exe या loader.dll)। परिभाषित फ़ाइल एक्सटेंशन के आधार पर यह निर्धारित होगा कि Freeze dll या exe बनाता है या नहीं।
-console
केवल बाइनरी पेलोड के लिए - पेलोड निष्पादित होने पर वर्बोज़ कंसोल जानकारी उत्पन्न करता है। यह छिपी हुई विंडो सुविधा को अक्षम कर देगा।
-encrypt
AES 256 एन्क्रिप्शन का उपयोग करके शेलकोड को एन्क्रिप्ट करता है
-export स्ट्रिंग
केवल DLL लोडर के लिए - लोडर के लिए एक विशिष्ट एक्सपोर्ट फ़ंक्शन निर्दिष्ट करें।
-process स्ट्रिंग
स्पॉन करने की प्रक्रिया का नाम। यह प्रक्रिया C:\Windows\System32\ में मौजूद होनी चाहिए। उदाहरण 'notepad.exe' (डिफ़ॉल्ट "notepad.exe")
-sandbox
जाँच करके सैंडबॉक्स से बचाव सक्षम करता है:
क्या एंडपॉइंट किसी डोमेन से जुड़ा है?
क्या एंडपॉइंट में 2 से अधिक CPU हैं?
क्या एंडपॉइंट में 4 गीगाबाइट से अधिक RAM है?
-sha256
लोडरों का SHA256 मान प्रदान करता है (यह ट्रैकिंग के लिए उपयोगी है)
Freeze या तो .exe या .dll फ़ाइल उत्पन्न कर सकता है। इसे निर्दिष्ट करने के लिए, सुनिश्चित करें कि -O कमांड लाइन विकल्प बाइनरी के लिए .exe या dll के लिए .dll में समाप्त होता है। वर्तमान में किसी अन्य फ़ाइल प्रकार का समर्थन नहीं किया जाता है। DLL फ़ाइलों के मामले में, Freeze अतिरिक्त एक्सपोर्ट कार्यक्षमता भी जोड़ सकता है। ऐसा करने के लिए -export का उपयोग विशिष्ट एक्सपोर्ट फ़ंक्शन नाम के साथ करें।
Freeze एक तकनीक का उपयोग करता है जहाँ पहले प्रक्रिया बनाई जाती है और फिर इसे पृष्ठभूमि में ले जाया जाता है। यह दो काम करता है - पहला, यह प्रक्रिया को छिपाने में मदद करता है, और दूसरा, किसी भी EDR उत्पाद द्वारा पता लगाए जाने से बचाता है। प्रक्रिया को तुरंत पृष्ठभूमि में स्पॉन करना बहुत संदिग्ध हो सकता है और दुर्भावनापूर्णता का संकेत हो सकता है। Freeze ऐसा प्रक्रिया बनने और EDR के हुक लोड होने के बाद 'GetConsoleWindow' और 'ShowWindow' विंडोज फ़ंक्शन को कॉल करके, और फिर विंडो विशेषताओं को छिपा हुआ में बदलकर करता है। Freeze इन API का उपयोग पारंपरिक -ldflags -H=windowsgui के बजाय करता है, क्योंकि यह अत्यधिक हस्ताक्षरित है और अधिकांश सुरक्षा उत्पादों में समझौता के संकेतक के रूप में वर्गीकृत है।
यदि -console कमांड-लाइन विकल्प चुना जाता है, तो Freeze प्रक्रिया को पृष्ठभूमि में नहीं छिपाएगा। इसके बजाय, Freeze कई डीबग संदेश जोड़ेगा जो दिखाते हैं कि लोडर क्या कर रहा है।
AlternativeShellcodeExec विकसित करने के लिए aahmad097 को विशेष धन्यवाद
Garble विकसित करने के लिए mvdan को विशेष धन्यवाद