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

This commit is contained in:
Translator 2024-04-29 23:21:47 +00:00
parent 59a85b1d33
commit 53abcbde9a
3 changed files with 213 additions and 91 deletions

View file

@ -159,7 +159,7 @@
* [macOS Universal binaries & Mach-O Format](macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/universal-binaries-and-mach-o-format.md)
* [macOS Objective-C](macos-hardening/macos-security-and-privilege-escalation/macos-basic-objective-c.md)
* [macOS Privilege Escalation](macos-hardening/macos-security-and-privilege-escalation/macos-privilege-escalation.md)
* [macOS Proces Abuse](macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/README.md)
* [macOS Process Abuse](macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/README.md)
* [macOS Dirty NIB](macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-dirty-nib.md)
* [macOS Chromium Injection](macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-chromium-injection.md)
* [macOS Electron Applications Injection](macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-electron-applications-injection.md)

View file

@ -2,42 +2,107 @@
<details>
<summary><strong>AWS hacklemeyi sıfırdan ileri seviyeye öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong> ile</strong></summary>
<summary><strong>AWS hacklemeyi sıfırdan ileri seviyeye öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong> ile</strong>!</summary>
HackTricks'ı desteklemenin diğer yolları:
* **Şirketinizi HackTricks'te reklamını görmek istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARI**](https://github.com/sponsors/carlospolop)'na göz atın!
* [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin
* [**The PEASS Family'yi**](https://opensea.io/collection/the-peass-family) keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuz
* **💬 [Discord grubumuza](https://discord.gg/hRep4RUj7f) katılın veya [telegram grubuna](https://t.me/peass) katılın veya bizi Twitter'da** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)** takip edin.**
* **Hacking püf noktalarınızı paylaşarak** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına PR göndererek katkıda bulunun.
- **Şirketinizi HackTricks'te reklamını görmek istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARI**](https://github.com/sponsors/carlospolop)'na göz atın!
- [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin
- [**PEASS Ailesi'ni**](https://opensea.io/collection/the-peass-family) keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuz
- **Katılın** 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) veya bizi **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)** takip edin**.
- **Hacking püf noktalarınızı paylaşarak** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına PR göndererek katkıda bulunun.
</details>
## Temel Bilgiler
**Grand Central Dispatch (GCD)**, aynı zamanda **libdispatch** olarak da bilinir, macOS ve iOS'te mevcuttur. Apple tarafından geliştirilen bir teknolojidir ve çok çekirdekli donanımlarda eşzamanlı (çoklu iş parçacıklı) yürütme için uygulama desteğini optimize etmek amacıyla geliştirilmiştir.
**Grand Central Dispatch (GCD),** ayrıca **libdispatch** (`libdispatch.dyld`) olarak da bilinir, macOS ve iOS'te mevcuttur. Apple tarafından geliştirilen bu teknoloji, çok çekirdekli donanımlarda eşzamanlı (çoklu iş parçacıklı) yürütme için uygulama desteğini optimize etmek amacıyla geliştirilmiştir.
**GCD**, uygulamanızın **görevleri** **blok nesneleri** şeklinde **göndermesi** için ve **FIFO kuyruklarını** sağlamak ve yönetmek için kullanılır. Gönderilen bloklar, sistem tarafından tamamen yönetilen bir **iş parçacığı havuzunda** yürütülür. GCD, görevleri yürütmek için iş parçacıkları oluşturur ve bu görevleri mevcut çekirdeklere çalışacak şekilde planlar.
**GCD**, uygulamanızın **blok nesneleri** şeklinde **görevleri gönderebileceği FIFO kuyruklarını** sağlar ve yönetir. Dağıtım kuyruklarına gönderilen bloklar, sistem tarafından tamamen yönetilen bir iş parçacığı havuzunda yürütülür. GCD, dağıtım kuyruklarındaki görevleri yürütmek için otomatik olarak iş parçacıkları oluşturur ve bu görevleri mevcut çekirdeklere çalışacak şekilde planlar.
{% hint style="success" %}
Özetle, **paralel olarak kodu yürütmek** için işlemler, kod bloklarını **GCD'ye gönderebilir** ve GCD bu kodları yürütir. Bu nedenle, işlemler yeni iş parçacıkları oluşturmaz; **GCD, kendi iş parçacığı havuzuyla verilen kodu yürütir**.
Özetle, **paralel olarak kodu yürütmek** için işlemler, **GCD'ye kod blokları gönderebilir**, bu da onların yürütümüyle ilgilenir. Bu nedenle, işlemler yeni iş parçacıkları oluşturmaz; **GCD, verilen kodu kendi iş parçacığı havuzuyla yürütür** (gerektiğinde artabilir veya azalabilir).
{% endhint %}
Bu, paralel yürütümü başarılı bir şekilde yönetmek için çok yardımcı olur, işlemlerin oluşturduğu iş parçacığı sayısını büyük ölçüde azaltır ve paralel yürütümü optimize eder. Bu, **büyük paralelizm** gerektiren görevler (kaba kuvvet?) veya ana iş parçacığını bloke etmemesi gereken görevler için çok uygundur: Örneğin, iOS'taki ana iş parçacığı UI etkileşimlerini yönetir, bu nedenle uygulamanın donmasına neden olabilecek herhangi bir işlev (arama, web'e erişim, dosya okuma...) bu şekilde yönetilir.
Bu, paralel yürütümü başarılı bir şekilde yönetmek için çok yardımcı olur, işlemlerin oluşturduğu iş parçacığı sayısını büyük ölçüde azaltır ve paralel yürütümü optimize eder. Bu, **büyük paralelizm** gerektiren görevler için (kaba kuvvet?) veya ana iş parçacığını engellememesi gereken görevler için idealdir: Örneğin, iOS'taki ana iş parçacığı UI etkileşimlerini yönetir, bu nedenle uygulamanın donmasına neden olabilecek herhangi başka bir işlev (arama, web'e erişim, dosya okuma...) bu şekilde yönetilir.
### Bloklar
Bir blok, **kendi başına kapsamlı bir kod bölümü** (argüman döndüren bir işlev gibi) ve bağlı değişkenleri de belirtebilir.\
Ancak, derleyici düzeyinde bloklar mevcut değildir, bunlar `os_object`'lerdir. Bu nesnelerin her biri iki yapıdan oluşur:
* **blok literali**:&#x20;
* Bloğun sınıfına işaret eden **`isa`** alanıyla başlar:
* `NSConcreteGlobalBlock` (`__DATA.__const` blokları)
* `NSConcreteMallocBlock` (heap'teki bloklar)
* `NSConcreateStackBlock` (yığında bloklar)
* Blok tanımlayıcısında bulunan alanları gösteren **`flags`** ve bazı ayrılmış baytlar
* Çağrılacak işlev işaretçisi
* Bir blok tanımlayıcısına işaretçi
* İçe aktarılan blok değişkenleri (varsa)
* **blok tanımlayıcısı**: Bu, mevcut veriye bağlı olarak boyutu değişir (önceki bayraklarda belirtildiği gibi)
* Bazı ayrılmış baytlar içerir
* Boyutu
* Genellikle, parametreler için ne kadar alanın gerektiğini bilmek için bir Objective-C tarzı imza işaretçisine işaret eder (bayrak `BLOCK_HAS_SIGNATURE`)
* Değişkenler referans alınıyorsa, bu blok ayrıca bir kopya yardımcısına (değeri başlangıçta kopyalayan) ve atma yardımcısına (serbest bırakan) işaretçilere sahip olacaktır.
### Kuyruklar
Bir dağıtım kuyruğu, blokların yürütülmesi için FIFO sıralaması sağlayan adlandırılmış bir nesnedir.
Blokların yürütülmesi için kuyruklara yerleştirilir ve bunlar 2 modu destekler: `DISPATCH_QUEUE_SERIAL` ve `DISPATCH_QUEUE_CONCURRENT`. Tabii ki, **seri** olan **yarış koşulu** sorunlarına sahip olmayacak çünkü bir blok, önceki blok bitene kadar yürütülmeyecektir. Ancak **diğer kuyruk türü bunu** yapabilir.
Varsayılan kuyruklar:
* `.main-thread`: `dispatch_get_main_queue()`'den
* `.libdispatch-manager`: GCD'nin kuyruk yöneticisi
* `.root.libdispatch-manager`: GCD'nin kuyruk yöneticisi
* `.root.maintenance-qos`: En düşük öncelikli görevler
* `.root.maintenance-qos.overcommit`
* `.root.background-qos`: `DISPATCH_QUEUE_PRIORITY_BACKGROUND` olarak mevcut
* `.root.background-qos.overcommit`
* `.root.utility-qos`: `DISPATCH_QUEUE_PRIORITY_NON_INTERACTIVE` olarak mevcut
* `.root.utility-qos.overcommit`
* `.root.default-qos`: `DISPATCH_QUEUE_PRIORITY_DEFAULT` olarak mevcut
* `.root.background-qos.overcommit`
* `.root.user-initiated-qos`: `DISPATCH_QUEUE_PRIORITY_HIGH` olarak mevcut
* `.root.background-qos.overcommit`
* `.root.user-interactive-qos`: En yüksek öncelikli
* `.root.background-qos.overcommit`
Her zaman **hangi iş parçacıklarının hangi kuyrukları hangi zamanlarda işleyeceğine** sistem karar verecektir (çoklu iş parçacıkları aynı kuyrukta çalışabilir veya aynı iş parçacığı farklı kuyruklarda çalışabilir).
#### Özellikler
**`dispatch_queue_create`** ile bir kuyruk oluşturulurken üçüncü argüman bir `dispatch_queue_attr_t` olup genellikle ya `DISPATCH_QUEUE_SERIAL` (aslında NULL) ya da `DISPATCH_QUEUE_CONCURRENT` olacaktır, bu da kuyruğun bazı parametrelerini kontrol etmeye izin veren bir `dispatch_queue_attr_t` yapısına işaret eder.
### Dağıtım nesneleri
Libdispatch'in kullandığı birkaç nesne vardır ve kuyruklar ve bloklar sadece bunlardan ikisidir. Bu nesneleri `dispatch_object_create` ile oluşturmak mümkündür:
* `block`
* `data`: Veri blokları
* `group`: Blok grubu
* `io`: Asenkron G/Ç istekleri
* `mach`: Mach portları
* `mach_msg`: Mach mesajları
* `pthread_root_queue`: İş parçacığı havuzlu bir kuyruk ve iş kuyrukları olmayan
* `queue`
* `semaphore`
* `source`: Olay kaynağı
## Objective-C
Objetive-C'de kodun paralel olarak yürütülmesi için farklı işlevler bulunmaktadır:
Objective-C'de bir bloğun paralel olarak yürütülmesi için farklı işlevler bulunmaktadır:
* [**dispatch\_async**](https://developer.apple.com/documentation/dispatch/1453057-dispatch\_async): Bir kod bloğunu eşzamansız olarak bir dağıtım kuyruğunda yürütmek için gönderir ve hemen döner.
* [**dispatch\_sync**](https://developer.apple.com/documentation/dispatch/1452870-dispatch\_sync): Bir kod bloğunu yürütmek için gönderir ve o blok yürütüldükten sonra döner.
* [**dispatch\_once**](https://developer.apple.com/documentation/dispatch/1447169-dispatch\_once): Bir uygulamanın ömrü boyunca yalnızca bir kez bir kod bloğunu yürütür.
* [**dispatch\_async\_and\_wait**](https://developer.apple.com/documentation/dispatch/3191901-dispatch\_async\_and\_wait): Bir iş öğesini yürütmek için gönderir ve yalnızca o işlem yürütüldükten sonra döner. [**`dispatch_sync`**](https://developer.apple.com/documentation/dispatch/1452870-dispatch\_sync)'den farklı olarak, bu işlev, kuyruğun tüm özelliklerine saygı duyar ve bloğu yürütürken bu özellikleri dikkate alır.
* [**dispatch\_async**](https://developer.apple.com/documentation/dispatch/1453057-dispatch\_async): Bir bloğu bir dağıtım kuyruğunda asenkron olarak yürütmek için gönderir ve hemen döner.
* [**dispatch\_sync**](https://developer.apple.com/documentation/dispatch/1452870-dispatch\_sync): Bir blok nesnesini yürütüm için gönderir ve o blok yürütüldükten sonra döner.
* [**dispatch\_once**](https://developer.apple.com/documentation/dispatch/1447169-dispatch\_once): Bir uygulamanın ömrü boyunca bir blok nesnesini yalnızca bir kez yürütür.
* [**dispatch\_async\_and\_wait**](https://developer.apple.com/documentation/dispatch/3191901-dispatch\_async\_and\_wait): Bir iş öğesini yürütmek için gönderir ve yalnızca o iş öğesi yürütüldükten sonra döner. [**`dispatch_sync`**](https://developer.apple.com/documentation/dispatch/1452870-dispatch\_sync) işlevinin aksine, bu işlev, bloğu yürütürken kuyruğun tüm özelliklerine saygı duyar.
Bu işlevler şu parametreleri bekler: [**`dispatch_queue_t`**](https://developer.apple.com/documentation/dispatch/dispatch\_queue\_t) **`queue,`** [**`dispatch_block_t`**](https://developer.apple.com/documentation/dispatch/dispatch\_block\_t) **`block`**
Bu, bir Blok'un **yapısıdır**:
İşte bir **Blok yapısının** yapısı:
```c
struct Block {
void *isa; // NSConcreteStackBlock,...
@ -48,7 +113,7 @@ struct BlockDescriptor *descriptor;
// captured variables go here
};
```
Ve **`dispatch_async`** kullanarak **paralelizm** kullanımına dair bir örnek:
Ve **`dispatch_async`** kullanarak **paralelizm** kullanımına bir örnek:
```objectivec
#import <Foundation/Foundation.h>
@ -89,7 +154,7 @@ The **`libswiftDispatch`** library wraps the C GCD APIs in a more Swift-friendly
* **`async await`**
* **`var (data, response) = await URLSession.shared.data(from: URL(string: "https://api.example.com/getData"))`**
**Code example**:
**Kod örneği**:
```swift
import Foundation
@ -118,7 +183,7 @@ sleep(1) // Simulate a long-running task
```
## Frida
Aşağıdaki Frida betiği, birkaç `dispatch` fonksiyonuna **hook yapmak** ve sıra adını, geri izlemeyi ve bloğu çıkarmak için kullanılabilir: [**https://github.com/seemoo-lab/frida-scripts/blob/main/scripts/libdispatch.js**](https://github.com/seemoo-lab/frida-scripts/blob/main/scripts/libdispatch.js)
Aşağıdaki Frida betiği, birkaç `dispatch` fonksiyonuna **kanca takmak** ve sıra adını, geri izlemeyi ve bloğu çıkarmak için kullanılabilir: [**https://github.com/seemoo-lab/frida-scripts/blob/main/scripts/libdispatch.js**](https://github.com/seemoo-lab/frida-scripts/blob/main/scripts/libdispatch.js)
```bash
frida -U <prog_name> -l libdispatch.js
@ -133,9 +198,9 @@ Backtrace:
```
## Ghidra
Şu anda Ghidra, ne ObjectiveC **`dispatch_block_t`** yapısını, ne de **`swift_dispatch_block`** yapısını anlamıyor.
Şu anda Ghidra, ne ObjectiveC **`dispatch_block_t`** yapısını ne de **`swift_dispatch_block`** yapısını anlamıyor.
Bu nedenle, onları anlamasını istiyorsanız, sadece **bildirmeniz gerekebilir**:
Bu yüzden onları anlamasını istiyorsanız, sadece **bildirmeniz gerekebilir**:
<figure><img src="../../.gitbook/assets/image (1157).png" alt="" width="563"><figcaption></figcaption></figure>
@ -146,7 +211,7 @@ Bu nedenle, onları anlamasını istiyorsanız, sadece **bildirmeniz gerekebilir
Ardından, kodun içinde **kullanıldığı yeri bulun**:
{% hint style="success" %}
Yapıyı nasıl kullanıldığını anlamak için "block" ile yapılan tüm referanslara dikkat edin.
"block" ile yapılan tüm referansları not alarak, yapının nasıl kullanıldığını anlayabilirsiniz.
{% endhint %}
<figure><img src="../../.gitbook/assets/image (1161).png" alt="" width="563"><figcaption></figcaption></figure>
@ -158,3 +223,7 @@ Değişkenin üzerine sağ tıklayın -> Değişkeni Yeniden Türle ve bu durumd
Ghidra otomatik olarak her şeyi yeniden yazacaktır:
<figure><img src="../../.gitbook/assets/image (1163).png" alt="" width="563"><figcaption></figcaption></figure>
## Referanslar
* [**\*OS Internals, Cilt I: Kullanıcı Modu. Jonathan Levin tarafından**](https://www.amazon.com/MacOS-iOS-Internals-User-Mode/dp/099105556X)

View file

@ -2,114 +2,167 @@
<details>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong> ile sıfırdan kahramana kadar AWS hacklemeyi öğrenin!</summary>
<summary><strong>AWS hacklemeyi sıfırdan kahramana öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Kırmızı Takım Uzmanı)</strong></a><strong> ile!</strong></summary>
HackTricks'i desteklemenin diğer yolları:
HackTricks'ı desteklemenin diğer yolları:
* **Şirketinizi HackTricks'te reklamını görmek** veya **HackTricks'i PDF olarak indirmek** için [**ABONELİK PLANLARI**](https://github.com/sponsors/carlospolop)'na göz atın!
* [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family) koleksiyonumuzu keşfedin, özel [**NFT'lerimizle**](https://opensea.io/collection/the-peass-family)
* 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) katılın veya bizi Twitter'da 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live) takip edin.
* **Hacking püf noktalarınızı paylaşarak PR'ler göndererek** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına katkıda bulunun.
* **Şirketinizi HackTricks'te reklamını görmek istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARI**]'na (https://github.com/sponsors/carlospolop) göz atın!
* [**Resmi PEASS & HackTricks ürünleri**](https://peass.creator-spring.com)'ni edinin
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)'yi keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuzu
* **Katılın** 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) veya bizi **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)'da **takip edin**.
* **Hacking püf noktalarınızı paylaşarak PR göndererek** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına katkıda bulunun.
</details>
## MacOS İşlem Kötüye Kullanımı
## İşlemler Temel Bilgileri
MacOS, diğer işletim sistemleri gibi **işlemlerin etkileşimde bulunması, iletişim kurması ve veri paylaşması** için çeşitli yöntemler ve mekanizmalar sağlar. Bu teknikler, sistemin verimli çalışması için önemli olsa da, tehdit aktörleri tarafından **kötü amaçlı faaliyetler gerçekleştirmek** için kötüye kullanılabilir.
Bir işlem çalışan bir yürütülebilir dosyanın bir örneğidir, ancak işlemler kod çalıştırmaz, bunlar thread'lerdir. Bu nedenle **işlemler yalnızca çalışan thread'ler için konteynerlerdir**, belleği, tanımlayıcıları, bağlantı noktalarını, izinleri sağlarlar...
### Kütüphane Enjeksiyonu
Geleneksel olarak, işlemler diğer işlemler içinde (PID 1 hariç) **`fork`** çağrısı yaparak başlatılırdı, bu işlem mevcut işlemi tam olarak kopyalayacak 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ı yapacaktı. Daha sonra, bu işlemi hafızayı kopyalamadan daha hızlı hale getirmek için **`vfork`** tanıtıldı.\
Daha sonra **`posix_spawn`** tanıtıldı, **`vfork`** ve **`execve`**'yi bir araya getirerek ve bayrakları kabul ederek:
Kütüphane Enjeksiyonu, bir saldırganın bir işlemi **zararlı bir kütüphane yüklemeye zorladığı** bir tekniktir. Enjekte edildiğinde, kütüphane hedef işlemin bağlamında çalışır, saldırganı işlemle aynı izinler ve erişimle donatır.
* `POSIX_SPAWN_RESETIDS`: Etkili kimlikleri gerçek kimliklere sıfırlar
* `POSIX_SPAWN_SETPGROUP`: İşlem grubu üyeliğini ayarlar
* `POSUX_SPAWN_SETSIGDEF`: Sinyal varsayılan davranışını ayarlar
* `POSIX_SPAWN_SETSIGMASK`: Sinyal maskesini ayarlar
* `POSIX_SPAWN_SETEXEC`: Aynı işlemde yürütme (daha fazla seçenekle `execve` gibi)
* `POSIX_SPAWN_START_SUSPENDED`: Askıya alınmış olarak başlat
* `_POSIX_SPAWN_DISABLE_ASLR`: ASLR olmadan başlat
* `_POSIX_SPAWN_NANO_ALLOCATOR:` libmalloc'ın Nano tahsisatçısını kullan
* `_POSIX_SPAWN_ALLOW_DATA_EXEC:` Veri segmentlerinde `rwx`'e izin ver
* `POSIX_SPAWN_CLOEXEC_DEFAULT`: Varsayılan olarak exec(2) ile tüm dosya tanımlamalarını kapat
* `_POSIX_SPAWN_HIGH_BITS_ASLR:` ASLR kaydırmasının yüksek bitlerini rastgele hale getir
{% content-ref url="macos-library-injection/" %}
[macos-library-injection](macos-library-injection/)
{% endcontent-ref %}
Ayrıca, `posix_spawn` başlatılan işlemin bazı yönlerini kontrol eden bir dizi **`posix_spawnattr`** belirtmeye ve tanımlayıcıların durumunu değiştirmek için **`posix_spawn_file_actions`** kullanmaya olanak tanır.
### Fonksiyon Hooking
Bir işlem öldüğünde, **dönüş kodunu ebeveyn işleme** (ebeveyn öldüyse, yeni ebeveyn PID 1'dir) `SIGCHLD` sinyali ile gönderir. Ebeveyn bu değeri `wait4()` veya `waitid()` çağırarak almalı ve bu gerçekleşene kadar çocuk kaynak tüketmeyen ancak hala listelenen bir zombi durumunda kalır.
Fonksiyon Hooking, bir yazılım kodu içindeki **fonksiyon çağrılarını veya iletileri engelleme**yi içerir. Fonksiyonları kancalamak, bir saldırganın bir işlemin davranışını **değiştirmesine, hassas verileri gözlemlemesine veya hatta yürütme akışını kontrol etmesine** olanak tanır.
### PID'ler
{% content-ref url="macos-function-hooking.md" %}
[macos-function-hooking.md](macos-function-hooking.md)
{% endcontent-ref %}
PID'ler, işlem tanımlayıcıları, benzersiz bir işlemi tanımlar. XNU'da **PID'ler** **64 bit** olup monotonik olarak artar ve **asla sarılmaz** (istismarları önlemek için).
### İşlem Arası İletişim
### İşlem Grupları, Oturumlar ve Koalisyonlar
İşlem Arası İletişim (IPC), ayrı işlemlerin **veri paylaşımı ve değiş tokuşu** yapabileceği farklı yöntemleri ifade eder. IPC, birçok meşru uygulama için temel olmasına rağmen, işlem izolasyonunu alt üst etmek, hassas bilgileri sızdırmak veya yetkisiz eylemler gerçekleştirmek için de kötüye kullanılabilir.
**İşlemler**, onları daha kolay işlemek için gruplara yerleştirilebilir. Örneğin, bir kabuk betiğindeki komutlar aynı işlem grubunda olacak, bu nedenle örneğin kill kullanarak **onlara birlikte sinyal göndermek mümkün olacaktır**.\
Ayrıca, işlemleri **oturumlarda gruplandırmak mümkündür**. Bir işlem bir oturum başlattığında (`setsid(2)`), çocuk işlemler oturumun içine yerleştirilir, kendi oturumlarını başlatmadıkça.
{% content-ref url="macos-ipc-inter-process-communication/" %}
[macos-ipc-inter-process-communication](macos-ipc-inter-process-communication/)
{% endcontent-ref %}
Koalisyon, Darwin'de işlemleri gruplamanın başka bir yoludur. Bir koalisyona katılan bir işlem, havuz kaynaklarına erişim sağlamasına, bir defteri paylaşmasına veya Jetsam ile yüzleşmesine olanak tanır. Koalisyonların farklı rolleri vardır: Lider, XPC hizmeti, Uzantı.
### Electron Uygulamaları Enjeksiyonu
### Kimlik Bilgileri ve Personalar
Belirli çevresel değişkenlerle yürütülen Electron uygulamaları, işlem enjeksiyonuna açık olabilir:
Her işlem, sistemdeki ayrıcalıklarını tanımlayan **kimlik bilgilerini** tutar. Her işlemin birincil `uid` ve birincil `gid`'si olacaktır (ancak birkaç gruba ait olabilir).\
Eğer ikili dosyada `setuid/setgid` biti varsa kullanıcı ve grup kimliğini değiştirmek mümkündür.\
Yeni uid/gid'ler belirlemek için birkaç işlev vardır.
{% content-ref url="macos-electron-applications-injection.md" %}
[macos-electron-applications-injection.md](macos-electron-applications-injection.md)
{% endcontent-ref %}
Syscall **`persona`**, bir **alternatif** kimlik bilgisi kümesi sağlar. Bir persona benimsemek, uid'sini, gid'sini ve grup üyeliklerini **aynı anda** varsaymayı içerir. [**Kaynak kodunda**](https://github.com/apple/darwin-xnu/blob/main/bsd/sys/persona.h) yapıyı bulmak mümkündür.
```c
struct kpersona_info { uint32_t persona_info_version;
uid_t persona_id; /* overlaps with UID */
int persona_type;
gid_t persona_gid;
uint32_t persona_ngroups;
gid_t persona_groups[NGROUPS];
uid_t persona_gmuid;
char persona_name[MAXLOGNAME + 1];
### Chromium Enjeksiyonu
/* TODO: MAC policies?! */
}
```
## İplikler Temel Bilgileri
`--load-extension` ve `--use-fake-ui-for-media-stream` bayraklarını kullanarak **tarayıcıda adam ortasında saldırı** gerçekleştirmek mümkündür; böylece tuş vuruşlarını çalmak, trafiği izlemek, çerezleri çalmak, sayfalara betik enjekte etmek mümkün olabilir:
1. **POSIX İplikler (pthreads):** macOS, C/C++ için standart bir iplik API'si olan POSIX iplikleri (`pthreads`) destekler. macOS'taki pthreads uygulaması, `/usr/lib/system/libsystem_pthread.dylib` içinde bulunur ve genelde bulunan `libpthread` projesinden gelir. Bu kütüphane iplik oluşturmak ve yönetmek için gerekli işlevleri sağlar.
2. **İplik Oluşturma:** Yeni iplikler oluşturmak için `pthread_create()` işlevi kullanılır. Bu işlev, içsel olarak `bsdthread_create()` işlevini çağırır, bu işlev XNU çekirdeğine (macOS'un temel aldığı çekirdek) özgü düşük seviyeli bir sistem çağrısıdır. Bu sistem çağrısı, iplik davranışını belirleyen `pthread_attr` (öznitelikler) türetilmiş çeşitli bayrakları alır, bu davranışlar arasında zamanlama politikaları ve yığın boyutu bulunur.
* **Varsayılan Yığın Boyutu:** Yeni iplikler için varsayılan yığın boyutu 512 KB'dir, tipik işlemler için yeterli olsa da daha fazla veya daha az alan gerekiyorsa iplik öznitelikleri aracılığıyla ayarlanabilir.
3. **İplik Başlatma:** `__pthread_init()` işlevi, iplik kurulumu sırasında önemlidir ve `env[]` argümanını kullanarak yığının konumu ve boyutu gibi ayrıntıları içerebilen çevre değişkenlerini ayrıştırmak için kullanılır.
{% content-ref url="macos-chromium-injection.md" %}
[macos-chromium-injection.md](macos-chromium-injection.md)
{% endcontent-ref %}
#### macOS'ta İplik Sonlandırma
### Kirli NIB
1. **İpliklerin Sonlandırılması:** İplikler genellikle `pthread_exit()` çağrılarak sonlandırılır. Bu işlev, bir ipliğin temiz bir şekilde çıkmasına izin verir, gerekli temizliği yapar ve ipliği bekleyenlere bir dönüş değeri göndermesine olanak tanır.
2. **İplik Temizliği:** `pthread_exit()` çağrıldığında, `pthread_terminate()` işlevi çağrılır ve tüm ilişkili iplik yapılarının kaldırılmasını ele alır. Bu işlev, Mach iplik bağlantı noktalarını (Mach, XNU çekirdeğindeki iletişim alt sistemi) serbest bırakır ve iplikle ilişkili çekirdek düzeyindeki yapıları kaldıran `bsdthread_terminate` sistem çağrısını yapar.
NIB dosyaları, bir uygulama içindeki **kullanıcı arayüzü (UI) öğelerini ve etkileşimlerini tanımlar**. Bununla birlikte, NIB dosyaları **keyfi komutlar yürütebilir** ve bir **NIB dosyası değiştirilmişse**, Gatekeeper bir kez yürütülen bir uygulamanın tekrar yürütülmesini engellemez. Bu nedenle, keyfi programların keyfi komutları yürütmesi için kullanılabilirler:
#### Senkronizasyon Mekanizmaları
{% content-ref url="macos-dirty-nib.md" %}
[macos-dirty-nib.md](macos-dirty-nib.md)
{% endcontent-ref %}
Paylaşılan kaynaklara erişimi yönetmek ve yarış koşullarını önlemek için macOS, birkaç senkronizasyon ilkelini sağlar. Bu, veri bütünlüğünü ve sistem kararlılığını sağlamak için çoklu iplik ortamlarında kritiktir:
### Java Uygulamaları Enjeksiyonu
1. **Müteksinler:**
* **Normal Müteksin (İmza: 0x4D555458):** 56 bayt için müteksin ve 4 bayt için imza olmak üzere 60 bayt boyutunda standart müteksin.
* **Hızlı Müteksin (İmza: 0x4d55545A):** Normal müteksine benzer ancak daha hızlı işlemler için optimize edilmiş, aynı zamanda 60 bayt boyutundadır.
2. **Durum Değişkenleri:**
* Belirli koşulların gerçekleşmesini beklemek için kullanılır, 40 bayt artı 4 bayt imza ile 44 bayt boyutundadır.
* **Durum Değişkeni Öznitelikleri (İmza: 0x434e4441):** Durum değişkenleri için yapılandırma öznitelikleri, 12 bayt boyutundadır.
3. **Bir Kez Değişkeni (İmza: 0x4f4e4345):**
* Başlatma kodunun yalnızca bir kez yürütülmesini sağlar. Boyutu 12 bayttır.
4. **Okuma-Yazma Kilidi:**
* Aynı anda birden fazla okuyucuya veya bir yazıcıya izin verir, paylaşılan verilere verimli erişimi kolaylaştırır.
* **Okuma Yazma Kilidi (İmza: 0x52574c4b):** 196 bayt boyutundadır.
* **Okuma Yazma Kilidi Öznitelikleri (İmza: 0x52574c41):** Okuma-yazma kilitleri için öznitelikler, 20 bayt boyutundadır.
Belirli java yeteneklerini (örneğin **`_JAVA_OPTS`** çevresel değişkeni) kötüye kullanarak bir java uygulamasının **keyfi kod/komutları yürütmesi mümkündür**.
{% hint style="success" %}
Bu nesnelerin son 4 baytı taşmaları algılamak için kullanılır.
{% endhint %}
{% content-ref url="macos-java-apps-injection.md" %}
[macos-java-apps-injection.md](macos-java-apps-injection.md)
{% endcontent-ref %}
### İplik Yerel Değişkenler (TLV)
### .Net Uygulamaları Enjeksiyonu
**İplik Yerel Değişkenler (TLV)**, macOS'ta yürütülebilir dosyalar için biçim olan Mach-O dosyaları bağlamında, çoklu iplikli bir uygulamadaki **her iplik** için özgü değişkenleri bildirmek için kullanılır. Bu, her ipliğin kendi ayrı değişken örneğine sahip olduğundan çakışmaları önlemek ve müteksinler gibi açık senkronizasyon mekanizmalarına gerek duymadan veri bütünlüğünü korumak için bir yol sağlar.
.Net uygulamalarına kod enjekte etmek, macOS korumaları tarafından (çalışma zamanı sıkılaştırma gibi) korunmayan **.Net hata ayıklama işlevselliğini kötüye kullanarak mümkündür**.
C ve ilgili dillerde, bir iplik yerel değişkeni **`__thread`** anahtar kelimesini kullanarak bildirebilirsiniz. İşte örneğinizde nasıl çalıştığı:
```c
cCopy code__thread int tlv_var;
{% content-ref url="macos-.net-applications-injection.md" %}
[macos-.net-applications-injection.md](macos-.net-applications-injection.md)
{% endcontent-ref %}
void main (int argc, char **argv){
tlv_var = 10;
}
```
Bu parça, `tlv_var`'ı bir iş parçacığı yerel değişkeni olarak tanımlar. Bu kodu çalıştıran her iş parçacığı kendi `tlv_var`'ına sahip olacak ve bir iş parçacığının `tlv_var`'ına yaptığı değişiklikler diğer bir iş parçacığındaki `tlv_var`'ı etkilemeyecektir.
### Perl Enjeksiyonu
Mach-O ikilisinde, iş parçacığı yerel değişkenlerle ilgili veriler belirli bölümlere düzenlenmiştir:
Bir Perl betiğinin keyfi kod yürütmesini sağlamak için farklı seçenekleri kontrol edin:
* **`__DATA.__thread_vars`**: Bu bölüm, iş parçacığı yerel değişkenleri hakkında metadata içerir, türleri ve başlatma durumları gibi.
* **`__DATA.__thread_bss`**: Bu bölüm, açıkça başlatılmamış iş parçacığı yerel değişkenleri için kullanılır. Sıfırlanmış veriler için ayrılan belleğin bir parçasıdır.
{% content-ref url="macos-perl-applications-injection.md" %}
[macos-perl-applications-injection.md](macos-perl-applications-injection.md)
{% endcontent-ref %}
Mach-O ayrıca bir iş parçacığı çıkış yaptığında iş parçacığı yerel değişkenlerini yönetmek için **`tlv_atexit`** adında özel bir API sağlar. Bu API, bir iş parçacığı sonlandığında iş parçacığı yerel verilerini temizleyen özel fonksiyonları **kaydetmenize** olanak tanır.
### Ruby Enjeksiyonu
### İş Parçacığı Öncelikleri
Keyfi betiklerin keyfi kod yürütmesi için ruby çevresel değişkenlerinin kötüye kullanılması mümkündür:
İş parçacığı önceliklerini anlamak, işletim sisteminin hangi iş parçacıklarını çalıştıracağına ve ne zaman çalıştıracağına karar verirken bakılması gereken konuları içerir. Bu karar, her iş parçacığına atanan öncelik seviyesinden etkilenir. macOS ve Unix benzeri sistemlerde, bu kavramlar `nice`, `renice` ve Kalite Hizmeti (QoS) sınıfları gibi kavramlar kullanılarak ele alınır.
{% content-ref url="macos-ruby-applications-injection.md" %}
[macos-ruby-applications-injection.md](macos-ruby-applications-injection.md)
{% endcontent-ref %}
#### Nice ve Renice
1. **Nice:**
* Bir işlemin `nice` değeri, önceliğini etkileyen bir numaradır. Her işlem, genellikle 0 olan -20 (en yüksek öncelik) ile 19 (en düşük öncelik) arasında değişen bir güzel değere sahiptir. Bir işlem oluşturulduğunda varsayılan güzel değer genellikle 0'dır.
* Daha düşük bir güzel değer (-20'ye daha yakın) bir işlemi daha "bencil" yapar, yani diğer işlemlere göre daha fazla CPU zamanı verir.
2. **Renice:**
* `renice`, zaten çalışan bir işlemin güzel değerini değiştirmek için kullanılan bir komuttur. Bu, işlemlerin önceliğini dinamik olarak ayarlamak için kullanılabilir, yeni güzel değerlere göre CPU zamanı tahsisini artırarak veya azaltarak işlemlerin önceliğini ayarlamak için kullanılabilir.
* Örneğin, bir işlemin geçici olarak daha fazla CPU kaynağına ihtiyacı varsa, `renice` kullanarak güzel değerini düşürebilirsiniz.
#### Kalite Hizmeti (QoS) Sınıfları
QoS sınıfları, özellikle **Grand Central Dispatch (GCD)** gibi sistemleri destekleyen macOS gibi sistemlerde iş parçacığı önceliklerini ele almanın daha modern bir yaklaşımıdır. QoS sınıfları, işin önemine veya aciliyetine göre farklı seviyelere kategorize etmeye olanak tanır. macOS, bu QoS sınıflarına dayanarak iş parçacığı önceliğini otomatik olarak yönetir:
1. **Kullanıcı Etkileşimli:**
* Bu sınıf, şu anda kullanıcıyla etkileşimde olan veya iyi bir kullanıcı deneyimi sağlamak için hemen sonuçlar gerektiren görevler içindir. Bu görevler, arayüzün yanıt vermesini sağlamak için en yüksek önceliği alır (örneğin, animasyonlar veya etkinlik işleme).
2. **Kullanıcı Başlatılan:**
* Kullanıcının başlattığı ve hemen sonuçlar beklediği görevler, belge açma veya hesaplama gerektiren bir düğmeye tıklama gibi. Bunlar yüksek öncelikli ancak kullanıcı etkileşimli görevlerin altındadır.
3. **Yardımcı:**
* Bu görevler uzun süre çalışır ve genellikle bir ilerleme göstergesi gösterir (örneğin, dosyaları indirme, veri içe aktarma). Kullanıcı başlatılan görevlerden daha düşük önceliğe sahiptir ve hemen bitmesi gerekmez.
4. **Arka Plan:**
* Bu sınıf, arka planda çalışan ve kullanıcı tarafından görülmeyen görevler içindir. Bunlar dizinleme, senkronizasyon veya yedekleme gibi görevler olabilir. En düşük önceliğe sahiptirler ve sistem performansı üzerinde minimal etkiye sahiptirler.
QoS sınıflarını kullanarak, geliştiricilerin kesin öncelik numaralarını yönetmeleri gerekmez, ancak görevin doğasına odaklanabilirler ve sistem CPU kaynaklarını buna göre optimize eder.
Ayrıca, **iş parçacığı zamanlama politikaları** adında farklı zamanlama politikaları vardır, bu politikaların dikkate alınacak bir dizi zamanlama parametresini belirtmek için akışlar sağlar. Bu, `thread_policy_[set/get]` kullanılarak yapılabilir. Bu, yarış koşulu saldırılarında faydalı olabilir.
### Python Enjeksiyonu
Eğer **`PYTHONINSPECT`** çevresel değişkeni ayarlanmışsa, python işlemi tamamlandığında bir python cli'ye düşer. Ayrıca etkileşimli bir oturumun başında yürütülecek bir python betiğini belirtmek için **`PYTHONSTARTUP`** kullanılabilir.\
Ancak, **`PYTHONSTARTUP`** betiği, **`PYTHONINSPECT`** etkileşimli oturum oluşturduğunda yürütülmeyecektir.
Eğer **`PYTHONINSPECT`** ortam değişkeni ayarlanmışsa, python işlemi tamamlandığında bir python komut satırına düşer. Ayrıca, etkileşimli bir oturumun başında yürütülecek bir python betiğini belirtmek için **`PYTHONSTARTUP`** kullanmak da mümkündür.\
Ancak, **`PYTHONINSPECT`** etkileşimli oturum oluşturduğunda **`PYTHONSTARTUP`** betiği yürütülmeyecektir.
**`PYTHONPATH`** ve **`PYTHONHOME`** gibi diğer çevresel değişkenler de bir python komutunun keyfi kod yürütmesi için kullanışlı olabilir.
**`PYTHONPATH`** ve **`PYTHONHOME`** gibi diğer ortam değişkenleri de bir python komutunun keyfi kodu yürütmesini sağlamak için kullanışlı olabilir.
**`pyinstaller`** ile derlenen yürütülebilir dosyalar, gömülü bir python kullanıyor olsalar bile, bu çevresel değişkenleri kullanmayacaktır.
**`pyinstaller`** ile derlenen yürütülebilir dosyalar, gömülü bir python kullanıyor olsalar bile bu ortam değişkenlerini kullanmayacaktır.
{% hint style="danger" %}
Genel olarak, çevresel değişkenleri kötüye kullanarak python'un keyfi kod yürütmesini sağlayacak bir yol bulamadım.\
Ancak, çoğu insan **Hombrew** kullanarak python yükler, bu da python'u varsayılan yönetici kullanıcı için **yazılabilir bir konuma** yükler. Bunu şöyle ele geçirebilirsiniz:
Genel olarak, ortam değişkenlerini kötüye kullanarak python'un keyfi kod yürütmesini sağlayacak bir yol bulamadım.\
Ancak, insanların çoğu **Hombrew** kullanarak python'u yükler, bu da python'u varsayılan yönetici kullanıcısı için bir **yazılabilir konuma** yükler. Bunu şu şekilde ele geçirebilirsiniz:
```bash
mv /opt/homebrew/bin/python3 /opt/homebrew/bin/python3.old
cat > /opt/homebrew/bin/python3 <<EOF
@ -128,13 +181,13 @@ chmod +x /opt/homebrew/bin/python3
- **Çevresel Değişkenler Kullanarak**: Aşağıdaki çevresel değişkenlerin varlığını izleyecektir: **`DYLD_INSERT_LIBRARIES`**, **`CFNETWORK_LIBRARY_PATH`**, **`RAWCAMERA_BUNDLE_PATH`** ve **`ELECTRON_RUN_AS_NODE`**
- **`task_for_pid`** çağrıları Kullanarak: Bir işlemin başka bir işlemin **görev bağlantı noktasını almak istediğinde** (bu, işleme kod enjekte etmeyi sağlar) bulunur.
- **Electron uygulama parametreleri**: Birisi bir Electron uygulamasını hata ayıklama modunda başlatmak ve böylece kod enjekte etmek için **`--inspect`**, **`--inspect-brk`** ve **`--remote-debugging-port`** komut satırı argümanlarını kullanabilir.
- **Sembolik bağlantılar** veya **sabit bağlantılar** Kullanarak: Genellikle en yaygın kötüye kullanım, **kullanıcı ayrıcalıklarımızla bir bağlantı oluşturmak** ve **daha yüksek ayrıcalıklı bir konuma işaret etmek**tir. Hem sabit bağlantılar hem de sembolik bağlantılar için tespit çok basittir. Bağlantıyı oluşturan işlem hedef dosyadan **farklı bir ayrıcalık seviyesine** sahipse, 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 hedef hakkında bilgiye sahip değiliz. Bu, Apple'ın EndpointSecuriy çerçevesinin bir kısıtlamasıdır.
- **Sembolik bağlantılar** veya **sabit bağlantılar** Kullanarak: Genellikle en yaygın kötüye kullanım, **kullanıcı ayrıcalıklarımızla bir bağlantı oluşturmak** ve **daha yüksek ayrıcalıklı bir konuma işaret etmek**tir. Hem sabit bağlantılar hem de sembolik bağlantılar için tespit çok basittir. Bağlantıyı oluşturan işlem hedef dosyadan **farklı bir ayrıcalık seviyesine** sahipse, bir **uyarı** oluştururuz. Ne yazık ki sembolik bağlantıların engellenmesi mümkün değildir, çünkü bağlantının oluşturulmasından önce bağlantının hedefi hakkında bilgiye sahip değiliz. Bu, Apple'ın EndpointSecuriy çerçevesinin bir kısıtlamasıdır.
### Diğer işlemler tarafından yapılan çağrılar
[**Bu blog yazısında**](https://knight.sc/reverse%20engineering/2019/04/15/detecting-task-modifications.html) işlemlerin bir işleme kod enjekte ettiği bilgileri almak ve ardından o diğer işlem hakkında bilgi almak için **`task_name_for_pid`** işlevini nasıl kullanabileceğinizi bulabilirsiniz.
Bu [**blog yazısında**](https://knight.sc/reverse%20engineering/2019/04/15/detecting-task-modifications.html) işlemi çalıştıran başka bir işlem tarafından kod enjekte eden işlemler hakkında bilgi almak için **`task_name_for_pid`** işlevini nasıl kullanabileceğinizi bulabilirsiniz ve ardından o diğer işlem hakkında bilgi alabilirsiniz.
Bu işlevi çağırmak için işlemi çalıştıran kişiyle **aynı uid** olmanız veya **root** olmanız gerekir (ve bu işlem, kod enjekte etme yöntemi değil, işlem hakkında bilgi döndürür).
Bu işlevi çağırmak için işlemi çalıştıran kişiyle **aynı uid** olmanız veya **root** olmanız gerekir (ve bu işlem, kod enjekte etmenin bir yolu değil, işlem hakkında bilgi döndürür).
## Referanslar