Microsoft Defender ATPでのクエリの使い方

皆さんこんにちは。国井です。
先日、あるトレーニングで「ユーザーのアクセスログを取りたければMicrosoft Defender ATP (MDATP) を使えば一発ですよ」などとお話しさせていただいたのですが、そもそもどうやってその見るの?という疑問があったかと思います。ということで、今日はMicrosoft 365 Enterprise E5などで利用可能なMicrosoft Defender ATP (MDATP) を使ってログを見る方法について紹介します。
MDATPはあらかじめWindows 10のコンピューターでMDATPから提供されるスクリプトを実行すると、自動的にWindows 10コンピューターの操作ログを収集し、クラウド経由でその内容を参照できるというもので、Windows 10コンピューターがマルウェア感染したり、不正アクセスに遭ったりしたときに、管理者がログを見てどういうインシデントがあったか?を調査する目的で使われるものです。ただ、既に何回か言葉として使っているように「操作ログ」が取れるので、インシデント対応だけでなく、他の目的にも使えるんですよ(悪用厳禁!)。
禁断のログをちょっと見てみましょう。

マシンごとに生成されるログ

MDATPのポータルサイト(https://securitycenter.windows.com)にアクセスし、管理者のアカウントでサインインします。
ポータルサイトにアクセスできたら、画面左側の[Machine list]から該当のコンピューターをクリックすると、タイムラインでコンピューターで行った操作が出てきます。
image
ここのログをクリックすると、その詳細も出てきます。例えば、下のログはMicrosoft Edgeを使ってyodobashi.comにアクセスしていることがわかりますね。
image

Advanced Huntingを使ったログに対するクエリ

ここまでいくつかのログを見てもらいましたが、でも一番見たいのは時系列に並んだログではなく、特定の操作を行ったユーザー/コンピューターがいるか?ということかもしれません。
その場合、MDATPの中に用意されているAdvanced Huntingを使ってクエリを書いてあげればよいでしょう。
MDATPの左側のメニューからAdvanced Huntingにアクセスし、クエリを書いていくだけで使えます。
クエリの書き方はサンプルを参考にするとわかりやすいと思います。サンプルは[Shared Queries]-[Suggested]から選択できるので、ここでは[Files with double extensions]という拡張子が2重になっているファイルが生成されたイベントを抽出するクエリを選択してみました。そうすると、なんとなく文法がわかってきますね。
image
書き方ですが、まず最初にクエリを投げる分野を選択します。例えば、ファイルが生成(実行)されたイベントであればProcessCreationEventを選択します。レジストリに対する操作であればRegistryEvents、ネットワークアクセスに関する操作であればNetworkCommunicationEvents、がそれぞれ用意されています。
次に|で区切ってクエリの条件を設定します。条件に何が使えるかは、一度条件を指定しないで実行してみればわかりやすいと思います。ただし、そのまま実行してしまうと大量な結果が返ってくるので、| top 10 by EventTime と追記しておきましょう。これで直近10個のログだけが表示されます。
ProcessCreationEvents
| top 10 by EventTime

結果はこんな感じ。

image

なるほど、FileNameに使われたファイルの名前が入るのか、ということがわかります。だから、二重拡張子のファイルを見つけるのであれば、

ProcessCreationEvents
| where FileName endswith ".pdf.exe"
| top 10 by EventTime
のように書けばよいのですね。さらに、whereでor条件を設定するのであれば、

| where FileName endswith “.pdf.exe”
or FileName endswith “.doc.exe”

のように書きます。そのほか、検索条件を7日前までに絞り込むなら

| where EventTime > ago(7d)

のように書きます。また、検索結果に表示される内容(列)を定義したい場合は

| project EventTime, ComputerName, FileName, AccountSid, AccountName, AccountDomain

のようにprojectで始まる項目で列名を定義してください。

【クエリ例】マルウェア検出の結果を参照する

以前のブログ投稿で、Windows Defenderウイルス対策で検出したマルウェアの情報は一元的に参照する方法は(Intuneに)ないという話をしましたが、MDATPを使えば各コンピューターで出力されたアラートは一元的に参照できます。
コンピューターで出力されたアラートにはAlertEventsを使います。
AlertEvents
| where Title startswith "Windows Defender AV detected"
| top 10 by EventTime

image

【クエリ例】特定ファイルへのアクセスを参照する

先日、私のコンピューターではF03F61A.docxという名前のファイルができていました。これって、マルウェアによって作られたの??などという心配があるなら、次のようなクエリで調べましょう。

FileCreationEvents  
| where FileName == "F03F61A.docx"

image
(どうやらテンポラリで作られたファイルなだけだったようです。)

【クエリ例】特定Webサイトへのアクセスを参照する

この間、軽い衝撃を受けたのは、Microsoft Cloud App Security(MCAS)を見ていたら、Exchange Onlineに非公開の予定を入れたのに、MCASのアクティビティログからはバッチリ見えてるのです!
image
(業務時間中に、こっそり整体に行こうとしているのがバレてる)
となると、MCASにアクセスした人を知りたいとなります。この場合、MCASのWebサイト(https://portal.cloudappsecurity.com/)にアクセスしたことを追跡したければ、私の秘密の予定を見ようとした(かもしれない)人を追跡できます。この場合、NetworkCommunicationEventsを使って次のようなクエリを書きます。
この書き方はGitHubに教わったものですが、最初の行に
let partialRemoteUrlToDetect = “任意のURLドメイン”と書けば、
| where EventTime > ago(7d)
and RemoteUrl has partialRemoteUrlToDetect

と指定することで、“任意のURLドメイン”の部分に書いたドメイン名がRemoteUrlに含まれるかチェックしてくれます。

let partialRemoteUrlToDetect = "portal.cloudappsecurity.com";
NetworkCommunicationEvents  
| where EventTime > ago(7d)
and RemoteUrl has partialRemoteUrlToDetect
| top 10 by EventTime

image

これを流用すれば、業務に関係ないWebサイトを見に行った人とか、そういうのも追跡できますね。繰り返しますけど、悪用厳禁でお願いします。