macOS FS Tricks
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Permisos en un directorio:
leer - puedes enumerar las entradas del directorio
escribir - puedes eliminar/escribir archivos en el directorio y puedes eliminar carpetas vacías.
Pero no puedes eliminar/modificar carpetas no vacías a menos que tengas permisos de escritura sobre ellas.
No puedes modificar el nombre de una carpeta a menos que seas el propietario.
ejecutar - se te permite atravesar el directorio - si no tienes este derecho, no puedes acceder a ningún archivo dentro de él, ni en ningún subdirectorio.
Cómo sobrescribir un archivo/carpeta propiedad de root, pero:
Un propietario de directorio padre en la ruta es el usuario
Un propietario de directorio padre en la ruta es un grupo de usuarios con acceso de escritura
Un grupo de usuarios tiene acceso de escritura al archivo
Con cualquiera de las combinaciones anteriores, un atacante podría inyectar un enlace simbólico/duro en la ruta esperada para obtener una escritura arbitraria privilegiada.
Si hay archivos en un directorio donde solo root tiene acceso R+X, esos no son accesibles para nadie más. Así que una vulnerabilidad que permita mover un archivo legible por un usuario, que no puede ser leído debido a esa restricción, de esta carpeta a otra diferente, podría ser abusada para leer estos archivos.
Ejemplo en: https://theevilbit.github.io/posts/exploiting_directory_permissions_on_macos/#nix-directory-permissions
Si un proceso privilegiado está escribiendo datos en un archivo que podría ser controlado por un usuario de menor privilegio, o que podría haber sido creado previamente por un usuario de menor privilegio. El usuario podría simplemente apuntarlo a otro archivo a través de un enlace simbólico o duro, y el proceso privilegiado escribirá en ese archivo.
Consulta en las otras secciones donde un atacante podría abusar de una escritura arbitraria para escalar privilegios.
Los archivos con la extensión .fileloc
pueden apuntar a otras aplicaciones o binarios, por lo que cuando se abren, la aplicación/binario será el que se ejecute.
Ejemplo:
Si puedes hacer que un proceso abra un archivo o una carpeta con altos privilegios, puedes abusar de crontab
para abrir un archivo en /etc/sudoers.d
con EDITOR=exploit.py
, de modo que exploit.py
obtenga el FD del archivo dentro de /etc/sudoers
y lo abuse.
Por ejemplo: https://youtu.be/f1HA5QhLQ7Y?t=21098
Si un archivo/carpeta tiene este atributo inmutable, no será posible poner un xattr en él.
Un devfs mount no soporta xattr, más información en CVE-2023-32364
Este ACL impide agregar xattrs
al archivo.
El formato de archivo AppleDouble copia un archivo incluyendo sus ACEs.
En el código fuente es posible ver que la representación de texto de la ACL almacenada dentro del xattr llamado com.apple.acl.text
se establecerá como ACL en el archivo descomprimido. Así que, si comprimes una aplicación en un archivo zip con formato de archivo AppleDouble con una ACL que impide que otros xattrs sean escritos en él... el xattr de cuarentena no se estableció en la aplicación:
Consulta el informe original para más información.
Para replicar esto, primero necesitamos obtener la cadena acl correcta:
(Note que incluso si esto funciona, el sandbox escribe el xattr de cuarentena antes)
No es realmente necesario, pero lo dejo ahí por si acaso:
macOS xattr-acls extra stuffLos bundles contienen el archivo _CodeSignature/CodeResources
que contiene el hash de cada archivo en el bundle. Tenga en cuenta que el hash de CodeResources también está incrustado en el ejecutable, por lo que no podemos jugar con eso, tampoco.
Sin embargo, hay algunos archivos cuya firma no será verificada, estos tienen la clave omitida en el plist, como:
Es posible calcular la firma de un recurso desde la línea de comandos con:
Un usuario puede montar un dmg personalizado creado incluso sobre algunas carpetas existentes. Así es como podrías crear un paquete dmg personalizado con contenido personalizado:
Por lo general, macOS monta discos hablando con el servicio Mach com.apple.DiskArbitrarion.diskarbitrariond
(proporcionado por /usr/libexec/diskarbitrationd
). Si se agrega el parámetro -d
al archivo plist de LaunchDaemons y se reinicia, almacenará registros en /var/log/diskarbitrationd.log
.
Sin embargo, es posible utilizar herramientas como hdik
y hdiutil
para comunicarse directamente con el kext com.apple.driver.DiskImages
.
Si tu script pudiera ser interpretado como un script de shell, podrías sobrescribir el /etc/periodic/daily/999.local
script de shell que se activará todos los días.
Puedes fingir una ejecución de este script con: sudo periodic daily
Escribe un LaunchDaemon arbitrario como /Library/LaunchDaemons/xyz.hacktricks.privesc.plist
con un plist que ejecute un script arbitrario como:
Just generate the script /Applications/Scripts/privesc.sh
con los comandos que te gustaría ejecutar como root.
Si tienes escritura arbitraria, podrías crear un archivo dentro de la carpeta /etc/sudoers.d/
otorgándote privilegios de sudo.
El archivo /etc/paths
es uno de los principales lugares que poblan la variable de entorno PATH. Debes ser root para sobrescribirlo, pero si un script de proceso privilegiado está ejecutando algún comando sin la ruta completa, podrías ser capaz de secuestrarlo modificando este archivo.
También puedes escribir archivos en /etc/paths.d
para cargar nuevas carpetas en la variable de entorno PATH
.
Esto generará un archivo que pertenece a root que es escribible por mí (código de aquí). Esto también podría funcionar como privesc:
La memoria compartida POSIX permite a los procesos en sistemas operativos compatibles con POSIX acceder a un área de memoria común, facilitando una comunicación más rápida en comparación con otros métodos de comunicación entre procesos. Implica crear o abrir un objeto de memoria compartida con shm_open()
, establecer su tamaño con ftruncate()
, y mapearlo en el espacio de direcciones del proceso usando mmap()
. Los procesos pueden entonces leer y escribir directamente en esta área de memoria. Para gestionar el acceso concurrente y prevenir la corrupción de datos, a menudo se utilizan mecanismos de sincronización como mutexes o semáforos. Finalmente, los procesos desmapean y cierran la memoria compartida con munmap()
y close()
, y opcionalmente eliminan el objeto de memoria con shm_unlink()
. Este sistema es especialmente efectivo para IPC eficiente y rápido en entornos donde múltiples procesos necesitan acceder a datos compartidos rápidamente.
macOS descriptores protegidos son una característica de seguridad introducida en macOS para mejorar la seguridad y fiabilidad de las operaciones de descriptores de archivo en aplicaciones de usuario. Estos descriptores protegidos proporcionan una forma de asociar restricciones específicas o "guardias" con descriptores de archivo, que son aplicadas por el kernel.
Esta característica es particularmente útil para prevenir ciertas clases de vulnerabilidades de seguridad, como acceso no autorizado a archivos o condiciones de carrera. Estas vulnerabilidades ocurren cuando, por ejemplo, un hilo está accediendo a una descripción de archivo dando acceso a otro hilo vulnerable sobre ella o cuando un descriptor de archivo es heredado por un proceso hijo vulnerable. Algunas funciones relacionadas con esta funcionalidad son:
guarded_open_np
: Abre un FD con una guardia
guarded_close_np
: Ciérralo
change_fdguard_np
: Cambia las banderas de guardia en un descriptor (incluso eliminando la protección de guardia)
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)