用 Nim 编写的原生 WinRM shell 客户端
版本 1.2.0 · 作者 Chokri Hammedi (blue0x1) · 许可证 MIT
nimrm 旨在用于对您拥有或已获得明确访问许可的系统进行合法管理、安全测试和研究。作者不对因滥用或使用本工具造成的损害负责。
nimrm 提供了一个紧凑且快速的 WinRM shell,具备实用的身份验证、命令执行、传输和报告辅助功能。它以原生 Nim 二进制文件形式构建,不依赖任何 Nim 包。
| 领域 | 支持情况 |
|---|---|
| 身份验证 | NTLM 密码、NTLM 哈希、通过 KRB5CCNAME 的 Kerberos |
| WinRM 传输 | HTTP、HTTPS/TLS、自定义端口 |
| Shell | 交互式 PowerShell、CMD 前缀、一次性命令模式、命令和本地路径自动补全 |
| 传输 | 文件上传/下载、递归目录传输、远程会话到会话的文件和目录中继 |
| 内存操作 | PowerShell 脚本导入、托管 .NET 程序集执行 |
| 报告 | AD/域上下文、日志记录和审计态势 |
| 可靠性 | Kerberos 消息封装、传输重置/重试处理 |
| 组件 | 要求 |
|---|---|
| 构建 | Nim >= 1.6.0 |
| Kerberos | Linux 上的 libgssapi_krb5.so.2 或 macOS 上的 libgssapi_krb5.dylib |
| TLS 构建 | OpenSSL 和 -d:ssl |
| 目标 | 所选端口上可访问的 WinRM |
Nimble:
nimble install nimrm
下载最新版本:
curl -L -o nimrm https://github.com/blue0x1/nimrm/releases/latest/download/nimrm
chmod +x nimrm
Windows 发布版二进制文件:
Invoke-WebRequest -Uri https://github.com/blue0x1/nimrm/releases/latest/download/nimrm.exe -OutFile nimrm.exe
Debian 软件包:
curl -L -o nimrm_1.2.0_amd64.deb https://github.com/blue0x1/nimrm/releases/latest/download/nimrm_1.2.0_amd64.deb
sudo dpkg -i nimrm_1.2.0_amd64.deb
BlackArch:
sudo pacman -S nimrm
BlackArch PKGBUILD 跟踪最新的上游 git 提交,因此新版本会在用户下次系统更新时到达 BlackArch 用户。如果 nimrm 已安装,请使用以下命令升级:
sudo pacman -Syu nimrm
从源码构建:
git clone https://github.com/blue0x1/nimrm.git
cd nimrm
make linux
make linux
make ssl
make windows
Windows 目标会在 dist/windows/nimrm.exe 构建一个自包含的、支持 SSL 的可执行文件。启动器用 Nim 编写,内嵌生成的 WinRM 核心以及来自 vendor/windows-runtime/ 所需的运行时 DLL,执行时将它们解压到临时运行时目录,然后使用相同的参数运行核心。除非传递 --tls / --ssl,否则这支持纯 HTTP WinRM;启用 TLS 时支持 HTTPS WinRM。内嵌的 OpenSSL 运行时使用:
libssl-3-x64.dll
libcrypto-3-x64.dll
Kerberos 模式(-k / --kerb)在 Windows 上延迟加载,因此即使不使用 Kerberos,可执行文件也能启动。Windows 构建内嵌了 Kerberos 模式所使用的 MIT Kerberos/GSSAPI 运行时。
手动构建:
nim c -d:release --opt:speed -o:nimrm nimrm.nim
nimrm 通过使用原生 Nim 二进制文件、持久化 WinRM runspace、分块传输逻辑和紧凑的进度渲染来保持高速。
| 操作 | 实现 |
|---|---|
| 上传 | 分块 Base64 写入,对大信封进行自适应重试 |
| 下载 | 流式 Base64 分块,带进度跟踪,小文件走快速路径 |
| 远程会话中继 | 从一个 WinRM 会话读取并写入另一个会话,通过控制器内存传输,不将文件写入本地磁盘 |
| 目录传输 | 使用相同的分块传输路径进行递归文件枚举 |
| 命令执行 | 复用活动的 WinRM shell/runspace,而不是每条命令重新连接 |
NTLM 密码:
./nimrm -T 192.168.1.10 -A 'CORP\administrator' -P 'Password123'
NTLM pass-the-hash:
./nimrm -T 192.168.1.10 -A 'CORP\user' -N aad3b435b51404eeaad3b435b51404ee:0123456789abcdef0123456789abcdef
Kerberos:
KRB5CCNAME=FILE:/tmp/user.ccache ./nimrm -k -T dc01.corp.local -Z CORP.LOCAL
通过 HTTP 强制 NTLM 消息加密:
./nimrm -T 192.168.1.10 -A 'CORP\user' -P 'Password123' --seal
自定义端口:
./nimrm -T 192.168.1.10 -A 'CORP\user' -P 'Password123' -p 5985
一次性命令:
./nimrm -T 192.168.1.10 -A 'CORP\user' -P 'Password123' -c 'whoami'
跳过 TLS 证书验证(自签名证书):
./nimrm -T 192.168.1.10 -A 'CORP\user' -P 'Password123' --tls --insecure
| 选项 | 描述 |
|---|---|
-T, --target | 目标 IP 或主机名 |
-A, --account | 用户名:user、user@domain 或 DOMAIN\user |
-P, --secret | NTLM 密码 |
-p, --port | WinRM 端口 |
-N, --nt-proof | NT 哈希或 LM:NT 哈希 |
-Z, --krb-zone | Kerberos 领域覆盖 |
-K, --kerb-spn | Kerberos SPN 覆盖 |
-k, --kerb | 使用 Kerberos 身份验证 |
-c, --command | 执行一条命令后退出 |
--tls | 使用 HTTPS/TLS |
--insecure | 跳过 TLS 证书验证 |
-h, --help | 显示帮助 |
| 命令 | 描述 |
|---|---|
/help | 显示帮助 |
exit, quit | 关闭 shell |
!<cmd> | 通过 cmd.exe 运行 |
upload <local> [remote] | 上传单个文件 |
download <remote> [local] | 下载单个文件 |
rupload <remote> <session> [dest] | 通过内存将远程文件从活动会话复制到另一个会话 |
rdownload <session> <remote> [dest] | 通过内存将远程文件从另一个会话复制到活动会话 |
rupload-dir <remote> <session> [dest] | 通过内存将远程目录从活动会话复制到另一个会话 |
rdownload-dir <session> <remote> [dest] | 通过内存将远程目录从另一个会话复制到活动会话 |
upload-dir <local> [remote] | 上传目录 |
download-dir <remote> [local] | 下载目录 |
invoke-script <ps1> [args] | 从内存导入本地 PowerShell |
execute-assembly <exe> [args] | 从内存运行托管 .NET |
ad-info | 显示 AD/域上下文 |
opsec-check | 显示日志记录和审计态势 |
sessions | 列出所有活动会话 |
session <opts> | 创建新会话 |
use <name|id> | 切换到某个会话 |
kill <name|id> | 关闭并移除会话 |
nimrm 支持多个并发 WinRM 会话。您可以在不同主机和用户之间切换,而无需离开 shell。
在现有会话中创建新会话:
PS C:\Users\Administrator> session -T 10.0.0.5 -A 'CORP\user2' -P 'Pass123'
PS C:\Users\Administrator> session -T dc02.corp.local -A [email protected] -N aad3b435:0123456789abcdef -n dc02
PS C:\Users\Administrator> session -T dc03.corp.local -k -Z CORP.LOCAL -n dc03
列出活动会话:
PS C:\Users\Administrator> sessions
ID Name Target User Auth
-- ---- ------ ---- ----
* 1 session-1 dc01.corp.local:5985 administrator Kerberos
2 session-2 10.0.0.5:5985 user2 NTLM
3 dc02 dc02.corp.local:5985 user NTLM
在会话之间切换:
[session-2] PS C:\Users\user2> use 1
[*] Switched to session: session-1 (dc01.corp.local:5985)
[session-1] PS C:\Users\Administrator> use dc02
[*] Switched to session: dc02 (dc02.corp.local:5985)
关闭会话:
[dc02] PS C:\Users\user> kill 2
[*] Killed session: session-2
在活动会话之间复制文件:
[session-1] PS C:\Users\user1> rupload C:\Users\user1\tool.exe session-2 C:\Users\user2\Desktop\tool.exe
[*] Download mode: WinRS binary stream
✔ rupload-read [━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━] 100% 442.0 KB/442.0 KB done in 0.7s
[*] Upload mode: WinRS stream
✔ rupload-write [━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━] 100% 442.0 KB/442.0 KB done in 0.4s
[+] Remote uploaded 452608 bytes from session-1:C:\Users\user1\tool.exe to session-2:C:\Users\user2\Desktop\tool.exe