Windows標準ツール pktmon でキャプチャして Wireshark で確認する

メモ:  Category:windows

Windows に標準で実装されたパケットキャプチャツール pktmon を使ってネットワークインターフェイス上を通過するネットワークパケットをキャプチャし Wireshark で扱ってみます。

Wireshark などのサードパーティアプリをインストール出来ない環境では、 Microsoft が用意している Microsoft Network Monitor を使ってパケットを解析することができます。

pktmon の使い方

管理者権限でコマンドプロンプトを起動します。

※ pktmon は、バージョンによって引数が大きく異なっているので 「 pktmon help 」で確認したほうがよさそうです。

ここでの引数を確認すると、次のように表示されました。

>pktmon help
pktmon <command> [オプション | ヘルプ]
    高度なパケット キャプチャとイベント収集。

コマンド
    filter     パケット フィルターを管理します。
    list       パケット処理コンポーネントを一覧表示します。

    start      パケット キャプチャとイベント収集を開始します。
    stop       データ収集を停止します。
    status     現在の状態を照会します。
    unload     PktMon ドライバーをアンロードします。

    counters   現在のパケット カウンターを表示します。
    reset      パケット カウンターをゼロにリセットします。

    etl2txt    ログ ファイルをテキスト形式に変換します。
    etl2pcap   ログ ファイルを pcapng 形式に変換します。
    hex2pkt    16 進数形式のパケットをデコードします。

    help       特定のコマンドのヘルプ テキストを表示します。
               例: pktmon start help

各コマンドの使い方を確認したい場合は、「 pktmon list help 」といった形で「コマンド + help」 とすることで確認することができます。

まずは、ポート 443 番だけパケットキャプチャしたいとします。この場合、監視したい通信だけを抽出したいので、次のコマンドを実行してフィルターを追加します。

>pktmon filter add -p 443
フィルターが追加されました。

パケットのキャプチャを開始するには、 start コマンドを実行します。

>pktmon start --capture --pkt-size 0
ロガー パラメーター:
    ロガー名:        PktMon
    ログ モード:       循環
    ログ ファイル:           C:\WINDOWS\system32\PktMon.etl
    最大ファイル サイズ:      512 MB
    使用されているメモリ:        192 MB

収集されたデータ:
    パケット カウンター、パケット キャプチャ

キャプチャの種類:
    すべてのパケット

監視対象コンポーネント:
    すべて

パケット フィルター:
     # 名前      ポート
     - --      ---
     1 <empty> 443

パケットキャプチャが開始され「C:\WINDOWS\system32\PktMon.etl」にキャプチャされた情報が生成されます。

この間に確認したい通信を発生させておきます。必要な通信が終了したら 「 stop 」コマンドを実行しキャプチャを停止します。

>pktmon stop
ログをフラッシュしています...
メタデータを結合しています...
ログ ファイル: C:\WINDOWS\system32\PktMon.etl (イベントは失われていません)

今回は、取得した情報を Wireshark で確認したいので 「 etl2pcap 」コマンドを使用して pcapng 形式に変換します。

>pktmon etl2pcap PktMon.etl
処理しています...

パケットの合計:       316
パケットのドロップ カウント:   0
書式設定されたパケット:   316
書式設定されたファイル:    PktMon.pcapng

以上で pktmon でキャプチャしたパケットが Wireshark で確認できるようになりました。

追加したフィルターは、次のコマンドで削除できます。

>pktmon filter remove

インターフェイスを指定する

上記の手順の場合、すべてのインターフェイスのパケットが取得されてしまいます。目的によっては、情報量が多すぎるため見づらくなることもあります。

そんな時は、指定したインターフェイスの通信のみキャプチャするようにします。

まず、指定したいインタフェースの ID を調べます。

>pktmon list
ネットワーク アダプター:
   ID MAC アドレス          名前
   -- --------          --
    9 80-FA-5B-A5-D1-25 Realtek PCIe GbE Family Controller
   13 0A-00-27-00-00-0F VirtualBox Host-Only Ethernet Adapter
   10 DC-1B-A1-A0-B8-7B Bluetooth Device (Personal Area Network)

有線 LAN を指定したい場合、 ID が 9 になっていますので 「 –comp 」という引数に ID : 9 を指定します。

>pktmon start --capture --comp 9 --pkt-size 0
ロガー パラメーター:
    ロガー名:        PktMon
    ログ モード:       循環
    ログ ファイル:           C:\WINDOWS\system32\PktMon.etl
    最大ファイル サイズ:      512 MB
    使用されているメモリ:        192 MB

収集されたデータ:
    パケット カウンター、パケット キャプチャ

キャプチャの種類:
    すべてのパケット

監視対象コンポーネント:
    ID ドライバー        名前
    -- -----        --
    9 rt640x64.sys Realtek PCIe GbE Family Controller

パケット フィルター:
     # 名前      ポート
     - --      ---
     1 <empty> 443

こんな感じで、指定したインターフェイスの通信のみキャプチャできるようになりました。

pktmon は、 filter と組み合わせることでより通信内容を絞ってキャプチャできるようになります。

bluenote by BBB