
..NET, PE e Raw Shellcode Packer/Loader Escrito em Nim
Nimcrypt2 é mais um packer/loader de PE projetado para contornar AV/EDR. É uma melhoria do meu projeto original Nimcrypt, com as principais melhorias sendo o uso de syscalls diretos e a capacidade de carregar arquivos PE regulares, além de shellcode bruto.
Antes de prosseguir, devo reconhecer aqueles que fizeram a GRANDE maioria do trabalho e pesquisa dos quais este projeto depende. Primeiramente, devo agradecer a @byt3bl33d3r pelo seu repositório Offensive Nim, e a @ShitSecure por todos os trechos de código que ele disponibilizou publicamente. Foi a partir disso que a versão original desta ferramenta foi criada, e a versão atual não é diferente. Particularmente, a nova funcionalidade de carregamento de PE usada nesta ferramenta é apenas uma implementação do código recentemente lançado por ShitSecure, Nim-RunPE. A partir de 14/03/22, este código também usa o código GetSyscallStub dele para uso dinâmico de syscalls. Eu recomendo fortemente patrociná-lo para ter acesso ao seu próprio Nim PE Packer, que é sem dúvida uma versão muito melhor e mais completa desta.
Além disso, gostaria de agradecer a @ajpc500 pelo seu projeto NimlineWhispers2 que esta ferramenta usa para syscalls diretos. Não posso enfatizar o suficiente como este projeto é simplesmente uma amálgama do trabalho público dos mencionados anteriormente, então todo crédito deve ir para eles.
___
.-' `'.
/ \
| ;
| | ___.--,
_.._ |0) ~ (0) | _.---'`__.-( (_.
__.--'`_.. '.__.\ '--. \_.-' ,.--'` `""`
( ,.--'` ',__ /./; ;, '.__.'` __
_`) ) .---.__.' / | |\ \__..--"" ""'--.,_
`---' .'.''-._.-'`_./ /\ '. \ _.-~~~````~~~-._`-.__.'
| | .' _.-' | | \ \ '. `~---`
\ \/ .' \ \ '. '-._)
\/ / \ \ `=.__`~-. Nimcrypt v2
jgs / /\ `) ) / / `"".`\
, _.-'.'\ \ / / ( ( / / 3-in-1 C#, PE, & Raw Shellcode Loader
`--~` ) ) .-'.' '.'. | (
(/` ( (` ) ) '-;
` '-; (-'
Nimcrypt v 2.0
Uso:
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)
Opções:
-h --help Mostrar esta tela.
--version Mostrar a versão.
-f --file arquivo Arquivo a ser carregado
-t --type tipo Tipo de arquivo (csharp, raw ou pe)
-p --process processo Nome do processo para injeção de shellcode
-o --output arquivo Nome do arquivo para o exe compilado
-u --unhook Remover hook do ntdll.dll
-v --verbose Ativar mensagens detalhadas durante a execução
-e --encrypt-strings Criptografar strings usando o módulo strenc
-g --get-syscallstub Usar GetSyscallStub em vez de NimlineWhispers2
-l --llvm-obfuscator Usar Obfuscator-LLVM para compilar o binário
-n --no-randomization Desativar aleatorização de nomes de syscalls
-s --no-sandbox Desativar verificações de sandbox
--no-ppid-spoof Desativar PPID Spoofing
Nimcrypt2 foi projetado para ser usado em sistemas Linux com Nim instalado. Antes de instalar o Nim, você deve garantir que os seguintes pacotes estejam instalados via seu gerenciador de pacotes:
sudo apt install gcc mingw-w64 xz-utils git
Para instalar o Nim, prefiro usar choosenim da seguinte forma:
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 também depende de alguns pacotes que podem ser instalados via Nimble. Isso pode ser feito assim:
nimble install winim nimcrypto docopt ptr_math strenc
Com todas as dependências agora instaladas, Nimcrypt2 pode ser compilado assim:
nim c -d=release --cc:gcc --embedsrc=on --hints=on --app=console --cpu=amd64 --out=nimcrypt nimcrypt.nim
OPCIONAL: Para usar a flag Obfuscator-LLVM, você deve tê-lo instalado em seu sistema juntamente com wclang. Achei isso um pouco trabalhoso, mas você deve conseguir fazer com um pouco de perseverança. Aqui está um passo a passo rápido que funcionou no meu sistema Kali Linux:
Além disso, você deve adicionar as seguintes linhas ao seu arquivo nim.cfg para apontar o nim para seus binários 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++"
Provavelmente existe uma maneira melhor de fazer isso, mas foi o que funcionou para mim. Se tiver problemas, continue tentando e certifique-se de que pode executar x86_64-w64-mingw32-clang -v e ele mostra "Obfuscator-LLVM" na saída. Certifique-se também de que o MinGW está usando os arquivos de biblioteca do Obfuscator-LLVM: o Nim lhe dará um erro caso contrário.