
CobaltWhispers is an aggressor script that utilizes a collection of Beacon Object Files (BOF) for Cobalt Strike to perform process injection, persistence and more, leveraging direct syscalls (SysWhispers2) to bypass EDR/AV
लेखक: @Cerbersec
CobaltWhispers एक एग्रेसर स्क्रिप्ट है जो Cobalt Strike के लिए Beacon Object Files के संग्रह का उपयोग करके प्रोसेस इंजेक्शन, पर्सिस्टेंस और अधिक कार्य करती है, EDR/AV को बायपास करने के लिए डायरेक्ट syscalls का लाभ उठाती है।
CobaltWhispers SysWhispers2 और InlineWhispers2 द्वारा संचालित है
CobaltWhispers StayKit तथा Hasherezade और Forrest Orr के कार्य पर आधारित है।
CobaltWhispers NVISO Security की Red Team में इंटर्नशिप के हिस्से के रूप में बनाया गया था। संबंधित ब्लॉगपोस्ट यहाँ (process-injection) और यहाँ (kernel karnage) पाए जा सकते हैं।
CobaltWhispers को कंपाइल करने के लिए कई टूल्स की आवश्यकता होती है:
apt install mingw-w64apt install makeप्रत्येक प्रोजेक्ट को कार्य करने के लिए SysWhispers2 / InlineWhispers2 द्वारा उत्पन्न 3 फाइलों की आवश्यकता होती है:
इन फाइलों को InlineWhispers2 प्रलेखन के अनुसार उत्पन्न किया जा सकता है, हालाँकि यह सर्वोत्तम तरीका नहीं है क्योंकि इसमें बहुत सारा अप्रयुक्त कोड शामिल होगा:
git clone https://github.com/Sh0ckFR/InlineWhispers2 && cd InlineWhispers2
cd SysWhispers2/ && python3 syswhispers.py --preset all -o syscalls_all && cd ..
python3 InlineWhispers2.py
इसके बजाय, केवल आवश्यक APIs के लिए आउटपुट फाइलें उत्पन्न करने हेतु SysWhispers2 का उपयोग करें, फिर उन्हें मैन्युअल रूप से (या स्क्रिप्ट द्वारा) InlineWhispers2 को दें जो उन्हें उचित प्रारूप में बदल देगा। अतिरिक्त जानकारी के लिए शामिल makefile देखें या शामिल फाइलों का उपयोग अपने जोखिम पर करें।
| पेलोड प्रकार | लक्ष्य | विश्वसनीयता (0-5) | एलिवेटेड | टिप्पणियाँ |
|---|---|---|---|---|
| - | - | 5 | नहीं | पैरेंट प्रक्रिया से अनुमतियाँ इनहेरिट करता है |
कोड इंटीग्रिटी गार्ड (CIG) सक्षम के साथ एक नई निलंबित प्रक्रिया स्पॉन करता है ताकि गैर-माइक्रोसॉफ्ट हस्ताक्षरित बाइनरी ब्लॉक हो सकें। निर्दिष्ट पैरेंट प्रक्रिया को स्पूफ करता है। PID लौटाया जाता है।
पैरेंट प्रक्रिया: पैरेंट के रूप में सेट करने के लिए प्रक्रिया का नाम
एक्ज़िक्यूटेबल स्थान: नई प्रक्रिया स्पॉन करने के लिए डिस्क पर एक्ज़िक्यूटेबल का पूरा पथ
| पेलोड प्रकार | लक्ष्य | विश्वसनीयता (0-5) | एलिवेटेड | टिप्पणियाँ |
|---|---|---|---|---|
| Shellcode/Raw | PID | 5 | नहीं | - |
NtCreateThreadEx का उपयोग करके एक रिमोट प्रोसेस में पेलोड इंजेक्ट करता है।
प्रक्रिया PID: रिमोट प्रक्रिया का प्रोसेस आईडी
पेलोड स्थान: डिस्क पर बाइनरी रूप में पेलोड का स्थान (सशर्त | वैकल्पिक)
पेलोड b64: बेस64 एन्कोडेड स्ट्रिंग प्रारूप में रॉ शेलकोड (सशर्त | वैकल्पिक)
लिसनर: पेलोड उत्पन्न करने के लिए लिसनर (सशर्त)
Beacon पेलोड उत्पन्न करने के लिए एक लिसनर निर्दिष्ट किया जाना चाहिए। यदि मैन्युअल पेलोड चाहिए, तो इसे डिस्क पर रॉ बाइनरी के पथ के माध्यम से, या बेस64 एन्कोडेड शेलकोड के रूप में प्रदान किया जाना चाहिए।
| पेलोड प्रकार | लक्ष्य | विश्वसनीयता (0-5) | एलिवेटेड | टिप्पणियाँ |
|---|---|---|---|---|
| Shellcode/Raw | PID | 2 | नहीं | संभावित रूप से लक्ष्य प्रक्रिया को क्रैश कर सकता है |
NtQueueApcThread का उपयोग करके एक रिमोट प्रोसेस में पेलोड इंजेक्ट करता है।
प्रक्रिया PID: रिमोट प्रक्रिया का प्रोसेस आईडी
थ्रेड्स: उन थ्रेड्स की संख्या जिनमें APC कॉल जोड़नी है
पेलोड स्थान: डिस्क पर बाइनरी रूप में पेलोड का स्थान (सशर्त | वैकल्पिक)
पेलोड b64: बेस64 एन्कोडेड स्ट्रिंग प्रारूप में रॉ शेलकोड (सशर्त | वैकल्पिक)
लिसनर: पेलोड उत्पन्न करने के लिए लिसनर (सशर्त)
Beacon पेलोड उत्पन्न करने के लिए एक लिसनर निर्दिष्ट किया जाना चाहिए। यदि मैन्युअल पेलोड चाहिए, तो इसे डिस्क पर रॉ बाइनरी के पथ के माध्यम से, या बेस64 एन्कोडेड शेलकोड के रूप में प्रदान किया जाना चाहिए।
| पेलोड प्रकार | लक्ष्य | विश्वसनीयता (0-5) | एलिवेटेड | टिप्पणियाँ |
|---|---|---|---|---|
| Shellcode/Raw | सरोगेट प्रोसेस | 5 | नहीं | - |
NtMapViewOfSection का उपयोग करके एक सरोगेट प्रोसेस में पेलोड इंजेक्ट करता है।
पैरेंट प्रक्रिया: पैरेंट के रूप में सेट करने के लिए प्रक्रिया का नाम
एक्ज़िक्यूटेबल स्थान: डिस्क पर एक्ज़िक्यूटेबल का स्थान जिसका उपयोग नई प्रक्रिया स्पॉन करने के लिए किया जाएगा
पेलोड स्थान: डिस्क पर बाइनरी रूप में पेलोड का स्थान (सशर्त | वैकल्पिक)
पेलोड b64: बेस64 एन्कोडेड स्ट्रिंग प्रारूप में रॉ शेलकोड (सशर्त | वैकल्पिक)
लिसनर: पेलोड उत्पन्न करने के लिए लिसनर (सशर्त)
Beacon पेलोड उत्पन्न करने के लिए एक लिसनर निर्दिष्ट किया जाना चाहिए। यदि मैन्युअल पेलोड चाहिए, तो इसे डिस्क पर रॉ बाइनरी के पथ के माध्यम से, या बेस64 एन्कोडेड शेलकोड के रूप में प्रदान किया जाना चाहिए।
| पेलोड प्रकार | लक्ष्य | विश्वसनीयता (0-5) | एलिवेटेड | टिप्पणियाँ |
|---|---|---|---|---|
| PE | सरोगेट प्रोसेस | 5 | नहीं | x64 PE पेलोड की आवश्यकता है |
ट्रांज़ैक्टेड सेक्शन और मैप्ड व्यू का उपयोग करके एक सरोगेट प्रोसेस में पेलोड इंजेक्ट करता है। रिमोट एंट्री पॉइंट और PEB अपडेट किए जाते हैं, कोई असामान्य मेमोरी सेक्शन या मेमोरी अनुमतियाँ नहीं होतीं। अधिक जानकारी के लिए यहाँ देखें।
पैरेंट प्रक्रिया: पैरेंट के रूप में सेट करने के लिए प्रक्रिया का नाम
एक्ज़िक्यूटेबल स्थान: डिस्क पर एक्ज़िक्यूटेबल का स्थान जिसका उपयोग नई प्रक्रिया स्पॉन करने के लिए किया जाएगा
पेलोड स्थान: डिस्क पर x64 PE पेलोड का स्थान (सशर्त | वैकल्पिक)
पेलोड b64: बेस64 एन्कोडेड स्ट्रिंग प्रारूप में x64 PE पेलोड (सशर्त | वैकल्पिक)
लिसनर: पेलोड उत्पन्न करने के लिए लिसनर (सशर्त)
Beacon पेलोड उत्पन्न करने के लिए एक लिसनर निर्दिष्ट किया जाना चाहिए। यदि मैन्युअल पेलोड चाहिए, तो इसे डिस्क पर x64 PE के पथ के माध्यम से, या बेस64 एन्कोडेड x64 PE के रूप में प्रदान किया जाना चाहिए।
वर्तमान में कार्यान्वित नहीं किया गया है
| पेलोड प्रकार | लक्ष्य | विश्वसनीयता (0-5) | एलिवेटेड | टिप्पणियाँ |
|---|---|---|---|---|
| Position Independent Shellcode (PIC) | सरोगेट प्रोसेस | 5 | हाँ | सिस्टम DLL को लेखन अनुमतियों के साथ खोलने के लिए एलिवेटेड अनुमतियों की आवश्यकता होती है |
ट्रांज़ैक्टेड सेक्शन का उपयोग DLL हॉलोइंग के साथ संयोजन में करके एक सरोगेट प्रोसेस में पेलोड इंजेक्ट करता है। अधिक जानकारी के लिए यहाँ देखें।
पैरेंट प्रक्रिया: पैरेंट के रूप में सेट करने के लिए प्रक्रिया का नाम
एक्ज़िक्यूटेबल स्थान: डिस्क पर एक्ज़िक्यूटेबल का स्थान जिसका उपयोग नई प्रक्रिया स्पॉन करने के लिए किया जाएगा
पेलोड स्थान: डिस्क पर बाइनरी रूप में पेलोड का स्थान (सशर्त | वैकल्पिक)
पेलोड b64: बेस64 एन्कोडेड स्ट्रिंग प्रारूप में रॉ शेलकोड (सशर्त | वैकल्पिक)
लिसनर: पेलोड उत्पन्न करने के लिए लिसनर (सशर्त)
Beacon पेलोड उत्पन्न करने के लिए एक लिसनर निर्दिष्ट किया जाना चाहिए। यदि मैन्युअल पेलोड चाहिए, तो इसे डिस्क पर रॉ बाइनरी के पथ के माध्यम से, या बेस64 एन्कोडेड शेलकोड के रूप में प्रदान किया जाना चाहिए।
निर्दिष्ट स्थान पर एक रजिस्ट्री कुंजी बनाएँ या संशोधित करें।
कुंजी नाम: वैल्यू नाम
कमांड: रजिस्ट्री उपयोग होने पर चलाया जाने वाला कमांड
रजिस्ट्री कुंजी: वह स्थान जहाँ रजिस्ट्री कुंजी बनाई जाएगी
छिपा हुआ: कुंजी नाम में एक नल बाइट जोड़ देगा; regedit में त्रुटियाँ उत्पन्न करता है
सफाई: बनाई गई कुंजी को हटाता है
सफाई के लिए कुंजी नाम और रजिस्ट्री कुंजी (स्थान) की आवश्यकता होती है।
निर्दिष्ट स्थान पर एक रजिस्ट्री कुंजी बनाएँ या संशोधित करें।
कुंजी नाम: वैल्यू नाम
कमांड: रजिस्ट्री उपयोग होने पर चलाया जाने वाला कमांड
रजिस्ट्री कुंजी: वह स्थान जहाँ रजिस्ट्री कुंजी बनाई जाएगी
छिपा हुआ: कुंजी नाम में एक नल बाइट जोड़ देगा; regedit में त्रुटियाँ उत्पन्न करता है
सफाई: बनाई गई कुंजी को हटाता है
सफाई के लिए कुंजी नाम और रजिस्ट्री कुंजी (स्थान) की आवश्यकता होती है।
UserInit: स्वचालित रूप से 'कुंजी नाम' और 'रजिस्ट्री कुंजी' सेट करता है।
निर्दिष्ट स्थान पर एक रजिस्ट्री कुंजी बनाएँ या संशोधित करें।
कुंजी नाम: वैल्यू नाम
कमांड: रजिस्ट्री उपयोग होने पर चलाया जाने वाला कमांड
रजिस्ट्री कुंजी: वह स्थान जहाँ रजिस्ट्री कुंजी बनाई जाएगी
छिपा हुआ: कुंजी नाम में एक नल बाइट जोड़ देगा; regedit में त्रुटियाँ उत्पन्न करता है
सफाई: बनाई गई कुंजी को हटाता है
सफाई के लिए कुंजी नाम और रजिस्ट्री कुंजी (स्थान) की आवश्यकता होती है।
निर्दिष्ट स्थान पर एक रजिस्ट्री कुंजी बनाएँ या संशोधित करें।
कुंजी नाम: वैल्यू नाम
कमांड: रजिस्ट्री उपयोग होने पर चलाया जाने वाला कमांड
रजिस्ट्री कुंजी: वह स्थान जहाँ रजिस्ट्री कुंजी बनाई जाएगी
छिपा हुआ: कुंजी नाम में एक नल बाइट जोड़ देगा; regedit में त्रुटियाँ उत्पन्न करता है
सफाई: बनाई गई कुंजी को हटाता है
सफाई के लिए कुंजी नाम और रजिस्ट्री कुंजी (स्थान) की आवश्यकता होती है।
UserInitMprLogonScript: स्वचालित रूप से 'कुंजी नाम' और 'रजिस्ट्री कुंजी' सेट करता है।
एक शेड्यूल्ड टास्क के COM हैंडलर को हाईजैक करता है। HKCU:\Software\Classes\CLSID\\InprocServer32 पर एक रजिस्ट्री कुंजी बनाता है जो एक DLL को इंगित करती है।
क्लास आईडी: वह CLSID जो टास्क के COM हैंडलर CLSID से मेल खाता है
DLL पथ: उस DLL का पथ जिसे लोड किया जाना है
सफाई: बनाई गई कुंजी को हटाता है
| विश्वसनीयता (0-5) | एलिवेटेड | टिप्पणियाँ |
|---|---|---|
| 4 | हाँ | संभावित रूप से लक्ष्य सिस्टम को BSOD कर सकता है |
कर्नेल मेमोरी में मनमाना रीड/राइट करने वाला एक कमजोर हस्ताक्षरित ड्राइवर (NalDrv/iqvm64.sys) लोड करता है। Driver Signature Enforcement (DSE) को अक्षम करने के लिए ntoskrnl.exe g_CiEnabled या CI.dll g_CiOptions फ्लैग को बदलता है।
एक गैर-हस्ताक्षरित ड्राइवर (Interceptor/Interceptor.sys) लोड करता है, फिर DSE फ्लैग मानों को पुनर्स्थापित करता है। हस्ताक्षरित और गैर-हस्ताक्षरित दोनों ड्राइवर डिस्क पर लिखे जाते हैं।
| ड्राइवर | MD5 checksum |
|---|---|
| iqvm64.sys | 1898ceda3247213c084f43637ef163b3 |
| Interceptor.sys | 508c8943359717cfa0c77b61ebea2118 |
कमजोर ड्राइवर स्थान: डिस्क पर बाइनरी रूप में कमजोर हस्ताक्षरित ड्राइवर का स्थान
दुर्भावनापूर्ण ड्राइवर स्थान: डिस्क पर बाइनरी रूप में दुर्भावनापूर्ण गैर-हस्ताक्षरित ड्राइवर का स्थान
कमजोर ड्राइवर नाम: रजिस्ट्री कुंजी '\Registry\Machine\System\CurrentControlSet\Services\' बनाने के लिए उपयोग किया जाने वाला नाम
कमजोर ड्राइवर डिवाइस नाम: ड्राइवर से संपर्क करने के लिए उपयोग किया जाने वाला नाम '\DosDevices\'
दुर्भावनापूर्ण ड्राइवर नाम: रजिस्ट्री कुंजी '\Registry\Machine\System\CurrentControlSet\Services\' बनाने के लिए उपयोग किया जाने वाला नाम
दुर्भावनापूर्ण ड्राइवर डिवाइस नाम: ड्राइवर से संपर्क करने के लिए उपयोग किया जाने वाला नाम '\DosDevices\'
लक्ष्य पथ: कमजोर और दुर्भावनापूर्ण ड्राइवर फाइलों को लिखने के लिए अस्थायी पथ
| विश्वसनीयता (0-5) | एलिवेटेड | टिप्पणियाँ |
|---|---|---|
| 5 | हाँ | - |
प्रदान की गई रजिस्ट्री कुंजी का उपयोग करके लक्ष्य पर एक ड्राइवर अनलोड करता है और निर्दिष्ट पथ पर डिस्क से बाइनरी हटा देता है।
ड्राइवर रजिस्ट्री कुंजी: ड्राइवर अनलोड करने के लिए उपयोग की जाने वाली रजिस्ट्री कुंजी '\Registry\Machine\System\CurrentControlSet\Services\'
ड्राइवर स्थापना पथ: डिस्क पर ड्राइवर का स्थान
| विश्वसनीयता (0-5) | एलिवेटेड | टिप्पणियाँ |
|---|---|---|
| 4 | नहीं | संभावित रूप से लक्ष्य सिस्टम को BSOD कर सकता है |
जानकारी: Interceptor ड्राइवर से क्वेरी करें
हुक: लक्ष्य ड्राइवर के प्रमुख कार्यों (IRP) को हुक करें
अनहुक: लक्ष्य ड्राइवर के प्रमुख कार्यों को पुनर्स्थापित करें
पैच: लक्ष्य कर्नेल कॉलबैक को पैच करें
रीस्टोर: लक्ष्य कर्नेल कॉलबैक को पुनर्स्थापित करें
विक्रेता: समर्थित विक्रेताओं को प्रदर्शित करें
मॉड्यूल: सभी लोडेड ड्राइवरों को क्वेरी करें
हुक किए गए मॉड्यूल: सभी हुक किए गए ड्राइवरों को प्रदर्शित करें
कॉलबैक: सभी पंजीकृत कॉलबैक को क्वेरी करें
इंडेक्स: इंडेक्स द्वारा ड्राइवर हुक करें (देखें: जानकारी - मॉड्यूल)
नाम: डिवाइस नाम द्वारा ड्राइवर हुक करें (\Device\Name)
मान: इंडेक्स की अल्पविराम से अलग सूची (सशर्त)
नाम: लक्ष्य ड्राइवर का डिवाइस नाम (सशर्त)
जब 'Index' चुना जाता है तो Values आवश्यक हैं। जब 'Name' चुना जाता है तो Name आवश्यक है।
इंडेक्स: इंडेक्स द्वारा ड्राइवर अनहुक करें (देखें: जानकारी - हुक किए गए मॉड्यूल)
सभी: सभी हुक किए गए ड्राइवरों को अनहुक करें
मान: इंडेक्स की अल्पविराम से अलग सूची (सशर्त)
जब 'Index' चुना जाता है तो Values आवश्यक हैं।
विक्रेता: विक्रेता मॉड्यूल(s) से जुड़े सभी कॉलबैक पैच करें
मॉड्यूल: मॉड्यूल(s) से जुड़े सभी कॉलबैक पैच करें
प्रक्रिया: प्रोसेस कॉलबैक(s) पैच करें
थ्रेड: थ्रेड कॉलबैक(s) पैच करें
छवि: इमेज कॉलबैक(s) पैच करें
रजिस्ट्री: रजिस्ट्री कॉलबैक(s) पैच करें
ऑब्जेक्ट प्रोसेस: ऑब्जेक्ट प्रोसेस कॉलबैक(s) पैच करें
ऑब्जेक्ट थ्रेड: ऑब्जेक्ट थ्रेड कॉलबैक(s) पैच करें
मान: इंडेक्स की अल्पविराम से अलग सूची (देखें: जानकारी - कॉलबैक) (सशर्त)
नाम: मॉड्यूल नामों की अल्पविराम से अलग सूची या एकल विक्रेता नाम (देखें: जानकारी - विक्रेता) (सशर्त)
जब 'process', 'thread', 'image', 'registry', 'object process' या 'object thread' चुना जाता है तो Values आवश्यक हैं। जब 'vendor' या 'module' चुना जाता है तो Name आवश्यक है।
विक्रेता: विक्रेता मॉड्यूल(s) से जुड़े सभी कॉलबैक रीस्टोर करें
मॉड्यूल: मॉड्यूल(s) से जुड़े सभी कॉलबैक रीस्टोर करें
प्रक्रिया: प्रोसेस कॉलबैक(s) रीस्टोर करें
थ्रेड: थ्रेड कॉलबैक(s) रीस्टोर करें
छवि: इमेज कॉलबैक(s) रीस्टोर करें
रजिस्ट्री: रजिस्ट्री कॉलबैक(s) रीस्टोर करें
ऑब्जेक्ट प्रोसेस: ऑब्जेक्ट प्रोसेस कॉलबैक(s) रीस्टोर करें
ऑब्जेक्ट थ्रेड: ऑब्जेक्ट थ्रेड कॉलबैक(s) रीस्टोर करें
सभी: सभी कॉलबैक रीस्टोर करें
मान: इंडेक्स की अल्पविराम से अलग सूची (देखें: जानकारी - कॉलबैक) (सशर्त)
नाम: मॉड्यूल नामों की अल्पविराम से अलग सूची या एकल विक्रेता नाम (देखें: जानकारी - विक्रेता) (सशर्त)
जब 'process', 'thread', 'image', 'registry', 'object process' या 'object thread' चुना जाता है तो Values आवश्यक हैं। जब 'vendor' या 'module' चुना जाता है तो Name आवश्यक है।