
Shell WinRM nativo em Nim com NTLM, Kerberos, transferência de arquivos, auxiliares em memória e relatórios de AD/OPSEC.
Cliente de shell WinRM nativo escrito em Nim
Versão 1.2.0 · Autor Chokri Hammedi (blue0x1) · Licença MIT
O nimrm destina-se a administração legítima, testes de segurança e pesquisa em sistemas que você possui ou para os quais tem permissão explícita de acesso. O autor não é responsável por uso indevido ou danos causados por esta ferramenta.
O nimrm fornece um shell WinRM compacto e rápido com autenticação prática, execução de comandos, transferência e utilitários de relatórios. Ele é construído como um binário Nim nativo, sem dependências de pacotes Nim.
| Componente |
|---|
Nimble:
nimble install nimrm
Baixe a versão mais recente:
curl -L -o nimrm https://github.com/blue0x1/nimrm/releases/latest/download/nimrm
chmod +x nimrm
Binário da versão para Windows:
Invoke-WebRequest -Uri https://github.com/blue0x1/nimrm/releases/latest/download/nimrm.exe -OutFile nimrm.exe
Pacote 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
O PKGBUILD do BlackArch acompanha o commit git mais recente do upstream, então novas versões chegam aos usuários do BlackArch na próxima atualização do sistema. Se o nimrm já estiver instalado, atualize-o com:
sudo pacman -Syu nimrm
Compile a partir do código-fonte:
git clone https://github.com/blue0x1/nimrm.git
cd nimrm
make linux
make linux
make ssl
make windows
Compilação manual:
nim c -d:release --opt:speed -o:nimrm nimrm.nim
O nimrm foi projetado para permanecer rápido usando um binário Nim nativo, runspace WinRM persistente, lógica de transferência em blocos e renderização compacta de progresso.
Senha NTLM:
./nimrm -T 192.168.1.10 -A 'CORP\administrator' -P 'Password123'
Pass-the-hash 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
Forçar criptografia de mensagens NTLM via HTTP:
./nimrm -T 192.168.1.10 -A 'CORP\user' -P 'Password123' --seal
Porta personalizada:
./nimrm -T 192.168.1.10 -A 'CORP\user' -P 'Password123' -p 5985
Comando único:
./nimrm -T 192.168.1.10 -A 'CORP\user' -P 'Password123' -c 'whoami'
Ignorar verificação de certificado TLS (certificados autoassinados):
./nimrm -T 192.168.1.10 -A 'CORP\user' -P 'Password123' --tls --insecure
O nimrm suporta múltiplas sessões WinRM simultâneas. Você pode alternar entre diferentes hosts e usuários sem sair do shell.
Crie uma nova sessão a partir de uma sessão existente:
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
Liste as sessões ativas:
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
Alterne entre sessões:
[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)
Feche uma sessão:
[dc02] PS C:\Users\user> kill 2
[*] Killed session: session-2
Copie arquivos entre sessões ativas:
[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 e rupload-dir usam a sessão ativa como origem e a sessão nomeada como destino. rdownload e rdownload-dir usam a sessão nomeada como origem e a sessão ativa como destino. Esses comandos retransmitem os bytes pela memória do nimrm, portanto o host controlador não grava uma cópia temporária em disco.
Opções de sessão:
PowerShell e CMD:
PS> hostname
PS> Get-Process
PS> !ipconfig /all
Transferências:
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
Direção da retransmissão remota entre sessões:
# 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
Autocompletar:
PS> upl<Tab>
PS> upload ./pay<Tab>
O prompt interativo completa nomes de comandos e caminhos do sistema de arquivos local para comandos de origem local, como upload, upload-dir, invoke-script e execute-assembly.
Utilitários em memória:
PS> invoke-script ./AdminTools.ps1
PS> execute-assembly ./tool.exe arg1 arg2
Relatórios:
PS> ad-info
PS> opsec-check
execute-assembly suporta apenas assemblies .NET gerenciados.invoke-script importa para o runspace remoto atual.rupload, rdownload, rupload-dir e rdownload-dir não gravam arquivos temporários no host controlador, mas os bytes ainda passam pela memória do controlador e usam dois trechos de transferência WinRM.ad-info e opsec-check são comandos de relatório somente leitura.MIT. Consulte LICENSE.
| Área | Suporte |
|---|
| Autenticação | Senha NTLM, hash NTLM, Kerberos via KRB5CCNAME |
| Transporte WinRM | HTTP, HTTPS/TLS, porta personalizada |
| Shell | PowerShell interativo, prefixo CMD, modo de comando único, autocompletar de comandos e caminhos locais |
| Transferências | Upload/download de arquivos, transferência recursiva de diretórios, retransmissão remota de arquivos e diretórios entre sessões |
| Em memória | Importação de scripts PowerShell, execução de assemblies .NET gerenciados |
| Relatórios | Contexto de AD/domínio, postura de logging e auditoria |
| Confiabilidade | Encapsulamento de mensagens Kerberos, tratamento de redefinição/re-tentativa de transporte |
| Requisito |
|---|
| Compilação | Nim >= 1.6.0 |
| Kerberos | libgssapi_krb5.so.2 no Linux ou libgssapi_krb5.dylib no macOS |
| Compilação TLS | OpenSSL e -d:ssl |
| Alvo | WinRM acessível na porta selecionada |
| Operação | Implementação |
|---|
| Upload | Gravações Base64 em blocos com nova tentativa adaptativa para envelopes grandes |
| Download | Blocos Base64 transmitidos com acompanhamento de progresso e caminho rápido para arquivos pequenos |
| Retransmissão remota de sessão | Lê de uma sessão WinRM e grava em outra pela memória do controlador, sem gravar o arquivo no disco local |
| Transferência de diretório | Enumeração recursiva de arquivos usando o mesmo caminho de transferência em blocos |
| Execução de comandos | Reutiliza o shell/runspace WinRM ativo em vez de reconectar por comando |
| Opção | Descrição |
|---|
-T, --target | IP ou nome de host de destino |
-A, --account | Nome de usuário: user, user@domain ou DOMAIN\user |
-P, --secret | Senha NTLM |
-p, --port | Porta WinRM |
-N, --nt-proof | Hash NT ou hash LM:NT |
-Z, --krb-zone | Substituição de realm Kerberos |
-K, --kerb-spn | Substituição de SPN Kerberos |
-k, --kerb | Usar autenticação Kerberos |
-c, --command | Executar um comando e sair |
--tls | Usar HTTPS/TLS |
--insecure | Ignorar verificação de certificado TLS |
-h, --help | Mostrar ajuda |
| Comando | Descrição |
|---|
/help | Mostrar ajuda |
exit, quit | Fechar o shell |
!<cmd> | Executar via cmd.exe |
upload <local> [remote] | Enviar um arquivo |
download <remote> [local] | Baixar um arquivo |
rupload <remote> <session> [dest] | Copiar um arquivo remoto da sessão ativa para outra sessão pela memória |
rdownload <session> <remote> [dest] | Copiar um arquivo remoto de outra sessão para a sessão ativa pela memória |
rupload-dir <remote> <session> [dest] | Copiar um diretório remoto da sessão ativa para outra sessão pela memória |
rdownload-dir <session> <remote> [dest] | Copiar um diretório remoto de outra sessão para a sessão ativa pela memória |
upload-dir <local> [remote] | Enviar um diretório |
download-dir <remote> [local] | Baixar um diretório |
invoke-script <ps1> [args] | Importar PowerShell local da memória |
execute-assembly <exe> [args] | Executar .NET gerenciado da memória |
ad-info | Mostrar contexto de AD/domínio |
opsec-check | Mostrar postura de logging e auditoria |
sessions | Listar todas as sessões ativas |
session <opts> | Criar uma nova sessão |
use <name|id> | Alternar para uma sessão |
kill <name|id> | Fechar e remover uma sessão |
| Opção | Descrição |
|---|
-T | Host de destino |
-A | Nome de usuário |
-P | Senha |
-N | Hash NT |
-k | Autenticação Kerberos |
-Z | Realm Kerberos |
-K | Substituição de SPN |
-p | Porta |
--tls | Usar HTTPS |
-n | Nome personalizado de sessão |