
.NET, PE und Raw Shellcode Packer/Loader, geschrieben in Nim
Nimcrypt2 ist ein weiterer PE-Packer/Loader, der entwickelt wurde, um AV/EDR zu umgehen. Es ist eine Verbesserung meines ursprünglichen Nimcrypt-Projekts, wobei die wichtigsten Verbesserungen die Verwendung direkter Syscalls und die Möglichkeit zum Laden regulärer PE-Dateien sowie von rohem Shellcode sind.
Bevor ich weitergehe, muss ich diejenigen würdigen, die den GRÖSSTEN Teil der Arbeit und Forschung geleistet haben, auf der dieses Projekt basiert. Zunächst möchte ich @byt3bl33d3r für sein Offensive Nim Repo danken, sowie @ShitSecure für all die Code-Snippets, die er öffentlich veröffentlicht hat. Daraus wurde die ursprüngliche Version dieses Tools erstellt, und die aktuelle Version ist nicht anders. Insbesondere die neue PE-Ladefunktionalität, die in diesem Tool verwendet wird, ist lediglich eine Implementierung von ShitSecures kürzlich veröffentlichtem Nim-RunPE-Code. Seit dem 14.03.2022 verwendet dieser Code auch seinen GetSyscallStub-Code für die dynamische Syscall-Nutzung. Ich empfehle dringend, ihn zu sponsorn, um Zugang zu seinem eigenen Nim PE Packer zu erhalten, der zweifellos eine viel bessere und funktionsreichere Version davon ist.
Darüber hinaus möchte ich @ajpc500 für sein NimlineWhispers2-Projekt danken, das dieses Tool für direkte Syscalls verwendet. Ich kann nicht genug betonen, wie sehr dieses Projekt lediglich eine Zusammenstellung der öffentlichen Arbeit der zuvor Genannten ist. Daher gebührt ihnen alle Anerkennung.
___
.-' `'.
/ \
| ;
| | ___.--,
_.._ |0) ~ (0) | _.---'`__.-( (_.
__.--'`_.. '.__.\ '--. \_.-' ,.--'` `""`
( ,.--'` ',__ /./; ;, '.__.'` __
_`) ) .---.__.' / | |\ \__..--"" ""'--.,_
`---' .'.''-._.-'`_./ /\ '. \ _.-~~~````~~~-._`-.__.'
| | .' _.-' | | \ \ '. `~---`
\ \/ .' \ \ '. '-._)
\/ / \ \ `=.__`~-. Nimcrypt v2
jgs / /\ `) ) / / `"".`\
, _.-'.'\ \ / / ( ( / / 3-in-1 C#, PE, & Raw Shellcode Loader
`--~` ) ) .-'.' '.'. | (
(/` ( (` ) ) '-;
` '-; (-'
Nimcrypt v 2.0
Usage:
nimcrypt -f file_to_load -t csharp/raw/pe [-o <output>] [-p <process>] [-n] [-u] [-s] [-e] [-g] [-l] [-v] [--no-ppid-spoof]
nimcrypt (-h | --help)
Options:
-h --help Show this screen.
--version Show version.
-f --file filename File to load
-t --type filetype Type of file (csharp, raw, or pe)
-p --process process Name of process for shellcode injection
-o --output filename Filename for compiled exe
-u --unhook Unhook ntdll.dll
-v --verbose Enable verbose messages during execution
-e --encrypt-strings Encrypt strings using the strenc module
-g --get-syscallstub Use GetSyscallStub instead of NimlineWhispers2
-l --llvm-obfuscator Use Obfuscator-LLVM to compile binary
-n --no-randomization Disable syscall name randomization
-s --no-sandbox Disable sandbox checks
--no-ppid-spoof Disable PPID Spoofing
Nimcrypt2 ist für die Verwendung auf Linux-Systemen mit installiertem Nim ausgelegt. Bevor Sie Nim installieren, müssen Sie sicherstellen, dass die folgenden Pakete über Ihren Paketmanager installiert sind:
sudo apt install gcc mingw-w64 xz-utils git
Um Nim zu installieren, verwende ich bevorzugt choosenim wie folgt:
curl https://nim-lang.org/choosenim/init.sh -sSf | sh
echo "export PATH=$HOME/.nimble/bin:$PATH" >> ~/.bashrc
export PATH=$HOME/.nimble/bin:$PATH
Nimcrypt2 hängt auch von einigen Paketen ab, die über Nimble installiert werden können. Dies kann wie folgt erfolgen:
nimble install winim nimcrypto docopt ptr_math strenc
Nachdem alle Abhängigkeiten nun installiert sind, kann Nimcrypt2 wie folgt kompiliert werden:
nim c -d=release --cc:gcc --embedsrc=on --hints=on --app=console --cpu=amd64 --out=nimcrypt nimcrypt.nim
OPTIONAL: Um das Flag Obfuscator-LLVM zu verwenden, muss es zusammen mit wclang auf Ihrem System installiert sein. Ich fand das etwas mühsam, aber mit etwas Ausdauer sollte es machbar sein. Hier ist eine kurze Schritt-für-Schritt-Anleitung, die auf meinem Kali Linux-System funktioniert hat:
Darüber hinaus müssen Sie die folgenden Zeilen zu Ihrer nim.cfg-Datei hinzufügen, um Nim auf Ihre wclang-Binärdateien zu verweisen:
amd64.windows.clang.exe = "x86_64-w64-mingw32-clang"
amd64.windows.clang.linkerexe = "x86_64-w64-mingw32-clang"
amd64.windows.clang.cpp.exe = "x86_64-w64-mingw32-clang++"
amd64.windows.clang.cpp.linkerexe = "x86_64-w64-mingw32-clang++"
Es gibt wahrscheinlich einen besseren Weg, dies zu tun, aber das hat bei mir funktioniert. Wenn Sie Probleme haben, versuchen Sie es weiter und stellen Sie sicher, dass Sie x86_64-w64-mingw32-clang -v ausführen können und dass "Obfuscator-LLVM" in der Ausgabe erscheint. Stellen Sie außerdem sicher, dass MinGW die Obfuscator-LLVM-Bibliotheksdateien verwendet: Nim gibt Ihnen sonst einen Fehler aus.