脅威ハンティングの始め方:ビギナーガイド
Security Madeleine Tauber , Tamara Chacon周囲をすばやく観察し、その情報に基づいて計画を立て、実行する。これはサイバーセキュリティにおいても人生においても欠かせないスキルです。
新しい環境でハンティングを行うときは、実際の作業に入る前に、そのプロセスを確認しておくことが重要です。このチュートリアルでは、新しい環境で脅威ハンティングを行うという冒険的な体験を乗り越えるための方法をご紹介します。
脅威ハンティングを日常的に行っている場合でも、初めて行う場合でも、このチュートリアルを読めば役に立つヒントが見つかるはずです。この記事は以下の4つのセクションで構成されています。
- ハンティングプロセスを始める
- ハンティングの対象(期間、データ、コンテキスト)を絞る
- Splunkで適切なコマンドを使ってサーチを行う
- OSINT (オープンソースインテリジェンス)などの外部リソースを活用する
このチュートリアルはSplunkユーザー向けで、データがすでにSplunkに取り込まれていることを前提としています。Splunkにデータを取り込む方法については多くのブログ記事でご紹介しているので省略し、ここでは、それらのデータから情報を引き出そうとするアナリストの皆様を対象にご説明します。
(この記事は「Splunkで脅威ハンティング」シリーズの一部で、初稿はJohn Stonerによって書かれました。お客様に最大限の価値を提供できるよう、その内容を最近更新しました。)
ステップ1. ハンティングプロセスを始める
ハンティングを始めるときは、目的を明確にすることが大切です。どこで何を探すかを決めるために役立つ方法がいくつかあります。
- 仮説を立てて取り組みの方針を決める
- PEAK脅威ハンティングフレームワークに基づいてハンティングに関するガードレールを定める
たとえば、WindowsシステムでPowerShellが実行されていると仮定すれば、ハンティングで何に集中すべきかがわかり、他の脅威の痕跡を求めてわき道にそれることもなくなります。
もちろん、他の脅威の痕跡が実際に見つかった場合はメモしておき、あとでその脅威を仮定してハンティングを行いましょう。
ステップ2. ハンティングの対象を絞る
Splunkコンソールを見ると、多数のデータソース(sourcetypes)の、数日、数週間、数カ月、または数年にわたるデータが表示されているはずです。
まずは、対象とするデータと期間を絞り込んで、特定の範囲またはサブセットに限定します。もちろん、その範囲外のデータは調べなくてよいというわけではありませんが、最初は効果を上げるために対象を絞ります。
では、どうやって絞り込めばよいでしょうか。期間から見ていきましょう。
期間
Splunkサーチバーの右側には タイムピッカー と呼ばれるドロップダウンがあり、これを使ってサーチの対象とする期間を設定できます。このドロップダウンをクリックすると、複数のプリセットの期間が表示されます。また、日時を指定して検索範囲を設定することもできます。ハンティングを行うときは常に、このタイムピッカーでサーチを絞り込むことが非常に重要です。
データソース(sourcetypes)を限定するときは、利用可能なソースタイプを把握しておく必要があります。利用可能なソースタイプをすばやく調べるには、metadataコマンドを使って次のように指定します。
| metadata type=sourcetypes | sort - totalCount
この例では、以下の情報を含むリストが表示されます。
- ソースタイプ(sourcetypes)
- 指定の時間範囲のイベント数
- 最初、最後、直近のイベントの記録日時
(このサーチについて詳しくは、ブログ記事「metadataとtstatsを活用した脅威ハンティング」をご覧ください。)
データソース
仮説(目的)、期間、ソースタイプが決まったら、データを掘り下げていきます。次に考えるのは、対象にするデータの種類です。これは、最初に立てた仮説(目的)によって決まります。
- この例ではPowerShellを対象にするため、ホストベースのデータソース(MicrosoftイベントログやMicrosoft Sysmonなど)が最適でしょう。あとでネットワークデータソースも調べる必要が生じるかもしれませんが、まずはこのデータソースに集中しましょう。
- 一方で、データ圧縮を使ったデータ流出の痕跡を調べるような場合は、ネットワークデータソースが適しています。
ネットワークデータソースは、どのデータがどこに送信されたかを特定するために役立ちます。データがクラウドプロバイダーに送られたのか、社内のサーバーからワークステーションに送られたのかといった情報を把握することは非常に重要です。
ネットワークデータソースには以下のものがあります。
- ファイアウォール
- Webプロキシ
- ワイヤーデータ
ワイヤーデータは、TCP、HTTP、SMTP、DNSなどのネットワークプロトコルごとに分類された、Splunk for Streamの形式で確認できます。
Splunk for Streamを使用していない場合でも、PCAPデータやZeekをお使いであれば、それらのデータセットから、組織のネットワークで使用している各プロトコルに関する有用なインサイトを得られます。
コンテキスト
ネットワーク、システム、ユーザーの状況をより詳しく理解するには、ログイベントに加えて、コンテキストデータも入手する必要があります。検討すべきデータタイプには以下のものがあります。
- 資産とIDデータ:ユーザーに関するコンテキストを確認できます。たとえば、各システムのオーナーや、ユーザーが所属している部門などがわかります。これらのコンテキストから、特定のサーバーに接続する不審なワークステーションの所有者といった手掛かりが得られます。
- システムが所属するネットワークとアドレス:これらはハンティングにおいて重要な情報です。自身のワークステーションが所属するアドレス空間で何らかのアクティビティを発見したとき、そのソースIPが組織に属するものであることを認識できなければ、社内のシステムに脅威を与えないソースのアクティビティを調査して時間を無駄にすることになりかねません。
- 脅威インテリジェンス:組織の環境のコンテキスト内で調査すべき、外部からの攻撃の兆候を把握するために特に役立ちます。ただし、これらの兆候が見つかった時点で、すでに問題が発生していると言えるかもしれません。
ステップ3. Splunkでサーチを行う
データとコンテキストを確認し、期間を絞り込む方法がわかったら、Splunkサーチを実行します。Splunkでは、非体系的なアプローチと体系的なアプローチのどちらでもサーチを実行して結果を得られます。
私は、ハンティングで何を探すかが明確になっていない場合、最初は広い範囲でサーチを行うことにしています。それには以下のような理由があります。
- 精密なSplunkサーチを書いたのに結果が返ってこなかったという事態を避けたい(私が書いたサーチを見たことがあれば、そもそもそんなサーチにはならないことがおわかりいただけるでしょうが...)
- 最初は広くサーチして、そこから絞り込んでいく方が効率的である。サーチ結果を確認し、画面の左側に表示される「選択されたフィールド」と「関連するフィールド」を使って、特定のフィールドの値を調べたり、特定のフィールドをピボットしたりして、サーチ結果を絞り込むことができます。
この例では、Microsoft Sysmonデータを対象に、2017年8月23日に発生したイベントをサーチしています。(もちろん、このデータがやや古いことは承知していますが、このデータの内容とそこから学べることは今でも非常に有用です。)
sourcetype="xmlwineventlog:microsoft-windows-sysmon/operational"
このサーチで約40,000件のイベントが見つかりました。ここから、利用可能なフィールドを使用することで、サーチ結果を大幅に絞り込むことができます。しかも、いくつかのフィールドをポイントしてクリックするだけでそれが可能です。例として、Amber Turingというユーザーが実行したアクティビティを探します。
sourcetype="xmlwineventlog:microsoft-windows-sysmon/operational" user="FROTHLY\\amber.turing"
この結果から、Amberが自身のシステムで「tor.exe」を実行したらしいことがわかります。興味深いですね。では、Splunkのすばらしい変換コマンドを使って、データを見やすくしましょう。
変換コマンドのことはご存じでしょうか?これらは、サーチの結果を受け取ってデータ出力を変換する、以下のようなコマンドです。
役に立つコマンドリファレンス
Splunkは、役に立つコマンドリファレンスを公開しています。私もよく参照しています。皆様もハンティングの際にぜひご活用ください!(Splunkのコマンドになじみがなく、いつもキーワードを使ってサーチを行っている場合でも、心配ありません。この脅威ハンティングシリーズは、その方法にも対応しています。)
無人島にSplunkコマンドを2つだけ持っていけるとしたら、私は stats と eval を選びます。この2つはそのくらい強力です。この2つのコマンドを組み合わせたサーチの例をご紹介します。
sourcetype="pan:traffic" (src_ip=10.0.2.101 OR dest_ip=10.0.2.101)
| stats count AS event_count sum(bytes_in) AS bytes_in sum(bytes_out) AS bytes_out sum(bytes) as bytes_total by src_ip dest_ip
| eval mb_in=round((bytes_in/1024/1024),2) | eval mb_out=round((bytes_out/1024/1024),2) | eval mb_total=round((bytes_total/1024/1024),2)
| fields - bytes*
| sort - mb_total
| head 10
この例では、Amberのシステムと他のシステムとの間で行われた通信の経路を確認しています。コンテキスト情報から、AmberのIPアドレスが「10.0.2.101」であることがわかっているので、1行目のサーチでは、そのIPアドレスが送信元または宛先になっているファイアウォールデータを探しています。
- 次に、statsコマンドを使って、bytes_in (受信バイト数)、bytes_out (送信バイト数)、bytes (総バイト数)の各フィールドをそれぞれ合計し、送信元アドレスと宛先アドレスの一意の組み合わせごとにイベント数を割り出します。
- その後、evalコマンドを使って、バイトをMB単位に変換するための計算を行い、小数点以下2桁までに四捨五入して、結果を新しいフィールドに格納します。
この2つが私のお気に入りのコマンドなので、ここで説明を終えてもよいのですが、さらに先のステップで使えるコマンドをもう少しご紹介しましょう。
- fieldsコマンドを使って、結果セットにもともと含まれていた「byte」で始まる各フィールドを除外します。
- sortコマンドを使って、mb_totalフィールドの降順で結果を並べ替え、headコマンドを使って、上位10件の結果を取り出します。
これにより、Amberのシステムと大量にデータをやり取りしている外部の通信先トップ10がわかりました。すごいでしょう?
ステップ4. OSINTなどのリソースを活用する
ハンティングを始めるときに覚えておくべき最後の重要なステップは、OSINT (オープンソースインテリジェンス)を活用することです。
私のお気に入りのOSINTサイトは「G」で始まります。おわかりですか?そう、google.comです。
Googleはハンティングで見過ごされがちですが、非常に強力なリソースです。私の記憶力では1,000以上あるWindowsイベントコードをすべて覚えておくことはできないので、こうした情報をすばやく検索できるだけでも十分な価値があります。
Google以外に役立つサイトとしては、以下のものがあります。
- VirusTotal:マルウェアの情報を調査できます。
- RiskIQ:パッシブDNSの情報を調査できます。
- Censys.IO:SSL証明書と攻撃者のインフラの関連を調べたいときに重宝します。
ハンティングを始めましょう
短時間で多くのことを学びましたね!サンプルデータセットを使ってハンティングのスキルを磨きたい場合や、新しい技法を試してみたい場合、または単にSplunkサーチの練習をしたい場合は、Splunk GitHubからBOTSデータセット(botsv3など)をダウンロードして、サンドボックス環境で使ってみてください。
また、このシリーズには他にもたくさんのチュートリアルが用意されているので、ぜひご覧ください。
Splunkはセキュリティチームをいつでもサポートします。
関連記事

クラウドセキュリティとは?対策やリスクについて解説

実践編:Splunkで実現するランサムウェア攻撃対策 ― 可視化から自動対応まで
