
潜在的に感染したmacOSエンドポイントからフォレンジックデータを収集し、ブラウザアーティファクト、永続化メカニズム、プロセス、ネットワーク構成をキャプチャするためのモジュール式インシデント対応ツールキット。
このスクリプト群は、感染が疑われるエンドポイントからさまざまなデータを収集し、インシデント対応プロセスを支援するために設計されています。このデータは完全なフォレンジックデータ収集と見なされるべきではありませんが、多くの有用なフォレンジック情報を捕捉します。
真のフォレンジックデータが必要な場合は、完全なメモリダンプを取得し、ドライブ全体をイメージ化する必要があります。それはこのツールキットの範囲外です。
スクリプトはライブシステム上で実行する必要があり、イメージやその他のフォレンジックデータストア上では実行できません。厳密には実行に root 権限は必要ありませんが、意図されたデータの多くを収集できなくなります。
データは2つの形式で収集されます。1つ目はサマリファイルで、シェルコマンドの出力、データベースから抽出されたデータなどが含まれます。例えば、browser モジュールは browser_extensions.txt ファイルを出力し、Safari、Chrome、Firefox にインストールされているすべてのブラウザ拡張機能のサマリを含みます。
2つ目はファイルシステムから収集された完全なファイルです。これらは収集フォルダ内の artifacts サブフォルダに保存されます。
スクリプトの実行は非常に簡単です。必須のパラメータとして、JSON 形式の設定スクリプトを1つだけ受け取ります。
./pict.py -c /path/to/config.json
設定スクリプトは、スクリプトが何をどのように収集するかを記述します。次のようになります。
{
"collection_dest" : "~/Desktop/",
"all_users" : true,
"collectors" : {
"browser" : "BrowserExtCollector",
"persist" : "PersistenceCollector",
"suspicious" : "SuspiciousBehaviorCollector",
"browserhist" : "BrowserHistoryCollector",
"bash_config" : "BashConfigCollector",
"bash_hist" : "BashHistoryCollector",
"processes" : "ProcessCollector",
"network_config" : "NetworkConfigCollector",
"profiles" : "ProfileCollector",
"certs" : "TrustedCertCollector"
},
"settings" : {
"keepLSData" : true,
"zipIt" : true
},
"moduleSettings" : {
"browser" : {
"collectArtifacts" : true
}
},
"unused" : {
"installs" : "InstallationCollector"
}
}
収集データを保存するパスを指定します。絶対パスまたはユーザのホームフォルダからの相対パス(チルダで始める)を指定できます。指定しない場合のデフォルトパスは /Users/Shared です。
この場所にフォルダが作成され、データが収集されます。フォルダ名は PICT-コンピュータ名-YYYY-MM-DD の形式になります。コンピュータ名は システム環境設定 > 共有 で指定されたマシン名、日付は収集日です。
true の場合、可能な限りマシン上のすべてのユーザからデータを収集します。false の場合、スクリプトを実行しているユーザのデータのみを収集します。指定しない場合、デフォルトは true です。
PICT はモジュール式であり、使用する Collector モジュールを変更するだけで、簡単に拡張または縮小できます。
collectors データは辞書で、キーはロードするモジュールの名前(Python ファイルの拡張子 .py を除いた名前)、値はそのモジュール内にある Collector サブクラスの名前です。カスタムモジュールのエントリを追加したり(独自モジュールの作成 を参照)、エントリを削除してそれらのモジュールが実行されないようにすることができます。後で再追加したい場合に正確な名前を調べる手間を省く簡単な方法として、モジュールを unused というトップレベルの辞書に移動することができます。
この辞書はグローバル設定を提供します。
keepLSData は、lsregister.txt ファイル(かなり大きくなる可能性があります)を保持するかどうかを指定します。(このファイルは自動的に生成され、他のモジュールの出力を構築するために使用されます。豊富な有用情報が含まれていますが、サイズが 100 MB を超えることもあります。そのデータが不要な場合、または大量のデータを扱いたくない場合は、false に設定すると、収集完了時に削除されます。)
zipIt は、収集フォルダの内容を自動的に zip ファイルに圧縮するかどうかを指定します。データの圧縮と解凍のプロセスにより、ファイルの所有権などの一部の属性が変更されることに注意してください。
この辞書はモジュール固有の設定を指定します。すべてのモジュールが独自の設定を持つわけではありませんが、モジュールが独自の設定を許可している場合、ここで設定を指定できます。上の例では、browser モジュールで collectArtifacts というブール値の設定が使用されているのがわかります。
また、Collector クラスによって管理されるグローバルモジュール設定もあり、各モジュールに対して個別に設定できます。
collectArtifacts は、モジュールが通常収集するファイルアーティファクトを収集するかどうかを指定します。false の場合、そのモジュールのすべてのアーティファクトが省略されます。これは、ストレージ容量が懸念される場合や、収集されるアーティファクトが大きい場合、または収集されたアーティファクトが分析対象システムのユーザのプライバシーの問題を表す可能性がある場合に必要になることがあります。
モジュールは、Collector(collectors/collector.py で定義)のサブクラスであるクラスを含むファイルで構成され、collectors フォルダに配置する必要があります。新しい Collector モジュールは、collectors/template.py ファイルを複製し、自分の用途に合わせてカスタマイズすることで簡単に作成できます。
def __init__(self, collectionPath, allUsers)このメソッドは必要に応じてオーバーライドできますが、その場合、できればカスタムコードの実行前にスーパークラスの Collector.init() を呼び出す必要があります。これにより、カスタムコードがプロパティを使用しようとする前に、オブジェクトがプロパティをセットアップする機会を得られます。
def printStartInfo(self)これは非常にシンプルなメソッドで、このモジュールの収集が開始される際に呼び出されます。その目的は、何が起こっているかについてのフィードバックを提供することで、進捗状況をユーザに伝えるメッセージを標準出力に出力することです。
def applySettings(self, settingsDict)これにより、モジュールはカスタム設定を適用する機会を得られます。各モジュールは自己定義の設定を持つことができますが、Collection クラスが定義する設定を処理できるように、settingsDict をスーパークラスにも渡す必要があります。
def collect(self)このメソッドはモジュールの中核です。モジュールが収集を開始するタイミングで呼び出されます。必要なだけファイルを作成できますが、その活動はパス self.collectionPath 内のファイルに限定し、他のモジュールで既に使用されていないファイル名を使用する必要があります。
アーティファクトを収集する場合は、自分で行わないでください。代わりにパスを self.pathsToCollect 配列に追加するだけで、Collector クラスがそれらを artifacts フォルダ内の適切なサブパスにコピーし、アーティファクトのメタデータ(パーミッション、拡張属性、フラグなど)を維持します。
メソッドが終了したら、必ずスーパークラス(Collector.collect(self))を呼び出して、アーティファクトの収集などの責任を Collector クラスが処理できるようにします。
collect メソッドは、self.collectionPath にある basic_info.txt または lsregister.txt ファイルに収集されたデータを使用できます。これらは pict.py スクリプトによって最初に収集され、他のモジュールでも利用可能であると想定できます。ただし、他のモジュールの出力に依存してはいけません。モジュールが実行されるタイミングでファイルが利用可能である保証はないからです。モジュールは設定 JSON に現れる順序で実行されるとは限りません。Python の辞書は順序付けされていないためです。
Greg Neagle 氏の FoundationPlist.py に感謝します。これにより、バイナリ plist や日付データ型を含む plist の読み取りに関する多くの問題が解決されました。