macOS FS Tricks
Combinaciones de permisos POSIX
Permisos en un directorio:
lectura - puedes enumerar las entradas del directorio
escritura - puedes borrar/escribir archivos en el directorio y puedes borrar carpetas vacías.
Pero no puedes borrar/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 la poseas.
ejecución - 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.
Combinaciones Peligrosas
Cómo sobrescribir un archivo/carpeta propiedad de root, pero:
Uno de los propietarios del directorio padre en la ruta es el usuario
Uno de los propietarios del 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.
Caso Especial de R+X de la raíz de la carpeta
Si hay archivos en un directorio donde solo root tiene acceso de R+X, estos no son accesibles para nadie más. Por lo tanto, una vulnerabilidad que permita mover un archivo legible por un usuario, que no se puede leer debido a esa restricción, desde este directorio a otro diferente, podría ser abusada para leer estos archivos.
Ejemplo en: https://theevilbit.github.io/posts/exploiting_directory_permissions_on_macos/#nix-directory-permissions
Enlace simbólico / Enlace duro
Si un proceso privilegiado está escribiendo datos en un archivo que podría ser controlado por un usuario menos privilegiado, o que podría ser creado previamente por un usuario menos privilegiado. El usuario simplemente podría 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 dónde un atacante podría abusar de una escritura arbitraria para escalar privilegios.
.fileloc
Los archivos con 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:
FD Arbitrario
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 esta manera exploit.py
obtendrá el FD al archivo dentro de /etc/sudoers
y lo abusará.
Por ejemplo: https://youtu.be/f1HA5QhLQ7Y?t=21098
Trucos para Evitar las xattrs de Cuarentena
Eliminarlo
Bandera uchg / uchange / uimmutable
Si un archivo/carpeta tiene este atributo inmutable, no será posible ponerle un xattr.
Montaje de defvfs
Un montaje de devfs no admite xattr, más información en CVE-2023-32364
ACL de writeextattr
Esta ACL evita agregar xattrs
al archivo.
com.apple.acl.text xattr + AppleDouble
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 ACL almacenada dentro del xattr llamado com.apple.acl.text
se establecerá como ACL en el archivo descomprimido. Por lo tanto, si comprimiste una aplicación en un archivo zip con el formato de archivo AppleDouble con un ACL que evita que otros xattrs se escriban en él... el xattr de cuarentena no se establecerá en la aplicación:
Consulta el informe original para obtener más información.
Para replicar esto primero necesitamos obtener la cadena de acl correcta:
(Note that even if this works the sandbox write the quarantine xattr before)
No es realmente necesario, pero lo dejo ahí por si acaso:
pagemacOS xattr-acls extra stuffSaltar Firmas de Código
Los paquetes contienen el archivo _CodeSignature/CodeResources
que contiene el hash de cada archivo en el paquete. Ten en cuenta que el hash de CodeResources también está incrustado en el ejecutable, por lo que no podemos manipularlo.
Sin embargo, hay algunos archivos cuya firma no se verificará, estos tienen la clave omit en el plist, como:
Es posible calcular la firma de un recurso desde la línea de comandos con:
Por lo general, macOS monta el disco hablando con el servicio Mach com.apple.DiskArbitration.diskarbitrationd
(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
.
Escrituras Arbitrarias
Scripts sh periódicos
Si su script podría ser interpretado como un script de shell, podría sobrescribir el script de shell /etc/periodic/daily/999.local
que se activará todos los días.
Puede simular una ejecución de este script con: sudo periodic daily
Daemons
Escriba un LaunchDaemon arbitrario como /Library/LaunchDaemons/xyz.hacktricks.privesc.plist
con un plist que ejecute un script arbitrario como:
Archivo Sudoers
Si tienes escritura arbitraria, podrías crear un archivo dentro de la carpeta /etc/sudoers.d/
otorgándote privilegios de sudo.
Archivos PATH
El archivo /etc/paths
es uno de los lugares principales que populan la variable de entorno PATH. Debes ser root para sobrescribirlo, pero si un script de un proceso privilegiado está ejecutando algún comando sin la ruta completa, podrías secuestrarlo modificando este archivo.
También puedes escribir archivos en /etc/paths.d
para cargar nuevas carpetas en la variable de entorno PATH
.
Generar archivos escribibles como otros usuarios
Esto generará un archivo que pertenece a root y es escribible por mí (código desde aquí). Esto también podría funcionar como escalada de privilegios:
Memoria Compartida POSIX
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 utilizando 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, se suelen utilizar mecanismos de sincronización como mutex 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 una IPC eficiente y rápida en entornos donde múltiples procesos necesitan acceder a datos compartidos rápidamente.
Descriptores protegidos de macOS
Los descriptores protegidos de macOS son una característica de seguridad introducida en macOS para mejorar la seguridad y confiabilidad de las operaciones de descriptores de archivos en aplicaciones de usuario. Estos descriptores protegidos proporcionan una forma de asociar restricciones específicas o "guardias" con descriptores de archivos, que son aplicadas por el kernel.
Esta característica es particularmente útil para prevenir ciertas clases de vulnerabilidades de seguridad como el acceso no autorizado a archivos o condiciones de carrera. Estas vulnerabilidades ocurren, por ejemplo, cuando un hilo está accediendo a una descripción de archivo dando acceso a otro hilo vulnerable sobre él 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 guardiaguarded_close_np
: Ciérralochange_fdguard_np
: Cambia las banderas de guardia en un descriptor (incluso eliminando la protección de la guardia)
Referencias
Última actualización