
Shell WinRM nativa in Nim con NTLM, Kerberos, trasferimento file, helper in memoria e reporting AD/OPSEC.
Client shell WinRM nativo scritto in Nim
Versione 1.2.0 · Autore Chokri Hammedi (blue0x1) · Licenza MIT
nimrm è pensato per l'amministrazione legittima, i test di sicurezza e la ricerca su sistemi di tua proprietà o per i quali hai esplicita autorizzazione all'accesso. L'autore non è responsabile per usi impropri o danni causati da questo strumento.
nimrm fornisce una shell WinRM compatta e veloce con pratici helper per autenticazione, esecuzione di comandi, trasferimento e report. È costruito come binario Nim nativo senza dipendenze da pacchetti Nim.
| Componente |
|---|
Nimble:
nimble install nimrm
Scarica l'ultima release:
curl -L -o nimrm https://github.com/blue0x1/nimrm/releases/latest/download/nimrm
chmod +x nimrm
Binario di release per Windows:
Invoke-WebRequest -Uri https://github.com/blue0x1/nimrm/releases/latest/download/nimrm.exe -OutFile nimrm.exe
Pacchetto 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
Il PKGBUILD di BlackArch segue l'ultimo commit git upstream, quindi le nuove release raggiungono gli utenti BlackArch al successivo aggiornamento di sistema. Se nimrm è già installato, aggiornalo con:
sudo pacman -Syu nimrm
Compila dal sorgente:
git clone https://github.com/blue0x1/nimrm.git
cd nimrm
make linux
make linux
make ssl
make windows
Compilazione manuale:
nim c -d:release --opt:speed -o:nimrm nimrm.nim
nimrm è progettato per restare veloce grazie a un binario Nim nativo, runspace WinRM persistente, logica di trasferimento a blocchi e rendering compatto dell'avanzamento.
Password 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
Forza la crittografia dei messaggi NTLM su HTTP:
./nimrm -T 192.168.1.10 -A 'CORP\user' -P 'Password123' --seal
Porta personalizzata:
./nimrm -T 192.168.1.10 -A 'CORP\user' -P 'Password123' -p 5985
Comando singolo:
./nimrm -T 192.168.1.10 -A 'CORP\user' -P 'Password123' -c 'whoami'
Salta la verifica del certificato TLS (certificati self-signed):
./nimrm -T 192.168.1.10 -A 'CORP\user' -P 'Password123' --tls --insecure
nimrm supporta più sessioni WinRM concorrenti. Puoi passare da un host all'altro e cambiare utente senza uscire dalla shell.
Crea una nuova sessione dall'interno di una esistente:
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
Elenca le sessioni attive:
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
Passa da una sessione all'altra:
[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)
Chiudi una sessione:
[dc02] PS C:\Users\user> kill 2
[*] Killed session: session-2
Copia file tra sessioni attive:
[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 usano la sessione attiva come origine e la sessione indicata come destinazione. rdownload e rdownload-dir usano la sessione indicata come origine e la sessione attiva come destinazione. Questi comandi instradano i byte attraverso la memoria di nimrm, quindi l'host controller non scrive una copia temporanea su disco.
Opzioni di sessione:
PowerShell e CMD:
PS> hostname
PS> Get-Process
PS> !ipconfig /all
Trasferimenti:
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
Direzione del relay tra sessioni remote:
# 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
Completamento automatico:
PS> upl<Tab>
PS> upload ./pay<Tab>
Il prompt interattivo completa i nomi dei comandi e i percorsi del filesystem locale per i comandi con origine locale come upload, upload-dir, invoke-script ed execute-assembly.
Helper in-memory:
PS> invoke-script ./AdminTools.ps1
PS> execute-assembly ./tool.exe arg1 arg2
Report:
PS> ad-info
PS> opsec-check
execute-assembly supporta solo assembly .NET gestiti.invoke-script importa nel runspace remoto corrente.rupload, rdownload, rupload-dir e rdownload-dir non scrivono file temporanei sull'host controller, ma i byte passano comunque attraverso la memoria del controller e usano due passaggi di trasferimento WinRM.ad-info e opsec-check sono comandi di report in sola lettura.MIT. Vedi LICENSE.
| Area | Supporto |
|---|
| Autenticazione | Password NTLM, hash NTLM, Kerberos tramite KRB5CCNAME |
| Trasporto WinRM | HTTP, HTTPS/TLS, porta personalizzata |
| Shell | PowerShell interattivo, prefisso CMD, modalità comando singolo, completamento automatico di comandi e percorsi locali |
| Trasferimenti | Caricamento/scaricamento file, trasferimento ricorsivo di directory, relay di file e directory tra sessioni remote |
| In-memory | Importazione di script PowerShell, esecuzione di assembly .NET gestiti |
| Reportistica | Contesto AD/dominio, posture di logging e auditing |
| Affidabilità | Avvolgimento messaggi Kerberos, gestione reset/retry del trasporto |
| Requisito |
|---|
| Compilazione | Nim >= 1.6.0 |
| Kerberos | libgssapi_krb5.so.2 su Linux o libgssapi_krb5.dylib su macOS |
| Compilazione TLS | OpenSSL e -d:ssl |
| Destinazione | WinRM raggiungibile sulla porta selezionata |
| Operazione | Implementazione |
|---|
| Caricamento | Scritture Base64 a blocchi con retry adattivo per envelope di grandi dimensioni |
| Scaricamento | Blocchi Base64 in streaming con monitoraggio dell'avanzamento e percorso rapido per file piccoli |
| Relay tra sessioni remote | Legge da una sessione WinRM e scrive in un'altra attraverso la memoria del controller senza scrivere il file su disco locale |
| Trasferimento directory | Enumerazione ricorsiva dei file tramite lo stesso percorso di trasferimento a blocchi |
| Esecuzione comandi | Riutilizza la shell/runspace WinRM attiva invece di riconnettersi a ogni comando |
| Opzione | Descrizione |
|---|
-T, --target | IP o hostname di destinazione |
-A, --account | Nome utente: user, user@domain o DOMAIN\user |
-P, --secret | Password NTLM |
-p, --port | Porta WinRM |
-N, --nt-proof | Hash NT o hash LM:NT |
-Z, --krb-zone | Override del realm Kerberos |
-K, --kerb-spn | Override dello SPN Kerberos |
-k, --kerb | Usa l'autenticazione Kerberos |
-c, --command | Esegue un comando ed esce |
--tls | Usa HTTPS/TLS |
--insecure | Salta la verifica del certificato TLS |
-h, --help | Mostra l'aiuto |
| Comando | Descrizione |
|---|
/help | Mostra l'aiuto |
exit, quit | Chiudi la shell |
!<cmd> | Esegui tramite cmd.exe |
upload <local> [remote] | Carica un file |
download <remote> [local] | Scarica un file |
rupload <remote> <session> [dest] | Copia un file remoto dalla sessione attiva a un'altra sessione tramite memoria |
rdownload <session> <remote> [dest] | Copia un file remoto da un'altra sessione alla sessione attiva tramite memoria |
rupload-dir <remote> <session> [dest] | Copia una directory remota dalla sessione attiva a un'altra sessione tramite memoria |
rdownload-dir <session> <remote> [dest] | Copia una directory remota da un'altra sessione alla sessione attiva tramite memoria |
upload-dir <local> [remote] | Carica una directory |
download-dir <remote> [local] | Scarica una directory |
invoke-script <ps1> [args] | Importa PowerShell locale dalla memoria |
execute-assembly <exe> [args] | Esegui .NET gestito dalla memoria |
ad-info | Mostra il contesto AD/dominio |
opsec-check | Mostra la postura di logging e auditing |
sessions | Elenca tutte le sessioni attive |
session <opts> | Crea una nuova sessione |
use <name|id> | Passa a una sessione |
kill <name|id> | Chiudi e rimuovi una sessione |
| Opzione | Descrizione |
|---|
-T | Host di destinazione |
-A | Nome utente |
-P | Password |
-N | Hash NT |
-k | Autenticazione Kerberos |
-Z | Realm Kerberos |
-K | Override SPN |
-p | Porta |
--tls | Usa HTTPS |
-n | Nome personalizzato della sessione |