
Um kit de ferramentas forense para coleta e análise de evidências para OS X

O OSXCollector é um kit de ferramentas forenses de coleta e análise de evidências para OSX.
O script de coleta é executado em uma máquina potencialmente infectada e gera um arquivo JSON que descreve a máquina alvo. O OSXCollector coleta informações de plists, bancos de dados SQLite e do sistema de arquivos local.
Munido da coleta forense, um analista pode responder perguntas como:
O Yelp automatiza a análise da maioria das execuções do OSXCollector, convertendo sua saída em um resumo legível e acionável de apenas os itens suspeitos. Confira o projeto Filtros de Saída do OSXCollector para aprender como aproveitar ao máximo a análise automatizada da saída do OSXCollector.
osxcollector.py é um único arquivo Python que é executado sem dependências em uma máquina OSX padrão. Isso torna muito fácil executar a coleta em qualquer máquina – sem complicações com brew, pip, arquivos de configuração ou variáveis de ambiente. Basta copiar o único arquivo para a máquina e executá-lo:
sudo osxcollector.py é tudo o que é preciso.
$ sudo osxcollector.py
Wrote 35394 lines.
Output in osxcollect-2014_12_21-08_49_39.tar.gz
Se você acabou de clonar o repositório GitHub, osxcollector.py está dentro do diretório osxcollector/, então você precisa executá-lo como:
$ sudo osxcollector/osxcollector.py
IMPORTANTE: certifique-se de que o comando python na sua máquina Mac OS X use o interpretador Python padrão fornecido com o sistema e não seja substituído, por exemplo, pela versão do Python instalada através do brew. O OSXCollector depende de algumas ligações nativas do Python para bibliotecas do OS X, que podem não estar disponíveis em outras versões do Python que não a originalmente instalada no seu sistema.
Alternativamente, você pode executar osxcollector.py especificando explicitamente a versão do Python que você deseja usar:
$ sudo /usr/bin/python2.7 osxcollector/osxcollector.py
A saída JSON do coletor, junto com alguns arquivos úteis como logs do sistema, foi compactada em um .tar.gz para entrega a um analista.
osxcollector.py também tem muitas opções úteis para alterar como a coleta funciona:
-i INCIDENT_PREFIX/--id=INCIDENT_PREFIX:
Define um identificador que é usado como prefixo do arquivo de saída. O valor padrão é osxcollect.
$ sudo osxcollector.py -i IncontinentSealord
Wrote 35394 lines.
Output in IncontinentSealord-2014_12_21-08_49_39.tar.gz
Seja criativo com os nomes de incidente, isso torna mais fácil rir da dor.
-p ROOTPATH/--path=ROOTPATH:
Define o caminho para a raiz do sistema de arquivos no qual executar a coleta. O valor padrão é /. Isso é ótimo para executar a coleta na imagem de um disco.
$ sudo osxcollector.py -p '/mnt/powned'
-s SECTION/--section=SECTION:
Executa apenas uma parte da coleta completa. Pode ser especificado mais de uma vez. A lista completa de seções e subseções é:
versionO coletor gera um .tar.gz contendo todos os artefatos coletados. O arquivo contém um arquivo JSON com a maioria das informações. Além disso, um conjunto de logs úteis dos logs do sistema alvo é incluído.
Cada linha do arquivo JSON registra 1 informação. Existem algumas chaves comuns que aparecem em todos os registros JSON:
osxcollector_incident_id: Um ID único compartilhado por todos os registros.osxcollector_section: A seção ou tipo de dado que este registro contém.osxcollector_subsection: A subseção ou descritor mais detalhado do tipo de dado que este registro contém.Para registros que representam arquivos, há várias chaves úteis:
atime: O tempo de acesso ao arquivo.ctime: O tempo de criação do arquivo.mtime: O tempo de modificação do arquivo.file_path: O caminho absoluto para o arquivo.md5: Hash MD5 do conteúdo do arquivo.sha1: Hash SHA1 do conteúdo do arquivo.sha2: Hash SHA2 do conteúdo do arquivo.Para registros que representam arquivos baixados:
xattr-wherefrom: Uma lista contendo as URLs de origem e de referência para o arquivo baixado.xattr-quarantines: Uma string descrevendo qual aplicativo baixou o arquivo.Para registros que representam uma linha de um banco de dados SQLite:
osxcollector_table_name: O nome da tabela de onde a linha vem.osxcollector_db_path: O caminho absoluto para o arquivo SQLite.Para registros que representam dados associados a um usuário específico:
osxcollector_username: O nome do usuárioO OSXCollector tenta converter carimbos de data/hora em strings de data/hora legíveis por humanos no formato YYYY-mm-dd hh:MM:ss. Ele usa heurísticas para identificar automaticamente vários carimbos:
versionA versão atual do OSXCollector.
system_infoColeta informações básicas sobre o sistema:
kextColeta as extensões do kernel de:
/System/Library/Extensions/Library/ExtensionsstartupColeta informações sobre os LaunchAgents, LaunchDaemons, ScriptingAdditions, StartupItems e outros itens de login de:
/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.plistMais informações sobre a inicialização do Mac OS X podem ser encontradas aqui: http://www.malicious-streams.com/article/Mac_OSX_Startup.pdf
applicationsCalcula hash de aplicativos instalados e coleta o histórico de instalação de:
/Applications~/Applications/Library/Receipts/InstallHistory.plistquarantinesQuarentenas são basicamente as informações necessárias para mostrar o 'Tem certeza de que deseja executar isso?' quando um usuário tenta abrir um arquivo baixado da Internet. Para mais detalhes, consulte a explicação do Suporte Apple sobre Quarentenas: http://support.apple.com/kb/HT3662
Esta seção também coleta informações da verificação de malware baseada em hash XProtect para arquivos em quarentena. O plist está em:
/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/XProtect.plist
O XProtect também adiciona versões mínimas para Plugins de Internet. Esse plist está em:
/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/XProtect.meta.plist
downloadsCalcula hash de todos os arquivos baixados pelos usuários de:
~/Downloads~/Library/Mail Downloads~/Library/Containers/com.apple.mail/Data/Library/Mail DownloadschromeColeta as seguintes informações do navegador Google Chrome:
Estes dados são extraídos de ~/Library/Application Support/Google/Chrome/Default
firefoxColeta informações dos diferentes bancos de dados SQLite em um perfil do Firefox:
Estas informações são extraídas de ~/Library/Application Support/Firefox/Profiles
Para mais detalhes sobre a pasta de perfil do Firefox, veja http://kb.mozillazine.org/Profile_folder_-_Firefox
safariColeta informações dos diferentes plists e bancos de dados SQLite em um perfil do Safari:
accountsColeta informações sobre contas de usuários:
/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.plistmailCalcula hash de arquivos nos diretórios do aplicativo de e-mail:
~/Library/Mail~/Library/Mail Downloadsfull_hashCalcula hash de todos os arquivos no disco. Todos eles. Isso não é executado por padrão. Deve ser acionado com:
$ sudo osxcollector.py -s full_hash
A análise forense é um pouco de arte e um pouco de ciência. Cada analista verá uma história um pouco diferente ao ler a saída do OSXCollector. Isso é parte do que torna a análise divertida.
Geralmente, a coleta é realizada em uma máquina alvo porque algo está estranho: o antivírus encontrou um arquivo que não gosta, a inspeção profunda de pacotes observou uma chamada externa, o monitoramento de endpoint notou um novo item de inicialização. Os detalhes desse alerta inicial - um caminho de arquivo, um carimbo de data/hora, um hash, um domínio, um IP, etc. - são suficientes para começar.
Simplesmente usar grep alguns minutos antes e depois de um carimbo de data/hora funciona muito bem:
$ cat INCIDENT32.json | grep '2014-01-01 11:3[2-8]'
Está lá. Uma ferramenta como o jq pode ser muito útil para fazer uma saída mais elaborada:
$ cat INCIDENT32.json | grep '2014-01-01 11:3[2-8]' | jq 'select(has("url"))|.url'
$ cat INCIDENT32.json | jq 'select(.osxcollector_username=="ivanlei")|.'
O projeto Filtros de Saída do OSXCollector contém filtros que processam e transformam a saída do OSXCollector. O objetivo dos filtros é facilitar a análise da saída do OSXCollector.
A funcionalidade do OSXCollector está armazenada em um único arquivo: osxcollector.py. O coletor deve ser executado em uma instalação limpa do OS X sem pacotes ou dependências adicionais.
Certifique-se de que todos os testes do OSXCollector passem antes de editar o código fonte. Você pode executar os testes usando: make test
Após fazer alterações no código fonte, execute make test novamente para verificar se suas alterações não quebraram nenhum dos testes.
Este trabalho é licenciado sob a GNU General Public License e é uma derivação de https://github.com/jipegit/OSXAuditor
Quer aprender mais sobre forense em OS X?
Mais algumas ferramentas interessantes:
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:
Coleta o valor dos cookies. Por padrão, o OSXCollector não despeja o valor de um cookie, pois pode conter informações sensíveis (ex.: id de sessão).
-l/--collect-local-storage:
Coleta os valores armazenados no armazenamento local dos navegadores web. Por padrão, o OSXCollector não despeja os valores, pois podem conter informações sensíveis.
-d/--debug:
Ativa a saída detalhada e pontos de parada do Python. Se algo estiver errado com o OSXCollector, tente isso.
$ sudo osxcollector.py -d