Windows Defender ATP Advanced Hunting の概要
※本ブログは、米国時間 7/15 に公開された”Getting Started with Windows Defender ATP Advanced Hunting” の抄訳です。
先日、Windows Defender ATP の Advanced Hunting をリリースいたしました。これは、Windows Defender ATP テナント内の生データにフィルタリングせずにアクセスして、強力な検索機能とクエリ言語によってプロアクティブに脅威を検知する機能です。
Advanced Hunting のメリット
企業のセキュリティ担当者は、未知の脅威による侵入の痕跡 (IOC: Indicator of Compromise) から、その影響を迅速に判断する必要があります。新しい脅威とは、世界規模の感染、一部のエンド ユーザーを狙った水飲み場型攻撃、ゼロデイ攻撃などが考えられます。
以下のシナリオを想像してみてください。
ある朝、早めに出社し、いつものように脆弱性や脅威に関するニュースやソーシャル メディア チャネルに目を通していると、最新の脆弱性攻撃に関する記事を発見しました。自社のエンドポイントがこの脅威にさらされていないかどうか、一刻も早く確認しなければなりません。このような場合、Windows Defender ATP テナントでアラートが生成されていなくても、Advanced Hunting があれば、自社のデータに特定の脆弱性攻撃が及んでいないかを確認することができます。クエリの結果に基づいて関連情報が即座に表示されるため、必要に応じてすばやく対応することができます。
Advanced Hunting のしくみ
Advanced Hunting では、Azure Log Analytics (英語) と同じ Azure Kusto というクエリ言語を使用して、過去 30 日までの生データへフル アクセスすることができます。
データ モデルは、合計 10 個のテーブルでシンプルに構成されています。各テーブルのフィールド詳細は、Windows Defender ATP Advanced Hunting リファレンス (機械翻訳) で解説しています。
- アラート情報: アラートおよび IOC に関する情報が含まれるテーブル
- マシン情報: デバイスのプロパティ (名前、OS プラットフォームとバージョン、ログオン中のユーザーなど)
- マシンのネットワーク情報 (プレビュー): デバイス ネットワークのインターフェイスに関する情報
- プロセス作成イベント: プロセスのイメージ ファイル情報、コマンド ラインなどの情報
- 読み込みイメージ: プロセスと読み込まれたモジュールの情報
- ネットワーク通信イベント: プロセスと接続の情報
- ファイル作成イベント: 作成されたファイルの情報
- レジストリ アクティビティ: 特定のプロセスによって変更されたキーと値
- ログオン イベント: ログオン ユーザー、ログオンの種類、アクセス許可など
- イベント: さまざまな Windows 関連のイベント (Windows Defender Exploit Guard のテレメトリなど)
クエリ内で脅威の特定に必要なテーブルを組み合わせたり、任意のテーブルの組み合わせを検索したりすることができます。
初めてクエリを作成する場合
Advanced Hunting は、簡単に言うと、ピボットやフィルタリングができる Excel スプレッドシートの機能に近いもので、テーブル結合、列の比較、フィルターによる検索結果の絞り込みなどを行うことができます。シンプルかつ強力なクエリ言語を使用して、さまざまなデータを引き出すことができます。
データ量が豊富なため、フィルターを効果的に使用して、分析に不要なノイズを抑えることをお勧めします。このクエリ言語には、指定された行数を返して結果セットをすばやく効率的に確認できる演算子をはじめ、便利な演算子が多数用意されています。
他にも EventTime を使用して、出力結果を一定の期間に絞り込む方法もあります。詳細は、Advanced Hunting のクエリに関するベスト プラクティス (機械翻訳) をご覧ください。
具体的な例をご紹介します。最初の例では、ProcessCreationEvents というテーブルを使用します。まず、ProcessCreationEvents の最新の 5 行を確認します。次に、limit 演算子の代わりに EventTime を使用して、1 時間以内に発生したイベントを絞り込みます。
ProcessCreationEvents | limit 5
図 1: ProcessCreationEvents テーブルから 5 行をランダムに返すクエリ例。データの一部をすばやく表示します。
ProcessCreationEvents | where EventTime > ago(1h)
図 2: ProcessCreationEvents テーブルから 1 時間以内に発生したすべてのイベントを返すクエリ例
図 3: EventTime によって ProcessCreationEvents を絞り込んだ結果
先ほど、この機能を Excel のスプレッドシートと比較しましたが、クエリの結果をエクスポートして Excel で開くと、さらに正確に比較することができます。以下の図では、前述の条件に該当する行がすべて表示されています。
図 4: EventTime で絞り込んだ ProcessCreationEvents のエクスポート結果を Excel で表示
他の Excel シートと同様に、フィルターを適用する箇所と方法がわかれば、必要な情報を絞り込むことができます。これができれば、Advanced Hunting を習得したと言えるでしょう。
次は、その他の演算子を学習し、クエリで使用してみましょう。
特定のアクティビティを絞り込む方法
フィルターを適用して特定のデータを表示する方法はいくつかあります。多くのサンプル クエリで使用される一般的なフィルターの 1 つが where 演算子です。これを使用して、テーブルの特定の列にフィルターを適用します。たとえば、ProcessCreationEvents から FileName が powershell.exe であるイベントを検索する場合には、以下のクエリにこれを適用します。
ProcessCreationEvents | where FileName == "powershell.exe"
図 5: ProcessCreationEvents から FileName が powershell.exe であるすべてのイベントを表示するクエリ例
この場合も、最適なクエリ結果を得られるように、limit 演算子または EventTime 行をフィルターとして使用することをお勧めします。また、正確なファイル名がわからない場合や、名前が次々に変更される悪意のあるファイルを探す場合などもあります。このようなシナリオには、contains や startwith などの他のフィルターが便利です。
図 6: データ (ファイル名、パス、コマンド ライン、URL など) に大文字/小文字のばらつきがあるフィールドもあります。このような場合は、大文字と小文字を区別せずにマッチングを行います。調査上必要な場合もあるため、元の大文字/小文字の区別は保持されます。
ProcessCreationEvents | where FileName =~ "powershell.exe" | limit 5
図 7: ProcessCreationEvents から FileName が powershell.exe である最新の 5 行を返すクエリ例。大文字と小文字を区別しないように “=~ ” を使用しています。
演算子を組み合わせたい場合には and 演算子または or 演算子を使用して、さらに強力なクエリを作成できます。
ProcessCreationEvents | where FileName =~ "powershell.exe" or FileName =~ "cmd.exe" | limit 5
図 8: ProcessCreationEvents から FileName が powershell.exe または cmd.exe である最新の 5 行を返すクエリ例
複数のテーブルから特定の情報を検索したい場合もあります。そのようなときは、find 演算子を使用します。特定の悪意のあるファイル ハッシュがわかっており、FileCreationEvents、ProcessCreationEvents、NetworkCommunicatonEvents の各テーブルでそのファイル ハッシュの詳細を確認したいといったシナリオで役に立ちます。
let fileHash = "e152f7ce2d3a4349ac583580c2caf8f72fac16ba"; find in (FileCreationEvents, ProcessCreationEvents, NetworkCommunicationEvents) where SHA1 == fileHash or InitiatingProcessSHA1 == fileHash project ComputerName, ActionType, FileName, EventTime
図 9: 複数のテーブルから、SHA1 がファイル ハッシュに一致している特定のファイル ハッシュを検索するクエリ例
クエリの結果を調整する方法
クエリの実行時に、最も関連性の高い情報をすばやく表示できるように、クエリの結果を調整する必要があります。このような場合、project 演算子を使用して、最も関心のある列を選択することができます。以下のように、表示したい列を選択します。
ProcessCreationEvents | where FileName == "powershell.exe" or FileName == "cmd.exe" | limit 5 | project EventTime, ComputerName, ProcessCommandLine
図 10: ProcessCreationEvents から FileName が powershell.exe または cmd.exe である最新の 5 行を返し (“==” を使用して大文字と小文字を区別)、EventTime、ComputerName、ProcessCommandLine のみを表示するように絞り込んだクエリ例
図 11: 図 10 のクエリの結果
シナリオによっては、エンドポイントで特定のイベントが発生した回数を把握する必要があります。その場合は、summarize 演算子を使用して、入力テーブルの内容を集計するテーブルを作成できます。count () と組み合わせると行数、dcount () と組み合わせると値の個数をカウントします。
ProcessCreationEvents | where FileName == "powershell.exe" | summarize count()
図 12: ProcessCreationEvents から FileName が powershell.exe であるすべてのイベントを検索し、件数の合計を結果として返すクエリ例
図 13: 図 12 の結果。ProcessCreationEvents から FileName が powershell.exe であるイベントが 25 件見つかりました。
ProcessCreationEvents | where FileName == "powershell.exe" | summarize dcount(ComputerName)
図 14: ProcessCreationEvents から FileName が powershell.exe に該当したすべての行を検索し、見つかった固有のコンピューター名の合計を表示するクエリの例
図 15: 図 14 の結果。ProcessCreationEvents から FileName が powershell.exe であるエンドポイントが 8 個見つかりました。
以下の図のとおり、Advanced Hunting コンソールにはフィルター アイコンがあります。この機能は、クエリの結果に応じてフィルターを追加し、クエリをさらに最適化するのに便利です。
図 16: フィルター オプションを選択してクエリをさらに最適化します。
図 17: クエリの現在の結果に応じて、使用可能なフィルターを表示します。
マイナスのアイコンを選択するとクエリから特定の属性が除外され、プラスを選択するとその属性が追加されます。追加のフィルターを選択すると、[Run query] が青に変わり、更新したクエリを実行できます。
単一クエリで複数のテーブルを結合する方法
Advanced Hunting には、ほぼすべての操作に対応する演算子が用意されています。インシデントの影響を十分に理解できるように、複数のテーブルを結合することもあります。その場合は、join 演算子を使用します。
FileCreationEvents | where EventTime > ago(30d) | project MachineId, FileName, SHA1, FolderPath | join kind= inner ( ProcessCreationEvents | where EventTime > ago(30d) | project MachineId, FileName, SHA1, FolderPath ) on MachineId, SHA1, FolderPath, FileName | limit 10
図 18: FileCreationEvents と ProcessCreationEvents を結合するクエリの例。結果には、作成および実行されたすべてのファイルが表示されます。
これは、脅威アクターが投下したペイロードが後から実行されたケースを検索する場合に特に便利です。データを相互に関連付けることができるため、2 つのクエリを作成して実行する必要がありません。
サンプル クエリの解析
ダウンロードを行った可能性のある PowerShell 実行イベント
このサンプル クエリは、脅威アクターがネットワークから何らかのファイルをダウンロードした可能性のある PowerShell アクティビティを検索します。クエリを分解して、それぞれの記述法と理由を解説します。
ProcessCreationEvents | where EventTime > ago(7d) | where FileName in~ ("powershell.exe", "powershell_ise.exe") | where ProcessCommandLine has "Net.WebClient" or ProcessCommandLine has "DownloadFile" or ProcessCommandLine has "Invoke-WebRequest" or ProcessCommandLine has "Invoke-Shellcode" or ProcessCommandLine contains "http:" | project EventTime, ComputerName, InitiatingProcessFileName, FileName, ProcessCommandLine | top 100 by EventTime
図 19: ダウンロードを行った可能性のある PowerShell 実行イベントのクエリ例
ProcessCreationEvents | 対象テーブル |
| where EventTime > ago(7d) | 過去 7 日間に発生したイベントのみを検索 |
| where FileName in~ (“powershell.exe”, “powershell_ise.exe”) | FileName が指定したいずれかの PowerShell バリエーションに該当するイベントのみを検索 (大文字と小文字を区別しないように “in~” を使用) |
| where ProcessCommandLine has “Net.WebClient” or ProcessCommandLine has “DownloadFile” or ProcessCommandLine has “Invoke-WebRequest” or ProcessCommandLine has “Invoke-Shellcode” or ProcessCommandLine has “http:” |
使用されたコマンド ラインがいずれかに該当する PowerShell イベントのみを検索 |
| project EventTime, ComputerName, InitiatingProcessFileName, FileName, ProcessCommandLine | 結果に EventTime、ComputerName、InitiatingProcessFileName、FileName、ProcessCommandLine のみを表示 |
| top 100 by EventTime | レコードを EventTime の上位 100 件の順に並べ替え |
Base64 デコードを行ったペイロードの特定
最近では、脅威アクターが悪意のあるペイロードを偽装するために Base64 デコードを多用しています。
ProcessCreationEvents | where EventTime > ago(14d) | where ProcessCommandLine contains ".decode('base64')" or ProcessCommandLine contains "base64 --decode" or ProcessCommandLine contains ".decode64(" | project EventTime , ComputerName , FileName , FolderPath , ProcessCommandLine , InitiatingProcessCommandLine | top 100 by EventTime
図 20: Base64 デコードを行ったペイロードの特定
ProcessCreationEvents | 対象テーブル |
| where EventTime > ago(14d) | 過去 14 日間に発生したイベントのみを検索 |
| where ProcessCommandLine contains “.decode(‘base64’)” or ProcessCommandLine contains “base64 –decode” or ProcessCommandLine contains “.decode64(“ |
コマンド ラインに Base64 デコードの痕跡が含まれているイベントのみを検索 -> .decode(‘base64’) -> base64 –decode -> .decode64( |
| project EventTime , ComputerName , FileName , FolderPath , ProcessCommandLine , InitiatingProcessCommandLine | 結果に EventTime、ComputerName、FileName、FolderPath、ProcessCommandLine、InitiatingProcessCommandLine のみを表示 |
| top 100 by EventTime | レコードを EventTime の上位 100 件を新しい順に並べ替え |
既知の Dofoil NameCoin サーバーへのネットワーク接続の特定
Dofoil は、2018 年 3 月に数十万台のコンピューターに対するコイン マイニング マルウェアのインストールを仕掛けた巧妙な脅威です。以下のサンプル クエリでは、過去 30 日間にネットワーク内のエンドポイントから既知の Dofoil NameCoin サーバーへのネットワーク接続があったかどうかをすばやく確認することができます。
NetworkCommunicationEvents | where RemoteIP in ("139.59.208.246","130.255.73.90","31.3.135.232","52.174.55.168","185.121.177.177","185.121.177.53", "62.113.203.55","144.76.133.38","169.239.202.202","5.135.183.146","142.0.68.13","103.253.12.18", "62.112.8.85","69.164.196.21","107.150.40.234","162.211.64.20","217.12.210.54","89.18.27.34","193.183.98.154","51.255.167.0","91.121.155.13","87.98.175.85","185.97.7.7") | project ComputerName, InitiatingProcessCreationTime, InitiatingProcessFileName, InitiatingProcessCommandLine, RemoteIP, RemotePort
図 21: 既知の Dofoil NameCoin サーバーへのネットワーク接続の特定
NetworkCommunicationEvents | 対象テーブル |
| where RemoteIP in (“139.59.208.246″,”130.255.73.90″,”31.3.135.232”, “52.174.55.168”, “185.121.177.177”,”185.121.177.53″,”62.113.203.55″, “144.76.133.38”,”169.239.202.202″,”5.135.183.146″, “142.0.68.13”,”103.253.12.18″,”62.112.8.85″, “69.164.196.21” ,”107.150.40.234″,”162.211.64.20″,”217.12.210.54″ ,”89.18.27.34″,”193.183.98.154″,”51.255.167.0″ ,”91.121.155.13″,”87.98.175.85″,”185.97.7.7″) |
RemoteIP がクエリ内のいずれかに該当するネットワーク接続のみを検索 |
| project ComputerName, InitiatingProcessCreationTime, InitiatingProcessFileName, InitiatingProcessCommandLine, RemoteIP, RemotePort |
結果に ComputerName、InitiatingProcessCreationTime、InitiatingProcessFileName、InitiatingProcessCommandLine、RemoteIP、RemotePort のみを表示 |
確認クイズ
このセクションで取り上げる 2 つのクエリは、修正しないと動作しません。問題のある箇所を見つけて、クエリが動作するように修正してください。ここまでの説明の中にヒントがあります。
NetworkCommunicationEvents | where RemoteIP in (“msupdater.com”, “twitterdocs.com”) | summarize by ComputerName, InitiatingProcessComandLine
図 22: このクエリでは、msupdater.com と twitterdocs.com という 2 つの URL へのネットワーク通信を返します。
図 23: このクエリでは、Microsoft Edge を介してダウンロードされたファイルの、EventTime、ComputerName、InitiatingProcessFileName、FileName、FolderPath の各列を返します。
クエリの管理
各種テキスト ファイルに保存しているクエリや、このブログからコピーして貼り付けたクエリを、Advanced Hunting 内に保存し、テナント内のメンバーと共有することができます。
図 24: [Save] または [Save As] を選択してフォルダーの場所を選択できます。
図 25: 組織全体でクエリを共有するか、個人的に使用するかを選択します。
まとめ
GitHub で新しいサンプル クエリを定期的に公開していますので、定期的にチェックすることを強くお勧めします。Windows Defender ATP Advanced Hunting のサンプル クエリ (英語) をご覧ください。
この記事をお読みいただければ、いつでも Advanced Hunting を使用して、自社環境の疑わしいアクティビティをプロアクティブに検索することができます。ご不明な点がある場合は、Twitter @MiladMSFT までお気軽にお問い合わせください。