Evil-WinRMを使ったWindows OS環境のリモート探索

# はじめに
本稿では、Kali Linux OS環境下において「**Evil-WinRM**」ツールを使った、リモートからのWindows OS環境に対する「探索」（Post-Exploitation）について検証します。
<img width="665" alt="Evil-WinRM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/092cd5cb-4e27-d48e-97e9-ec407d1f3197.png">

# WinRMとは
「**Windows Remote Management (WinRM)**」とは、Microsoftによる[WS-Management Protocol](https://docs.microsoft.com/ja-jp/windows/win32/winrm/ws-management-protocol)の実装です。これにより、さまざまなベンダーのハードウェアとオペレーティングシステムの相互運用を可能にし、システム管理者の負担を軽減することを目指しています。

一方で、被害者のマシンで、WinRMサービスが有効になっている場合、環境内における**「Lateral Movement（横展開)**」に利用可能な方法の一つになります。

[MITER ATT＆CK](https://attack.mitre.org/)が示す「ATT&CK Matrix for Enterprise」では、「[TA0008: Lateral Movement](https://attack.mitre.org/tactics/TA0008/)」戦術（Tactic）における戦法（Technique）の一つとして「[T1028: Windows Remote Management](https://attack.mitre.org/techniques/T1028/)」を分類しています。

また、「CAPEC（Common Attack Pattern Enumeration and Classification：共通攻撃パターン一覧）」では、「[CAPEC-555：盗まれた資格情報を使用したリモートサービス](https://capec.mitre.org/data/definitions/555.html)」として分類しています。

|要素名|概要|ID|
|:---|:---|:---|
|Technique|攻撃に使われる技術（戦法）|[T1028](https://attack.mitre.org/techniques/T1028/)|
|Tactics|戦術：使われた技術によって達成する（目指す）ゴール|[TA0008](https://attack.mitre.org/tactics/TA0008/)|

# Evil-WinRM
`Evil-WinRM`ツールは、`WinRM`サービスが有効（通常は`5985/tcp`で応答）かつ、資格情報とアクセス許可がある場合に使用することのできるリモートシェルプログラムです。
`Evil-WinRM`ツールを介することで、リモートのWindowsサーバーで稼働している`WinRM`サービスに接続することができ、インタラクティブな`PowerShell`を取得することができます。

```
5985/tcp  open     http          syn-ack ttl 127                     Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
```

```
$ ./evil-winrm.rb --help

Evil-WinRM shell v2.3

Usage: evil-winrm -i IP -u USER [-s SCRIPTS_PATH] [-e EXES_PATH] [-P PORT] [-p PASS] [-H HASH] [-U URL] [-S] [-c PUBLIC_KEY_PATH ] [-k PRIVATE_KEY_PATH ] [-r REALM]
    -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 }
    -s, --scripts PS_SCRIPTS_PATH    Powershell scripts local path
    -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)
    -p, --password PASS              Password
    -H, --hash HASH                  NTHash
    -P, --port PORT                  Remote host port (default 5985)
    -V, --version                    Show version
    -n, --no-colors                  Disable colors
    -h, --help                       Display this help message
```


# Evil-WinRMのインストール
Gitクローンを作成し、システムの依存関係を手作業で解決する方法でインストールを行います。
<ol><li>依存関係の解決を行う。

```
~$ sudo gem install winrm winrm-fs colorize stringio
```

<li>リポジトリのクローンを作成する。

```
~$ git clone https://github.com/Hackplayers/evil-winrm.git
```

<li>`evil-winrm`の準備完了。次のコマンド構文では、`WinRM`サービスを実行しているWindowsサーバー`192.168.1.100`に対するリモートシェルの確立を行っています。シェルの確立には`<ユーザー名>`と`<パスワード>`が必要であることにご注意ください。

```
~$ cd evil-winrm && ruby evil-winrm.rb -i 192.168.1.100 -u <ユーザー名> -p '<パスワード>' -s '<Powershellスクリプトのローカルパス>' -e '<C#プログラムの実行パス>'
```
パスワードをクリアテキストで入力したくない場合は、`-p`パラメーターを使用することで変更できます。
</ol>

# Evil-WinRMの使い方
ここでは、`evil-winrm`コマンドにてリモートシェルを確立した後に実行できるコマンド群について確認します。

## upload コマンド
ローカルファイルはタブキーを使用して自動補完できます。ローカルファイルが`evil-winrm.rb`ファイルと同じディレクトリにある場合、`<リモートパス>`を指定する必要はありません。

```
*Evil-WinRM* PS C:\Users\hacker\Documents> upload <ローカルパス> <リモートパス>
```

例えば、プロセスのメモリ情報（メモリダンプ）を取得するために「[ProcDump](https://technet.microsoft.com/en-us/sysinternals/dd996900
)」をアップロードすることがあります。被害者のパスワード情報がメモリイメージ上にプレーンテキスト状態で残されている可能性を調査します。

## download コマンド
リモートファイルが現在のディレクトリにある場合、`<ローカルパス>`を設定する必要はありません。

```
*Evil-WinRM* PS C:\Users\hacker\Documents> download <リモートパス> <ローカルパス>
```

## services コマンド
すべてのサービスをリストすることができます。このとき、管理者権限は必要ありません。

```
*Evil-WinRM* PS C:\Users\hacker\Documents> services

Path                                                                              Privileges Service                     
----                                                                              ---------- -------                     
C:\Windows\ADWS\Microsoft.ActiveDirectory.WebServices.exe                              False ADWS                        
cmd.exe /c echo drzlyx > \\.\pipe\drzlyx                                               False drzlyx                      
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\SMSvcHost.exe                           True NetTcpPortSharing           
C:\Windows\SysWow64\perfhost.exe                                                       False PerfHost                    
C:\Windows\servicing\TrustedInstaller.exe                                              False TrustedInstaller            
"C:\Program Files\VMware\VMware Tools\VMware VGAuth\VGAuthService.exe"                 False VGAuthService               
"C:\Program Files\VMware\VMware Tools\vmtoolsd.exe"                                    False VMTools                     
"C:\Program Files\VMware\VMware Tools\VMware CAF\pme\bin\CommAmqpListener.exe"         False VMwareCAFCommAmqpListener   
"C:\Program Files\VMware\VMware Tools\VMware CAF\pme\bin\ManagementAgentHost.exe"      False VMwareCAFManagementAgentHost
"C:\Program Files\Windows Defender\NisSrv.exe"                                          True WdNisSvc                    
"C:\Program Files\Windows Defender\MsMpEng.exe"                                         True WinDefend
```

# WinRMアクティビティの検出
## WindowsログからWinRMアクティビティを検出
`WinRM`サービスを使用する場合、Windowsは関連するログを2つの場所に記録します。

- %SystemRoot%\System32\Winevt\Logs\Security.evtx
- %SystemRoot%\System32\Winevt\Logs\Microsoft-Windows-WinRM%4Operational.evtx

# 参考文献
- Evil-WinRM, https://github.com/Hackplayers/evil-winrm
- Windows Remote Management, https://docs.microsoft.com/ja-jp/windows/win32/winrm/portal
- Demystifying WinRM, https://www.bloggingforlogging.com/2018/01/24/demystifying-winrm/
- JPCERT/CC, ツール分析結果シート, https://jpcertcc.github.io/ToolAnalysisResultSheet_jp/
- A look under the hood at Powershell Remoting through a cross plaform lens, http://www.hurryupandwait.io/blog/a-look-under-the-hood-at-powershell-remoting-through-a-ruby-cross-plaform-lens
- 今知るべきATT＆CK｜攻撃者の行動に注目したフレームワーク徹底解説, https://blogs.mcafee.jp/mitre-attck