macOS Files, Folders, Binaries & Memory
Last updated
Last updated
Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE)
/Applications: Las aplicaciones instaladas deberían estar aquí. Todos los usuarios podrán acceder a ellas.
/bin: Binarios de línea de comandos
/cores: Si existe, se utiliza para almacenar volcados de núcleo
/dev: Todo se trata como un archivo, por lo que es posible ver dispositivos de hardware almacenados aquí.
/etc: Archivos de configuración
/Library: Se pueden encontrar muchos subdirectorios y archivos relacionados con preferencias, cachés y registros. Existe una carpeta Library en la raíz y en el directorio de cada usuario.
/private: No documentado, pero muchos de los directorios mencionados son enlaces simbólicos al directorio privado.
/sbin: Binarios esenciales del sistema (relacionados con la administración)
/System: Archivo para hacer funcionar OS X. Deberías encontrar principalmente archivos específicos de Apple aquí (no de terceros).
/tmp: Los archivos se eliminan después de 3 días (es un enlace simbólico a /private/tmp)
/Users: Directorio de inicio para los usuarios.
/usr: Binarios de configuración y del sistema
/var: Archivos de registro
/Volumes: Las unidades montadas aparecerán aquí.
/.vol: Al ejecutar stat a.txt
se obtiene algo como 16777223 7545753 -rw-r--r-- 1 nombredeusuario wheel ...
donde el primer número es el número de identificación del volumen donde se encuentra el archivo y el segundo es el número de inodo. Puedes acceder al contenido de este archivo a través de /.vol/ con esa información ejecutando cat /.vol/16777223/7545753
Las aplicaciones del sistema se encuentran en /System/Applications
Las aplicaciones instaladas suelen estar en /Applications
o en ~/Applications
Los datos de la aplicación se pueden encontrar en /Library/Application Support
para las aplicaciones que se ejecutan como root y en ~/Library/Application Support
para las aplicaciones que se ejecutan como el usuario.
Los daemons de aplicaciones de terceros que necesitan ejecutarse como root suelen estar ubicados en /Library/PrivilegedHelperTools/
Las aplicaciones sandboxed se mapean en la carpeta ~/Library/Containers
. Cada aplicación tiene una carpeta con el nombre del ID de paquete de la aplicación (com.apple.Safari
).
El núcleo se encuentra en /System/Library/Kernels/kernel
Las extensiones de kernel de Apple se encuentran en /System/Library/Extensions
Las extensiones de kernel de terceros se almacenan en /Library/Extensions
macOS almacena información como contraseñas en varios lugares:
macOS Sensitive Locations & Interesting Daemons.dmg
: Los archivos de imagen de disco de Apple son muy frecuentes para instaladores.
.kext
: Debe seguir una estructura específica y es la versión de OS X de un controlador (es un paquete).
.plist
: También conocido como lista de propiedades, almacena información en formato XML o binario.
Puede ser XML o binario. Los binarios se pueden leer con:
defaults read config.plist
/usr/libexec/PlistBuddy -c print config.plsit
plutil -p ~/Library/Preferences/com.apple.screensaver.plist
plutil -convert xml1 ~/Library/Preferences/com.apple.screensaver.plist -o -
plutil -convert json ~/Library/Preferences/com.apple.screensaver.plist -o -
.app
: Aplicaciones de Apple que siguen una estructura de directorio (es un paquete).
.dylib
: Bibliotecas dinámicas (como los archivos DLL de Windows)
.pkg
: Son iguales que xar (formato de archivo de archivo extensible). El comando installer se puede usar para instalar el contenido de estos archivos.
.DS_Store
: Este archivo está en cada directorio, guarda los atributos y personalizaciones del directorio.
.Spotlight-V100
: Esta carpeta aparece en el directorio raíz de cada volumen en el sistema.
.metadata_never_index
: Si este archivo está en la raíz de un volumen, Spotlight no indexará ese volumen.
.noindex
: Los archivos y carpetas con esta extensión no serán indexados por Spotlight.
.sdef
: Archivos dentro de paquetes que especifican cómo es posible interactuar con la aplicación desde un AppleScript.
Un paquete es un directorio que parece un objeto en Finder (un ejemplo de paquete son los archivos *.app
).
En macOS (y iOS) todas las bibliotecas compartidas del sistema, como frameworks y dylibs, se combinan en un solo archivo, llamado la caché de bibliotecas compartidas dyld. Esto mejora el rendimiento, ya que el código se puede cargar más rápido.
Esto se encuentra en macOS en /System/Volumes/Preboot/Cryptexes/OS/System/Library/dyld/
y en versiones antiguas es posible que puedas encontrar la caché compartida en /System/Library/dyld/
.
En iOS puedes encontrarlas en /System/Library/Caches/com.apple.dyld/
.
Al igual que la caché de bibliotecas compartidas dyld, el núcleo y las extensiones de kernel también se compilan en una caché de kernel, que se carga en el momento del arranque.
Para extraer las bibliotecas de la caché de archivos dylib compartidos único, era posible usar el binario dyld_shared_cache_util que puede que no funcione en la actualidad, pero también puedes usar dyldextractor:
Ten en cuenta que incluso si la herramienta dyld_shared_cache_util
no funciona, puedes pasar el binario dyld compartido a Hopper y Hopper podrá identificar todas las bibliotecas y permitirte seleccionar cuál quieres investigar:
Algunos extractores no funcionarán ya que las dylibs están preenlazadas con direcciones codificadas en duro, por lo tanto podrían estar saltando a direcciones desconocidas.
También es posible descargar la Caché de Bibliotecas Compartidas de otros dispositivos *OS en macOS utilizando un emulador en Xcode. Se descargarán dentro de: ls $HOME/Library/Developer/Xcode/<*>OS\ DeviceSupport/<version>/Symbols/System/Library/Caches/com.apple.dyld/
, como:$HOME/Library/Developer/Xcode/iOS\ DeviceSupport/14.1\ (18A8395)/Symbols/System/Library/Caches/com.apple.dyld/dyld_shared_cache_arm64
dyld
utiliza la llamada al sistema shared_region_check_np
para saber si la SLC ha sido mapeada (que devuelve la dirección) y shared_region_map_and_slide_np
para mapear la SLC.
Ten en cuenta que incluso si la SLC se desliza en el primer uso, todos los procesos utilizan la misma copia, lo que elimina la protección ASLR si el atacante lograra ejecutar procesos en el sistema. Esto fue realmente explotado en el pasado y se solucionó con el paginador de región compartida.
Los pools de ramas son pequeñas dylibs de Mach-O que crean pequeños espacios entre los mapeos de imágenes, lo que hace imposible interponerse en las funciones.
Usando las variables de entorno:
DYLD_DHARED_REGION=private DYLD_SHARED_CACHE_DIR=</path/dir> DYLD_SHARED_CACHE_DONT_VALIDATE=1
-> Esto permitirá cargar una nueva caché de bibliotecas compartidas
DYLD_SHARED_CACHE_DIR=avoid
y reemplazar manualmente las bibliotecas con enlaces simbólicos a la caché compartida con las reales (necesitarás extraerlas)
En una carpeta, leer permite listarla, escribir permite eliminar y escribir archivos en ella, y ejecutar permite atravesar el directorio. Por lo tanto, por ejemplo, un usuario con permiso de lectura sobre un archivo dentro de un directorio donde no tiene permiso de ejecución no podrá leer el archivo.
Hay algunas banderas que se pueden establecer en los archivos que harán que el archivo se comporte de manera diferente. Puedes verificar las banderas de los archivos dentro de un directorio con ls -lO /ruta/directorio
uchg
: Conocida como la bandera uchange evitará que se realice cualquier acción que cambie o elimine el archivo. Para establecerla haz: chflags uchg archivo.txt
El usuario root podría quitar la bandera y modificar el archivo
restricted
: Esta bandera hace que el archivo esté protegido por SIP (no puedes agregar esta bandera a un archivo).
Bit pegajoso
: Si un directorio tiene el bit pegajoso, solo el propietario de los directorios o root pueden renombrar o eliminar archivos. Normalmente esto se establece en el directorio /tmp para evitar que los usuarios normales eliminen o muevan archivos de otros usuarios.
Todas las banderas se pueden encontrar en el archivo sys/stat.h
(encuéntralo usando mdfind stat.h | grep stat.h
) y son:
UF_SETTABLE
0x0000ffff: Máscara de banderas cambiables por el propietario.
UF_NODUMP
0x00000001: No volcar archivo.
UF_IMMUTABLE
0x00000002: El archivo no se puede cambiar.
UF_APPEND
0x00000004: Los escritos en el archivo solo pueden ser de tipo añadir.
UF_OPAQUE
0x00000008: El directorio es opaco con respecto a la unión.
UF_COMPRESSED
0x00000020: El archivo está comprimido (algunos sistemas de archivos).
UF_TRACKED
0x00000040: No hay notificaciones para eliminaciones/renombramientos para archivos con esto establecido.
UF_DATAVAULT
0x00000080: Se requiere autorización para leer y escribir.
UF_HIDDEN
0x00008000: Indica que este elemento no debe mostrarse en una interfaz gráfica.
SF_SUPPORTED
0x009f0000: Máscara de banderas soportadas por el superusuario.
SF_SETTABLE
0x3fff0000: Máscara de banderas cambiables por el superusuario.
SF_SYNTHETIC
0xc0000000: Máscara de banderas sintéticas de solo lectura del sistema.
SF_ARCHIVED
0x00010000: El archivo está archivado.
SF_IMMUTABLE
0x00020000: El archivo no se puede cambiar.
SF_APPEND
0x00040000: Los escritos en el archivo solo pueden ser de tipo añadir.
SF_RESTRICTED
0x00080000: Se requiere autorización para escribir.
SF_NOUNLINK
0x00100000: El elemento no se puede eliminar, renombrar o montar.
SF_FIRMLINK
0x00800000: El archivo es un firmlink.
SF_DATALESS
0x40000000: El archivo es un objeto sin datos.
Los ACLs de archivos contienen ACE (Entradas de Control de Acceso) donde se pueden asignar permisos más granulares a diferentes usuarios.
Es posible otorgar a un directorio estos permisos: list
, search
, add_file
, add_subdirectory
, delete_child
, delete_child
.
Y a un archivo: read
, write
, append
, execute
.
Cuando el archivo contiene ACLs, verás un "+" al listar los permisos como en:
Puedes leer los ACL del archivo con:
Puedes encontrar todos los archivos con ACLs con (esto es muuuy lento):
Los atributos extendidos tienen un nombre y un valor deseado, y se pueden ver usando ls -@
y manipular usando el comando xattr
. Algunos atributos extendidos comunes son:
com.apple.resourceFork
: Compatibilidad con el tenedor de recursos. También visible como filename/..namedfork/rsrc
com.apple.quarantine
: MacOS: Mecanismo de cuarentena de Gatekeeper (III/6)
metadata:*
: MacOS: varios metadatos, como _backup_excludeItem
, o kMD*
com.apple.lastuseddate
(#PS): Fecha de último uso del archivo
com.apple.FinderInfo
: MacOS: Información del Finder (por ejemplo, etiquetas de color)
com.apple.TextEncoding
: Especifica la codificación de texto de archivos de texto ASCII
com.apple.logd.metadata
: Utilizado por logd en archivos en /var/db/diagnostics
com.apple.genstore.*
: Almacenamiento generacional (/.DocumentRevisions-V100
en la raíz del sistema de archivos)
com.apple.rootless
: MacOS: Utilizado por Protección de Integridad del Sistema para etiquetar archivos (III/10)
com.apple.uuidb.boot-uuid
: Marcas de logd de épocas de arranque con UUID único
com.apple.decmpfs
: MacOS: Compresión de archivos transparente (II/7)
com.apple.cprotect
: *OS: Datos de cifrado por archivo (III/11)
com.apple.installd.*
: *OS: Metadatos utilizados por installd, por ejemplo, installType
, uniqueInstallID
Esta es una forma de obtener Flujos de Datos Alternativos en máquinas MacOS. Puedes guardar contenido dentro de un atributo extendido llamado com.apple.ResourceFork dentro de un archivo guardándolo en file/..namedfork/rsrc.
Puedes encontrar todos los archivos que contienen este atributo extendido con:
El atributo extendido com.apple.decmpfs
indica que el archivo está almacenado encriptado, ls -l
reportará un tamaño de 0 y los datos comprimidos están dentro de este atributo. Cada vez que se accede al archivo, se desencriptará en memoria.
Este atributo se puede ver con ls -lO
indicado como comprimido porque los archivos comprimidos también están etiquetados con la bandera UF_COMPRESSED
. Si se elimina un archivo comprimido con esta bandera chflags nocompressed </path/to/file>
, el sistema no sabrá que el archivo estaba comprimido y, por lo tanto, no podrá descomprimirlo y acceder a los datos (pensará que en realidad está vacío).
La herramienta afscexpand se puede utilizar para forzar la descompresión de un archivo.
Los binarios de Mac OS generalmente se compilan como binarios universales. Un binario universal puede soportar múltiples arquitecturas en el mismo archivo.
macOS Universal binaries & Mach-O FormatEl directorio /System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/System
es donde se almacena información sobre el riesgo asociado con diferentes extensiones de archivo. Este directorio categoriza los archivos en varios niveles de riesgo, influyendo en cómo Safari maneja estos archivos al descargarlos. Las categorías son las siguientes:
LSRiskCategorySafe: Los archivos en esta categoría se consideran completamente seguros. Safari abrirá automáticamente estos archivos después de ser descargados.
LSRiskCategoryNeutral: Estos archivos no tienen advertencias y no se abren automáticamente en Safari.
LSRiskCategoryUnsafeExecutable: Los archivos en esta categoría generan una advertencia indicando que el archivo es una aplicación. Esto sirve como una medida de seguridad para alertar al usuario.
LSRiskCategoryMayContainUnsafeExecutable: Esta categoría es para archivos, como archivos comprimidos, que podrían contener un ejecutable. Safari generará una advertencia a menos que pueda verificar que todos los contenidos son seguros o neutrales.
$HOME/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2
: Contiene información sobre archivos descargados, como la URL desde donde se descargaron.
/var/log/system.log
: Registro principal de los sistemas OSX. com.apple.syslogd.plist es responsable de la ejecución del registro del sistema (puedes verificar si está desactivado buscando "com.apple.syslogd" en launchctl list
.
/private/var/log/asl/*.asl
: Estos son los Registros del Sistema de Apple que pueden contener información interesante.
$HOME/Library/Preferences/com.apple.recentitems.plist
: Almacena archivos y aplicaciones accedidos recientemente a través de "Finder".
$HOME/Library/Preferences/com.apple.loginitems.plsit
: Almacena elementos para iniciar al arrancar el sistema.
$HOME/Library/Logs/DiskUtility.log
: Archivo de registro para la aplicación DiskUtility (información sobre unidades, incluidas las USB).
/Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist
: Datos sobre puntos de acceso inalámbricos.
/private/var/db/launchd.db/com.apple.launchd/overrides.plist
: Lista de demonios desactivados.
Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE)