
OS X向けのフォレンジック証拠収集・分析ツールキット

OSXCollector は、OSX 向けのフォレンジック証拠収集・分析ツールキットです。
収集スクリプトは感染の可能性があるマシン上で実行され、対象マシンを記述した JSON ファイルを出力します。OSXCollector は、plist、SQLite データベース、ローカルファイルシステムから情報を収集します。
フォレンジック収集を手に入れたアナリストは、次のような質問に答えることができます:
Yelp は、ほとんどの OSXCollector 実行の分析を自動化し、その出力を「怪しいものだけ」の読みやすく実用的なサマリーに変換しています。自動化された OSXCollector 出力分析を最大限に活用する方法については、OSXCollector Output Filters プロジェクト を参照してください。
osxcollector.py は、標準の OSX マシン上で依存関係なしに実行できる単一の Python ファイルです。そのため、brew、pip、設定ファイル、環境変数を気にすることなく、任意のマシンで簡単に収集を実行できます。単一のファイルをマシンにコピーして実行するだけです。
sudo osxcollector.py だけです。
$ sudo osxcollector.py
Wrote 35394 lines.
Output in osxcollect-2014_12_21-08_49_39.tar.gz
GitHub リポジトリをクローンしたばかりの場合、osxcollector.py は osxcollector/ ディレクトリ内にあるため、次のように実行する必要があります:
$ sudo osxcollector/osxcollector.py
重要: Mac OS X マシン上の python コマンドが、システムに付属のデフォルトの Python インタプリタを使用しており、brew でインストールされた Python バージョンなどで上書きされていないことを確認してください。OSXCollector は OS X ライブラリのネイティブ Python バインディングに依存しています。これらは、システムに元々インストールされている Python 以外のバージョンでは利用できない可能性があります。
または、使用する Python バージョンを明示的に指定して osxcollector.py を実行することもできます:
$ sudo /usr/bin/python2.7 osxcollector/osxcollector.py
コレクタの JSON 出力は、システムログなどの便利なファイルとともに、.tar.gz ファイルにまとめられ、アナリストへの引き渡し用にされます。
osxcollector.py には、収集の動作を変更するための便利なオプションが多数あります:
-i INCIDENT_PREFIX/--id=INCIDENT_PREFIX:
出力ファイルのプレフィックスとして使用される識別子を設定します。デフォルト値は osxcollect です。
$ sudo osxcollector.py -i IncontinentSealord
Wrote 35394 lines.
Output in IncontinentSealord-2014_12_21-08_49_39.tar.gz
インシデント名は創造的に付けましょう。苦しみを笑い飛ばしやすくなります。
-p ROOTPATH/--path=ROOTPATH:
収集を実行するファイルシステムのルートへのパスを設定します。デフォルト値は / です。これはディスクイメージ上で収集を実行するのに最適です。
$ sudo osxcollector.py -p '/mnt/powned'
-s SECTION/--section=SECTION:
完全な収集の一部のみを実行します。複数回指定できます。セクションとサブセクションの完全なリストは次のとおりです:
versionsystem_infoコレクタは、収集されたすべてのアーティファクトを含む .tar.gz を出力します。アーカイブには、ほとんどの情報を含む JSON ファイルが含まれています。さらに、対象システムのログから有用なログのセットも含まれています。
JSON ファイルの各行は 1 つの「情報」を記録します。すべての JSON レコードに現れる共通のキーがいくつかあります:
osxcollector_incident_id: すべてのレコードで共有される一意の ID。osxcollector_section: このレコードが保持するデータの「セクション」または種類。osxcollector_subsection: このレコードが保持するデータの種類の「サブセクション」またはより詳細な記述子。ファイルを表すレコードには、いくつかの便利なキーがあります:
atime: ファイルアクセス時刻。ctime: ファイル作成時刻。mtime: ファイル変更時刻。file_path: ファイルの絶対パス。md5: ファイル内容の MD5 ハッシュ。sha1: ファイル内容の SHA1 ハッシュ。sha2: ファイル内容の SHA2 ハッシュ。ダウンロードされたファイルを表すレコードの場合:
xattr-wherefrom: ダウンロードされたファイルの送信元 URL と参照元 URL を含むリスト。xattr-quarantines: どのアプリケーションがファイルをダウンロードしたかを示す文字列。SQLite データベースの行を表すレコードの場合:
osxcollector_table_name: 行の由来となるテーブル名。osxcollector_db_path: SQLite ファイルの絶対パス。特定のユーザーに関連付けられたデータを表すレコードの場合:
osxcollector_username: ユーザー名OSXCollector は、タイムスタンプを YYYY-mm-dd hh:MM:ss 形式の人間が読みやすい日時文字列に変換しようとします。ヒューリスティックを使用して、さまざまなタイムスタンプを自動的に識別します:
version セクションOSXCollector の現在のバージョン。
system_info セクションシステムに関する基本情報を収集します:
kext セクションカーネル拡張機能を以下から収集します:
/System/Library/Extensions/Library/Extensionsstartup セクションLaunchAgents、LaunchDaemons、ScriptingAdditions、StartupItems およびその他のログイン項目に関する情報を以下の場所から収集します:
/System/Library/LaunchAgents/System/Library/LaunchDaemons/Library/LaunchAgents~/Library/LaunchAgents/Library/LaunchDaemons/System/Library/ScriptingAdditions/Library/ScriptingAdditions/System/Library/StartupItems/Library/StartupItems~/Library/Preferences/com.apple.loginitems.plistMac OS X の起動に関する詳細はこちらを参照してください: http://www.malicious-streams.com/article/Mac_OSX_Startup.pdf
applications セクションインストールされたアプリケーションのハッシュを取得し、インストール履歴を以下から収集します:
/Applications~/Applications/Library/Receipts/InstallHistory.plistquarantines セクション検疫とは、ユーザーがインターネットからダウンロードしたファイルを開こうとしたときに、「本当にこれを実行しますか?」と表示するために必要な情報です。詳細については、Apple Support の検疫に関する説明を参照してください: http://support.apple.com/kb/HT3662
このセクションでは、検疫ファイルに対する XProtect のハッシュベースのマルウェアチェックからの情報も収集します。plist の場所:
/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/XProtect.plist
XProtect はインターネットプラグインの最小バージョンも追加します。その plist の場所:
/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/XProtect.meta.plist
downloads セクションすべてのユーザーのダウンロードファイルのハッシュを以下から取得します:
~/Downloads~/Library/Mail Downloads~/Library/Containers/com.apple.mail/Data/Library/Mail Downloadschrome セクションGoogle Chrome ウェブブラウザから以下の情報を収集します:
このデータは ~/Library/Application Support/Google/Chrome/Default から抽出されます。
firefox セクションFirefox プロファイル内のさまざまな SQLite データベースから情報を収集します:
この情報は ~/Library/Application Support/Firefox/Profiles から抽出されます。
Firefox プロファイルフォルダの詳細については、以下を参照してください: http://kb.mozillazine.org/Profile_folder_-_Firefox
safari セクションSafari プロファイル内のさまざまな plist および SQLite データベースから情報を収集します:
accounts セクションユーザーアカウントに関する情報を収集します:
/private/var/db/dslocal/nodes/Default/groups/admin.plist/private/var/db/dslocal/nodes/Default/users~/Library/Accounts/Accounts3.sqlite~/Library/Preferences/com.apple.recentitems.plistmail セクションメールアプリのディレクトリ内のファイルのハッシュを取得します:
~/Library/Mail~/Library/Mail Downloadsfull_hash セクションディスク上のすべてのファイルのハッシュを取得します。すべてのファイルです。これはデフォルトでは実行されません。次のようにトリガーする必要があります:
$ sudo osxcollector.py -s full_hash
フォレンジック分析は、芸術と科学の両方の側面があります。OSXCollector の出力を読むとき、アナリストごとに少し異なるストーリーが見えます。それが分析を楽しくする要素の一つです。
通常、収集は何かが怪しいためにターゲットマシンで実行されます。アンチウイルスが好ましくないファイルを発見した、ディープパケットインスペクションがコールアウトを観測した、エンドポイントモニタリングが新しい起動項目を検出した、などです。この最初のアラートの詳細(ファイルパス、タイムスタンプ、ハッシュ、ドメイン、IP など)があれば、調査を開始するのに十分です。
単にタイムスタンプの前後数分を grep するだけで十分です:
$ cat INCIDENT32.json | grep '2014-01-01 11:3[2-8]'
履歴はそこに含まれています。jq のようなツールを使うと、高度な出力に非常に役立ちます:
$ cat INCIDENT32.json | grep '2014-01-01 11:3[2-8]' | jq 'select(has("url"))|.url'
$ cat INCIDENT32.json | jq 'select(.osxcollector_username=="ivanlei")|.'
OSXCollector Output Filters プロジェクト には、OSXCollector の出力を処理および変換するフィルタが含まれています。フィルタの目的は、OSXCollector の出力分析を容易にすることです。
OSXCollector の機能は単一のファイル osxcollector.py に格納されています。コレクタは、追加のパッケージや依存関係なしに、OS X の素のインストール上で動作する必要があります。
ソースコードを編集する前に、すべての OSXCollector テストが合格することを確認してください。テストは make test で実行できます。
ソースコードに変更を加えた後、再び make test を実行して、変更によってテストが壊れていないことを確認してください。
この作品は GNU General Public License の下でライセンスされており、https://github.com/jipegit/OSXAuditor の派生作品です。
OS X フォレンジックについてもっと学びたいですか?
その他の興味深いツール:
kextstartup
launch_agentsscripting_additionsstartup_itemslogin_itemsapplications
applicationsinstall_historyquarantinesdownloads
downloadsemail_downloadsold_email_downloadschrome
historyarchived_historycookieslogin_datatop_sitesweb_datadatabaseslocal_storagepreferencesfirefox
cookiesdownloadsformhistoryhistorysignonspermissionsaddonsextensioncontent_prefshealth_reportwebapps_storejson_filessafari
downloadshistoryextensionsdatabaseslocalstorageextension_filesaccounts
system_adminssystem_userssocial_accountsrecent_itemsmailfull_hash$ sudo osxcollector.py -s 'startup' -s 'downloads'
-c/--collect-cookies:
クッキーの値を収集します。デフォルトでは、OSXCollector はクッキーの値をダンプしません。これは機密情報(例:セッション ID)を含む可能性があるためです。
-l/--collect-local-storage:
Web ブラウザのローカルストレージに保存された値を収集します。デフォルトでは、OSXCollector は値をダンプしません。機密情報を含む可能性があるためです。
-d/--debug:
詳細出力と Python ブレークポイントを有効にします。OSXCollector に問題がある場合は、これを試してください。
$ sudo osxcollector.py -d