作者 Cas van Cooten (@chvancooten),特别感谢以下出色的人:
Kadir Yamamoto (@yamakadi),Furkan Göksel (@frkngksl),Fabian Mosch (@S3cur3Th1sSh1t),Rafael Félix (@b1scoito),Guillaume Caillé (@OffenseTeacher),以及许多其他人!
如果NimPlant对您有用,并且/或者您总体上喜欢我的工作,非常欢迎您的支持:
inline-execute、shinject(使用动态调用)、自定义运行空间中的powershell或线程内execute-assembly轻松部署更高级的功能或有效载荷运行Nimplant需要现代版本的Python3。
requirements.txt(pip3 install -r server/requirements.txt)。choosenim安装,因为apt并不总是提供最新版本)。cd client; nimble install -d)。mingw工具链(brew install mingw-w64或apt install mingw-w64)。rustup安装)。rustup target add x86_64-pc-windows-gnu。Cargo.toml修改您的~/.cargo/config.toml文件,并使用nightly构建链(rustup default nightly)。**注意:**即使在Windows上编译,也建议使用
x86_64-pc-windows-gnu目标。它生成的二进制文件稍大,但从生成的DLL生成shellcode时似乎更稳定。您可以修改rust-toolchain.toml将目标更改为x86_64-pc-windows-msvc,但生成的shellcode可能并非在所有情况下都能正常工作。
在使用NimPlant之前,请创建配置文件config.toml。建议复制config.toml.example并在此基础上工作。
设置概览如下。
| 类别 | 设置项 | 描述 |
|---|---|---|
| server | ip | C2 Web服务器(包括API)将监听的IP。建议使用127.0.0.1,仅在您已设置适当的防火墙或路由规则以保护C2时使用0.0.0.0。 |
| server | port | C2 Web服务器(包括API)将监听的端口。 |
| listener | type | 监听器类型,HTTP或HTTPS。HTTPS选项在下方配置。 |
| listener | sslCertPath | HTTPS证书文件的本地路径(例如通过LetsEncrypt CertBot请求或自签名)。当监听器类型为'HTTP'时忽略。 |
| listener | sslKeyPath | 对应HTTPS证书私钥文件的本地路径。如果设置了密码,运行NimPlant服务器时将提示输入密码。当监听器类型为'HTTP'时忽略。 |
| listener | hostname | 监听器主机名。如果不为空(""),NimPlant将使用此主机名进行连接。请确保从该主机到NimPlant监听器端口的流量路由正确。 |
| listener | ip | 监听器IP。即使设置了'hostname'也需要,因为服务器使用此IP进行注册。 |
| listener | port | 监听器端口。即使设置了'hostname'也需要,因为服务器使用此端口进行注册。 |
| listener | registerPath | 新NimPlant用于注册的URI路径。 |
| listener | taskPath | NimPlant获取任务的URI路径。 |
| listener | resultPath | NimPlant提交结果的URI路径。 |
| nimplant | riskyMode | 编译支持危险命令的NimPlant。操作者自行决定。禁用将移除对execute-assembly、powershell、shell和shinject的支持。 |
| nimplant | sleepMask | 是否对Nimplant使用Ekko睡眠掩码替代常规睡眠调用。目前仅适用于常规可执行文件! |
| nimplant | sleepTime | 新Nimplant的默认睡眠时间(秒)。 |
| nimplant | sleepJitter | 新Nimplant的默认抖动百分比。 |
| nimplant | killDate | Nimplant的失效日期(格式:yyyy-MM-dd)。如果超过此日期,Nimplant将退出。 |
| nimplant | userAgent | Nimplant使用的用户代理。服务器也使用它来验证Nimplant流量,因此建议选择一个不太显眼但也不过于常见的用户代理。 |
配置满意后,您可以生成NimPlant二进制文件以部署到目标。目前,NimPlant支持.exe、.dll和.bin二进制文件,分别对应(自删除)可执行文件、库和位置无关的shellcode(通过sRDI)。要生成,运行python nimplant.py compile,然后指定首选的二进制文件类型(exe、exe-selfdelete、dll、raw或all),以及可选地植入体类型(nim、rust、nim-debug或rust-debug——默认编译Nim)。文件将分别写入client/bin/或client-rs/bin/。
您可以传递rotatekey参数以在编译期间生成并使用新的XOR密钥。
注意:
NimPlant目前仅支持x64!
DLL文件的入口点是Update,它由DllMain在所有入口点上触发。这意味着您可以使用例如rundll32 .\NimPlant.dll,Update来触发,或者使用您选择的LOLBIN来侧加载它(可能需要在client/NimPlant.nim或client-rs/src/lib.rs中进行一些修改)```
PS C:\NimPlant> python .\nimplant.py compile all
* *(# #
** **(## ##
######## ( ********
####(###########************,****
# ######## ******** *
.### ***
.######## ********
#### ### *** ****
######### ### *** *********
####### #### ## ** **** *******
##### ## * ** *****
###### #### ##*** **** .******
############### ***************
########## **********
#########**********
#######********
| \ | () __ ___ | _ | | __ _ _ __ | |_
| | | | '_ _ \| |_) | |/ _ | '_ | __|
| |\ | | | | | | | __/| | (| | | | | |
|| _||| || ||| ||_,|| ||_|
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/'.
### 使用 Docker 编译
使用 Docker 很简单,并且可以避免依赖问题,因为容器中预装了所有所需的构建时和运行时依赖项。
要使用 Docker,您可以使用 [Docker Hub](https://hub.docker.com/r/chvancooten/nimplant) 上的公共 `chvancooten/nimplant` 容器(通过 CI/CD 构建),或者从源代码构建 `Dockerfile`.
> 要从源代码构建,请在主目录中运行以下命令:
>
> ```bash
> docker build . -t nimplant
> ```
这将构建一个标记为 `nimplant:latest` 的容器。注意:由于开发依赖,这可能需要一些时间并产生一个相当大的容器!
完成后,您可以从命令行运行容器来编译您的工件。```bash
docker run --rm -it -v ${PWD}:/nimplant chvancooten/nimplant:latest compile exe rust
注意:这是一个示例命令,请确保根据您的情况调整参数,例如挂载的卷。
一旦您准备好了二进制文件,就可以启动您的NimPlant服务器了!如果您是本地编译的,则无需额外配置,因为它会从同一个config.toml文件中读取。要启动服务器,只需运行python nimplant.py server(如果在Linux上运行,需要sudo权限)。一旦Nimplant签入,您可以使用控制台,或者访问Web界面http://localhost:31337(默认端口)。