使用 Nim 编写的原生 WinRM Shell 客户端
版本 1.2.0 · 作者 Chokri Hammedi (blue0x1) · 许可证 MIT
nimrm 旨在对您拥有或已获得明确访问许可的系统进行合法的管理、安全测试和研究。作者不对因使用本工具而造成的滥用或损害负责。
nimrm 提供了一个紧凑且快速的 WinRM Shell,并带有实用的身份认证、命令执行、传输和报告辅助功能。它构建为原生 Nim 二进制文件,不依赖任何 Nim 软件包。
| 组件 | 要求 |
|---|---|
通过 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
手动构建:
nim c -d:release --opt:speed -o:nimrm nimrm.nim
nimrm 通过使用原生 Nim 二进制文件、持久的 WinRM 运行空间、分块传输逻辑和紧凑的进度渲染来保持高速运行。
| 操作 | 实现方式 |
|---|---|
| 上传 | 分块 Base64 写入,对大型信封采用自适应重试 |
| 下载 | 流式 Base64 分块,带进度跟踪,并为小文件提供快速路径 |
| 远程会话中继 | 从一个 WinRM 会话读取,通过控制器内存写入另一个会话,无需将文件写入本地磁盘 |
NTLM 密码:
./nimrm -T 192.168.1.10 -A 'CORP\administrator' -P 'Password123'
NTLM 哈希传递:
./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
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
[session-1] PS C:\Users\user1> rdownload session-2 C:\Users\user2\Desktop\out.txt C:\Users\user1\out.txt
[+] Remote downloaded 1024 bytes from session-2:C:\Users\user2\Desktop\out.txt to session-1:C:\Users\user1\out.txt
rupload 和 rupload-dir 以活动会话为源,以指定会话为目标。rdownload 和 rdownload-dir 以指定会话为源,以活动会话为目标。这些命令通过 nimrm 内存中继字节数据,因此控制端主机不会将临时副本写入磁盘。
会话选项:
PowerShell 和 CMD:
PS> hostname
PS> Get-Process
PS> !ipconfig /all
传输:
PS> upload ./tool.exe C:\Temp\tool.exe
PS> download C:\Temp\out.txt ./out.txt
PS> rupload C:\Temp\tool.exe session-2 C:\Temp\tool.exe
PS> rdownload session-2 C:\Temp\out.txt C:\Temp\out.txt
PS> rupload-dir C:\Temp\logs session-2 C:\Temp\logs
PS> rdownload-dir session-2 C:\Temp\loot C:\Temp\loot
PS> upload-dir ./payloads C:\Temp\payloads
PS> download-dir C:\Temp\logs ./logs
远程会话中继方向:
# Active session -> another session
PS> rupload C:\Temp\payload.exe session-2 C:\Users\Public\payload.exe
# Another session -> active session
PS> rdownload session-2 C:\Users\Public\loot.zip C:\Temp\loot.zip
自动补全:
PS> upl<Tab>
PS> upload ./pay<Tab>
交互式提示符会为本地源命令(如 upload、upload-dir、invoke-script 和 execute-assembly)补全命令名和本地文件系统路径。
内存中执行辅助功能:
PS> invoke-script ./AdminTools.ps1
PS> execute-assembly ./tool.exe arg1 arg2
报告:
PS> ad-info
PS> opsec-check
execute-assembly 仅支持托管 .NET 程序集。invoke-script 导入到当前的远程运行空间。rupload、rdownload、rupload-dir 和 rdownload-dir 不会在控制端主机上写入临时文件,但字节数据仍会经过控制器内存,并使用两段 WinRM 传输路径。ad-info 和 opsec-check 是只读报告命令。MIT。参见 LICENSE。
| 类别 | 支持 |
|---|
| 身份认证 | 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 |
| 目录传输 | 使用相同的分块传输路径进行递归文件枚举 |
| 命令执行 | 复用活动的 WinRM Shell/运行空间,而不是每条命令都重新连接 |
| 选项 | 描述 |
|---|
-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> | 关闭并移除会话 |
| 选项 | 描述 |
|---|
-T | 目标主机 |
-A | 用户名 |
-P | 密码 |
-N | NT 哈希 |
-k | Kerberos 认证 |
-Z | Kerberos 领域 |
-K | SPN 覆盖 |
-p | 端口 |
--tls | 使用 HTTPS |
-n | 自定义会话名称 |