
Un kit d'outils de collecte et d'analyse de preuves forensiques pour OS X

OSXCollector est une boîte à outils de collecte et d'analyse de preuves numériques pour OSX.
Le script de collecte s'exécute sur une machine potentiellement infectée et génère un fichier JSON qui décrit la machine cible. OSXCollector rassemble des informations à partir de plists, de bases de données SQLite et du système de fichiers local.
Armé de la collecte de preuves, un analyste peut répondre à des questions comme :
Yelp automatise l'analyse de la plupart des exécutions d'OSXCollector en convertissant sa sortie en un résumé facilement lisible et exploitable de seulement les éléments suspects. Découvrez le projet OSXCollector Output Filters pour apprendre à tirer le meilleur parti de l'analyse automatisée de la sortie d'OSXCollector.
osxcollector.py est un fichier Python unique qui s'exécute sans aucune dépendance sur une machine OSX standard. Cela rend très facile l'exécution de la collecte sur n'importe quelle machine - pas besoin de se soucier de brew, pip, fichiers de configuration ou variables d'environnement. Copiez simplement le fichier unique sur la machine et exécutez-le :
sudo osxcollector.py est tout ce qu'il faut.
$ sudo osxcollector.py
Wrote 35394 lines.
Output in osxcollect-2014_12_21-08_49_39.tar.gz
Si vous venez de cloner le dépôt GitHub, osxcollector.py se trouve dans le répertoire osxcollector/, vous devez donc l'exécuter comme suit :
$ sudo osxcollector/osxcollector.py
IMPORTANT : assurez-vous que la commande python sur votre machine Mac OS X utilise l'interpréteur Python par défaut fourni avec le système et qu'il n'est pas outrepassé, par exemple par la version Python installée via brew. OSXCollector repose sur quelques liaisons Python natives pour les bibliothèques OS X, qui pourraient ne pas être disponibles dans d'autres versions de Python que celle installée à l'origine sur votre système.
Alternativement, vous pouvez exécuter osxcollector.py en spécifiant explicitement la version de Python que vous souhaitez utiliser :
$ sudo /usr/bin/python2.7 osxcollector/osxcollector.py
La sortie JSON du collecteur, ainsi que quelques fichiers utiles comme les journaux système, a été regroupée dans un fichier .tar.gz pour être remise à un analyste.
osxcollector.py possède également de nombreuses options utiles pour modifier le fonctionnement de la collecte :
-i INCIDENT_PREFIX/--id=INCIDENT_PREFIX :
Définit un identifiant utilisé comme préfixe du fichier de sortie. La valeur par défaut est osxcollect.
$ sudo osxcollector.py -i IncontinentSealord
Wrote 35394 lines.
Output in IncontinentSealord-2014_12_21-08_49_39.tar.gz
Soyez créatif avec les noms d'incidents, cela permet de rire à travers la douleur.
-p ROOTPATH/--path=ROOTPATH :
Définit le chemin vers la racine du système de fichiers sur lequel exécuter la collecte. La valeur par défaut est /. C'est idéal pour exécuter la collecte sur l'image d'un disque.
$ sudo osxcollector.py -p '/mnt/powned'
-s SECTION/--section=SECTION :
Exécute uniquement une partie de la collecte complète. Peut être spécifié plusieurs fois. La liste complète des sections et sous-sections est :
versionsystem_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 :
Collecte la valeur des cookies. Par défaut, OSXCollector ne vide pas la valeur d'un cookie, car elle peut contenir des informations sensibles (par exemple l'identifiant de session).
-l/--collect-local-storage :
Collecte les valeurs stockées dans le stockage local des navigateurs web. Par défaut, OSXCollector ne vide pas les valeurs car elles peuvent contenir des informations sensibles.
-d/--debug :
Active la sortie détaillée et les points d'arrêt Python. Si quelque chose ne va pas avec OSXCollector, essayez ceci.
$ sudo osxcollector.py -d
Le collecteur produit un fichier .tar.gz contenant tous les artefacts collectés. L'archive contient un fichier JSON avec la majorité des informations. De plus, un ensemble de journaux utiles provenant des journaux du système cible est inclus.
Chaque ligne du fichier JSON enregistre 1 élément d'information. Il existe quelques clés communes qui apparaissent dans chaque enregistrement JSON :
osxcollector_incident_id : Un identifiant unique partagé par chaque enregistrement.osxcollector_section : La section ou le type de données que cet enregistrement contient.osxcollector_subsection : La sous-section ou le descripteur plus détaillé du type de données que cet enregistrement contient.Pour les enregistrements représentant des fichiers, il y a plusieurs clés utiles :
atime : L'heure d'accès au fichier.ctime : L'heure de création du fichier.mtime : L'heure de modification du fichier.file_path : Le chemin absolu vers le fichier.md5 : Le hachage MD5 du contenu du fichier.sha1 : Le hachage SHA1 du contenu du fichier.sha2 : Le hachage SHA2 du contenu du fichier.Pour les enregistrements représentant des fichiers téléchargés :
xattr-wherefrom : Une liste contenant les URL source et de référence pour le fichier téléchargé.xattr-quarantines : Une chaîne décrivant quelle application a téléchargé le fichier.Pour les enregistrements représentant une ligne d'une base de données SQLite :
osxcollector_table_name : Le nom de la table d'où provient la ligne.osxcollector_db_path : Le chemin absolu vers le fichier SQLite.Pour les enregistrements qui représentent des données associées à un utilisateur spécifique :
osxcollector_username : Le nom de l'utilisateurOSXCollector tente de convertir les horodatages en chaînes de date/heure lisibles par l'homme au format YYYY-mm-dd hh:MM:ss. Il utilise des heuristiques pour identifier automatiquement divers horodatages :
versionLa version actuelle d'OSXCollector.
system_infoCollecte les informations de base sur le système :
kextCollecte les extensions du noyau depuis :
/System/Library/Extensions/Library/ExtensionsstartupCollecte les informations sur les LaunchAgents, LaunchDaemons, ScriptingAdditions, StartupItems et autres éléments de connexion depuis :
/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.plistPlus d'informations sur le démarrage de Mac OS X peuvent être trouvées ici : http://www.malicious-streams.com/article/Mac_OSX_Startup.pdf
applicationsHache les applications installées et rassemble l'historique d'installation depuis :
/Applications~/Applications/Library/Receipts/InstallHistory.plistquarantinesLes quarantaines sont essentiellement les informations nécessaires pour afficher le message 'Êtes-vous sûr de vouloir exécuter ceci ?' lorsqu'un utilisateur tente d'ouvrir un fichier téléchargé depuis Internet. Pour plus de détails, consultez l'explication du support Apple sur les quarantaines : http://support.apple.com/kb/HT3662
Cette section collecte également les informations de la vérification de malware basée sur le hachage XProtect pour les fichiers en quarantaine. Le plist se trouve à :
/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/XProtect.plist
XProtect ajoute également des versions minimales pour les plug-ins Internet. Ce plist se trouve à :
/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/XProtect.meta.plist
downloadsHache tous les fichiers téléchargés des utilisateurs depuis :
~/Downloads~/Library/Mail Downloads~/Library/Containers/com.apple.mail/Data/Library/Mail DownloadschromeCollecte les informations suivantes du navigateur web Google Chrome :
Ces données sont extraites de ~/Library/Application Support/Google/Chrome/Default
firefoxCollecte les informations des différentes bases de données SQLite dans un profil Firefox :
Ces informations sont extraites de ~/Library/Application Support/Firefox/Profiles
Pour plus de détails sur le dossier de profil Firefox, voir http://kb.mozillazine.org/Profile_folder_-_Firefox
safariCollecte les informations des différents plists et bases de données SQLite dans un profil Safari :
accountsCollecte les informations sur les comptes des utilisateurs :
/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.plistmailHache les fichiers dans les répertoires de l'application Mail :
~/Library/Mail~/Library/Mail Downloadsfull_hashHache tous les fichiers sur le disque. Tous. Cela ne s'exécute pas par défaut. Il doit être déclenché avec :
$ sudo osxcollector.py -s full_hash
L'analyse forensique est à la fois un art et une science. Chaque analyste verra une histoire un peu différente en lisant la sortie d'OSXCollector. C'est ce qui rend l'analyse amusante.
Généralement, la collecte est effectuée sur une machine cible parce que quelque chose cloche : un antivirus a trouvé un fichier qu'il n'aime pas, une inspection profonde des paquets a observé une communication sortante, une surveillance de point de terminaison a remarqué un nouvel élément de démarrage. Les détails de cette alerte initiale – un chemin de fichier, un horodatage, un hachage, un domaine, une adresse IP, etc. – suffisent pour commencer.
Simplement greper quelques minutes avant et après un horodatage fonctionne très bien :
$ cat INCIDENT32.json | grep '2014-01-01 11:3[2-8]'
Il y est. Un outil comme jq peut être très utile pour obtenir une sortie élaborée :
$ cat INCIDENT32.json | grep '2014-01-01 11:3[2-8]' | jq 'select(has("url"))|.url'
$ cat INCIDENT32.json | jq 'select(.osxcollector_username=="ivanlei")|.'
Le projet OSXCollector Output Filters contient des filtres qui traitent et transforment la sortie d'OSXCollector. L'objectif des filtres est de faciliter l'analyse de la sortie d'OSXCollector.
La fonctionnalité d'OSXCollector est stockée dans un seul fichier : osxcollector.py. Le collecteur doit s'exécuter sur une installation nue de OS X sans aucun paquet ou dépendance supplémentaire.
Assurez-vous que tous les tests d'OSXCollector réussissent avant de modifier le code source. Vous pouvez exécuter les tests en utilisant : make test
Après avoir apporté des modifications au code source, exécutez à nouveau make test pour vérifier que vos changements n'ont cassé aucun test.
Ce travail est sous licence GNU General Public License et est une dérivation de https://github.com/jipegit/OSXAuditor
Vous voulez en savoir plus sur l'analyse forensique d'OS X ?
Quelques autres outils intéressants :