pywintrace の紹介: ETW の Python ラッパー

ETW Architecture news

序章

Windows のイベント トレース (ETW) は、Windows 2000 で最初に導入された軽量のログ機能です。当初は、ソフトウェアの診断、トラブルシューティング、およびパフォーマンス監視ツールを目的としていましたが、 軽量のデバッグ メカニズムを作成するために Windows Vista で大幅に拡張されました。

ETW の基本アーキテクチャには、プロバイダー、コントローラー、コンシューマーの 3 つの個別のコンポーネントがあります。プロバイダーはトレース データを提供し、コントローラーはキャプチャ セッションを制御し、コンシューマーはプロバイダーから返されたデータを処理します。図 1 に、このアーキテクチャの概要を示します。

ETW Architecture
ETW アーキテクチャ

Windows 7 には既定で 600 を超えるプロバイダーがインストールされており、その多くは詳細なトレース データを提供します。 ETW データを使用すると、デバッガーを必要とせずに、OS のほぼすべての領域を調査できます。既定の Windows インストールには、ETW データをキャプチャするために必要なすべてのツールが付属していますが、これらのツールはやや柔軟性に欠けます。もう 1 つの欠点は、通常、キャプチャしたデータを分析するときに別のツールが必要になることです。

まったく新しいプロジェクトを作成するという決定を下す前に、機能する既存のプロジェクトがあるかどうかを確認するために調査が行われました。いくつかのプロジェクトが見つかりましたが、 Microsoftの KrabsETW とGoogle の pyetwが最も有望でした。ただし、KrabsETW は Python で記述されていないため、既存のプロジェクトと互換性がなく、pyetw はもはや維持されていないため、これらのどちらもまったく正しくありませんでした。 Python を使用した ETW への単純なプログラムによるアクセスが欠落していることがわかりました。

pywintrace に入る

Pywintraceは、FireEye Innovation and Custom Engineering (ICE) チームによって開発された Python パッケージであり、ETW の研究を加速するための Windows API の柔軟なラッパーの必要性を満たします。チームは、Python の ctypes を使用して、キャプチャ セッションを作成および制御し、トレース イベントを処理できるモジュールを作成しました。このパッケージには、次の 3 つの主要なクラスが含まれています。

  • EventProvider – ETW プロバイダーとのやり取りをラップします。
  • EventConsumer – ETW トレース セッションから出力されたメッセージを処理するコンシューマー
  • ETW – ETW キャプチャのメイン クラス

pywintrace の使用は簡単で、必要に応じて拡張して、ほぼすべての目的のキャプチャ シナリオに適合させることができます。通常、ユーザーは ETW クラスのインスタンスを作成して、データのキャプチャを開始します。図 2 は、この簡単な例を示しています。

シンプルなキャプチャ スクリプト
シンプルなキャプチャ スクリプト

図 2 では、GUID が「11111111-1111-1111-1111-111111111111」の ETW プロバイダー「Some Provider」がキャプチャされ、結果のメッセージ データがコンソールに書き込まれます。図 2 の run 関数は、システムから返されたメッセージを処理するヘルパー関数です。必要に応じて、ユーザーは独自のコールバック関数を指定し、メッセージを処理することができます。

図 2 の例は単純ですが、pywintrace がいかに簡単に使用できるかを示しています。その他の例については、pywintrace パッケージのサンプルディレクトリを参照してください。

興味深いデータのキャプチャ

調査すべき興味深いプロバイダーは数多くありますが、Microsoft が発行したブログでは、Windows 7 でのMicrosoft-Windows-WinINet プロバイダーの有用性が示されました。もう 1 つの興味深い WinInet プロバイダーであるMicrosoft-Windows-WinINet-Captureが、Windows 10 で追加されました。 ICE チームは、両方を使用して ETW キャプチャを簡単に実行できました。 ETW メッセージはシステムによって時系列で配信されるため、複数のプロバイダーを使用する場合に特別な処理は必要ありません。図 3 は、このキャプチャ データの一部を示しています。

ETW トラフィック キャプチャ
ETW トラフィック キャプチャ

各メッセージには、少なくとも、メッセージ ID、関連するイベント タイプ名、説明、タスク名、および EventHeader が含まれます。図 3 の最初のメッセージ (ID 108) である Microsoft-Windows-WinINet プロバイダー メッセージは、「www.google.com」のサーバーに対して作成されている要求ハンドルを示しています。注目すべきは、ドメイン固有の情報が返され、レイヤード サービス プロバイダー (LSP) やドライバーを必要とせずに、他のいくつかのプロバイダーからも送信されることです。

2 番目のメッセージ (ID 2001) である Microsoft-Windows-WinINet-Capture プロバイダー メッセージは、サーバーに送信される要求データを示しています。このメッセージの「ペイロード」フィールドは、平文トラフィックの 16 進ストリームです。デコードされたデータを図 4 に示します。

デコードされた HTTPS トラフィック
デコードされた HTTPS トラフィック

このキャプチャは、Edge ブラウザを使用して Windows 10 マシンで実行されたことに注意してください。他のブラウザーと OS の組み合わせでは、異なる結果が得られる場合があります。ただし、この情報は、通常は暗号化レイヤーによってマスクされる悪意のあるアクティビティを検出するために使用できるため、非常に役立ちます。

悪意のあるアクティビティのキャプチャ

図 5 は、制御された環境でマルウェア サンプルによって生成されたトラフィックの WinINet キャプチャのスニペットを示しています。

悪意のあるトラフィック
悪意のあるトラフィック

ここでは、マルウェアがコマンド アンド コントロール (C2) サーバーにビーコンを送信し、Web ページを要求しています。この 1 つのメッセージには、要求されているページの URL と、悪意のあるアクティビティの元となったプロセス ID とスレッド ID が表示されます。このメッセージから、URL を使用してリクエストが悪意のあるものかどうかを判断し、プロセス / スレッド情報を使用してマルウェアを追跡できます。特に、プロセス ハロウイングまたは DLL インジェクションの場合にそうです。

結論

ETW は、Windows に便利に組み込まれた非常に強力な軽量トレース メカニズムを提供します。特に、エンドポイントでの悪意のあるアクティビティを潜在的に検出するために使用できます。 pywintrace を使用して ETW データをキャプチャする方が、複数のツールを使用して同じ作業を行うよりも簡単です。Python で記述されているため、必要に応じて簡単に変更できます。これにより、何百もの ETW プロバイダーを探し回る作業がはるかに簡単になり、興味深いプロバイダーを見つける作業が加速されます。

pywintrace を今すぐダウンロードしてください。

了承

ICE チーム全体に感謝します。 ICE は高度な訓練を受けた少人数のエンジニア チームであり、当社の製品、お客様、およびお客様にとって重要な機能を提供します。 ICE は、困難な問題を迅速に解決することに関心のある優秀な候補者を常に探しています。

また、ETW に関する広範なブログ投稿とドキュメントを提供してくれた Microsoft にも感謝します。

参照: https://www.mandiant.com/resources/blog/introducing-pywintrace-python-wrapper-etw

Comments

タイトルとURLをコピーしました