# macOS Dosyaları, Klasörler, İkili Dosyalar ve Bellek
{{#include ../../../banners/hacktricks-training.md}}
## Dosya hiyerarşisi düzeni
- **/Applications**: Yüklenen uygulamalar burada olmalıdır. Tüm kullanıcılar bunlara erişebilir.
- **/bin**: Komut satırı ikili dosyaları
- **/cores**: Varsa, çekirdek dökümlerini saklamak için kullanılır
- **/dev**: Her şey bir dosya olarak kabul edilir, bu nedenle burada donanım cihazlarını görebilirsiniz.
- **/etc**: Yapılandırma dosyaları
- **/Library**: Tercihler, önbellekler ve günlüklerle ilgili birçok alt dizin ve dosya burada bulunabilir. Kökte ve her kullanıcının dizininde bir Library klasörü vardır.
- **/private**: Belgelendirilmemiştir ancak bahsedilen birçok klasör özel dizine sembolik bağlantılardır.
- **/sbin**: Temel sistem ikili dosyaları (yönetimle ilgili)
- **/System**: OS X'in çalışmasını sağlayan dosya. Burada çoğunlukla yalnızca Apple'a özgü dosyalar bulmalısınız (üçüncü taraf değil).
- **/tmp**: Dosyalar 3 gün sonra silinir (bu, /private/tmp'e yumuşak bir bağlantıdır)
- **/Users**: Kullanıcılar için ana dizin.
- **/usr**: Yapılandırma ve sistem ikili dosyaları
- **/var**: Günlük dosyaları
- **/Volumes**: Bağlı sürücüler burada görünecektir.
- **/.vol**: `stat a.txt` komutunu çalıştırdığınızda `16777223 7545753 -rw-r--r-- 1 username wheel ...` gibi bir şey elde edersiniz; burada ilk sayı dosyanın bulunduğu hacmin kimlik numarası ve ikincisi inode numarasıdır. Bu bilgiyi kullanarak `cat /.vol/16777223/7545753` komutunu çalıştırarak bu dosyanın içeriğine erişebilirsiniz.
### Uygulama Klasörleri
- **Sistem uygulamaları** `/System/Applications` altında bulunur.
- **Yüklenen** uygulamalar genellikle `/Applications` veya `~/Applications` içinde yüklenir.
- **Uygulama verileri**, root olarak çalışan uygulamalar için `/Library/Application Support` ve kullanıcı olarak çalışan uygulamalar için `~/Library/Application Support` içinde bulunabilir.
- Üçüncü taraf uygulamaların **daemon'ları** **root olarak çalışması gereken** genellikle `/Library/PrivilegedHelperTools/` içinde bulunur.
- **Sandboxed** uygulamalar `~/Library/Containers` klasörüne haritalanır. Her uygulamanın, uygulamanın paket kimliğine (`com.apple.Safari`) göre adlandırılmış bir klasörü vardır.
- **Kernel** `/System/Library/Kernels/kernel` içinde bulunur.
- **Apple'ın kernel uzantıları** `/System/Library/Extensions` içinde bulunur.
- **Üçüncü taraf kernel uzantıları** `/Library/Extensions` içinde saklanır.
### Hassas Bilgiler İçeren Dosyalar
MacOS, şifreler gibi bilgileri birkaç yerde saklar:
{{#ref}}
macos-sensitive-locations.md
{{#endref}}
### Savunmasız pkg yükleyicileri
{{#ref}}
macos-installers-abuse.md
{{#endref}}
## OS X'e Özgü Uzantılar
- **`.dmg`**: Apple Disk Image dosyaları yükleyiciler için çok yaygındır.
- **`.kext`**: Belirli bir yapıyı takip etmelidir ve OS X sürümünde bir sürücüdür. (bu bir pakettir)
- **`.plist`**: XML veya ikili formatta bilgi saklayan property list olarak da bilinir.
- XML veya ikili olabilir. İkili olanlar şu komutlarla okunabilir:
- `defaults read config.plist`
- `/usr/libexec/PlistBuddy -c print config.plist`
- `plutil -p ~/Library/Preferences/com.apple.screensaver.plist`
- `plutil -convert xml1 ~/Library/Preferences/com.apple.screensaver.plist -o -`
- `plutil -convert json ~/Library/Preferences/com.apple.screensaver.plist -o -`
- **`.app`**: Dizin yapısını takip eden Apple uygulamaları (bu bir pakettir).
- **`.dylib`**: Dinamik kütüphaneler (Windows DLL dosyaları gibi)
- **`.pkg`**: xar (eXtensible Archive format) ile aynıdır. Bu dosyaların içeriğini yüklemek için yükleyici komutu kullanılabilir.
- **`.DS_Store`**: Bu dosya her dizinde bulunur, dizinin özelliklerini ve özelleştirmelerini kaydeder.
- **`.Spotlight-V100`**: Bu klasör, sistemdeki her hacmin kök dizininde görünür.
- **`.metadata_never_index`**: Bu dosya bir hacmin kökünde bulunuyorsa, Spotlight o hacmi dizinlemez.
- **`.noindex`**: Bu uzantıya sahip dosya ve klasörler Spotlight tarafından dizinlenmez.
- **`.sdef`**: Paketler içindeki dosyalar, bir AppleScript ile uygulama ile nasıl etkileşim kurulabileceğini belirtir.
### macOS Paketleri
Bir paket, **Finder'da bir nesne gibi görünen** bir **dizindir** (bir Paket örneği `*.app` dosyalarıdır).
{{#ref}}
macos-bundles.md
{{#endref}}
## Dyld Paylaşılan Kütüphane Önbelleği (SLC)
macOS (ve iOS) üzerinde tüm sistem paylaşılan kütüphaneleri, çerçeveler ve dylib'ler, **tek bir dosyada birleştirilmiştir**, buna **dyld paylaşılan önbellek** denir. Bu, performansı artırır, çünkü kod daha hızlı yüklenebilir.
Bu, macOS'ta `/System/Volumes/Preboot/Cryptexes/OS/System/Library/dyld/` içinde bulunur ve eski sürümlerde **paylaşılan önbelleği** **`/System/Library/dyld/`** içinde bulabilirsiniz.\
iOS'ta bunları **`/System/Library/Caches/com.apple.dyld/`** içinde bulabilirsiniz.
Dyld paylaşılan önbelleğine benzer şekilde, kernel ve kernel uzantıları da bir kernel önbelleğine derlenir ve bu, önyükleme sırasında yüklenir.
Tek dosya dylib paylaşılan önbelleğinden kütüphaneleri çıkarmak için [dyld_shared_cache_util](https://www.mbsplugins.de/files/dyld_shared_cache_util-dyld-733.8.zip) ikilisini kullanmak mümkündü, bu günümüzde çalışmayabilir ama [**dyldextractor**](https://github.com/arandomdev/dyldextractor) da kullanılabilir:
```bash
# dyld_shared_cache_util
dyld_shared_cache_util -extract ~/shared_cache/ /System/Volumes/Preboot/Cryptexes/OS/System/Library/dyld/dyld_shared_cache_arm64e
# dyldextractor
dyldex -l [dyld_shared_cache_path] # List libraries
dyldex_all [dyld_shared_cache_path] # Extract all
# More options inside the readme
```
> [!TIP]
> `dyld_shared_cache_util` aracının çalışmaması durumunda, **paylaşılan dyld ikilisini Hopper'a** iletebileceğinizi ve Hopper'ın tüm kütüphaneleri tanıyıp **hangi kütüphaneyi** incelemek istediğinizi **seçmenize** izin vereceğini unutmayın:
Bazı çıkarıcılar çalışmayabilir çünkü dylib'ler, bilinmeyen adreslere atlama yapabilecekleri için sabit kodlanmış adreslerle önceden bağlanmıştır.
> [!TIP]
> Xcode'da bir emülatör kullanarak macos'ta diğer \*OS cihazlarının Paylaşılan Kütüphane Önbelleğini indirmenin de mümkün olduğunu unutmayın. Bunlar şu dizinde indirilecektir: ls `$HOME/Library/Developer/Xcode/<*>OS\ DeviceSupport//Symbols/System/Library/Caches/com.apple.dyld/`, örneğin: `$HOME/Library/Developer/Xcode/iOS\ DeviceSupport/14.1\ (18A8395)/Symbols/System/Library/Caches/com.apple.dyld/dyld_shared_cache_arm64`
### SLC Haritalama
**`dyld`** SLC'nin haritalanıp haritalanmadığını bilmek için **`shared_region_check_np`** sistem çağrısını kullanır (bu adresi döndürür) ve SLC'yi haritalamak için **`shared_region_map_and_slide_np`** kullanır.
SLC ilk kullanımda kaydırılsa bile, tüm **işlemler** **aynı kopyayı** kullanır, bu da saldırganın sistemde işlemleri çalıştırabilmesi durumunda **ASLR** korumasını **ortadan kaldırır**. Bu geçmişte gerçekten istismar edildi ve paylaşılan bölge sayfası ile düzeltildi.
Branch havuzları, görüntü haritalamaları arasında küçük alanlar oluşturan küçük Mach-O dylib'lerdir ve bu da işlevlerin araya girmesini imkansız hale getirir.
### SLC'leri Geçersiz Kılma
Aşağıdaki çevre değişkenlerini kullanarak:
- **`DYLD_DHARED_REGION=private DYLD_SHARED_CACHE_DIR= DYLD_SHARED_CACHE_DONT_VALIDATE=1`** -> Bu, yeni bir paylaşılan kütüphane önbelleği yüklemeye izin verecektir.
- **`DYLD_SHARED_CACHE_DIR=avoid`** ve kütüphaneleri gerçek olanlarla paylaşılan önbelleğe simlinklerle manuel olarak değiştirmek (bunları çıkarmanız gerekecek).
## Özel Dosya İzinleri
### Klasör izinleri
Bir **klasörde**, **okuma** onu **listelemeye** izin verir, **yazma** dosyaları **silme** ve **yazma** işlemlerine izin verir, ve **çalıştırma** dizinde **gezinmeye** izin verir. Örneğin, bir kullanıcı bir dizinde **çalıştırma** iznine sahip olmadığı bir dosya üzerinde **okuma iznine** sahip olsa bile, dosyayı **okuyamaz**.
### Bayrak değiştiricileri
Dosyalarda ayarlanabilecek bazı bayraklar vardır, bu bayraklar dosyanın farklı davranmasına neden olur. Bir dizindeki dosyaların **bayraklarını kontrol edebilirsiniz** `ls -lO /path/directory` ile.
- **`uchg`**: **uchange** bayrağı olarak bilinir ve **dosyanın** değiştirilmesini veya silinmesini **engeller**. Ayarlamak için: `chflags uchg file.txt`
- Root kullanıcısı **bayrağı kaldırabilir** ve dosyayı değiştirebilir.
- **`restricted`**: Bu bayrak dosyanın **SIP tarafından korunmasını** sağlar (bu bayrağı bir dosyaya ekleyemezsiniz).
- **`Sticky bit`**: Eğer bir dizin sticky bit'e sahipse, **yalnızca** **dizin sahibi veya root dosyaları yeniden adlandırabilir veya silebilir**. Genellikle bu, sıradan kullanıcıların diğer kullanıcıların dosyalarını silmesini veya taşınmasını önlemek için /tmp dizininde ayarlanır.
Tüm bayraklar `sys/stat.h` dosyasında bulunabilir (bunu `mdfind stat.h | grep stat.h` kullanarak bulabilirsiniz) ve şunlardır:
- `UF_SETTABLE` 0x0000ffff: Sahip değiştirilebilir bayrakların maskesi.
- `UF_NODUMP` 0x00000001: Dosyayı dökme.
- `UF_IMMUTABLE` 0x00000002: Dosya değiştirilemez.
- `UF_APPEND` 0x00000004: Dosyaya yazma yalnızca ekleme yapabilir.
- `UF_OPAQUE` 0x00000008: Dizin, birleşim açısından opaktır.
- `UF_COMPRESSED` 0x00000020: Dosya sıkıştırılmıştır (bazı dosya sistemleri).
- `UF_TRACKED` 0x00000040: Bu ayar için dosyalar silinme/yeniden adlandırma bildirimleri yoktur.
- `UF_DATAVAULT` 0x00000080: Okuma ve yazma için yetki gereklidir.
- `UF_HIDDEN` 0x00008000: Bu öğenin bir GUI'de görüntülenmemesi gerektiğini belirten ipucu.
- `SF_SUPPORTED` 0x009f0000: Süper kullanıcı destekli bayrakların maskesi.
- `SF_SETTABLE` 0x3fff0000: Süper kullanıcı değiştirilebilir bayrakların maskesi.
- `SF_SYNTHETIC` 0xc0000000: Sistem salt okunur sentetik bayrakların maskesi.
- `SF_ARCHIVED` 0x00010000: Dosya arşivlenmiştir.
- `SF_IMMUTABLE` 0x00020000: Dosya değiştirilemez.
- `SF_APPEND` 0x00040000: Dosyaya yazma yalnızca ekleme yapabilir.
- `SF_RESTRICTED` 0x00080000: Yazma için yetki gereklidir.
- `SF_NOUNLINK` 0x00100000: Öğe kaldırılmayabilir, yeniden adlandırılamaz veya bağlanamaz.
- `SF_FIRMLINK` 0x00800000: Dosya bir firmlink'tir.
- `SF_DATALESS` 0x40000000: Dosya dataless nesnedir.
### **Dosya ACL'leri**
Dosya **ACL'leri**, farklı kullanıcılara daha **ince izinler** atamak için **ACE** (Erişim Kontrol Girişleri) içerir.
Bir **dizin** için bu izinleri vermek mümkündür: `listele`, `arama`, `dosya_ekle`, `alt_dizin_ekle`, `çocuk_sil`, `çocuk_sil`.\
Ve bir **dosya** için: `okuma`, `yazma`, `ekleme`, `çalıştırma`.
Dosya ACL'ler içeriyorsa, izinleri listelediğinizde **"+" bulacaksınız**:
```bash
ls -ld Movies
drwx------+ 7 username staff 224 15 Apr 19:42 Movies
```
Dosyanın **ACL'lerini** şu şekilde okuyabilirsiniz:
```bash
ls -lde Movies
drwx------+ 7 username staff 224 15 Apr 19:42 Movies
0: group:everyone deny delete
```
Tüm **ACL'lere sahip dosyaları** (bu çok yavaş) bulabilirsiniz:
```bash
ls -RAle / 2>/dev/null | grep -E -B1 "\d: "
```
### Genişletilmiş Nitelikler
Genişletilmiş nitelikler bir adı ve istenen herhangi bir değeri vardır ve `ls -@` kullanılarak görülebilir ve `xattr` komutu ile manipüle edilebilir. Bazı yaygın genişletilmiş nitelikler şunlardır:
- `com.apple.resourceFork`: Kaynak fork uyumluluğu. Ayrıca `filename/..namedfork/rsrc` olarak görünür
- `com.apple.quarantine`: MacOS: Gatekeeper karantina mekanizması (III/6)
- `metadata:*`: MacOS: `_backup_excludeItem` veya `kMD*` gibi çeşitli meta veriler
- `com.apple.lastuseddate` (#PS): Son dosya kullanım tarihi
- `com.apple.FinderInfo`: MacOS: Finder bilgisi (örneğin, renk Etiketleri)
- `com.apple.TextEncoding`: ASCII metin dosyalarının metin kodlamasını belirtir
- `com.apple.logd.metadata`: `/var/db/diagnostics` içindeki dosyalar için logd tarafından kullanılır
- `com.apple.genstore.*`: Nesil depolama (`/.DocumentRevisions-V100` dosya sisteminin kökünde)
- `com.apple.rootless`: MacOS: Dosyayı etiketlemek için Sistem Bütünlüğü Koruması tarafından kullanılır (III/10)
- `com.apple.uuidb.boot-uuid`: Benzersiz UUID ile önyükleme dönemlerinin logd işaretleri
- `com.apple.decmpfs`: MacOS: Şeffaf dosya sıkıştırması (II/7)
- `com.apple.cprotect`: \*OS: Dosya başına şifreleme verileri (III/11)
- `com.apple.installd.*`: \*OS: installd tarafından kullanılan meta veriler, örneğin, `installType`, `uniqueInstallID`
### Kaynak Forkları | macOS ADS
Bu, **MacOS'taki Alternatif Veri Akışlarını** elde etmenin bir yoludur. İçeriği, bir dosya içinde **com.apple.ResourceFork** adlı bir genişletilmiş nitelik içinde kaydederek **file/..namedfork/rsrc** içinde saklayabilirsiniz.
```bash
echo "Hello" > a.txt
echo "Hello Mac ADS" > a.txt/..namedfork/rsrc
xattr -l a.txt #Read extended attributes
com.apple.ResourceFork: Hello Mac ADS
ls -l a.txt #The file length is still q
-rw-r--r--@ 1 username wheel 6 17 Jul 01:15 a.txt
```
Bu genişletilmiş niteliği içeren **tüm dosyaları bulabilirsiniz**:
```bash
find / -type f -exec ls -ld {} \; 2>/dev/null | grep -E "[x\-]@ " | awk '{printf $9; printf "\n"}' | xargs -I {} xattr -lv {} | grep "com.apple.ResourceFork"
```
### decmpfs
Genişletilmiş özellik `com.apple.decmpfs`, dosyanın şifreli olarak saklandığını gösterir, `ls -l` **boyutunun 0** olduğunu bildirecek ve sıkıştırılmış veriler bu özellik içinde yer alacaktır. Dosya her erişildiğinde, bellek içinde şifresi çözülecektir.
Bu özellik `ls -lO` ile sıkıştırılmış olarak görülebilir çünkü sıkıştırılmış dosyalar `UF_COMPRESSED` bayrağı ile etiketlenir. Eğer bir sıkıştırılmış dosya `chflags nocompressed ` ile kaldırılırsa, sistem dosyanın sıkıştırıldığını bilmeyecek ve bu nedenle veriyi açıp erişemeyecektir (gerçekte boş olduğunu düşünecektir).
Alet afscexpand, bir dosyayı zorla açmak için kullanılabilir.
## **Evrensel ikililer &** Mach-o Formatı
Mac OS ikilileri genellikle **evrensel ikililer** olarak derlenir. Bir **evrensel ikili**, **aynı dosyada birden fazla mimariyi destekleyebilir**.
{{#ref}}
universal-binaries-and-mach-o-format.md
{{#endref}}
## macOS Süreç Belleği
## macOS bellek dökümü
{{#ref}}
macos-memory-dumping.md
{{#endref}}
## Risk Kategorisi Dosyaları Mac OS
`/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/System` dizini, **farklı dosya uzantılarıyla ilişkili risk hakkında bilgilerin saklandığı yerdir**. Bu dizin, dosyaları çeşitli risk seviyelerine ayırarak, Safari'nin bu dosyaları indirdikten sonra nasıl işleyeceğini etkiler. Kategoriler şunlardır:
- **LSRiskCategorySafe**: Bu kategorideki dosyalar **tamamen güvenli** olarak kabul edilir. Safari, bu dosyaları indirdikten sonra otomatik olarak açacaktır.
- **LSRiskCategoryNeutral**: Bu dosyalar uyarı içermez ve Safari tarafından **otomatik olarak açılmaz**.
- **LSRiskCategoryUnsafeExecutable**: Bu kategori altındaki dosyalar, dosyanın bir uygulama olduğunu belirten **bir uyarı tetikler**. Bu, kullanıcıyı uyarmak için bir güvenlik önlemidir.
- **LSRiskCategoryMayContainUnsafeExecutable**: Bu kategori, bir yürütülebilir içerebilecek dosyalar, örneğin arşivler içindir. Safari, tüm içeriklerin güvenli veya nötr olduğunu doğrulayamazsa **bir uyarı tetikler**.
## Günlük dosyaları
- **`$HOME/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2`**: İndirilen dosyalar hakkında, nereden indirildikleri gibi bilgileri içerir.
- **`/var/log/system.log`**: OSX sistemlerinin ana günlüğü. com.apple.syslogd.plist, syslogging'in yürütülmesinden sorumludur (devre dışı olup olmadığını kontrol etmek için `launchctl list` içinde "com.apple.syslogd" arayabilirsiniz).
- **`/private/var/log/asl/*.asl`**: İlginç bilgiler içerebilecek Apple Sistem Günlükleridir.
- **`$HOME/Library/Preferences/com.apple.recentitems.plist`**: "Finder" aracılığıyla en son erişilen dosyaları ve uygulamaları saklar.
- **`$HOME/Library/Preferences/com.apple.loginitems.plsit`**: Sistem başlangıcında başlatılacak öğeleri saklar.
- **`$HOME/Library/Logs/DiskUtility.log`**: DiskUtility Uygulaması için günlük dosyası (USB'ler dahil sürücüler hakkında bilgi).
- **`/Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist`**: Kablosuz erişim noktaları hakkında veri.
- **`/private/var/db/launchd.db/com.apple.launchd/overrides.plist`**: Devre dışı bırakılan daemonların listesi.
{{#include ../../../banners/hacktricks-training.md}}