
Un conjunto de herramientas forenses de recopilación y análisis de evidencia para OS X

OSXCollector es un conjunto de herramientas de recolección y análisis de evidencia forense para OSX.
El script de recolección se ejecuta en una máquina potencialmente infectada y genera un archivo JSON que describe la máquina objetivo. OSXCollector recopila información de plists, bases de datos SQLite y el sistema de archivos local.
Armado con la recolección forense, un analista puede responder preguntas como:
Yelp automatiza el análisis de la mayoría de las ejecuciones de OSXCollector convirtiendo su salida en un resumen fácilmente legible y procesable de solo las cosas sospechosas. Revisa el proyecto OSXCollector Output Filters para aprender cómo aprovechar al máximo el análisis automatizado de la salida de OSXCollector.
osxcollector.py es un único archivo Python que se ejecuta sin dependencias en una máquina OSX estándar. Esto facilita mucho la ejecución de la recolección en cualquier máquina, sin tener que lidiar con brew, pip, archivos de configuración o variables de entorno. Simplemente copia el único archivo en la máquina y ejecútalo:
sudo osxcollector.py es todo lo que se necesita.
$ sudo osxcollector.py
Wrote 35394 lines.
Output in osxcollect-2014_12_21-08_49_39.tar.gz
Si acabas de clonar el repositorio de GitHub, osxcollector.py está dentro del directorio osxcollector/, por lo que debes ejecutarlo como:
$ sudo osxcollector/osxcollector.py
IMPORTANTE: asegúrate de que el comando python en tu máquina Mac OS X use el intérprete de Python predeterminado incluido con el sistema y no esté sobrescrito, por ejemplo, por la versión de Python instalada a través de brew. OSXCollector depende de un par de enlaces nativos de Python para bibliotecas de OS X, que podrían no estar disponibles en otras versiones de Python que no sean la instalada originalmente en tu sistema.
Alternativamente, puedes ejecutar osxcollector.py especificando explícitamente la versión de Python que deseas usar:
$ sudo /usr/bin/python2.7 osxcollector/osxcollector.py
La salida JSON del recolector, junto con algunos archivos útiles como registros del sistema, se ha agrupado en un archivo .tar.gz para su entrega a un analista.
osxcollector.py también tiene muchas opciones útiles para cambiar cómo funciona la recolección:
-i INCIDENT_PREFIX/--id=INCIDENT_PREFIX:
Establece un identificador que se utiliza como prefijo del archivo de salida. El valor predeterminado es osxcollect.
$ sudo osxcollector.py -i IncontinentSealord
Wrote 35394 lines.
Output in IncontinentSealord-2014_12_21-08_49_39.tar.gz
Sé creativo con los nombres de incidentes, hace que sea más fácil reírse del dolor.
-p ROOTPATH/--path=ROOTPATH:
Establece la ruta raíz del sistema de archivos sobre el que se ejecutará la recolección. El valor predeterminado es /. Esto es excelente para ejecutar la recolección en la imagen de un disco.
$ sudo osxcollector.py -p '/mnt/powned'
-s SECTION/--section=SECTION:
Ejecuta solo una parte de la recolección completa. Se puede especificar más de una vez. La lista completa de secciones y subsecciones es:
versionEl recolector genera un archivo .tar.gz que contiene todos los artefactos recolectados. El archivo contiene un archivo JSON con la mayor parte de la información. Además, se incluye un conjunto de registros útiles de los registros del sistema objetivo.
Cada línea del archivo JSON registra 1 pieza de información. Hay algunas claves comunes que aparecen en cada registro JSON:
osxcollector_incident_id: Un ID único compartido por cada registro.osxcollector_section: La sección o tipo de datos que contiene este registro.osxcollector_subsection: La subsección o descriptor más detallado del tipo de datos que contiene este registro.Para registros que representan archivos, hay un montón de claves útiles:
atime: La hora de acceso al archivo.ctime: La hora de creación del archivo.mtime: La hora de modificación del archivo.file_path: La ruta absoluta al archivo.md5: Hash MD5 del contenido del archivo.sha1: Hash SHA1 del contenido del archivo.sha2: Hash SHA2 del contenido del archivo.Para registros que representan archivos descargados:
xattr-wherefrom: Una lista que contiene las URLs de origen y de referencia para el archivo descargado.xattr-quarantines: Una cadena que describe qué aplicación descargó el archivo.Para registros que representan una fila de una base de datos SQLite:
osxcollector_table_name: El nombre de la tabla de la que proviene la fila.osxcollector_db_path: La ruta absoluta al archivo SQLite.Para registros que representan datos asociados a un usuario específico:
osxcollector_username: El nombre del usuarioOSXCollector intenta convertir las marcas de tiempo a cadenas de fecha/hora legibles por humanos en el formato YYYY-mm-dd hh:MM:ss. Utiliza heurísticas para identificar automáticamente varias marcas de tiempo:
versionLa versión actual de OSXCollector.
system_infoRecoge información básica sobre el sistema:
kextRecoge las extensiones del kernel de:
/System/Library/Extensions/Library/ExtensionsstartupRecoge información sobre los LaunchAgents, LaunchDaemons, ScriptingAdditions, StartupItems y otros elementos de inicio de sesión 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.plistSe puede encontrar más información sobre el inicio de Mac OS X aquí: http://www.malicious-streams.com/article/Mac_OSX_Startup.pdf
applicationsGenera hashes de las aplicaciones instaladas y recoge el historial de instalación de:
/Applications~/Applications/Library/Receipts/InstallHistory.plistquarantinesLas cuarentenas son básicamente la información necesaria para mostrar el mensaje '¿Estás seguro de que quieres ejecutar esto?' cuando un usuario intenta abrir un archivo descargado de Internet. Para más detalles, consulta la explicación de Apple Support sobre las cuarentenas: http://support.apple.com/kb/HT3662
Esta sección también recoge información de la comprobación de malware basada en hash de XProtect
para archivos en cuarentena. El plist está en:
/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/XProtect.plist
XProtect también añade versiones mínimas para los complementos de Internet. Ese plist está en:
/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/XProtect.meta.plist
downloadsGenera hashes de todos los archivos descargados por los usuarios de:
~/Downloads~/Library/Mail Downloads~/Library/Containers/com.apple.mail/Data/Library/Mail DownloadschromeRecoge la siguiente información del navegador web Google Chrome:
Estos datos se extraen de ~/Library/Application Support/Google/Chrome/Default
firefoxRecoge información de las diferentes bases de datos SQLite en un perfil de Firefox:
Esta información se extrae de ~/Library/Application Support/Firefox/Profiles
Para más detalles sobre la carpeta de perfil de Firefox, consulta http://kb.mozillazine.org/Profile_folder_-_Firefox
safariRecoge información de los diferentes plists y bases de datos SQLite en un perfil de Safari:
accountsRecoge información sobre las cuentas de los usuarios:
/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.plistmailGenera hashes de los archivos en los directorios de la aplicación Mail:
~/Library/Mail~/Library/Mail Downloadsfull_hashGenera hashes de todos los archivos en el disco. Todos ellos. Esto no se ejecuta por defecto. Debe activarse con:
$ sudo osxcollector.py -s full_hash
El análisis forense es un poco de arte y un poco de ciencia. Cada analista verá una historia un poco diferente al leer la salida de OSXCollector. Eso es parte de lo que hace que el análisis sea divertido.
Generalmente, la recolección se realiza en una máquina objetivo porque algo anda mal: el antivirus encontró un archivo que no le gusta, la inspección profunda de paquetes observó una llamada externa, la monitorización del endpoint notó un nuevo elemento de inicio. Los detalles de esta alerta inicial (una ruta de archivo, una marca de tiempo, un hash, un dominio, una IP, etc.) son suficientes para empezar.
Simplemente grepando unos minutos antes y después de una marca de tiempo funciona muy bien:
$ cat INCIDENT32.json | grep '2014-01-01 11:3[2-8]'
Está ahí dentro. Una herramienta como jq puede ser muy útil para hacer una salida más 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")|.'
El proyecto OSXCollector Output Filters contiene filtros que procesan y transforman la salida de OSXCollector. El objetivo de los filtros es facilitar el análisis de la salida de OSXCollector.
La funcionalidad de OSXCollector está almacenada en un solo archivo: osxcollector.py. El recolector debería ejecutarse en una instalación limpia de OS X sin paquetes ni dependencias adicionales.
Asegúrate de que todas las pruebas de OSXCollector pasen antes de editar el código fuente. Puedes ejecutar las pruebas usando: make test
Después de hacer cambios en el código fuente, ejecuta make test nuevamente para verificar que tus cambios no hayan roto ninguna de las pruebas.
Este trabajo está licenciado bajo la Licencia Pública General de GNU y es una derivación de https://github.com/jipegit/OSXAuditor
¿Quieres aprender más sobre la informática forense en OS X?
Un par de otras herramientas interesantes:
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:
Recoge el valor de las cookies.
Por defecto, OSXCollector no vuelca el valor de una cookie, ya que puede contener información sensible (por ejemplo, el id de sesión).
-l/--collect-local-storage:
Recoge los valores almacenados en el almacenamiento local de los navegadores web.
Por defecto, OSXCollector no vuelca los valores ya que pueden contener información sensible.
-d/--debug:
Habilita la salida detallada y los puntos de interrupción de Python. Si algo anda mal con OSXCollector, prueba esto.
$ sudo osxcollector.py -d