
Shell WinRM natif Nim avec NTLM, Kerberos, transfert de fichiers, utilitaires en mémoire et reporting AD/OPSEC

nimrm est destiné à l'administration légitime, aux tests de sécurité et à la recherche sur des systèmes que vous possédez ou pour lesquels vous disposez d'une autorisation explicite d'accès. L'auteur n'est pas responsable d'une utilisation abusive ou des dommages causés par cet outil.
nimrm fournit un shell WinRM compact et rapide avec des assistants pratiques pour l'authentification, l'exécution de commandes, le transfert et le reporting. Il est compilé en un binaire Nim natif sans dépendances de paquets Nim.
| Domaine | Prise en charge |
|---|---|
| Authentification | Mot de passe NTLM, hash NTLM, Kerberos via KRB5CCNAME |
| Transport WinRM | HTTP, HTTPS/TLS, port personnalisé |
| Shell | PowerShell interactif, préfixe CMD, mode de commande unique, autocomplétion des commandes et des chemins locaux |
| Transferts | Téléversement/téléchargement de fichiers, transfert récursif de répertoires, relais de fichiers et de répertoires entre sessions distantes |
| En mémoire | Import de scripts PowerShell, exécution d'assemblys .NET managés |
| Reporting | Contexte AD/domaine, posture de journalisation et d'audit |
| Fiabilité | Enveloppement des messages Kerberos, gestion de la réinitialisation/des nouvelles tentatives de transport |
| Composant | Prérequis |
|---|---|
| Compilation | Nim >= 1.6.0 |
| Kerberos | libgssapi_krb5.so.2 sous Linux ou libgssapi_krb5.dylib sous macOS |
| Compilation TLS | OpenSSL et -d:ssl |
| Cible | WinRM accessible sur le port sélectionné |
Nimble :
nimble install nimrm
Télécharger la dernière version :
curl -L -o nimrm https://github.com/blue0x1/nimrm/releases/latest/download/nimrm
chmod +x nimrm
Binaire de la version Windows :
Invoke-WebRequest -Uri https://github.com/blue0x1/nimrm/releases/latest/download/nimrm.exe -OutFile nimrm.exe
Paquet 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
Le PKGBUILD BlackArch suit le dernier commit git en amont, de sorte que les nouvelles versions parviennent aux utilisateurs de BlackArch lors de leur prochaine mise à jour système. Si nimrm est déjà installé, mettez-le à niveau avec :
sudo pacman -Syu nimrm
Compilation depuis les sources :
git clone https://github.com/blue0x1/nimrm.git
cd nimrm
make linux
make linux
make ssl
make windows
Compilation manuelle :
nim c -d:release --opt:speed -o:nimrm nimrm.nim
nimrm est conçu pour rester rapide grâce à un binaire Nim natif, un espace d'exécution WinRM persistant, une logique de transfert par blocs et un rendu compact de la progression.
| Opération | Implémentation |
|---|---|
| Téléversement | Écritures Base64 par blocs avec nouvelle tentative adaptative pour les enveloppes volumineuses |
| Téléchargement | Blocs Base64 diffusés avec suivi de progression et un chemin rapide pour les petits fichiers |
| Relais entre sessions distantes | Lit depuis une session WinRM et écrit vers une autre via la mémoire du contrôleur sans écrire le fichier sur le disque local |
| Transfert de répertoire | Énumération récursive des fichiers en utilisant le même chemin de transfert par blocs |
| Exécution de commandes | Réutilise le shell/espace d'exécution WinRM actif au lieu de se reconnecter à chaque commande |
Mot de passe 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
Forcer le chiffrement des messages NTLM sur HTTP :
./nimrm -T 192.168.1.10 -A 'CORP\user' -P 'Password123' --seal
Port personnalisé :
./nimrm -T 192.168.1.10 -A 'CORP\user' -P 'Password123' -p 5985
Commande unique :
./nimrm -T 192.168.1.10 -A 'CORP\user' -P 'Password123' -c 'whoami'
Ignorer la vérification du certificat TLS (certificats auto-signés) :
./nimrm -T 192.168.1.10 -A 'CORP\user' -P 'Password123' --tls --insecure
| Option | Description |
|---|---|
-T, --target | IP ou nom d'hôte cible |
-A, --account | Nom d'utilisateur : user, user@domain ou DOMAIN\user |
-P, --secret | Mot de passe NTLM |
-p, --port | Port WinRM |
-N, --nt-proof | Hash NT ou hash LM:NT |
-Z, --krb-zone | Remplacement du domaine Kerberos |
-K, --kerb-spn | Remplacement du SPN Kerberos |
-k, --kerb | Utiliser l'authentification Kerberos |
-c, --command | Exécuter une commande puis quitter |
--tls | Utiliser HTTPS/TLS |
--insecure | Ignorer la vérification du certificat TLS |
-h, --help | Afficher l'aide |
| Commande | Description |
|---|---|
/help | Afficher l'aide |
exit, quit | Fermer le shell |
!<cmd> | Exécuter via cmd.exe |
upload <local> [remote] | Téléverser un fichier |
download <remote> [local] | Télécharger un fichier |
rupload <remote> <session> [dest] | Copier un fichier distant de la session active vers une autre session via la mémoire |
rdownload <session> <remote> [dest] | Copier un fichier distant d'une autre session vers la session active via la mémoire |
rupload-dir <remote> <session> [dest] | Copier un répertoire distant de la session active vers une autre session via la mémoire |
rdownload-dir <session> <remote> [dest] | Copier un répertoire distant d'une autre session vers la session active via la mémoire |
upload-dir <local> [remote] | Téléverser un répertoire |
download-dir <remote> [local] | Télécharger un répertoire |
invoke-script <ps1> [args] | Importer un script PowerShell local depuis la mémoire |
execute-assembly <exe> [args] | Exécuter du .NET managé depuis la mémoire |
ad-info | Afficher le contexte AD/domaine |
opsec-check | Afficher la posture de journalisation et d'audit |
sessions | Lister toutes les sessions actives |
session <opts> | Créer une nouvelle session |
use <name|id> | Basculer vers une session |
kill <name|id> | Fermer et supprimer une session |
nimrm prend en charge plusieurs sessions WinRM concurrentes. Vous pouvez passer d'un hôte et d'un utilisateur à l'autre sans quitter le shell.
Créer une nouvelle session depuis une session existante :
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
Lister les sessions actives :
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
Basculer entre les sessions :
[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)
Fermer une session :
[dc02] PS C:\Users\user> kill 2
[*] Killed session: session-2
Copier des fichiers entre sessions actives :
[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 et rupload-dir utilisent la session active comme source et la session nommée comme destination. rdownload et rdownload-dir utilisent la session nommée comme source et la session active comme destination. Ces commandes relaient les octets via la mémoire de nimrm, de sorte que l'hôte contrôleur n'écrit pas de copie temporaire sur le disque.
Options de session :
| Option | Description |
|---|---|
-T | Hôte cible |
-A | Nom d'utilisateur |
-P | Mot de passe |
-N | Hash NT |
-k | Authentification Kerberos |
-Z | Domaine Kerberos |
-K | Remplacement du SPN |
-p | Port |
--tls | Utiliser HTTPS |
-n | Nom de session personnalisé |
PowerShell et CMD :
PS> hostname
PS> Get-Process
PS> !ipconfig /all
Transferts :
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
Sens du relais entre sessions distantes :
# 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
Autocomplétion :
PS> upl<Tab>
PS> upload ./pay<Tab>
L'invite interactive complète les noms de commandes et les chemins du système de fichiers local pour les commandes utilisant une source locale, telles que upload, upload-dir, invoke-script et execute-assembly.
Assistants en mémoire :
PS> invoke-script ./AdminTools.ps1
PS> execute-assembly ./tool.exe arg1 arg2
Reporting :
PS> ad-info
PS> opsec-check
execute-assembly prend en charge uniquement les assemblys .NET managés.invoke-script importe dans l'espace d'exécution distant actuel.rupload, rdownload, rupload-dir et rdownload-dir n'écrivent pas de fichiers temporaires sur l'hôte contrôleur, mais les octets transitent toujours par la mémoire du contrôleur et utilisent deux étapes de transfert WinRM.ad-info et opsec-check sont des commandes de reporting en lecture seule.MIT. Voir LICENSE.