
Un toolkit per la raccolta e l'analisi di prove forensi per OS X

OSXCollector è un toolkit di raccolta e analisi di prove forensi per OSX.
Lo script di raccolta viene eseguito su una macchina potenzialmente infetta e produce un file JSON che descrive la macchina bersaglio. OSXCollector raccoglie informazioni da plist, database SQLite e dal filesystem locale.
Grazie alla raccolta forense, un analista può rispondere a domande come:
Yelp automatizza l'analisi della maggior parte delle esecuzioni di OSXCollector, convertendo il suo output in un riepilogo facilmente leggibile e utilizzabile di solo le cose sospette. Dai un'occhiata al progetto OSXCollector Output Filters per sapere come sfruttare al meglio l'analisi automatizzata dell'output di OSXCollector.
osxcollector.py è un singolo file Python che funziona senza dipendenze su una normale macchina OSX. Questo rende molto semplice eseguire la raccolta su qualsiasi macchina - niente seccature con brew, pip, file di configurazione o variabili d'ambiente. Basta copiare il singolo file sulla macchina ed eseguirlo:
sudo osxcollector.py è tutto ciò che serve.
$ sudo osxcollector.py
Wrote 35394 lines.
Output in osxcollect-2014_12_21-08_49_39.tar.gz
Se hai appena clonato il repository GitHub, osxcollector.py si trova all'interno della directory osxcollector/, quindi devi eseguirlo come:
$ sudo osxcollector/osxcollector.py
IMPORTANTE: assicurati che il comando python sulla tua macchina Mac OS X utilizzi l'interprete Python predefinito fornito con il sistema e non sia stato sovrascritto, ad esempio dalla versione di Python installata tramite brew. OSXCollector si basa su un paio di binding Python nativi per le librerie OS X, che potrebbero non essere disponibili in versioni di Python diverse da quella installata originariamente sul sistema.
In alternativa, puoi eseguire osxcollector.py specificando esplicitamente la versione di Python che desideri utilizzare:
$ sudo /usr/bin/python2.7 osxcollector/osxcollector.py
L'output JSON del collettore, insieme ad alcuni file utili come i log di sistema, è stato impacchettato in un archivio .tar.gz per essere consegnato a un analista.
osxcollector.py ha anche molte opzioni utili per modificare il funzionamento della raccolta:
-i INCIDENT_PREFIX/--id=INCIDENT_PREFIX:
Imposta un identificatore utilizzato come prefisso del file di output. Il valore predefinito è osxcollect.
$ sudo osxcollector.py -i IncontinentSealord
Wrote 35394 lines.
Output in IncontinentSealord-2014_12_21-08_49_39.tar.gz
Sii creativo con i nomi degli incidenti, rende più facile ridere attraverso il dolore.
-p ROOTPATH/--path=ROOTPATH:
Imposta il percorso della radice del filesystem su cui eseguire la raccolta. Il valore predefinito è /. È ottimo per eseguire la raccolta sull'immagine di un disco.
$ sudo osxcollector.py -p '/mnt/pwned'
-s SECTION/--section=SECTION:
Esegue solo una parte della raccolta completa. Può essere specificato più di una volta. L'elenco completo delle sezioni e sottosezioni è:
versionIl collettore produce un .tar.gz contenente tutti gli artefatti raccolti. L'archivio contiene un file JSON con la maggior parte delle informazioni. Inoltre, sono inclusi una serie di log utili dal sistema bersaglio.
Ogni riga del file JSON registra 1 informazione. Ci sono alcune chiavi comuni che appaiono in ogni record JSON:
osxcollector_incident_id: Un ID univoco condiviso da ogni record.osxcollector_section: La sezione o tipo di dati che questo record contiene.osxcollector_subsection: La sottosezione o descrittore più dettagliato del tipo di dati che questo record contiene.Per i record che rappresentano file ci sono alcune chiavi utili:
atime: L'ora di accesso al file.ctime: L'ora di creazione del file.mtime: L'ora di modifica del file.file_path: Il percorso assoluto del file.md5: Hash MD5 del contenuto del file.sha1: Hash SHA1 del contenuto del file.sha2: Hash SHA2 del contenuto del file.Per i record che rappresentano file scaricati:
xattr-wherefrom: Una lista contenente gli URL di origine e di riferimento per il file scaricato.xattr-quarantines: Una stringa che descrive quale applicazione ha scaricato il file.Per i record che rappresentano una riga di un database SQLite:
osxcollector_table_name: Il nome della tabella da cui proviene la riga.osxcollector_db_path: Il percorso assoluto del file SQLite.Per i record che rappresentano dati associati a un utente specifico:
osxcollector_username: Il nome dell'utenteOSXCollector tenta di convertire i timestamp in stringhe di data/ora leggibili dall'uomo nel formato YYYY-mm-dd hh:MM:ss. Utilizza euristiche per identificare automaticamente vari timestamp:
versionLa versione corrente di OSXCollector.
system_infoRaccoglie informazioni di base sul sistema:
kextRaccoglie le estensioni del kernel da:
/System/Library/Extensions/Library/ExtensionsstartupRaccoglie informazioni sui LaunchAgents, LaunchDaemons, ScriptingAdditions, StartupItems e altri elementi di login da:
/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.plistMaggiori informazioni sull'avvio di Mac OS X si trovano qui: http://www.malicious-streams.com/article/Mac_OSX_Startup.pdf
applicationsCalcola gli hash delle applicazioni installate e raccoglie la cronologia delle installazioni da:
/Applications~/Applications/Library/Receipts/InstallHistory.plistquarantinesLe quarantene sono sostanzialmente le informazioni necessarie per mostrare 'Sei sicuro di voler eseguire questo?' quando un utente tenta di aprire un file scaricato da Internet. Per ulteriori dettagli, consulta la spiegazione del Supporto Apple sulle quarantene: http://support.apple.com/kb/HT3662
Questa sezione raccoglie anche informazioni dal controllo malware basato su hash di XProtect
per i file in quarantena. Il plist si trova in:
/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/XProtect.plist
XProtect aggiunge anche versioni minime per i Plugin Internet. Quel plist si trova in:
/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/XProtect.meta.plist
downloadsCalcola l'hash dei file scaricati di tutti gli utenti da:
~/Downloads~/Library/Mail Downloads~/Library/Containers/com.apple.mail/Data/Library/Mail DownloadschromeRaccoglie le seguenti informazioni dal browser web Google Chrome:
Questi dati vengono estratti da ~/Library/Application Support/Google/Chrome/Default
firefoxRaccoglie informazioni dai diversi database SQLite in un profilo Firefox:
Queste informazioni vengono estratte da ~/Library/Application Support/Firefox/Profiles
Per maggiori dettagli sulla cartella del profilo Firefox, vedi http://kb.mozillazine.org/Profile_folder_-_Firefox
safariRaccoglie informazioni dai diversi plist e database SQLite in un profilo Safari:
accountsRaccoglie informazioni sugli account utente:
/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.plistmailCalcola l'hash dei file nelle directory dell'app Mail:
~/Library/Mail~/Library/Mail Downloadsfull_hashCalcola l'hash di tutti i file sul disco. Tutti quanti. Non viene eseguita per impostazione predefinita. Deve essere attivata con:
$ sudo osxcollector.py -s full_hash
L'analisi forense è un po' arte e un po' scienza. Ogni analista vedrà una storia leggermente diversa leggendo l'output di OSXCollector. Questo è ciò che rende l'analisi divertente.
Generalmente, la raccolta viene eseguita su una macchina bersaglio perché qualcosa è sospetto: l'antivirus ha trovato un file che non gli piace, l'ispezione approfondita dei pacchetti ha osservato una chiamata esterna, il monitoraggio degli endpoint ha notato un nuovo elemento di avvio. I dettagli di questo avviso iniziale - un percorso file, un timestamp, un hash, un dominio, un IP, ecc. - sono sufficienti per iniziare.
Semplicemente cercare con grep qualche minuto prima e dopo un timestamp funziona bene:
$ cat INCIDENT32.json | grep '2014-01-01 11:3[2-8]'
È lì dentro. Uno strumento come jq può essere molto utile per ottenere output elaborati:
$ cat INCIDENT32.json | grep '2014-01-01 11:3[2-8]' | jq 'select(has("url"))|.url'
$ cat INCIDENT32.json | jq 'select(.osxcollector_username=="ivanlei")|.'
Il progetto OSXCollector Output Filters contiene filtri che elaborano e trasformano l'output di OSXCollector. L'obiettivo dei filtri è rendere semplice l'analisi dell'output di OSXCollector.
La funzionalità di OSXCollector è memorizzata in un singolo file: osxcollector.py. Il collettore dovrebbe funzionare su un'installazione pulita di OS X senza pacchetti o dipendenze aggiuntive.
Assicurati che tutti i test di OSXCollector siano superati prima di modificare il codice sorgente. Puoi eseguire i test usando: make test
Dopo aver apportato modifiche al codice sorgente, esegui make test di nuovo per verificare che le tue modifiche non abbiano rotto alcun test.
Questo lavoro è concesso in licenza sotto la GNU General Public License ed è una derivazione di https://github.com/jipegit/OSXAuditor
Vuoi saperne di più sulla forense di OS X?
Un paio di altri strumenti interessanti:
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:
Raccogli il valore dei cookie.
Per impostazione predefinita, OSXCollector non scarica il valore di un cookie, poiché potrebbe contenere informazioni sensibili (es. ID di sessione).
-l/--collect-local-storage:
Raccogli i valori memorizzati nell'archiviazione locale dei browser web.
Per impostazione predefinita, OSXCollector non scarica i valori poiché potrebbero contenere informazioni sensibili.
-d/--debug:
Abilita output verboso e breakpoint Python. Se qualcosa non va con OSXCollector, prova questo.
$ sudo osxcollector.py -d