
Инструментарий для сбора и анализа криминалистических доказательств для OS X

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
ВАЖНО: убедитесь, что команда python на вашем Mac OS X использует стандартный интерпретатор Python, поставляемый с системой, и не переопределена, например, версией Python, установленной через brew. OSXCollector опирается на несколько нативных привязок Python к библиотекам OS X, которые могут быть недоступны в других версиях Python, кроме той, что была установлена изначально в системе.
В качестве альтернативы вы можете запустить osxcollector.py, явно указав нужную версию Python:
$ 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:
Запускает только часть полного сбора. Может быть указано несколько раз. Полный список разделов и подразделов:
versionСборщик создаёт архив .tar.gz, содержащий все собранные артефакты. В архиве находится JSON-файл с основной информацией. Кроме того, в него включается набор полезных журналов из целевой системы.
Каждая строка JSON-файла содержит 1 единицу информации. Существуют общие ключи, присутствующие в каждой JSON-записи:
osxcollector_incident_id: Уникальный идентификатор, общий для всех записей.osxcollector_section: Раздел или тип данных, которые содержит эта запись.osxcollector_subsection: Подраздел или более детальное описание типа данных, которые содержит эта запись.Для записей, представляющих файлы, имеется несколько полезных ключей:
atime: Время последнего доступа к файлу.ctime: Время создания файла.mtime: Время последнего изменения файла.file_path: Абсолютный путь к файлу.md5: MD5-хэш содержимого файла.sha1: SHA1-хэш содержимого файла.sha2: SHA2-хэш содержимого файла.Для записей, представляющих загруженные файлы:
xattr-wherefrom: Список, содержащий 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Карантины — это, по сути, информация, необходимая для отображения сообщения «Вы уверены, что хотите запустить это?», когда пользователь пытается открыть файл, загруженный из Интернета. Более подробно можно узнать из объяснения 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Собирает информацию из различных баз данных SQLite в профиле Firefox:
Эта информация извлекается из ~/Library/Application Support/Firefox/Profiles
Более подробно о папке профиля Firefox см. http://kb.mozillazine.org/Profile_folder_-_Firefox
safariСобирает информацию из различных plist-файлов и баз данных SQLite в профиле Safari:
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?
Несколько других интересных инструментов:
system_infokextstartup
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, так как оно может содержать конфиденциальную информацию (например, идентификатор сессии).
-l/--collect-local-storage:
Собирает значения, хранящиеся в локальном хранилище веб-браузеров.
По умолчанию OSXCollector не выгружает эти значения, так как они могут содержать конфиденциальную информацию.
-d/--debug:
Включает подробный вывод и точки останова Python. Если с OSXCollector что-то не так, попробуйте эту опцию.
$ sudo osxcollector.py -d