おれさまラボ

実際に手を動かして理解を深めるブログ。

Defender Advanced Hanting のチートシート

はじめに

Advanced Hunting は、Microsoft 365 Defender シリーズから収集されたログ情報に対して、カスタムクエリを発行し、分析を行うための仕組みです。カスタムクエリは Kusto 言語によって記述されます。自分が使いたくなったクエリをメモとして残しておきます。

Web アクセスブロックの調査

Web アクセスが何の機能によってブロックされたかは、DeviceEventsAdditionalFields から判別できます。

Experience Keyに対するValue ブロックを判定した機能
CustomPolicy Custom Indicator
CustomBlockList Web Contents Filtering
Malicious SmartScreen Web Threat Protection
Phishing SmartScreen Web Threat Protection
Untrusted SmartScreen Web Threat Protection

特定のデバイスについて、WCF でブロックされたアクセス先を列挙する

// Web Content Filtering によってブロックされたアクセス先URLを出力します。
// DeviceName(=アクセス元デバイスの名前) やTimestampを適宜書き換えて使用してください。
DeviceEvents
| where Timestamp > ago(7d)
| where ActionType == "SmartScreenUrlWarning"
| where DeviceName startswith "PC-99999"
| extend ParsedFields=parse_json(AdditionalFields)
| project Timestamp, DeviceName, InitiatingProcessFileName, RemoteUrl, InitiatingProcessAccountUpn, Experience=tostring(ParsedFields.Experience)
| where Experience == "CustomBlockList" 

ExploitGuardによるブロック(3rd Party製ブラウザの制御)についても表示する場合は以下のクエリを使用してください。

// Web Content Filtering によってブロックされたアクセス先URLを出力します。
// DeviceName(=アクセス元デバイスの名前) やTimestampを適宜書き換えて使用してください。
DeviceEvents
| where Timestamp > ago(7d)
| where ActionType in ("SmartScreenUrlWarning","ExploitGuardNetworkProtectionBlocked")
| where DeviceName startswith "PC-99999"
| extend ParsedFields=parse_json(AdditionalFields)
| project Timestamp, DeviceName, InitiatingProcessFileName, RemoteUrl, InitiatingProcessAccountUpn, Experience=tostring(ParsedFields.Experience), ResponseCategory=tostring(ParsedFields.ResponseCategory)
| where Experience == "CustomBlockList" or ResponseCategory == "CustomBlockList"

特定のデバイスについて、Defenderによってブロックされたリモート URL を出力する

// PC-99999 から facebook を含むリモート URL へのアクセスを出力する例
DeviceEvents
| where Timestamp > ago(7d)
| where ActionType == "SmartScreenUrlWarning"
| where DeviceName startswith "PC-99999"
| where RemoteUrl contains "facebook"
| project Timestamp, DeviceName, RemoteUrl, AdditionalFields

Web アクセスがカテゴリブロックされたデバイスを出力する

Web Content Filtering もしくは ExploitGuard Network Protection によってカテゴリブロックされたデバイスを、ブロック回数とともに出力する。

DeviceEvents
| where Timestamp > ago(1d)
| where ActionType in ("SmartScreenUrlWarning","ExploitGuardNetworkProtectionBlocked")
| extend ParsedFields=parse_json(AdditionalFields)
| project Timestamp, DeviceName, InitiatingProcessFileName, Experience=tostring(ParsedFields.Experience), ResponseCategory=tostring(ParsedFields.ResponseCategory)
| where Experience == "CustomBlockList" or ResponseCategory == "CustomBlockList"
| summarize DeviceCount=dcount(Timestamp) by DeviceName
| sort by DeviceCount desc  

Webフィルタによるブロックが発生していないデバイスを列挙する

DeviceEvents
| where Timestamp > ago(7d)
| where DeviceName startswith "PC"
| where InitiatingProcessFileName contains "msedge.exe" or InitiatingProcessFileName contains "chrome.exe"
| where ActionType !in ("SmartScreenUrlWarning","ExploitGuardNetworkProtectionBlocked")
| project Timestamp, DeviceId, DeviceName, InitiatingProcessFileName, InitiatingProcessAccountUpn, ReportId
| summarize EventCounter=dcount(Timestamp) by DeviceId, DeviceName, InitiatingProcessFileName, InitiatingProcessAccountUpn

Azure AD Sign In Events

AADSignInEventsBeta
| where Timestamp > ago(1d)
| project LogonType, Timestamp, Application
| summarize aaa=dcount(Timestamp) by LogonType, Application
| top 10 by LogonType
AADSignInEventsBeta
| where Timestamp > ago(1d)
| where LogonType contains "nonInteractiveUser"
| project LogonType, Timestamp, Application, ClientAppUsed
| summarize aaa=dcount(Timestamp) by LogonType, ClientAppUsed
| top 100 by LogonType
AADSignInEventsBeta
| where Timestamp > ago(1d)
| where LogonType contains "nonInteractiveUser"
| where ClientAppUsed contains "Browser"
| summarize aaa=dcount(Timestamp) by Application, LogonType
| top 100 by LogonType

参考資料

公式ドキュメント

ベストプラクティス

Advanced hunting query best practices