
OSXCollector 是一个面向 OS X 的取证证据收集与分析工具包。
收集脚本在可能受感染的机器上运行,并输出描述目标机器的 JSON 文件。OSXCollector 从 plist、SQLite 数据库和本地文件系统中收集信息。
借助取证收集的结果,分析师可以回答此类问题:
Yelp 对大多数 OSXCollector 运行结果进行自动化分析,将其输出转换为易读且可操作的摘要,仅聚焦于可疑内容。请查看 OSXCollector Output Filters 项目,了解如何充分利用 OSXCollector 输出的自动化分析。
osxcollector.py 是一个独立的 Python 文件,在标准 OS X 机器上无需任何依赖即可运行。这使得在任何机器上运行收集都非常简单——无需纠结 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:
仅运行完整收集的某一部分。可以多次指定。完整的 sections(板块)和 subsections(子板块)列表如下:
versionsystem_info收集器输出一个包含所有收集到的工件(artifacts)的 .tar.gz 文件。该归档文件中包含一个 JSON 文件,存有大部分信息。此外,还包含了目标系统日志中的一组有用日志。
JSON 文件的每一行记录一条“信息”。每条 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.plist更多关于 Mac OS X 启动机制的信息可参考: http://www.malicious-streams.com/article/Mac_OSX_Startup.pdf
applications 板块对已安装的应用程序进行哈希,并从以下位置收集安装历史:
/Applications~/Applications/Library/Receipts/InstallHistory.plistquarantines 板块隔离区(Quarantines)基本上包含了当用户尝试打开从互联网下载的文件时显示“你确定要运行这个吗?”所需要的信息。更多细节请参考 Apple 支持对隔离区的解释: 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 通用公共许可证授权,是 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:
收集 cookie 的值。默认情况下,OSXCollector 不会导出 cookie 的值,因为其中可能包含敏感信息(如会话 ID)。
-l/--collect-local-storage:
收集 web 浏览器本地存储中的值。默认情况下,OSXCollector 不会导出这些值,因为它们可能包含敏感信息。
-d/--debug:
启用详细输出和 Python 断点。如果 OSXCollector 出现问题,可以尝试此选项。
$ sudo osxcollector.py -d