PSTreeを使ったプロセスハンティング

Security Madeleine Tauber , Shannon Davis
セキュリティインシデントを調査しているときや、悪質なアクティビティの兆候を探してデータを精査しているときに、特定のプロセスのアクティビティや関係を追跡したくなることがよくあります。
セキュリティインシデント

そのために、親プロセスと子プロセスの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を使ったテーブルの作成

スプレッドシートが開かれた後に起きたことすべてを一度に追跡できるテーブルを作成して、作業をもっと楽にする方法はないでしょうか?それがあるのです!

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つの新しいフィールド、parentchilddetailを、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
PSTreeを使ったテーブルの作成

画面のサイズによっては少し見づらいかもしれませんが、生成されたテーブルには、最大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はセキュリティチームをいつでもサポートします。

このブログはこちらの英語ブログの翻訳、山村 悟史によるレビューです。

関連記事

サプライチェーン攻撃の仕組み:定義、種類、セキュリティ対策と予防措置
セキュリティ
10 分程度

サプライチェーン攻撃の仕組み:定義、種類、セキュリティ対策と予防措置

サプライチェーン攻撃は信頼されているサードパーティやベンダーを悪用して、アクセス権を取得し、サプライチェーンを侵害します。詳細をお確かめください。
ソーシャルエンジニアリング攻撃とは?
セキュリティ
8 分程度

ソーシャルエンジニアリング攻撃とは?

この記事では、サイバー犯罪者が使うさまざまな手口を解説し、ソーシャルエンジニアリング攻撃を防ぐ方法を紹介します。
Log4Shell - Log4jの脆弱性(CVE-2021-44228)を検出する(続報)
セキュリティ
15 分程度

Log4Shell - Log4jの脆弱性(CVE-2021-44228)を検出する(続報)

良いニュースです。Splunkを使用すれば、ネットワークトラフィックとDNSクエリーのログをデータソースとして、Log4Shellを悪用する攻撃を未然に検出できます。Splunk SURGeが発見した、CVE-2021-44228のさらなる検出方法をご紹介します。