
x86, x64, या AMD64+x86 पोजीशन-इंडिपेंडेंट शेलकोड उत्पन्न करता है जो .NET असेंब्लियों, PE फ़ाइलों, और अन्य Windows पेलोड्स को मेमोरी से लोड करता है और उन्हें पैरामीटर के साथ चलाता है।

वर्तमान संस्करण: v1.1
Donut एक स्थिति-स्वतंत्र कोड है जो VBScript, JScript, EXE, DLL फ़ाइलों और dotNET असेंबलीज़ का इन-मेमोरी निष्पादन सक्षम बनाता है। Donut द्वारा बनाया गया मॉड्यूल या तो HTTP सर्वर से स्टेज किया जा सकता है या लोडर के अंदर ही एम्बेड किया जा सकता है। मॉड्यूल वैकल्पिक रूप से Chaskey ब्लॉक सिफर और 128-बिट यादृच्छिक रूप से उत्पन्न कुंजी का उपयोग करके एन्क्रिप्ट किया जाता है। फ़ाइल को मेमोरी में लोड और निष्पादित करने के बाद, मूल संदर्भ को मिटा दिया जाता है ताकि मेमोरी स्कैनर को धोखा दिया जा सके। जनरेटर और लोडर निम्नलिखित सुविधाओं का समर्थन करते हैं:
लिनक्स और विंडोज दोनों के लिए डायनामिक और स्टैटिक लाइब्रेरीज़ उपलब्ध हैं जिन्हें आप अपनी परियोजनाओं में एकीकृत कर सकते हैं। एक पायथन मॉड्यूल भी है जिसके बारे में आप पायथन एक्सटेंशन के निर्माण और उपयोग में अधिक पढ़ सकते हैं।
Donut में प्रत्येक समर्थित फ़ाइल प्रकार के लिए अलग-अलग लोडर होते हैं। dotNET EXE/DLL असेंबली के लिए, Donut कॉमन लैंग्वेज रनटाइम (CLR) को लोड करने के लिए अनमैनेज्ड CLR होस्टिंग API का उपयोग करता है। एक बार CLR होस्ट प्रक्रिया में लोड हो जाने के बाद, एक नया एप्लीकेशन डोमेन बनाया जाता है ताकि डिस्पोज़ेबल AppDomains में असेंबली को चलाया जा सके। जब AppDomain तैयार हो जाता है, तो dotNET असेंबली को AppDomain.Load_3 विधि के माध्यम से लोड किया जाता है। अंत में, EXE के लिए एंट्री पॉइंट या DLL के लिए उपयोगकर्ता द्वारा निर्दिष्ट सार्वजनिक विधि को किसी भी अतिरिक्त पैरामीटर के साथ आमंत्रित किया जाता है। अनमैनेज्ड CLR होस्टिंग API के दस्तावेज़ीकरण के लिए MSDN देखें। CLR होस्ट के एक स्टैंडअलोन उदाहरण के लिए, यहाँ कोड देखें।
VBScript और JScript फ़ाइलों को IActiveScript इंटरफ़ेस का उपयोग करके निष्पादित किया जाता है। विंडोज स्क्रिप्ट होस्ट (wscript/cscript) द्वारा प्रदान की गई कुछ विधियों के लिए न्यूनतम समर्थन भी है। एक स्टैंडअलोन उदाहरण के लिए, यहाँ कोड देखें। अधिक विस्तृत विवरण के लिए, पढ़ें: जावास्क्रिप्ट, VBScript, JScript और XSL का इन-मेमोरी निष्पादन
अनमैनेज्ड या देशी EXE/DLL फ़ाइलों को विलंबित आयात, TLS और कमांड लाइन को पैच करने के समर्थन के साथ एक कस्टम PE लोडर का उपयोग करके निष्पादित किया जाता है। केवल वे फ़ाइलें समर्थित हैं जिनमें रिलोकेशन जानकारी होती है। अधिक जानकारी के लिए DLL का इन-मेमोरी निष्पादन पढ़ें।
लोडर मेमोरी में निष्पादित दुर्भावनापूर्ण फ़ाइलों का पता लगाने से बचने में मदद करने के लिए AMSI और WLDP को अक्षम कर सकता है। अधिक जानकारी के लिए, रेड टीम्स .NET डायनामिक कोड के लिए AMSI और WLDP को कैसे बायपास करती हैं पढ़ें। यह aPLib या RtlDecompressBuffer API का उपयोग करके मेमोरी में फ़ाइलों के डीकंप्रेसन का भी समर्थन करता है। अधिक जानकारी के लिए डेटा संपीड़न पढ़ें।
v1.0 के अनुसार, ETW को भी बायपास किया गया है। AMSI/WLDP की तरह, यह एक मॉड्यूलर सिस्टम है जो आपको डिफ़ॉल्ट बायपास को अपने स्वयं के साथ बदलने की अनुमति देता है। डिफ़ॉल्ट बायपास XPN के शोध से लिया गया है। अधिक जानकारी के लिए अपने .NET को छिपाना - ETW पढ़ें।
डिफ़ॉल्ट रूप से, लोडर अनमैनेज्ड PE के PE हेडर को अधिलेखित कर देगा (आधार पते से `IMAGE_OPTIONAL_HEADER.SizeOfHeaders` तक)। यदि कोई डिकॉय मॉड्यूल (मॉड्यूल ओवरलोडिंग) का उपयोग नहीं किया जाता है, तो PE हेडर शून्य कर दिए जाएंगे। यदि डिकॉय मॉड्यूल का उपयोग किया जाता है, तो डिकॉय मॉड्यूल के PE हेडर का उपयोग पेलोड मॉड्यूल के हेडर को अधिलेखित करने के लिए किया जाएगा। यह मेमोरी में मॉड्यूल के PE हेडर की तुलना डिस्क पर उनकी फ़ाइल बैकिंग से करके पता लगाने को रोकने के लिए है। उपयोगकर्ता अनुरोध कर सकता है कि सभी PE हेडर अपनी मूल स्थिति में संरक्षित रहें। यह उन परिदृश्यों के लिए सहायक है जहाँ पेलोड मॉड्यूल को अपने PE हेडर तक पहुँचने की आवश्यकता होती है, जैसे कि एम्बेडेड PE संसाधनों को देखते समय।
जनरेटर का उपयोग करके विस्तृत वॉकथ्रू और Donut ट्रेडक्राफ्ट को कैसे प्रभावित करता है, इसके लिए Donut - .NET असेंबली को शेलकोड के रूप में इंजेक्ट करना पढ़ें। लोडर के बारे में अधिक जानकारी के लिए, मेमोरी से .NET असेंबली लोड करना पढ़ें।
जो लोग आंतरिक कार्यप्रणाली के बारे में अधिक जानना चाहते हैं, वे डेवलपर नोट्स देखें।
बिल्ड दो प्रकार के होते हैं। यदि आप Donut को डीबग करना चाहते हैं, तो कृपया यहाँ दस्तावेज़ीकरण देखें। यदि नहीं, तो रिलीज़ बिल्ड के लिए पढ़ना जारी रखें।
विंडोज कमांड प्रॉम्प्ट या लिनक्स टर्मिनल से, रिपॉजिटरी को क्लोन करें।
git clone http://github.com/thewover/donut.git
अगला कदम आपके ऑपरेटिंग सिस्टम और आपके द्वारा उपयोग किए जाने वाले कंपाइलर पर निर्भर करता है। वर्तमान में, Donut के लिए जनरेटर और लोडर टेम्पलेट को Microsoft Visual Studio 2019 और MingGW-64 दोनों के साथ सफलतापूर्वक संकलित किया जा सकता है। अपने स्वयं के C/C++ प्रोजेक्ट में लाइब्रेरीज़ का उपयोग करने के लिए, कृपया यहाँ दिए गए उदाहरण देखें।
लोडर टेम्पलेट, डायनामिक लाइब्रेरी donut.dll, स्टैटिक लाइब्रेरी donut.lib और जनरेटर donut.exe उत्पन्न करने के लिए। x64 Microsoft Visual Studio डेवलपर कमांड प्रॉम्प्ट प्रारंभ करें, उस निर्देशिका में बदलें जहाँ आपने Donut रिपॉजिटरी को क्लोन किया है और निम्नलिखित दर्ज करें:
nmake -f Makefile.msvc
वही करने के लिए, विंडोज या लिनक्स पर MinGW-64 का उपयोग करके, उस निर्देशिका में बदलें जहाँ आपने Donut रिपॉजिटरी को क्लोन किया है और निम्नलिखित दर्ज करें:
make -f Makefile.mingw
डायनामिक लाइब्रेरी donut.so, स्टैटिक लाइब्रेरी donut.a और जनरेटर donut उत्पन्न करने के लिए। उस निर्देशिका में बदलें जहाँ आपने Donut रिपॉजिटरी को क्लोन किया है और बस make टाइप करें।
Donut को पायथन मॉड्यूल के रूप में स्थापित और उपयोग किया जा सकता है। स्रोत से स्थापित करने के लिए Python3 के लिए pip की आवश्यकता होती है। पहले, सुनिश्चित करें कि donut-shellcode के पुराने संस्करण स्थापित नहीं हैं, इसके लिए लिनक्स टर्मिनल या Microsoft Visual Studio कमांड प्रॉम्प्ट पर निम्नलिखित कमांड जारी करें।
pip3 uninstall donut-shellcode
पुराने संस्करणों की अनुपस्थिति की पुष्टि करने के बाद, निम्नलिखित कमांड जारी करें।
pip3 install .
आप Donut को PyPi रिपॉजिटरी से प्राप्त करके पायथन मॉड्यूल के रूप में भी स्थापित कर सकते हैं।
pip3 install donut-shellcode
अधिक जानकारी के लिए, कृपया पायथन एक्सटेंशन के निर्माण और उपयोग देखें।
डॉकर कंटेनर का निर्माण।
docker build -t donut .
Donut चलाना।
docker run -it --rm -v "${PWD}:/workdir" donut -h
Donut में कई अन्य निष्पादन योग्य शामिल हैं जिन्हें अलग से बनाया जा सकता है। इनमें "hash.exe", "encrypt.exe", "inject.exe", और "inject_local.exe" शामिल हैं। पहले दो का उपयोग शेलकोड निर्माण में किया जाता है। अंतिम दो Donut शेलकोड के परीक्षण में सहायता के लिए प्रदान किए गए हैं। "inject.exe" एक रॉ बाइनरी फ़ाइल (loader.bin) को उसके PID या प्रक्रिया नाम द्वारा किसी प्रक्रिया में इंजेक्ट करेगा। "inject_local.exe" एक रॉ बाइनरी फ़ाइल को अपनी प्रक्रिया में इंजेक्ट करेगा।
इन सहायक निष्पादन योग्य फ़ाइलों को अलग से बनाने के लिए आप MSVC मेकफ़ाइल का उपयोग कर सकते हैं। उदाहरण के लिए, अपने Donut शेलकोड का परीक्षण करने के लिए "inject_local.exe" बनाने के लिए, आप चला सकते हैं।
nmake inject_local -f Makefile.msvc
Donut के प्रत्येक रिलीज़ संस्करण के लिए टैग प्रदान किए गए हैं जिनमें संकलित निष्पादन योग्य फ़ाइलें हैं।
वर्तमान में, दो अन्य जनरेटर उपलब्ध हैं।
निम्न तालिका जनरेटर के कमांड लाइन संस्करण द्वारा समर्थित स्विच को सूचीबद्ध करती है।
Donut द्वारा आपके पेलोड को सफलतापूर्वक लोड करने के लिए कुछ विशिष्ट आवश्यकताएँ हैं।
Cygwin निष्पादन योग्य फ़ाइलें आरंभीकरण रूटीन का उपयोग करती हैं जो होस्ट प्रक्रिया के डिस्क से चलने की अपेक्षा करती हैं। यदि मेमोरी से निष्पादित किया जाता है, तो होस्ट प्रक्रिया संभवतः क्रैश हो जाएगी।
Donut के साथ चार सहयोगी परियोजनाएँ प्रदान की गई हैं:
आप अधिक प्रकार के पेलोड के लिए समर्थन जोड़ना चाह सकते हैं, हमारी सुविधा सेट बदल सकते हैं, या Donut को अपने मौजूदा टूलिंग में एकीकृत कर सकते हैं। हमने डेवलपर दस्तावेज़ीकरण प्रदान किया है। अतिरिक्त सुविधाएँ पाठक के लिए अभ्यास के रूप में छोड़ दी गई हैं। हमारे सुझाव:
यदि आपके पास Donut के बारे में कोई प्रश्न या टिप्पणी है। BloodHound Gang Slack में #Donut चैनल से जुड़ें।
हम इस सॉफ़्टवेयर या तकनीक के किसी भी दुरुपयोग के लिए जिम्मेदार नहीं हैं। Donut को CLR इंजेक्शन और शेलकोड के माध्यम से इन-मेमोरी लोडिंग के प्रदर्शन के रूप में प्रदान किया जाता है ताकि रेड टीम के सदस्यों को विरोधियों का अनुकरण करने और डिफेंडरों को एनालिटिक्स और शमन बनाने के लिए संदर्भ का एक फ्रेम प्रदान किया जा सके। इससे अनिवार्य रूप से मैलवेयर लेखकों और खतरे वाले कलाकारों द्वारा इसके दुरुपयोग का जोखिम रहता है। हालाँकि, हमारा मानना है कि शुद्ध लाभ जोखिम से अधिक है। उम्मीद है कि यह सही है। यदि EDR या AV उत्पाद हस्ताक्षर या व्यवहार पैटर्न के माध्यम से Donut का पता लगाने में सक्षम हैं, तो हम हस्ताक्षर या पता लगाने के तरीकों का मुकाबला करने के लिए Donut को अपडेट नहीं करेंगे। नाराज होने से बचने के लिए, कृपया पूछें नहीं।
| स्विच | तर्क | विवरण |
|---|---|---|
| -a | arch | लोडर के लिए लक्ष्य आर्किटेक्चर : 1=x86, 2=amd64, 3=x86+amd64 (डिफ़ॉल्ट)। |
| -b | level | AMSI/WLDP को बायपास करने का व्यवहार : 1=कोई नहीं, 2=विफलता पर रोकें, 3=विफलता पर जारी रखें (डिफ़ॉल्ट)। |
| -k | headers | PE हेडर को संरक्षित करें। 1=अधिलेखित करें (डिफ़ॉल्ट), 2=सभी रखें |
| -j | decoy | मॉड्यूल ओवरलोडिंग के लिए डिकॉय मॉड्यूल का वैकल्पिक पथ। |
| -c | class | वैकल्पिक वर्ग का नाम। (.NET DLL के लिए आवश्यक) नेमस्पेस भी शामिल हो सकता है: जैसे namespace.class |
| -d | name | .NET के लिए बनाने के लिए AppDomain का नाम। यदि एन्ट्रॉपी सक्षम है, तो यादृच्छिक रूप से उत्पन्न किया जाएगा। |
| -e | level | एन्ट्रॉपी स्तर। 1=कोई नहीं, 2=यादृच्छिक नाम उत्पन्न करें, 3=यादृच्छिक नाम उत्पन्न करें + सममित एन्क्रिप्शन का उपयोग करें (डिफ़ॉल्ट) |
| -f | format | फ़ाइल में सहेजे गए लोडर का आउटपुट प्रारूप। 1=बाइनरी (डिफ़ॉल्ट), 2=Base64, 3=C, 4=Ruby, 5=Python, 6=PowerShell, 7=C#, 8=हेक्साडेसिमल |
| -m | name | DLL के लिए वैकल्पिक विधि या फ़ंक्शन। (.NET DLL के लिए विधि आवश्यक है) |
| -n | name | HTTP स्टेजिंग के लिए मॉड्यूल का नाम। यदि एन्ट्रॉपी सक्षम है, तो यादृच्छिक रूप से उत्पन्न किया जाता है। |
| -o | path | निर्दिष्ट करता है कि Donut लोडर को कहाँ सहेजे। वर्तमान निर्देशिका में डिफ़ॉल्ट "loader.bin" है। |
| -p | parameters | DLL विधि/फ़ंक्शन या EXE के लिए उद्धरणों के अंदर वैकल्पिक पैरामीटर/कमांड लाइन। |
| -r | version | CLR रनटाइम संस्करण। डिफ़ॉल्ट रूप से MetaHeader का उपयोग किया जाता है या यदि कोई उपलब्ध नहीं है तो v4.0.30319। |
| -s | server | HTTP सर्वर का URL जो एक Donut मॉड्यूल होस्ट करेगा। क्रेडेंशियल्स निम्नलिखित प्रारूप में प्रदान किए जा सकते हैं: https://username:[email protected]/ |
| -t | एक अनमैनेज्ड/नेटिव EXE के एंट्रीपॉइंट को एक थ्रेड के रूप में चलाएं और थ्रेड के समाप्त होने की प्रतीक्षा करें। | |
| -w | कमांड लाइन UNICODE प्रारूप में अनमैनेज्ड DLL फ़ंक्शन को पास की जाती है। (डिफ़ॉल्ट ANSI है) | |
| -x | option | निर्धारित करता है कि लोडर को कैसे बाहर निकलना चाहिए। 1=थ्रेड से बाहर निकलें (डिफ़ॉल्ट), 2=प्रक्रिया से बाहर निकलें, 3=बाहर न निकलें या साफ़ न करें और अनिश्चित काल तक अवरुद्ध रहें |
| -y | addr | लोडर के लिए एक नया थ्रेड बनाता है और होस्ट प्रक्रिया के निष्पादन योग्य के सापेक्ष एक ऑफसेट पते पर निष्पादन जारी रखता है। प्रदान किया गया मान ऑफसेट है। यह विकल्प उन लोडरों का समर्थन करता है जो donut के निष्पादन को पूरा करने के बाद होस्ट प्रक्रिया के निष्पादन को फिर से शुरू करना चाहते हैं। |
| -z | engine | इनपुट फ़ाइल को पैक/संपीड़ित करें। 1=कोई नहीं, 2=aPLib, 3=LZNT1, 4=Xpress, 5=Xpress Huffman। वर्तमान में, अंतिम तीन केवल विंडोज पर समर्थित हैं। |
| उपकरण | विवरण |
|---|---|
| DemoCreateProcess | परीक्षण में उपयोग करने के लिए एक नमूना .NET असेंबली। दो कमांड-लाइन पैरामीटर लेता है, प्रत्येक निष्पादित करने के लिए एक प्रोग्राम निर्दिष्ट करता है। |
| DonutTest | Donut के परीक्षण में उपयोग करने के लिए एक सरल C# शेलकोड इंजेक्टर। शेलकोड को base64 एन्कोडेड होना चाहिए और एक स्ट्रिंग के रूप में कॉपी किया जाना चाहिए। |
| ModuleMonitor | एक प्रूफ-ऑफ-कॉन्सेप्ट टूल जो CLR इंजेक्शन का पता लगाता है जैसा कि Donut और Cobalt Strike के execute-assembly जैसे टूल द्वारा किया जाता है। |
| ProcessManager | एक प्रक्रिया खोज उपकरण जिसका उपयोग आक्रामक ऑपरेटर यह निर्धारित करने के लिए कर सकते हैं कि किसमें इंजेक्ट किया जाए और रक्षात्मक ऑपरेटर यह निर्धारित करने के लिए कर सकते हैं कि क्या चल रहा है, उन प्रक्रियाओं में क्या गुण हैं, और उनमें CLR लोड है या नहीं। |