
RunPE तकनीक का VBA कार्यान्वयन या एप्लिकेशन व्हाइटलिस्टिंग को कैसे बायपास करें
VBA में RunPE तकनीक का एक सरल लेकिन प्रभावी कार्यान्वयन। इस कोड का उपयोग Word या Excel की मेमोरी से निष्पादन योग्य फ़ाइलों को चलाने के लिए किया जा सकता है। यह Microsoft Office 2010 और उसके ऊपर के 32-बिट और 64-बिट दोनों संस्करणों के साथ संगत है।
अधिक जानकारी यहाँ: https://itm4n.github.io/vba-runpe-part1/ https://itm4n.github.io/vba-runpe-part2/

Exploit प्रक्रिया में, उस फ़ाइल का पथ सेट करें जिसे आप निष्पादित करना चाहते हैं।strSrcFile = "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"
/!\ यदि आप 64-बिट OS पर Microsoft Office का 32-बिट संस्करण उपयोग कर रहे हैं, तो आपको 32-बिट बाइनरी निर्दिष्ट करनी होगी।
strSrcFile = "C:\Windows\SysWOW64\cmd.exe"
strSrcFile = "C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe"
strArguments = "-exec Bypass"
इसका उपयोग निम्नलिखित कमांड लाइन बनाने के लिए किया जाएगा:
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -exec Bypass
(वैकल्पिक) निष्पादन और त्रुटि लॉग जांचने के लिए View > Immediate Window (Ctrl+G) सक्षम करें।
Exploit मैक्रो चलाएँ!
pe2vba.py का उपयोग करें। इस तरह, इसे सीधे मैक्रो में एम्बेड किया जा सकता है।user@host:~/Tools/VBA-RunPE$ ./pe2vba.py meterpreter.exe
[+] फ़ाइल 'meterpreter.exe.vba' बनाई गई।
RunPE.vba में निम्नलिखित कोड को पिछले चरण में जनरेट की गई .vba फ़ाइल की सामग्री से बदलें।' ================================================================================
' ~~~ एम्बेडेड PE ~~~
' ================================================================================
' PE2VBA द्वारा उत्पन्न कोड
' ===== PE2VBA शुरू =====
Private Function PE() As String
Dim strPE As String
strPE = ""
PE = strPE
End Function
' ===== PE2VBA समाप्त =====
(वैकल्पिक) निष्पादन और त्रुटि लॉग जांचने के लिए View > Immediate Window (Ctrl+G) सक्षम करें।
Exploit मैक्रो चलाएँ!
/!\ एम्बेडेड PE का उपयोग करते समय, मैक्रो स्वचालित रूप से इस मोड में स्विच हो जाएगा क्योंकि PE() विधि एक गैर-रिक्त स्ट्रिंग लौटाएगी।
GetThreadContext() त्रुटि कोड 998 के साथ विफल होता है।यदि आप Office के 64-बिट संस्करण से यह मैक्रो चलाते हैं तो आपको यह त्रुटि मिल सकती है। एक समाधान के रूप में, आप कोड को Word ऑब्जेक्ट संदर्भों से निष्पादित करने के बजाय एक मॉड्यूल में ले जा सकते हैं। टिप के लिए धन्यवाद @joeminicucci का।
================================================================================
[*] स्रोत फ़ाइल: 'C:\Windows\System32\cmd.exe'
[*] स्रोत PE की जाँच...
[*] निलंबित अवस्था में नई प्रक्रिया बनाना...
[*] मुख्य थ्रेड का संदर्भ प्राप्त करना...
|__ GetThreadContext() विफल (Err: 998)
मुझे नहीं पता कि यह समाधान वर्तमान में क्यों काम करता है। मैंने इस पर थोड़ा शोध किया है। ऐसा लगता है कि यह त्रुटि 64-बिट संस्करण में CONTEXT संरचना के ठीक से संरेखित न होने के कारण होती है। मैंने देखा कि संरचना का आकार भी गलत है ([VBA] LenB(CONTEXT) != [C++] sizeof(CONTEXT)) जबकि 32-बिट संस्करण में यह ठीक है। मेरे पास एक कार्यशील समाधान है जो GetThreadContext() को ठीक से लौटने की अनुमति देता है लेकिन फिर यह निष्पादन में आगे कुछ अन्य चीजों को तोड़ देता है।
संपादन 2019-12-15: 64-बिट संस्करण के CONTEXT संरचना की परिभाषा वास्तव में गलत थी लेकिन इसे ठीक करने से बग ठीक नहीं हुआ। इसलिए, मैंने 64-बिट संस्करण के लिए एक वर्कअराउंड लागू किया। मैंने GetThreadContext() और SetThreadContext() फ़ंक्शनों के CONTEXT संरचना तर्क को समान आकार की Byte सरणी से बदल दिया।
संपादन 2019-12-17: मुझे अंततः समस्या मिल गई। मेरी पहली धारणा सही थी, CONTEXT संरचना को मेमोरी में 16-बाइट संरेखित होना चाहिए। यह कुछ ऐसा है जिसे आप C में संरचना की परिभाषा में align(16) का उपयोग करके नियंत्रित कर सकते हैं लेकिन आप इसे VBA में नियंत्रित नहीं कर सकते। इसलिए, GetThreadContext() और SetThreadContext() "यादृच्छिक रूप से" विफल हो सकते हैं। दूसरी ओर, Byte सरणियाँ हमेशा 16-बाइट संरेखित प्रतीत होती हैं, यही कारण है कि यह वर्कअराउंड प्रभावी है लेकिन इसकी कोई गारंटी नहीं है, जब तक कि मैं VBA इंटरप्रेटर/कम्पाइलर को रिवर्स इंजीनियर न करूँ और इसका पता न लगा लूँ?!
LongPtr - User Defined Type Not Definedयदि आपको यह त्रुटि मिलती है, तो इसका मतलब है कि आप Office के पुराने संस्करण (<=2007) से मैक्रो चला रहे हैं। LongPtr प्रकार VBA7 (Office 2010) में 64-बिट Windows API के समर्थन के साथ पेश किया गया था। यह आर्किटेक्चर (32-बिट / 64-बिट) की चिंता किए बिना पॉइंटर्स को संभालने के लिए बहुत उपयोगी है।
एक वर्कअराउंड के रूप में, आप सभी LongPtr घटनाओं को Long (32-बिट) या LongLong (64-बिट) से बदल सकते हैं। अपने पसंदीदा टेक्स्ट एडिटर में Ctrl+H का उपयोग करें।
@hasherezade - पूर्ण RunPE कार्यान्वयन (https://github.com/hasherezade/)
@Zer0Mem0ry - 32-बिट RunPE C++ में लिखित (https://github.com/Zer0Mem0ry/RunPE)
@DidierStevens - VBA में PE एम्बेडिंग
इस कोड का निम्नलिखित प्लेटफार्मों पर परीक्षण किया गया था:
यहाँ कुछ Win32 और VBA प्रकारों के बीच पत्राचार की तालिका है:
(*) LongPtr एक "गतिशील" प्रकार है, यह Office 32-बिट में 4 बाइट लंबा और Office 64-बिट में 8 बाइट लंबा होता है। https://msdn.microsoft.com/fr-fr/library/office/ee691831(v=office.14).aspx
| C++ | VBA | आर्किटेक्चर |
|---|
| BYTE | Byte | 32 और 64 |
| WORD | Integer | 32 और 64 |
| DWORD, ULONG, LONG | Long | 32 और 64 |
| DWORD64 | LongLong | 64 |
| HANDLE | LongPtr(*) | 32 और 64 |
| LPSTR | String | 32 और 64 |
| LPBYTE | LongPtr(*) | 32 और 64 |