APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

【CrowdStrike】クエリー徹底解説 その3

自己紹介

こんにちは、エーピーコミュニケーションズiTOC事業部 BzD部 0-WANの田中と申します。
弊社でEDR製品を導入いただいたお客様のインシデント調査を主に担当しております。
その傍らプログラマーとしての経験と知識を生かしてセキュリティに関するウェブアプリケーションを設計構築するなどSOCチームのメンバーとして日々サイバーセキュリティと共に在るエンジニアです。

2025年は12回に渡ってCrowdStrikeの利用者視点で役に立つ情報をお伝えします。 「CrowdStrike Falcon」の強力な機能の一つであるFalconの「クエリー」に焦点を当て、その機能概要から具体的な活用方法まで、全3回にわたって詳細に解説します。第3回目は具体的な例として「公式ドキュメントCool Query Fridayからピックアップした検索クエリで脅威ハンティングやインシデント調査を行う方法」をご紹介します。

過去のCrowdStrikeに関する記事は以下の通りです。

Cool Query Fridayとは

Cool Query Friday」は、「金曜日にクール(=役立つ、興味深い)なセキュリティログクエリを共有しましょう!」という趣旨の、学習・情報共有を目的とした取り組みで、実際のインシデント調査や脅威ハンティングにおいて非常に役立つ実践的な知識を提供します。

CrowdStrikeのコミュニティサイトでも見られますが、もっともアクティブに更新されているのはredditのCrowdStrike subredditです。

コミュニティのモデレーターAndrew-CSさん

クエリー例:特定のaidのごみ箱から実行したプロセスのリスト

このクエリーは特定のaidのごみ箱から実行したプロセスのイベントを検索します。
クエリ自体にAIDを指定するのではなく、?value構文を使用して、FalconコンソールでAIDのユーザープロンプトを作成してユーザがaidを任意に入力できるようにします。
ゴミ箱から実行した時点でCrowdStrikeによりプロセスがブロックされてしまったため#event_simpleName=ProcessBlockedをクエリーに追加しました。
aidはわかりやすいようにComputerNameを表示するようにコードを変更しました。
公式ドキュメント:https://falcon.us-2.crowdstrike.com/documentation/page/f5165d67/best-practices#ha70324d
クエリー:

(#event_simpleName=ProcessRollup2 or #event_simpleName=ProcessBlocked) aid=?aid ImageFileName=/\$Recycle\.Bin/i
| groupBy(ComputerName, #event_simpleName, function=collect([SHA256HashData, ImageFileName]), limit=max)

特定のaidのごみ箱から実行したプロセスのリスト

クエリー例:ログオン時にトリガーされるイベントの検索

このクエリーはログオン時にトリガーされるイベントを検索します。LogonTriggerに不要なデータが入るためreplace関数で削除するコードと、ホスト名でグループ化するコードを追加しました。
公式ドキュメント:https://falcon.us-2.crowdstrike.com/documentation/page/a4723919/hunting-anomalies-related-to-scheduled-tasks#ab770b51
クエリー:

#event_simpleName=ScheduledTaskRegistered
| parseXml(TaskXml)
| LogonTrigger:=rename(Task.Triggers.LogonTrigger.Enabled)
| LogonTrigger:=replace(regex=(\\u000d\\u000a), with="", field=LogonTrigger)
| LogonTrigger:=replace(regex=(\\u0009), with="", field=LogonTrigger)
| LogonTrigger:=replace(regex=(\s), with="", field=LogonTrigger)
| LogonTrigger=* // Remove this line if you don't care if it's empty
| table([ComputerName, TaskName, LogonTrigger, TaskXml], limit=1000)
| groupBy([ComputerName, TaskName, LogonTrigger, TaskXml], limit=1000)

ログオン時にトリガーされるイベントの検索

クエリー例:Windows および macOS のブラウザ拡張機能コレクション

ファルコンセンサー 7.16+、WindowsまたはmacOS、Discoverまたは露出管理が有効になっている場合はセンサーによりInstalledBrowserExtensionイベントが発生します。このイベントは、起動時、48時間ごとのランダウン、または拡張機能のインストールまたは更新時に発行されます。

このクエリーはWindows および macOS のブラウザ拡張機能を検索します。記事ではさまざまなブラウザ拡張機能の検索方法が記載されています。
拡張機能が50台未満のシステムにインストールされているかどうか(珍しい拡張機能)でフィルタリングしたり、Chrome拡張機能ストアへのリンクを結果に追加します。
Cool Query Friday:https://www.reddit.com/r/crowdstrike/comments/1dl3bo5/20240621_cool_query_friday_browser_extension/
クエリー:

// Get browser extension event
#event_simpleName=InstalledBrowserExtension BrowserExtensionId!="no-extension-available"
// Aggregate by event_platform, BrowserName, ExtensionID and ExtensionName
| groupBy([event_platform, ComputerName, BrowserName, BrowserExtensionId, BrowserExtensionName], function=([count(aid, distinct=true, as=TotalEndpoints)]))
// Check to see if the extension is installed on fewer than 50 systems
| test(TotalEndpoints<50)
// Create a link to the Chrome Extension Store
| format("[See Extension](https://chromewebstore.google.com/detail/%s)", field=[BrowserExtensionId], as="Chrome Store Link")
// Sort in descending order
| sort(order=desc, TotalEndpoints, limit=1000)
// Convert the browser name from decimal to human-readable
| case{
    BrowserName="3" | BrowserName:="Chrome";
    BrowserName="4" | BrowserName:="Edge";
    *;
}

Windows および macOS のブラウザ拡張機能コレクション

クエリー例:Helpful-CQL-Queries/AssociateTreeIdWithRoot to Pattern Details

このクエリーはAssociateTreeIdWithRootイベントを検索します。
falcon/investigate/detect_patterns.csvファイルから情報を取得して結果に追加します。
GitHub:https://github.com/CrowdStrike/logscale-community-content/blob/main/Queries-Only/Helpful-CQL-Queries/AssociateTreeIdWithRoot%20to%20Pattern%20Details.md
クエリー:

#event_simpleName=AssociateTreeIdWithRoot
| PatternId =~ match(file="falcon/investigate/detect_patterns.csv", column=PatternId, strict=false)
| select([@timestamp, aid, ComputerName, PatternId,name,scenario,scenarioFriendly,description,severity,show_in_ui,killchain_stage,tactic,technique,objective,pattern_updated])

AssociateTreeIdWithRoot to Pattern Details

Falconに登録されているファイルを読み込んで結果に情報を追加する

緊急時にログクエリが作れない場合の有効な一手

これまでの話でログ活用の重要性をお伝えしましたが、いざインシデント発生時、適切なログクエリが作れないケースは少なくありません。そんな時でも、解決策はあります。それは、時間と対象を極限まで絞り込み、全ログを目視で確認することです。

この方法は泥臭いですが、手がかりを見つけ、次の分析ステップへ繋げるための最後の、そして確実な手段となります。 以下では簡単に必要な情報のみ表示するテーブルを作成する小ワザをご紹介します。この方法の利点は必要なデータのみテーブルに表示させつつ詳細のデータ(すべてのフィールド)の情報も確認できるところです。

(1)調査対象の時間間隔はいったん2~7日と広くとり、調査したいデバイスIDをaidに指定して検索を実行します。

時間間隔を広くとる

aid(デバイスID)のみクエリーに指定して実行

(2)イベント分布チャートで日時を正確に絞ります

イベント分布チャート

(3)テーブルを見やすく修正するため結果から調査したいフィールドを追加します。必要なフィールドのみ選択するにはフィールドパネルでフィールド名の+をクリックします。表示がみやすくなるように表示量が多い「フィールドリスト」フィールドは表示項目から削除します。

列として#event_simpleNameを追加

フィールドリストは削除

(4)必要に応じて不要な値の行を削除すると必要な情報のみ表示するテーブルができました。深堀り調査する時には該当の行を選択すると下に詳細が表示されます。json形式で表示させることもできます。

必要に応じて不要な値の行を削除します

行を選択すると詳細が表示されます

まとめ

今回はCrowdStrike Falconの「公式ドキュメントとCool Query Fridayからピックアップした検索クエリで脅威ハンティングやインシデント調査を行う方法」について解説しました。クエリーについては今回ご紹介した公式ドキュメントやRedditの他、GitHubCrowdStrike Universityなど様々なリソースで詳しく学ぶことができますのでぜひご活用ください。 Happy Querying!

CrowdStrike University

今後の連載の予定をご参考に興味があるトピックだけでもご覧いただければ幸いです。
少しでもサイバーセキュリティに興味を持っていただけるように楽しくお伝えしますのでお楽しみに。
最後まで読んでいただきありがとうございました。

0-WANについて

私たち0-WANは、ゼロトラスト製品を中心とした、マルチベンダーでのご提案で、お客様の経営課題解決を支援しております。 ゼロトラストってどうやるの?製品を導入したけれど使いこなせていない気がする等々、どんな内容でも支援いたします。 お気軽にご相談ください。

問い合わせ先、0-WANについてはこちら。 www.ap-com.co.jp

一緒に働いて頂ける仲間も募集しています

今までの経験を活かして、私たちと一緒にゼロトラスト分野で活躍しませんか? www.ap-com.co.jp