
CISOレポート
デジタルレジリエンスへの道を取締役会と共に歩む
CISOと取締役会はかつてないほど緊密に連携しています。それぞれが果たすべき役割はまったく異なるため、成功指標に対する認識にずれがあります。
セキュリティインシデントを調査しているときや、悪質なアクティビティの兆候を探してデータを精査しているときに、特定のプロセスのアクティビティや関係を追跡したくなることがよくあります。
そのために、親プロセスと子プロセスのIDを何度もコピーアンドペーストし、ブルートフォース的に端から調べていくと、相当な時間と手間がかかります。作業中に、注意すべき事象を示す項目を見逃すこともあるかもしれません。
Splunkならプロセスデータを簡単に取り込んでサーチや相関付けを実行できますが、特にデータが複数世代にわたる場合、親子の関係を可視化するのは難しい場合があります。
そこで、このチュートリアルでは、pstreeコマンドとPSTree Appを使って、調査対象のすべてのプロセスを調べる方法を紹介します。PSTree Appを使えば、サーチ結果をわかりやすく表示できます。
(この記事は「Splunkで脅威ハンティング」シリーズの一部です。お客様に最大限の価値を提供できるよう、その内容を最近更新しました。)
プロセスの関係を追跡するには、まず、適切なデータを取り込む必要があります。今回はWindowsを対象にしますが、今後、他のオペレーティングシステムについても取り上げたいと考えています。
適切なデータを取り込むために、私はWindows Universal Forwarderに次の2つのSplunkアドオンを使用しています。
適切なアドオンをインストールしたら、Windowsエンドポイントでプロセス関連のイベントを収集するための設定を行います。新しいプロセスの作成を示すイベントを収集するために最適なデータが2種類あります。
どちらのデータソースを使っても問題ありませんが、このブログでは、後述のユーティリティとの相性の良さを考慮して、Sysmonイベントコード1のデータを使用します。
準備が整ったら、さっそくハンティングを始めましょう。この例では、環境内に悪質なスプレッドシートが紛れ込んでいることがわかっていて、そのファイルがすでに開かれたかどうかを調べます。開かれていた場合は、それによって何が起きたかも調査します。
まずは、問題のスプレッドシートのファイル名「Salaries.xls」を含むSysmonイベントコード1があるかどうかを調べます。ブリック・タムランド氏がランプを愛するのと同じくらいかそれ以上に、私はテーブルを愛しています。そこで、SPLのtableコマンドを使って、以下のデータを「テーブル」にします。
このサーチでは、インデックスに「main」、ソース(ソースタイプではありません!)にSysmonデータ、追加の条件に「EventCode=1」を指定して、プロセス作成イベントを取得します。最初のサーチブロックでCommandLineフィールドのサーチを定義することもできますが、ここではわかりやすさと後の作業で再利用することを考慮して、searchコマンドを別途指定しています。
次に、テーブルに含める前述のフィールドを指定します。必要に応じて他のフィールドを追加しても構いません。
index=main source="xmlwineventlog:microsoft-windows-sysmon/operational" EventCode=1
| search CommandLine="*Salaries.xls*"
| table _time host user ProcessId CommandLine
このサーチによって、「Salaries.xls」を含むプロセス作成イベントが1件見つかりました。そのユーザーは「wallylambic」、プロセスIDは「6416」であることがわかります。また、コマンドラインを見ると、Excel.exeによって、Outlookと思われるプログラムからスプレッドシートが開かれているようですが、これを確認するにはさらに調査が必要です。
また、スプレッドシートが開かれた後に何が起きたかもよくわかりません。
先ほどのサーチを少し変更して、tableコマンドで表示するフィールドを増やすことができます。以下のようなフィールドを追加できます。
これらのフィールドを調べれば詳しい状況がわかり、想定された場所からプロセスが実行されているかどうかを確認できます。
index=main source="xmlwineventlog:microsoft-windows-sysmon/operational" EventCode=1
| search CommandLine="*Salaries.xls*"
| table parent_process_name parent_process_id parent_process_path process_path
これにより、プロセスの追跡に役立つ適切な情報が得られます。たとえば以下のことがわかります。
プロセスのパス情報は、想定外の場所(tempディレクトリ、startupフォルダーなど)から起動されたプロセスを探す場合に非常に有効です。
このプロセスIDを起点に、返されたプロセスIDを親プロセスIDとして新しいサーチを実行するという作業を繰り返し、プロセスツリー全体を調査することもできますが、冒頭で述べたとおり、この方法には時間がかかり、ミスが起こりやすく、かなり深くまでパスをたどらなければならないこともあります。
スプレッドシートが開かれた後に起きたことすべてを一度に追跡できるテーブルを作成して、作業をもっと楽にする方法はないでしょうか?それがあるのです!
PSTree for Splunkは、Donald Murchison氏が開発したクールなAppで、調査の手間を大幅に省いてくれます。このAppとSplunk Python SDKをインストールしたら、親プロセスと子プロセスのフィールド情報を渡すだけで、プロセスのファミリー構造がテーブル形式で返されます(私がテーブル好きであることは言いましたよね?)。
次のサーチの大部分は、上記のリンク先であるSplunkbaseページの「Details」タブに記載されている、Donald氏による使用例から引用しています。一見難しそうですが、実際はそうでもありません。簡単にご説明しましょう。
2つのrexコマンドでは、既存のParentImageフィールドとImageフィールドから新しいフィールド「ParentName」と「ProcessName」を作成しているだけです。
(ヒント:正規表現が苦手な方は、こちらの便利なサイトから、Rex Kwon Doトレーニングをお試しください。また、Splunkのブログ記事「脅威ハンティングで正規表現を使用する(正規表現は意味不明な呪文ではありません!)」も参考になります。)
新しいフィールドを作成したら、evalコマンドを使って、抽出したParentNameフィールドと既存のParentProcessIdフィールド、ProcessNameフィールドと既存のProcessIdフィールドの情報をそれぞれ組み合わせます。さらに、_timeフィールドとCommandLineフィールドの情報を組み合わせた、「detail」という名前のフィールドも作成します。これらのステップを経ることで、最終的に、情報が豊富で見やすいテーブルを作成できます。
次に、作成した3つの新しいフィールド、parent、child、detailを、PSTree Appによって追加されたpstreeカスタムコマンドに渡します。「spaces=50」の定義は、生成されるテーブルの先頭の列に無駄なスペースが含まれないように、結果のテーブルをフォーマットするためのものです。問題の「Salaries.xls」スプレッドシートに基づいてプロセスを追跡するには、pstreeコマンドで操作を実行した後に、このファイルをサーチパラメーターとして指定します。これは非常に重要なポイントです。
最後に、treeフィールドのデータからテーブル(私が愛するテーブル)を作成します。
index=main source="xmlwineventlog:microsoft-windows-sysmon/operational" EventCode=1 user=wallylambic
| rex field=ParentImage "\x5c(?<ParentName>[^\x5c]+)$"
| rex field=Image "\x5c(?<ProcessName>[^\x5c]+)$"
| eval parent = ParentName." (".ParentProcessId.")"
| eval child = ProcessName." (".ProcessId.")"
| eval detail=strftime(_time,"%Y-%m-%d %H:%M:%S")." ".CommandLine
| pstree child=child parent=parent detail=detail spaces=50
| search tree=*Salaries.xls*
| table tree
画面のサイズによっては少し見づらいかもしれませんが、生成されたテーブルには、最大7層の深さのプロセストレースが表示されています。
「Outlook.exe (11120)」から始まり、そこから「Excel.exe (6416)」が生成され、さらにそこから「mshta.exe (12404)」、続いて「powershell.exe (16796)」が生成されています。その後、このプロセスによって別の「powershell.exe (5912)」が生成され、そこから「cmd.exe (1832)」が生成されて、さらに「powershell」、「cacls」、「bitsadmin」などのプロセスが生成されています。
CommandLineフィールドのデータも表示されていますが、字が小さくて見づらいかもしれません。
トレースの最初の部分を拡大したのが次の図です。
この作業を手動で行うとどれだけ大変か想像できるでしょう。新しいサーチを実行するたびにブラウザのタブが増えていくのは煩わしいものです。その点、プロセスに関する情報をタイムスタンプやコマンドラインの内容とともに1つのテーブルにまとめるこの方法は非常に効率的です。このすばらしいAppを作ってくれたDonald氏に感謝しましょう!
皆様のプロセス追跡作業にこのブログがお役に立てば幸いです。
Splunkはセキュリティチームをいつでもサポートします。
Splunkプラットフォームは、データを行動へとつなげる際に立ちはだかる障壁を取り除いて、オブザーバビリティチーム、IT運用チーム、セキュリティチームの能力を引き出し、組織のセキュリティ、レジリエンス(回復力)、イノベーションを強化します。
Splunkは、2003年に設立され、世界の21の地域で事業を展開し、7,500人以上の従業員が働くグローバル企業です。取得した特許数は1,020を超え、あらゆる環境間でデータを共有できるオープンで拡張性の高いプラットフォームを提供しています。Splunkプラットフォームを使用すれば、組織内のすべてのサービス間通信やビジネスプロセスをエンドツーエンドで可視化し、コンテキストに基づいて状況を把握できます。Splunkなら、強力なデータ基盤の構築が可能です。