BumbleCrypt
Bumblebee से प्रेरित Crypter
पृष्ठभूमि
BumbleCrypt, Bumblebee के crypter से प्रेरित है; Bumblebee के मामले में मुख्य Bumblebee DLL को मेमोरी में लोड करके निम्नलिखित तरीके से निष्पादित किया जाता है:
- पेलोड को डिक्रिप्ट करके Heap में लिखता है
- तीन NtApi को हुक करता है - NtOpenFile, NtCreateSection और NtMapViewOfSection
- LoadLibraryW("gdiplus.dll") को कॉल करता है जो इनलाइन हुक को ट्रिगर करता है, क्योंकि उपरोक्त तीनों API LoadLibrary() द्वारा किसी भी लाइब्रेरी को लोड करने के लिए उपयोग किए जाते हैं।
- इनलाइन हुक और LoadLibrary स्वयं फिर मुख्य Bumblebee DLL को "gdiplus.dll" के स्थान पर लोड करते हैं
- अंत में, नियंत्रण मुख्य Bumblebee DLL के एक्सपोर्ट किए गए फ़ंक्शन "SetPath" को स्थानांतरित कर दिया जाता है
BumbleCrypt की कार्यप्रणाली
BumbleBee के crypter का विश्लेषण करते समय मुझे एहसास हुआ कि डिक्रिप्ट किए गए DLL को Bumblebee के Crypter में उपयोग किए गए तीन इनलाइन हुक के बजाय केवल "NtMapViewOfSection" पर एक इनलाइन हुक के साथ लोड किया जा सकता है।
परिणामस्वरूप "BumbleCrypt" विकसित किया गया।
BumbleCrypt निम्नलिखित कार्य करता है:
-
BumbleCrypt पहले .rsrc सेक्शन से एक एन्क्रिप्टेड रिसोर्स लोड करता है और फिर अंतिम DLL पेलोड को डिक्रिप्ट करता है: encrypted res -> Base64 decode -> Rc4 Decrypt -> xor decrypt
-
Crypter डिक्रिप्ट किए गए DLL पेलोड को स्टोर करने के लिए Bumblebee के crypter की तरह ही Heap का उपयोग करता है
-
एक बार अंतिम पेलोड डिक्रिप्ट हो जाने के बाद, BumbleCrypt NtApi "NtMapViewOfSection" को हुक करता है, जिसका उपयोग सेक्शन के व्यू को वर्चुअल एड्रेस स्पेस में मैप करने के लिए किया जाता है।
-
फिर BumbleCrypt LoadLibraryW("msimg32.dll") को कॉल करता है। अब आइए समझते हैं कि इनलाइन हुक कैसे ट्रिगर होता है:
- LoadLibraryW() पहले तर्क के रूप में पारित मॉड्यूल का हैंडल प्राप्त करने के लिए NtOpenFile को कॉल करता है
- फिर यह NtCreateSection का उपयोग करके मॉड्यूल के हैंडल के साथ एक सेक्शन ऑब्जेक्ट बनाता है
- अब एक बार सेक्शन बन जाने के बाद, LoadLibrary, सेक्शन के व्यू को मेमोरी में मैप करने के लिए NtMapViewOfSection को कॉल करता है
- यहाँ NtMapViewOfSection पर हमारा हुक ट्रिगर होता है, जहां प्रॉक्सी फ़ंक्शन निम्नलिखित क्रियाएँ करता है:
- सबसे पहले NtMapViewOfSection को अनहुक करता है
- NtCreateSection() का उपयोग करके आवश्यक आकार का एक सेक्शन बनाता है
- फिर पहले अनहुक किए गए NtMapViewOfSection का उपयोग करके बनाए गए सेक्शन के व्यू को वर्चुअल एड्रेस स्पेस में मैप करता है
- अंत में यह पहले डिक्रिप्ट किए गए अंतिम DLL को मेमोरी मैप किए गए सेक्शन के बेस एड्रेस पर मैन्युअली मैप करता है और फिर LoadLibraryW को NTSTATUS_SUCCESS लौटाकर प्रॉक्सी फ़ंक्शन से बाहर निकल जाता है
- LoadLibraryW को तब NtMapViewOfSection के प्रत्युत्तर में NTSTATUS_SUCCESS तथा मेमोरी मैप किए गए सेक्शन का बेस एड्रेस प्राप्त होता है, जहां डिक्रिप्ट किया गया दुर्भावनापूर्ण DLL मेमोरी में मौजूद होता है। आगे LoadLibrary रिटर्न वैल्यू के अनुसार DLL को लोड करता है; परिणाम यह होता है कि msimg32.dll लोड किए गए मॉड्यूल में दिखाई देता है, लेकिन वह डिक्रिप्ट किए गए पेलोड की ओर इंगित करता है। आगे Crypter एक्सपोर्ट किए गए फ़ंक्शन "CallPath" को निष्पादित करके नियंत्रण को डिक्रिप्ट किए गए DLL को स्थानांतरित करता है।
-
अब यदि हम BumbleCrypt के लोड किए गए मॉड्यूल के स्क्रीनशॉट को देखें, तो हम देख सकते हैं कि इसमें "msimg32.dll" शामिल है, लेकिन बेस एड्रेस डिक्रिप्ट किए गए दुर्भावनापूर्ण पेलोड की ओर इंगित करता है।
स्क्रीनशॉट


PoC - BumbleCrypter

बहुत-बहुत धन्यवाद! आशा है आपको यह पसंद आया होगा =D
Ciao.
यदि आपके पास कोई प्रतिक्रिया या टिप्पणी है, तो आप मुझसे Twitter पर संपर्क कर सकते हैं
Twitter: https://twitter.com/knight0x07
नोट
केवल शैक्षिक उद्देश्यों के लिए। यह एक व्यक्तिगत सप्ताहांत प्रोजेक्ट है =)