Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Log in
Enviar
HerramientasExploitsBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
NimPlant — Un implante C2 de primera etapa ligero escrito en Nim (y Rust). | Kitploit
Herramientas/GitHubGitHub/chvancooten/nimplant
Frameworks de Pruebas de PenetraciónGeneración de PayloadsPost-ExplotaciónComando y ControlRed Teaming
GitHubchvancooten/nimplant

NimPlant

Un implante C2 de primera etapa ligero escrito en Nim (y Rust).

Ver Repositorio
95111610hace 1 añoRevisado por Kitploit

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

NimPlant - Un implante C2 ligero de primera etapa escrito en Nim, Rust y Python

GitHub Workflow Status PRs Welcome

Por Cas van Cooten (@chvancooten), con agradecimientos especiales a algunas personas increíbles:

Kadir Yamamoto (@yamakadi), Furkan Göksel (@frkngksl) , Fabian Mosch (@S3cur3Th1sSh1t), Rafael Félix (@b1scoito), Guillaume Caillé (@OffenseTeacher), ¡y muchos otros!

Si NimPlant te ha sido útil y/o te gusta mi trabajo en general, tu apoyo es muy bienvenido:

Sponsor on GitHub

Resumen de Funcionalidades

Descargar herramienta
  • Implante ligero y configurable escrito en los lenguajes de programación Nim y Rust
  • Interfaz web atractiva que te hará lucir bien durante todas tus operaciones
  • Cifrado y compresión de todo el tráfico por defecto, ofusca cadenas estáticas en los artefactos del implante
  • Soporte para varios tipos de implantes, incluyendo binarios nativos (exe/dll), shellcode o ejecutables autoeliminables
  • Amplia selección de comandos enfocados en operaciones de primera etapa, incluyendo enumeración local, gestión de archivos o registro, e interacciones web
  • Fácil implementación de funcionalidades más avanzadas o payloads mediante inline-execute, shinject (usando invocación dinámica), powershell en un runspace personalizado, o execute-assembly en el mismo hilo
  • Soporte para operaciones en cualquier plataforma; el implante solo apunta a Windows x64 por ahora
  • Registro completo de todas las interacciones y operaciones de archivos
  • Mucho, mucho más, solo mira abajo :)

Instrucciones

Instalación

Se requiere una versión moderna de Python3 para ejecutar NimPlant.

Servidor

  • Instala requirements.txt desde la carpeta del servidor (pip3 install -r server/requirements.txt).

Implante (Nim)

  • Instala el toolchain de Nim para tu plataforma (se recomienda la instalación mediante choosenim, ya que apt no siempre tiene la versión más reciente).
  • Instala los paquetes requeridos usando el gestor de paquetes Nimble (cd client; nimble install -d).
  • Si estás en Linux o MacOS, instala el toolchain mingw para tu plataforma (brew install mingw-w64 o apt install mingw-w64).
  • Si estás específicamente en ArchLinux, modifica tu configuración de Mingw según este gist (¡gracias @tothi!).

Implante (Rust)

  • Instala el toolchain de Rust (se recomienda la instalación mediante rustup).
  • Instala el objetivo MinGW de Windows: rustup target add x86_64-pc-windows-gnu.
  • Recomendado para mejor opsec: Modifica tu archivo ~/.cargo/config.toml según Cargo.toml y usa la cadena de compilación nightly (rustup default nightly).

Nota: Incluso si compilas en Windows, se recomienda el objetivo x86_64-pc-windows-gnu. Resulta en binarios ligeramente más grandes, pero parece ser más estable cuando se genera shellcode a partir del DLL resultante. Puedes modificar rust-toolchain.toml para cambiar el objetivo a x86_64-pc-windows-msvc, pero el shellcode generado podría no funcionar correctamente en todos los casos.

Primeros Pasos

Configuración

Antes de usar NimPlant, crea el archivo de configuración config.toml. Se recomienda copiar config.toml.example y trabajar a partir de ahí.

A continuación se proporciona una visión general de las opciones.

CategoríaConfiguraciónDescripción
serveripLa IP en la que escuchará el servidor web C2 (incluyendo API). Se recomienda usar 127.0.0.1, solo usa 0.0.0.0 cuando hayas configurado reglas de firewall o enrutamiento adecuadas para proteger el C2.
serverportEl puerto en el que escuchará el servidor web C2 (incluyendo API).
listenertypeEl tipo de listener, ya sea HTTP o HTTPS. Las opciones de HTTPS se configuran a continuación.
listenersslCertPathLa ruta local a un archivo de certificado HTTPS (por ejemplo, solicitado mediante LetsEncrypt CertBot o autofirmado). Se ignora cuando el tipo de listener es 'HTTP'.
listenersslKeyPathLa ruta local al archivo de clave privada del certificado HTTPS correspondiente. Se solicitará la contraseña al ejecutar el servidor NimPlant si está configurada. Se ignora cuando el tipo de listener es 'HTTP'.
listenerhostnameEl nombre de host del listener. Si no está vacío (""), NimPlant usará este nombre de host para conectarse. Asegúrate de enrutar correctamente el tráfico desde este host al puerto del listener de NimPlant.
listeneripLa IP del listener. Requerida incluso si 'hostname' está configurado, ya que el servidor la usa para registrarse en esta IP.
listenerportEl puerto del listener. Requerido incluso si 'hostname' está configurado, ya que el servidor lo usa para registrarse en este puerto.
listenerregisterPathLa ruta URI con la que se registrarán nuevos NimPlants.
listenertaskPathLa ruta URI de la que NimPlants obtendrán tareas.
listenerresultPathLa ruta URI a la que NimPlants enviarán resultados.
nimplantriskyModeCompila NimPlant con soporte para comandos riesgosos. Se recomienda discreción del operador. Deshabilitarlo eliminará el soporte para execute-assembly, powershell, shell y shinject.
nimplantsleepMaskSi usar o no la máscara de sueño Ekko en lugar de llamadas de sueño regulares para los Nimplants. ¡Solo funciona con ejecutables regulares por ahora!
nimplantsleepTimeEl tiempo de sueño predeterminado en segundos para nuevos NimPlants.

Compilación

Una vez que la configuración sea de tu agrado, puedes generar binarios de NimPlant para desplegar en tu objetivo. Actualmente, NimPlant soporta binarios .exe, .dll y .bin para ejecutables (autoeliminables), bibliotecas y shellcode independiente de la posición (a través de sRDI), respectivamente. Para generar, ejecuta python nimplant.py compile seguido de los binarios que prefieras (exe, exe-selfdelete, dll, raw o all) y, opcionalmente, el tipo de implante (nim, rust, nim-debug o rust-debug; por defecto compilará Nim). Los archivos se escribirán en client/bin/ o client-rs/bin/, respectivamente.

Puedes pasar el argumento rotatekey para generar y usar una nueva clave XOR durante la compilación.

Notas:

  • ¡NimPlant solo soporta x64 en este momento!

  • El punto de entrada para archivos DLL es Update, que se activa mediante DllMain para todos los puntos de entrada. Esto significa que puedes usar, por ejemplo, rundll32 .\NimPlant.dll,Update para activarlo, o usar tu LOLBIN de elección para cargarlo lateralmente (puede requerir algunas modificaciones en client/NimPlant.nim o client-rs/src/lib.rs).``` PS C:\NimPlant> python .\nimplant.py compile all

    root@kitploit:~
                *    *(#    #
                **  **(##  ##
       ########       (       ********
      ####(###########************,****
         # ########       ******** *
         .###                   ***
         .########         ********
         ####    ###     ***    ****
       ######### ###     *** *********
     #######  ####  ## **  ****  *******
     #####    ##      *      **    *****
     ######  ####   ##***   **** .******
     ###############     ***************
          ##########     **********
             #########**********
               #######********
    

    | \ | () __ ___ | _ | | __ _ _ __ | |_ | | | | '_ _ \| |_) | |/ _ | '_ | __| | |\ | | | | | | | __/| | (| | | | | | || _||| || ||| ||_,|| ||_|

    root@kitploit:~
      A light-weight stage 1 implant and C2 based on Nim|Rust and Python
      By Cas van Cooten (@chvancooten)
    

Compiling .exe for NimPlant Compiling self-deleting .exe for NimPlant Compiling .dll for NimPlant Compiling .bin for NimPlant

Done compiling! You can find compiled binaries in 'client/bin/'.

root@kitploit:~
### Compilación con Docker

Usar Docker es fácil y evita problemas de dependencias, ya que todas las dependencias de compilación y ejecución requeridas están preinstaladas en el contenedor.

Para usar Docker, puedes utilizar el contenedor público `chvancooten/nimplant` de [Docker Hub](https://hub.docker.com/r/chvancooten/nimplant) (construido mediante CI/CD), o construir el `Dockerfile` desde el código fuente.

> Para compilar desde el código fuente, ejecuta lo siguiente desde el directorio principal:
> 
> ```bash
> docker build . -t nimplant
> ```

Esto creará un contenedor etiquetado como `nimplant:latest`. Nota: ¡esto puede llevar un tiempo y producir un contenedor de tamaño considerable debido a las dependencias de desarrollo!

Una vez hecho esto, puedes ejecutar el contenedor desde la línea de comandos para compilar tus artefactos.```bash
docker run --rm -it -v ${PWD}:/nimplant chvancooten/nimplant:latest compile exe rust

Nota: Este es un comando de ejemplo, asegúrate de ajustar argumentos como los volúmenes montados a tu situación.

Iniciar el Servidor

Una vez que tengas tus binarios listos, ¡puedes poner en marcha tu servidor NimPlant! Si compilaste localmente, no es necesaria configuración adicional ya que lee del mismo archivo config.toml. Para iniciar un servidor, simplemente ejecuta python nimplant.py server (con privilegios sudo si estás en Linux). Puedes usar la consola una vez que un Nimplant se conecte, o acceder a la interfaz web en http://localhost:31337 (por defecto).

Notas:

  • Si estás ejecutando tu servidor NimPlant externamente desde la máquina donde se compilan los binarios, asegúrate de que tanto config.toml como .xorkey coincidan. Si no es así, NimPlant no podrá conectarse.

  • El frontend web o la API no admiten autenticación, por lo que NO expongas el puerto del frontend a ninguna red no confiable sin un proxy inverso seguro.

  • Si NimPlant no puede conectarse a un servidor o pierde la conexión, reintentará 5 veces con un tiempo de retroceso exponencial antes de intentar un re-registro. Si falla en registrarse 5 veces más (misma lógica de retroceso), se eliminará a sí mismo. El retroceso triplica el tiempo de espera en cada intento fallido. Por ejemplo, si el tiempo de espera es de 10 segundos, esperará 10, luego 30 (3^1 * 10), luego 90 (3^2 * 10), luego 270 (3^3 * 10), luego 810 segundos antes de rendirse (estos parámetros están codificados pero pueden cambiarse en client/NimPlant.nim).

  • Los registros se almacenan en el directorio server/logs. Cada instancia del servidor crea una nueva carpeta de registros, y los registros se dividen por sesión de consola/nimplant. Las descargas y cargas (incluyendo archivos subidos a través de la interfaz web) se almacenan en los directorios server/uploads y server/downloads respectivamente.

  • Los detalles de Nimplant y del servidor se almacenan en una base de datos SQLite en server/nimplant.db. Estos datos también se utilizan para recuperar Nimplants después de un reinicio del servidor.

  • Los registros, archivos subidos/descargados y la base de datos se pueden limpiar ejecutando nimplant.py con la bandera cleanup. Precaución: ¡Esto eliminará todo, así que asegúrate de hacer una copia de seguridad de lo que necesites primero!``` PS C:\NimPlant> python .\nimplant.py server

    root@kitploit:~
                *    *(#    #
                **  **(##  ##
       ########       (       ********
      ####(###########************,****
         # ########       ******** *
         .###                   ***
         .########         ********
         ####    ###     ***    ****
       ######### ###     *** *********
     #######  ####  ## **  ****  *******
     #####    ##      *      **    *****
     ######  ####   ##***   **** .******
     ###############     ***************
          ##########     **********
             #########**********
               #######********
    

    | \ | () __ ___ | _ | | __ _ _ __ | |_ | | | | '_ _ \| |_) | |/ _ | '_ | __| | |\ | | | | | | | __/| | (| | | | | | || _||| || ||| ||_,|| ||_|

    root@kitploit:~
      A light-weight stage 1 implant and C2 written in Nim|Rust and Python
      By Cas van Cooten (@chvancooten)
    

[06/02/2023 10:47:23] Started management server on http://127.0.0.1:31337. [06/02/2023 10:47:23] Started NimPlant listener on https://0.0.0.0:443. CTRL-C to cancel waiting for NimPlants.

root@kitploit:~
Esto iniciará tanto la API C2 como el servidor web de gestión (en el ejemplo anterior en `http://127.0.0.1:31337`) y el listener de NimPlant (en el ejemplo anterior en `https://0.0.0.0:443`). Una vez que un NimPlant se registra, puedes usar tanto la interfaz web como la consola para enviar comandos a NimPlant.

### Iniciando el Servidor con Docker

El mismo contenedor `chvancooten/nimplant` que se puede usar para la compilación también se puede usar para ejecutar el servidor NimPlant. Para que NimPlant reconozca el servidor, los archivos `config.toml` y `.xorkey` deben coincidir con la máquina donde se compiló NimPlant (esto es automáticamente correcto si usaste el mismo contenedor Docker para la compilación). Además, el archivo `config.toml` debe configurarse correctamente para Docker, especialmente la IP del servidor de gestión debe establecerse en `0.0.0.0` para alcanzarlo a través de Docker (asegúrate de exponerlo solo en la interfaz local de tu host).

Puedes iniciar un servidor NimPlant con el siguiente comando de ejemplo:```bash
docker run --rm -it -p 80:80 -p 443:443 -p 127.0.0.1:31337:31337 -v ${PWD}:/nimplant -e "TZ=Europe/Amsterdam" chvancooten/nimplant:latest server

Nota: Este es un comando de ejemplo, asegúrate de ajustar argumentos como los volúmenes montados según tu situación.

El uso de Docker te permite implementar fácilmente configuraciones más complejas. Como ejemplo, el directorio docker-example contiene un archivodocker-compose.yml que muestra cómo exponer NimPlant detrás de un redireccionador Nginx usando HTTPS y una página de inicio ficticia.

Uso

Los comandos disponibles son los siguientes. Puedes obtener ayuda detallada para cualquier comando escribiendo help [command]. Ciertos comandos indicados con (GUI) se pueden configurar gráficamente al usar la interfaz web, esto se puede hacer llamando al comando sin ningún argumento.``` Command arguments shown as [required] . Commands with (GUI) can be run without parameters via the web UI.

cancel Cancel all pending tasks. cat [filename] Print a file's contents to the screen. cd [directory] Change the working directory. clear Clear the screen. cp [source] [destination] Copy a file or directory. curl [url] Get a webpage remotely and return the results. download [remotefilepath] Download a file from NimPlant's disk to the NimPlant server. env Get environment variables. execute-assembly (GUI) <BYPASSAMSI=0> <BLOCKETW=0> [localfilepath] Execute .NET assembly from memory. AMSI/ETW patched by default. Loads the CLR. exit Exit the server, killing all NimPlants. getAv List Antivirus / EDR products on target using WMI. getDom Get the domain the target is joined to. getLocalAdm List local administrators on the target using WMI. getpid Show process ID of the currently selected NimPlant. getprocname Show process name of the currently selected NimPlant. help Show this help menu or command-specific help. hostname Show hostname of the currently selected NimPlant. inline-execute (GUI) [localfilepath] [entrypoint] Execute Beacon Object Files (BOF) from memory. ipconfig List IP address information of the currently selected NimPlant. kill Kill the currently selected NimPlant. list Show list of active NimPlants. listall Show list of all NimPlants. ls List files and folders in a certain directory. Lists current directory by default. mkdir [directory] Create a directory (and its parent directories if required). mv [source] [destination] Move a file or directory. nimplant Show info about the currently selected NimPlant. osbuild Show operating system build information for the currently selected NimPlant. powershell <BYPASSAMSI=0> <BLOCKETW=0> [command] Execute a PowerShell command in an unmanaged runspace. Loads the CLR. ps List running processes on the target. Indicates current process. pwd Get the current working directory. reg [query|add] [path] Query or modify the registry. New values will be added as REG_SZ. rm [file] Remove a file or directory. run [binary] Run a binary from disk. Returns output but blocks NimPlant while running. screenshot Take a screenshot of the user's screen. select [id] Select another NimPlant. shell [command] Execute a shell command. shinject (GUI) [targetpid] [localfilepath] Load raw shellcode from a file and inject it into the specified process's memory space using dynamic invocation. sleep [sleeptime] <jitter%> Change the sleep time of the current NimPlant. upload (GUI) [localfilepath] Upload a file from the NimPlant server to the victim machine. wget [url] Download a file to disk remotely. whoami Get the user ID that NimPlant is running as.

root@kitploit:~
#### Usando Archivos de Objeto Beacon (BOFs)

**NOTA: Los BOF son volátiles por naturaleza, y ejecutar un BOF defectuoso o pasar argumentos o tipos incorrectos puede bloquear su sesión de NimPlant. ¡Asegúrese de probar los BOF antes de implementarlos!**

NimPlant admite la carga en memoria de BOF gracias a los excelentes proyectos [NiCOFF](https://github.com/frkngksl/NiCOFF) (Nim) y [Coffee](https://github.com/hakaioffsec/coffee) (Rust). Ejecutar un BOF requiere un archivo de objeto BOF compilado localmente (normalmente llamado algo como `bofname.x64.o`), un punto de entrada (comúnmente `go`), y una lista de argumentos con sus respectivos tipos de argumento. Los argumentos se pasan como un par `arg argtype` separado por espacios.

Los argumentos se proporcionan de acuerdo con el formato "Zzsib", por lo que pueden ser `string` (alias: `z`), `wstring` (o `Z`), `integer` (alias: `int` o `i`), `short` (`s`), o `binary` (`bin` o `b`). Los argumentos binarios pueden ser una cadena binaria cruda o codificada en base64, siendo recomendable esto último para evitar caracteres no deseados.

A continuación se muestran algunos ejemplos de uso (utilizando los magníficos BOF de TrustedSec [[1](https://github.com/trustedsec/CS-Situational-Awareness-BOF), [2](https://github.com/trustedsec/CS-Remote-OPs-BOF)] como ejemplo). Tenga en cuenta que `inline-execute` (sin argumentos) se puede usar para configurar el comando gráficamente en la GUI.```bash
# Run a bof without arguments
inline-execute ipconfig.x64.o go

# Run the `dir` bof with one wide-string argument specifying the path to list, quoting optional
inline-execute dir.x64.o go "C:\Users\victimuser\desktop" Z

# Run an injection BOF specifying an integer for the process ID and base64-encoded shellcode as bytes
# Example shellcode generated with the command: msfvenom -p windows/x64/exec CMD=calc.exe EXITFUNC=thread -f base64
inline-execute /linux/path/to/createremotethread.x64.o go 1337 i /EiD5PDowAAAAEFRQVBSUVZIMdJlSItSYEiLUhhIi1IgSItyUEgPt0pKTTHJSDHArDxhfAIsIEHByQ1BAcHi7VJBUUiLUiCLQjxIAdCLgIgAAABIhcB0Z0gB0FCLSBhEi0AgSQHQ41ZI/8lBizSISAHWTTHJSDHArEHByQ1BAcE44HXxTANMJAhFOdF12FhEi0AkSQHQZkGLDEhEi0AcSQHQQYsEiEgB0EFYQVheWVpBWEFZQVpIg+wgQVL/4FhBWVpIixLpV////11IugEAAAAAAAAASI2NAQEAAEG6MYtvh//Vu+AdKgpBuqaVvZ3/1UiDxCg8BnwKgPvgdQW7RxNyb2oAWUGJ2v/VY2FsYy5leGUA b

# Depending on the BOF, sometimes argument parsing is a bit different using NiCOFF
# Make sure arguments are passed as expected by the BOF (can usually be retrieved from .CNA or BOF source)
# An example:
inline-execute enum_filter_driver.x64.o go            # CRASHES - default null handling does not work
inline-execute enum_filter_driver.x64.o go "" z       # OK      - arguments are passed as expected

Notificaciones Push

Por defecto, NimPlant admite notificaciones push a través del hook notify_user() definido en server/util/notify.py. Por defecto, implementa una notificación simple de Telegram que requiere que las variables de entorno TELEGRAM_CHAT_ID y TELEGRAM_BOT_TOKEN estén configuradas antes de que se active. Por supuesto, el código se puede extender fácilmente con la propia funcionalidad de notificaciones push. El hook notify_user() se llama cuando un nuevo NimPlant se registra y recibe un objeto con los detalles del NimPlant, que luego pueden enviarse según se desee.

Construyendo el frontend

Como usuario normal, no deberías tener que modificar o reconstruir la interfaz de usuario que viene con Nimplant. Sin embargo, si deseas hacer cambios, instala NodeJS y ejecuta npm install mientras estás en el directorio ui. Luego ejecuta ui/build-ui.py. Esto se encargará de descargar los paquetes, compilar el frontend de Next.JS y colocar los archivos en la ubicación correcta para que el servidor NimPlant los utilice.

Un comentario sobre uso en producción y OPSEC

NimPlant se desarrolló como un proyecto de aprendizaje y se publicó para el público con fines de transparencia y educativos. La evasión de antivirus o EDR no es un objetivo para los implantes listos para usar. En gran parte, NimPlant no hace ningún esfuerzo por ocultar sus intenciones. Además, se han implementado protecciones para prevenir el abuso. En otras palabras, NO uses NimPlant en compromisos de producción tal como está sin una revisión exhaustiva del código fuente y modificaciones! También recuerda que, como con cualquier framework C2, la huella OPSEC de ejecutar ciertos comandos debe considerarse antes del despliegue. NimPlant se puede compilar sin comandos de riesgo OPSEC estableciendo riskyMode en false en config.toml.

Solución de problemas

Hay muchas razones por las cuales Nimplant puede fallar al compilar o ejecutar. Si encuentras problemas, intenta lo siguiente (en orden):

  • Asegúrate de haber seguido los pasos descritos en la sección 'Instalación' anterior, verifica dos veces que todas las dependencias estén instaladas y que las versiones coincidan
  • Asegúrate de haber seguido los pasos descritos en la sección 'Compilación' anterior, y de haber usado el contenedor Docker para descartar cualquier problema de dependencias
  • Revisa los registros en el directorio server/logs en busca de errores
  • Prueba los modos de compilación nim-debug o rust-debug para compilar con mensajes de consola y depuración (solo .exe) para ver si se devuelven mensajes de error
  • Intenta compilar desde otro sistema operativo o con otro conjunto de herramientas para ver si ocurre el mismo error
  • Si todo lo anterior falla, abre un issue. Asegúrate de incluir la información de compilación adecuada (SO, versiones de nim/rust/python, versiones de dependencias) y el resultado de los pasos de solución de problemas anteriores. Los issues incompletos pueden cerrarse sin previo aviso.
nimplantsleepJitterLa fluctuación predeterminada en porcentaje para nuevos NimPlants.
nimplantkillDateLa fecha de muerte para los Nimplants (formato: yyyy-MM-dd). Los Nimplants se cerrarán si esta fecha ha pasado.
nimplantuserAgentEl user-agent usado por los NimPlants. El servidor también lo usa para validar el tráfico de NimPlant, por lo que se recomienda elegir un UA que sea discreto, pero no demasiado común.