
Packer/chargeur de shellcode .NET, PE et Raw Shellcode écrit en Nim
Nimcrypt2 est un autre packer/chargeur PE conçu pour contourner les AV/EDR. Il s'agit d'une amélioration de mon projet original Nimcrypt, les principales améliorations étant l'utilisation d'appels système directs et la capacité de charger des fichiers PE réguliers ainsi que du shellcode brut.
Avant d'aller plus loin, je dois reconnaître ceux qui ont fait la GRANDE majorité du travail et de la recherche dont ce projet dépend. Tout d'abord, je dois remercier @byt3bl33d3r pour son repo Offensive Nim, et @ShitSecure pour tous les extraits de code qu'il a publiés publiquement. C'est à partir de cela que la version originale de cet outil a été créée, et la version actuelle n'est pas différente. Notamment, la nouvelle fonctionnalité de chargement PE utilisée dans cet outil n'est qu'une implémentation du code Nim-RunPE récemment publié par ShitSecure. Depuis le 14/03/22, ce code utilise également son code GetSyscallStub pour l'utilisation dynamique des appels système. Je vous encourage vivement à le sponsoriser pour accéder à son propre Nim PE Packer, qui est sans doute une version bien meilleure et plus riche en fonctionnalités de celui-ci.
De plus, je tiens à remercier @ajpc500 pour son projet NimlineWhispers2 que cet outil utilise pour les appels système directs. Je ne saurais trop insister sur le fait que ce projet n'est qu'une amalgamation des travaux publics des personnes mentionnées précédemment, et tout le crédit leur revient donc.
___
.-' `'.
/ \
| ;
| | ___.--,
_.._ |0) ~ (0) | _.---'`__.-( (_.
__.--'`_.. '.__.\ '--. \_.-' ,.--'` `""`
( ,.--'` ',__ /./; ;, '.__.'` __
_`) ) .---.__.' / | |\ \__..--"" ""'--.,_
`---' .'.''-._.-'`_./ /\ '. \ _.-~~~````~~~-._`-.__.'
| | .' _.-' | | \ \ '. `~---`
\ \/ .' \ \ '. '-._)
\/ / \ \ `=.__`~-. Nimcrypt v2
jgs / /\ `) ) / / `"".`\
, _.-'.'\ \ / / ( ( / / 3-in-1 C#, PE, & Raw Shellcode Loader
`--~` ) ) .-'.' '.'. | (
(/` ( (` ) ) '-;
` '-; (-'
Nimcrypt v 2.0
Utilisation : nimcrypt -f file_to_load -t csharp/raw/pe [-o ] [-p ] [-n] [-u] [-s] [-e] [-g] [-l] [-v] [--no-ppid-spoof] nimcrypt (-h | --help)
Options : -h --help Afficher cet écran. --version Afficher la version. -f --file filename Fichier à charger -t --type filetype Type de fichier (csharp, raw ou pe) -p --process process Nom du processus pour l'injection de shellcode -o --output filename Nom du fichier pour l'exe compilé -u --unhook Décrocher ntdll.dll -v --verbose Activer les messages de débogage pendant l'exécution -e --encrypt-strings Chiffrer les chaînes avec le module strenc -g --get-syscallstub Utiliser GetSyscallStub au lieu de NimlineWhispers2 -l --llvm-obfuscator Utiliser Obfuscator-LLVM pour compiler le binaire -n --no-randomization Désactiver la randomisation des noms d'appels système -s --no-sandbox Désactiver les vérifications de sandbox --no-ppid-spoof Désactiver l'usurpation de PPID
Nimcrypt2 est conçu pour être utilisé sur des systèmes Linux avec Nim installé. Avant d'installer Nim, vous devez vous assurer que les paquets suivants sont installés via votre gestionnaire de paquets :
sudo apt install gcc mingw-w64 xz-utils git
Pour installer Nim, je préfère utiliser choosenim comme suit :
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 dépend également de quelques paquets qui peuvent être installés via Nimble. Cela peut être fait comme ceci :
nimble install winim nimcrypto docopt ptr_math strenc
Avec toutes les dépendances maintenant installées, Nimcrypt2 peut être compilé comme ceci :
nim c -d=release --cc:gcc --embedsrc=on --hints=on --app=console --cpu=amd64 --out=nimcrypt nimcrypt.nim
OPTIONNEL : Pour utiliser le drapeau Obfuscator-LLVM, vous devez l'avoir installé sur votre système en plus de wclang. J'ai trouvé cela un peu pénible mais vous devriez pouvoir y parvenir avec un peu de persévérance. Voici un guide rapide étape par étape qui a fonctionné sur mon système Kali Linux :
De plus, vous devez ajouter les lignes suivantes à votre fichier nim.cfg pour pointer nim vers vos binaires wclang :
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++"
Il existe probablement une meilleure façon de faire cela, mais c'est ce qui a fonctionné pour moi. Si vous rencontrez des problèmes, continuez à essayer et assurez-vous de pouvoir exécuter x86_64-w64-mingw32-clang -v et qu'il affiche "Obfuscator-LLVM" dans la sortie. Assurez-vous également que MinGW utilise les fichiers de bibliothèque Obfuscator-LLVM : Nim vous donnera une erreur dans le cas contraire.