
Модульный набор инструментов для реагирования на инциденты, предназначенный для сбора криминалистических данных с потенциально зараженных конечных точек macOS, включая артефакты браузеров, механизмы сохранения, процессы и сетевые конфигурации.
Этот набор скриптов предназначен для сбора различных данных с конечной точки, предположительно заражённой, для облегчения процесса реагирования на инциденты. Эти данные не следует считать полным судебным сбором данных, но они фиксируют множество полезной криминалистической информации.
Если вам нужны настоящие судебные данные, вам следует захватить полный дамп памяти и создать образ всего диска. Это выходит за рамки данного набора инструментов.
Скрипт должен запускаться на живой системе, а не на образе или другом хранилище судебных данных. Он не требует строгих прав root для запуска, но без них не сможет собрать большую часть предполагаемых данных.
Данные будут собираться в двух формах. Первая — в виде сводных файлов, содержащих вывод команд оболочки, данные, извлечённые из баз данных и т.п. Например, модуль browser выведет файл browser_extensions.txt с краткой информацией обо всех расширениях браузера, установленных для Safari, Chrome и Firefox.
Вторая — это полные файлы, собранные из файловой системы. Они сохраняются в подпапке artifacts внутри папки сбора.
Скрипт очень прост в запуске. Он принимает только один обязательный параметр — путь к конфигурационному скрипту в формате JSON:
./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-имя_компьютера-ГГГГ-ММ-ДД, где имя компьютера — это имя машины, указанное в Системных настройках > Общий доступ, а дата — дата сбора данных.
Если true, собирает данные со всех пользователей машины, когда это возможно. Если false, собирает данные только для пользователя, запустившего скрипт. Если не указано, значение по умолчанию — true.
PICT модульный, и его легко расширить или сократить, просто изменив используемые модули Collector.
Данные collectors представляют собой словарь, где ключ — это имя загружаемого модуля (имя Python-файла без расширения .py), а значение — имя подкласса Collector, найденного в этом модуле. Вы можете добавить дополнительные записи для пользовательских модулей (см. Написание собственных модулей) или удалить записи, чтобы предотвратить выполнение этих модулей. Простой способ удалить модули, не запоминая точные имена на случай, если потом захотите их добавить, — переместить их в словарь верхнего уровня с именем unused.
Этот словарь содержит глобальные настройки.
keepLSData указывает, следует ли сохранять файл lsregister.txt — он может быть довольно большим. (Этот файл создается автоматически и используется некоторыми другими модулями для построения вывода. Он содержит множество полезной информации, но может иметь размер более 100 МБ. Если вам не нужны все эти данные или вы не хотите иметь дело с таким объемом, установите значение false, и файл будет удален после завершения сбора.)
zipIt указывает, следует ли автоматически создавать zip-файл с содержимым папки сбора. Обратите внимание, что процесс упаковки и распаковки данных изменяет некоторые атрибуты, такие как права собственности на файлы.
Этот словарь задает настройки для конкретных модулей. Не все модули имеют собственные настройки, но если модуль допускает их, вы можете указать их здесь. В приведенном выше примере вы можете видеть логическую настройку с именем collectArtifacts, используемую с модулем browser.
Существуют также глобальные настройки модулей, поддерживаемые классом Collector, которые можно задавать индивидуально для каждого модуля.
collectArtifacts указывает, следует ли собирать файловые артефакты, которые модуль обычно собирает. Если false, все артефакты для этого модуля будут пропущены. Это может потребоваться, когда учитывается объем дискового пространства и собранные артефакты велики, или когда собранные артефакты могут представлять проблему конфиденциальности для пользователя, чья система анализируется.
Модули должны состоять из файла, содержащего класс, являющийся подклассом Collector (определен в collectors/collector.py), и должны быть помещены в папку collectors. Новый модуль Collector можно легко создать, скопировав файл collectors/template.py и настроив его под свои нужды.
def __init__(self, collectionPath, allUsers)Этот метод можно переопределить при необходимости, но в таком случае обязательно вызвать super Collector.init(), желательно до выполнения вашего пользовательского кода. Это дает объекту возможность настроить свои свойства до того, как ваш код попытается их использовать.
def printStartInfo(self)Это очень простой метод, который будет вызван при начале сбора данным модулем. Его цель — вывести сообщение в stdout, чтобы дать пользователю ощущение прогресса, предоставляя обратную связь о происходящем.
def applySettings(self, settingsDict)Это дает модулю возможность применить любые пользовательские настройки. Каждый модуль может иметь свои собственные настройки, но settingsDict также должен быть передан родительскому классу, чтобы класс Collection мог обработать любые настройки, которые он определяет.
def collect(self)Этот метод является ядром модуля. Он вызывается, когда наступает время для модуля начать сбор. Он может записывать столько файлов, сколько необходимо, но должен ограничивать эту деятельность файлами в пределах пути self.collectionPath и использовать имена файлов, которые не заняты другими модулями.
Если вы хотите собирать артефакты, не пытайтесь делать это самостоятельно. Просто добавьте пути в массив self.pathsToCollect, и класс Collector позаботится о копировании их в соответствующие подпути в папку artifacts, а также о сохранении метаданных (права доступа, расширенные атрибуты, флаги и т.д.) на артефактах.
Когда метод завершится, обязательно вызовите родительский (Collector.collect(self)), чтобы дать классу Collector возможность выполнить свои обязанности, такие как сбор артефактов.
Ваш метод collect может использовать любые данные, собранные в файлах basic_info.txt или lsregister.txt, находящихся в self.collectionPath. Они собираются в начале скриптом pict.py, и можно предположить, что они доступны для использования любыми другими модулями. Однако не следует полагаться на вывод других модулей, так как нет гарантии, что файлы будут доступны, когда ваш модуль запустится. Модули могут выполняться не в том порядке, в котором они указаны в вашем JSON-файле конфигурации, поскольку словари Python неупорядочены.
Спасибо Грегу Ниглу (Greg Neagle) за FoundationPlist.py, который решил множество проблем с чтением двоичных plist-файлов, plist-файлов, содержащих типы данных даты и т.д.