WinRMを活用したペネトレーションテストの効率化
1. はじめに: evil-winrmとは?
evil-winrmは、Windows Remote Management (WinRM) プロトコルを利用して、Windowsシステムに対してリモートから操作を行うための強力なシェルツールです。主に、ペネトレーションテストやセキュリティ評価のポストエクスプロイト(侵入後活動)フェーズで利用されることを目的として開発されました。
このツールはRubyで書かれており、LinuxやWindowsクライアントからターゲットのWindowsマシンへ接続し、インタラクティブなPowerShellセッションを提供します。単なるコマンド実行だけでなく、ファイルのアップロード/ダウンロード、PowerShellスクリプトやDLL/C#アセンブリのメモリへのロード、Pass-the-Hash (PtH) 認証、Kerberos認証など、ペネトレーションテストに役立つ多くの機能が実装されています。
開発は Hackplayers チームによって行われ、継続的にアップデートされています。
1.1. WinRM (Windows Remote Management) とは
WinRMは、WS-Managementプロトコルに基づいたMicrosoftの実装で、異なるベンダーのハードウェアやOS間での相互運用を可能にする標準的なSOAPベースのプロトコルです。システム管理者がリモートからWindowsマシンを管理しやすくするために導入されました。
通常、WinRMは以下のポートで待ち受けます:
- ポート 5985 (HTTP): 平文通信
- ポート 5986 (HTTPS): SSL/TLSで暗号化された通信
WinRMサービスが有効になっており、適切な認証情報(ユーザー名とパスワード、またはハッシュ)があれば、リモートからPowerShellコマンドを実行したり、システムを管理したりすることが可能です。多くの組織では、サーバー管理の効率化のためにWinRMを有効にしています。
1.2. なぜ evil-winrm なのか?
WinRM自体は正当な管理プロトコルですが、攻撃者にとっては格好のターゲットとなり得ます。もし攻撃者がWinRMサービスにアクセス可能な認証情報を入手した場合、システムへのリモートアクセス権を得てしまいます。
evil-winrmは、このWinRMを「悪用」することに特化して設計されています。標準的なWinRMクライアントよりも、ペネトレーションテスターが必要とする機能(例えば、メモリ上でのスクリプト実行、ファイルの容易な転送、PtH認証など)を豊富に備えています。これにより、侵入後の横展開 (Lateral Movement) や情報収集、権限昇格といった活動を効率的に行うことができます。
特に、以下のような点がevil-winrmの強みです:
- インタラクティブなシェル: ターゲット上で直接コマンドを実行しているかのような操作感を提供します。
- ファイル転送の容易さ: `upload` および `download` コマンドで簡単にファイルをやり取りできます。
- メモリ実行: PowerShellスクリプトやDLL、C#アセンブリをディスクに書き込まずにメモリ上で実行できるため、アンチウイルス製品による検知を回避しやすくなります。
- 認証オプション: 通常のパスワード認証に加え、NTLMハッシュを用いたPass-the-Hash (PtH) やKerberos認証にも対応しています。
- 補完機能: コマンド履歴、WinRMコマンド、ローカル/リモートのファイルパス補完機能があり、操作性が高いです。
- ログ機能: 操作ログをローカルに保存するオプションがあり、レポート作成などに役立ちます。
これらの機能により、evil-winrmはWindows環境におけるペネトレーションテストの標準ツールの一つとなっています。
2. インストール方法
evil-winrmはRubyで書かれているため、RubyGemsを使って簡単にインストールできます。多くのLinuxディストリビューション(特にKali Linuxなど)には、Rubyがプリインストールされていることが多いです。
2.1. RubyGems を使用したインストール
最も一般的なインストール方法は、RubyGemsを使用するものです。以下のコマンドを実行するだけで、依存関係も含めてインストールされます。
これにより、システムに`evil-winrm`コマンドがインストールされ、すぐに利用可能になります。
もしアップデートが必要な場合も、同じコマンドを実行することで最新版に更新できます。
2.2. 依存関係
RubyGemsでインストールする場合、通常は依存関係も自動的に解決・インストールされます。手動でインストールする場合やトラブルシューティングのために、主要な依存gemを以下に示します。
winrm
winrm-fs
stringio
logger
fileutils
もしgem install evil-winrm
で問題が発生する場合は、これらのgemが個別にインストール可能か確認してみてください。
2.3. Kali Linux での利用
最新のKali Linuxディストリビューションには、evil-winrmが標準で含まれているか、簡単にインストールできるようになっています。もし含まれていない場合でも、上記 2.1 の RubyGems を使った方法でインストールできます。
2.4. Docker を使用した利用
Dockerイメージも提供されており、ローカル環境を汚さずにevil-winrmを使用したい場合に便利です。Docker Hubから公式イメージをpullして利用できます。
Docker内で使用する場合、upload
や download
コマンドのローカルパスは、コンテナ内の /data
ディレクトリ(またはマウントしたボリュームのパス)を基準にする必要があります。
2.5. その他のインストール方法
GitHubリポジトリから直接クローンして利用する方法や、Bundlerを使う方法、特定のRubyバージョンで利用する方法などもあります。詳細は公式のGitHubリポジトリを参照してください。
3. 基本的な使い方
evil-winrmの基本的な使い方として、ターゲットへの接続方法と、接続後の対話シェルでの操作について説明します。
3.1. 接続コマンドの基本形
最も基本的な接続コマンドは、ターゲットのIPアドレス、ユーザー名、パスワードを指定する形式です。
例えば、IPアドレス `192.168.1.100` のマシンに、ユーザー `Administrator`、パスワード `Password123!` で接続する場合は以下のようになります。
注意: パスワードに特殊文字が含まれる場合は、シングルクォーテーション (`’`) やダブルクォーテーション (`”`) で囲むか、適切にエスケープする必要があります。
接続に成功すると、以下のようなプロンプトが表示され、リモートのPowerShellセッションが開始されます。
ここから、通常のPowerShellコマンド (ipconfig
, whoami
, Get-Process
など) を実行できます。
3.2. 主なコマンドラインオプション
evil-winrmには多くのコマンドラインオプションがあり、様々な状況に対応できます。以下に主要なオプションをまとめます。
オプション | 説明 | 例 |
---|---|---|
-i, --ip IP |
接続先のリモートホストIPアドレスまたはホスト名。必須。 | -i 192.168.1.100 -i target.domain.local |
-P, --port PORT |
接続先のWinRMポート番号。デフォルトは 5985 (HTTP) または 5986 (HTTPS、-S指定時)。 | -P 5986 |
-u, --user USER |
接続に使用するユーザー名。ドメインユーザーの場合は DOMAIN\user 形式も可能。 |
-u Administrator -u CONTOSO\john |
-p, --password PASS |
接続に使用するパスワード。指定しない場合、プロンプトで聞かれます。 | -p 'Password123!' |
-H, --hash HASH |
接続に使用するNTLMパスワードハッシュ。Pass-the-Hash攻撃で使用。 | -H aad3b435b51404eeaad3b435b51404ee |
-s, --scripts SCRIPTS_PATH |
ローカルのPowerShellスクリプト (.ps1) を格納したディレクトリパス。接続後にmenu コマンドでこれらをインポートして利用可能になる。 |
-s /opt/powershell_scripts/ |
-e, --executables EXECUTABLES_PATH |
ローカルの実行可能ファイル (.exe, .dll, .bin など) を格納したディレクトリパス。Invoke-Binary やInvoke-Assembly コマンドで利用可能。 |
-e /opt/windows_tools/ |
-S, --ssl |
HTTPS (通常ポート 5986) を使用して接続する。証明書検証は行わない。 | -S |
-k, --kerberos |
Kerberos認証を使用する。事前にkinit などで有効なKerberosチケットを取得しておく必要がある。環境変数 KRB5CCNAME でチケットキャッシュを指定する必要がある場合がある。パスワード (-p) やハッシュ (-H) は不要。 |
-k |
-r, --realm REALM |
Kerberos認証で使用するレルム (通常は大文字のドメイン名)。-k と共に使用。 |
-k -r MYDOMAIN.LOCAL |
-c, --command COMMAND |
単一のコマンドを実行して結果を表示し、終了する。インタラクティブシェルは起動しない。 | -c 'whoami /all' |
-pubk, --public-key PUBLIC_KEY_PATH |
証明書ベース認証で使用する公開鍵ファイルへのパス。 | -pubk ./mycert.pub |
-privk, --private-key PRIVATE_KEY_PATH |
証明書ベース認証で使用する秘密鍵ファイルへのパス。 | -privk ./mycert.key |
-l, --log |
セッション中のすべての操作と出力をログファイルに記録する。ログはデフォルトで ~/.evil-winrm/logs ディレクトリに保存される。 |
-l |
--no-ssl-peer-verification |
SSL/TLS接続時にサーバー証明書の検証をスキップする (-S 使用時)。自己署名証明書などの場合に使用。-S オプション使用時はこれがデフォルトの動作。 |
-S --no-ssl-peer-verification |
--no-color |
プロンプトや出力のカラー表示を無効にする。 | --no-color |
--no-remote-path-completion |
リモートのファイル/ディレクトリパス補完機能を無効にする。低速な回線などで有効な場合がある。 | --no-remote-path-completion |
3.3. 対話シェルでの基本操作
evil-winrmの対話シェル内では、通常のPowerShellコマンドに加えて、いくつかの便利な組み込みコマンドが利用できます。
upload <ローカルパス> [リモートパス]
: ローカルマシンからターゲットマシンへファイルをアップロードします。リモートパスを省略すると、カレントディレクトリにアップロードされます。パス補完 (Tabキー) が利用できます。download <リモートパス> [ローカルパス]
: ターゲットマシンからローカルマシンへファイルをダウンロードします。ローカルパスを省略すると、カレントディレクトリにダウンロードされます。パス補完 (Tabキー) が利用できます。services
: リモートマシン上のサービス一覧を表示し、現在のユーザーが各サービスに対して持つ権限(開始、停止、変更など)を示します。管理者権限は不要です。menu
: evil-winrmの拡張機能メニューを表示します。ここから、ロードされたPowerShellスクリプトの関数を実行したり、DLL/アセンブリをロードしたりできます。exit
: evil-winrmセッションを終了します。
ファイルアップロード/ダウンロード例
ローカルの /tmp/payload.exe
をターゲットの C:\Windows\Temp\
にアップロード:
ターゲットの C:\Users\Public\Documents\secret.txt
をローカルの /home/attacker/loot/
にダウンロード:
ヒント: upload
/download
コマンドでは、絶対パスを使用することが推奨されます。相対パスは予期せぬエラーを引き起こす可能性があります。
`menu` コマンド
menu
コマンドは、evil-winrmの強力な機能への入り口です。特に、-s
オプションでPowerShellスクリプトのディレクトリを指定した場合や、-e
オプションで実行ファイルのディレクトリを指定した場合に役立ちます。
メニューに表示された関数名を入力することで、ロードされたスクリプトや機能(例: `Invoke-Binary`)を実行できます。
4. 高度な機能とテクニック
evil-winrmは基本的なリモートシェル機能に加え、ペネトレーションテストをより効果的に進めるための高度な機能を備えています。
4.1. Pass-the-Hash (PtH)
Windows環境では、ユーザーのパスワードそのものではなく、パスワードから生成されたNTLMハッシュを用いて認証が行われることがあります。攻撃者は、パスワードを知らなくても、このNTLMハッシュを窃取できれば、それを使って認証をパスし、システムにアクセスできます。これがPass-the-Hash (PtH) 攻撃です。
evil-winrmは -H
オプションでNTLMハッシュを指定することで、PtH攻撃を簡単に行えます。
MimikatzなどのツールでNTLMハッシュをダンプした後、この機能を使って横展開 (Lateral Movement) を行うのが一般的なシナリオです。
4.2. PowerShell スクリプトの実行 (メモリ上)
-s
オプションでPowerShellスクリプト (.ps1) が格納されたローカルディレクトリを指定すると、evil-winrmは接続時にそれらのスクリプトを解析し、含まれる関数をメモリ上にロードします。
接続後、menu
コマンドを実行すると、ロードされた関数がリストアップされます。
この方法の最大の利点は、スクリプトファイル自体をターゲットのディスク上に書き込む必要がないため、ファイルベースのアンチウイルス検出を回避しやすい点です。また、evil-winrmには動的なAMSI (Antimalware Scan Interface) バイパス機能も組み込まれており、メモリ上で実行されるスクリプトに対するAMSIスキャンを回避しようと試みます。
menu
内の load P <スクリプト名 or パス>
コマンドを使えば、セッション中に後からスクリプトをロードすることも可能です。
4.3. 実行可能ファイル (C#, DLL) の利用 (メモリ上)
PowerShellスクリプトと同様に、-e
オプションでC#でコンパイルされた実行可能ファイル (.exe) やDLLファイル (.dll) が格納されたローカルディレクトリを指定できます。
接続後、menu
コマンドで利用可能な機能を確認し、Invoke-Binary
(またはエイリアスの Invoke-Assembly
) コマンドを使ってこれらの実行ファイルをメモリ上で実行できます。
DLLの場合は load D <DLL名 or パス>
でロードし、エクスポートされた関数を実行します。PowerShellスクリプトと同様に、ファイルレス実行により検出回避が期待できます。
さらに、Donutツールで生成されたx64シェルコードペイロードも Invoke-Shellcode
コマンドでメモリ実行可能です。
4.4. Kerberos 認証
Active Directory環境では、Kerberos認証が広く使われています。攻撃者が有効なKerberosチケット (TGTやサービスチケット) を取得できた場合、パスワードやハッシュを使わずにWinRMサービスにアクセスできる可能性があります。
まず、kinit
コマンド (Linux) や Mimikatz (Windows) などを使ってKerberosチケットを取得し、チケットキャッシュファイル (通常は /tmp/krb5cc_<UID>
) に保存します。
次に、-k
オプション (Kerberos認証を有効化) と -r
オプション (レルム/ドメイン名を指定) を付けてevil-winrmを実行します。必要であれば、KRB5CCNAME
環境変数でチケットキャッシュファイルのパスを明示的に指定します。
パスワードやハッシュを直接使用しないため、よりステルス性の高いアクセスが可能になる場合があります。
4.5. SSL/TLS (HTTPS) 接続
WinRMがHTTPS (通常ポート 5986) で構成されている場合、-S
オプションを使用します。
-S
を指定すると、通信はSSL/TLSで暗号化されます。デフォルトではサーバー証明書の検証は行われませんが、必要に応じて関連オプションで調整可能です。
4.6. IPv6 サポート
ターゲットがIPv6アドレスで到達可能な場合、IPv6アドレスを指定して接続できます。インターフェース指定が必要な場合は、%
に続けてインターフェース名を付加します。
4.7. DCOM を利用したコマンド実行
menu
コマンドからアクセスできる DCOM
機能を使うと、特定のDCOMオブジェクト (例: MMC20.Application, ShellWindows, ShellBrowserWindow) を介してコマンドを実行できます。これは、WinRMとは異なる方法でリモート実行を行うため、特定の監視や制限を回避できる可能性があります。
5. 実践的なシナリオ例
evil-winrmは、ペネトレーションテストの様々なフェーズで強力な武器となります。以下に、典型的な使用シナリオをいくつか紹介します。
5.1. 初期アクセス後の内部偵察
フィッシング攻撃や脆弱性悪用などによって、ある端末への初期アクセス権(例: 一般ユーザー権限)を得たとします。もしその端末から他のサーバーに対してWinRM接続が可能で、かつ有効な認証情報(パスワードやハッシュ)が手に入った場合、evil-winrmを使ってそのサーバーに接続し、さらなる情報を収集できます。
- 初期アクセスした端末から、MimikatzやLaZagneなどのツールで認証情報を窃取します。
- 窃取した認証情報(例: ドメインユーザー `john` のパスワードまたはNTLMハッシュ)を使って、ファイルサーバー `FILESRV01.domain.local` にevil-winrmで接続します。 または
- 接続後、PowerShellコマンドを実行して情報を収集します。
- システム情報:
systeminfo
,Get-ComputerInfo
- ネットワーク構成:
ipconfig /all
,Get-NetIPConfiguration
- 実行中のプロセス:
tasklist
,Get-Process
- ログイン中のユーザー:
query user
,Get-LoggedOnUser
(要PowerViewなど) - ファイル共有:
net share
,Get-SmbShare
- 機密ファイル検索:
dir /s /b C:\*passw*.*
,Get-ChildItem -Recurse -Include *passw*,*secret*,*confidential* -ErrorAction SilentlyContinue
- システム情報:
- 必要に応じて、PowerViewやBloodHound用のSharpHoundなどの偵察用PowerShellスクリプトを
-s
オプションでロードし、より詳細なActive Directory情報を収集します。
5.2. 横展開 (Lateral Movement)
内部偵察の結果、より権限の高いアカウントの認証情報や、他の重要なサーバーへのアクセス経路が見つかることがあります。evil-winrmは、これらの情報を使ってネットワーク内を横方向に移動していく(横展開)ために頻繁に使用されます。
- サーバーAでMimikatzを実行し、ドメイン管理者 `dom_admin` のNTLMハッシュを取得したとします。
- そのハッシュを使って、ドメインコントローラー `DC01.domain.local` への接続を試みます (PtH)。
- 接続に成功すれば、ドメインコントローラー上で高い権限でコマンドを実行できます。例えば、Active Directoryデータベース (ntds.dit) のコピーを作成したり、Kerberos TGT (krbtgt) のハッシュを取得したりできます。
- または、窃取したサービスアカウント `svc_webapp` のパスワードを使って、別のアプリケーションサーバー `APPSRV01` に接続します。
- 取得したチケットを使ってKerberos認証で接続することも可能です。
このように、認証情報を入手する → evil-winrmで別のマシンに接続する → さらに認証情報を探す、というサイクルを繰り返すことで、ネットワーク内のより広範囲にアクセス権を拡大していきます。
5.3. 永続化 (Persistence)
攻撃者は、一度獲得したアクセス権を失わないように、システム内にバックドアや永続化メカニズムを仕込むことがあります。evil-winrmを使って接続した後、PowerShellコマンドを実行して永続化を設定できます。
例:
- スケジュールタスクの作成: 定期的にリバースシェルを起動するタスクを登録する。
- WMIイベントサブスクリプション: 特定のイベント発生時に悪意のあるスクリプトを実行するようにWMIを設定する。
- レジストリへの登録: Runキーなどに悪意のあるプログラムのパスを登録し、ユーザーログイン時に自動実行させる。
- サービスの作成: 悪意のある実行ファイルをサービスとして登録する。
これらの操作は管理者権限が必要となることが多いですが、evil-winrmで管理者権限のセッションを確立できれば、容易に実行可能です。
6. 注意点と対策 (防御側視点)
evil-winrmは攻撃者にとって便利なツールですが、防御側としてはその活動を検知し、リスクを低減するための対策を講じることが重要です。
6.1. ログ記録と監視
WinRMの利用状況を監視することは、不正アクセスの検知に不可欠です。
- PowerShellログの有効化: PowerShellのモジュールログ、スクリプトブロックログ、トランスクリプションログを有効にします。これにより、WinRM経由で実行されたコマンドやスクリプトの詳細が記録されます。グループポリシー (GPO) で設定するのが一般的です。
Computer Configuration > Policies > Administrative Templates > Windows Components > Windows PowerShell
- Turn on Module Logging
- Turn on PowerShell Script Block Logging (Log script block invocation start / stop events オプションも有効化推奨)
- Turn on PowerShell Transcription
- Windowsイベントログの監視:
- セキュリティログ (Security.evtx): イベントID 4624 (ログオン成功)、4625 (ログオン失敗)。特にログオンタイプ 3 (ネットワーク経由) や 9 (NewCredentials) に注目。
- システムログ (System.evtx): WinRMサービス (Microsoft-Windows-WinRM) の開始/停止イベント。
- アプリケーションとサービスログ > Microsoft > Windows > WinRM > Operational: WinRMの操作に関する詳細ログ。
- アプリケーションとサービスログ > Microsoft > Windows > PowerShell > Operational: PowerShellエンジンのライフサイクルイベント。
- ネットワークトラフィックの監視: ファイアウォールやネットワーク監視ツールで、WinRMポート (5985, 5986) への異常な接続試行や通信パターンを監視します。特に、通常管理用に使われない端末からの接続や、短時間に多数の認証失敗が発生している場合は要注意です。
- SIEM (Security Information and Event Management) の活用: 上記の各種ログを一元的に収集・分析し、相関ルールに基づいて不審なアクティビティ(例: 短期間での複数サーバーへのWinRMログイン、通常とは異なる時間帯のアクセス、特権アカウントによる予期せぬWinRM利用)を検知します。
6.2. WinRM のセキュアな構成
WinRMサービス自体の設定を見直し、セキュリティを強化します。
- 不要なWinRMの無効化: WinRMによるリモート管理が不要なサーバーやクライアントPCでは、サービスを無効化します (
Disable-PSRemoting
コマンド、またはGPO)。 - HTTPSの強制: 可能であれば、HTTP (5985) ではなくHTTPS (5986) を使用するように構成し、通信を暗号化します。適切なサーバー証明書の展開が必要です。
- 信頼されたホストの制限: WinRMのTrustedHosts設定 (
Set-Item WSMan:\localhost\Client\TrustedHosts
) を適切に構成し、接続を許可するクライアントを限定します。ワイルドカード (`*`) の使用は極力避けるべきです。 - ファイアウォールによるアクセス制御: OSのファイアウォールやネットワークファイアウォールで、WinRMポートへのアクセス元IPアドレスを、許可された管理用端末やセグメントに限定します。
- PowerShell Just Enough Administration (JEA): 特定の管理タスクを実行するために必要な最小限のコマンドレットのみをユーザーに許可するJEAエンドポイントを構成します。これにより、仮にアカウントが侵害されても、実行できる操作が制限されます。
6.3. アカウント管理と認証
強力なアカウント管理と認証ポリシーは、evil-winrmによる不正アクセスを防ぐ上で非常に重要です。
- 強力なパスワードポリシー: 複雑で長いパスワードを強制し、定期的な変更を義務付けます。
- 多要素認証 (MFA): 特に特権アカウントに対しては、可能な限りMFAを導入します。WinRM自体が直接MFAをサポートすることは難しい場合が多いですが、リモートアクセスゲートウェイなどでMFAを要求する構成が考えられます。
- 特権アカウントの管理 (PAM): 特権アカウント (Domain Adminsなど) の数を最小限に抑え、パスワードを定期的に変更し、アクセスを厳密に管理・監視します。特権アクセスワークステーション (PAW) の導入も有効です。
- ローカル管理者パスワードソリューション (LAPS): ドメイン内の各コンピューターのローカル管理者アカウントのパスワードを、ランダムかつ一意に自動設定・管理します。これにより、Pass-the-Hashによる横展開リスクを大幅に低減できます。
- アカウントロックアウトポリシー: 短時間に多数の認証失敗があった場合にアカウントをロックアウトするポリシーを設定します。
- 認証情報の保護: Mimikatzなどのツールによるメモリからの認証情報窃取を防ぐため、Credential Guard (Windows 10/Server 2016以降) を有効化します。
これらの対策を組み合わせることで、evil-winrmのようなツールを用いた攻撃のリスクを効果的に低減することができます。
7. まとめと関連リソース
evil-winrmは、Windows環境におけるペネトレーションテストやレッドチーム活動において、非常に強力かつ便利なツールです。WinRMプロトコルを介してリモートのPowerShellセッションを提供し、ファイル転送、メモリ上でのスクリプト/バイナリ実行、Pass-the-Hash、Kerberos認証など、攻撃的な活動を支援する多くの機能を備えています。
主な特徴を再掲します:
- 容易な接続: IP、ユーザー名、パスワード/ハッシュで簡単に接続。
- ファイル転送: `upload`/`download` コマンドによる直感的なファイル操作。
- メモリ実行: PS1, EXE, DLL をディスク書き込みなしで実行可能 (AV/AMSI回避)。
- 多様な認証: パスワード、NTLMハッシュ (PtH)、Kerberos、証明書に対応。
- 操作支援: コマンド履歴、パス補完、カラー表示、ログ機能。
このツールを理解し、効果的に活用することで、Windowsネットワークに対するセキュリティ評価の精度と効率を高めることができます。一方で、防御側としては、WinRMのセキュアな構成、適切なログ監視、強力なアカウント管理を通じて、悪用されるリスクを最小限に抑える努力が不可欠です。
evil-winrmは今も活発に開発が続けられており、新しい機能が追加されています。最新の情報や詳細については、公式リポジトリを確認することをお勧めします。
公式リポジトリ:
evil-winrm の最新情報、ソースコード、詳細なドキュメントは、以下の GitHub リポジトリで確認できます。
このツールは強力であるため、必ず法的に許可された環境、または自身の管理下にある環境でのみ使用してください。 不正アクセスは法律で禁止されています。