mirror of
https://github.com/carlospolop/hacktricks
synced 2025-02-16 14:08:26 +00:00
Translated ['macos-hardening/macos-security-and-privilege-escalation/mac
This commit is contained in:
parent
d2f4e17f4a
commit
356539e295
2 changed files with 207 additions and 514 deletions
|
@ -1,26 +1,26 @@
|
|||
# macOS IPC - Inter Process Communication
|
||||
# macOS IPC - İşlem Arası İletişim
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>AWS hacklemeyi sıfırdan kahraman olmaya öğ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 hackleme konusunda sıfırdan kahraman olmaya kadar öğ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!
|
||||
* **Şirketinizi HackTricks'te reklamını görmek istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARI**]'na (https://github.com/sponsors/carlospolop) göz atın!
|
||||
* [**Resmi PEASS & HackTricks ürünlerini**](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
|
||||
* **Katılın** 💬 [**Discord grubumuza**](https://discord.gg/hRep4RUj7f) veya [**telegram grubumuza**](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.
|
||||
* [**PEASS Ailesi'ni**](https://opensea.io/collection/the-peass-family) keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuz
|
||||
* 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) katılın veya bizi **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)'da **takip edin**.
|
||||
* **Hacking püf noktalarınızı göndererek HackTricks** ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına PR göndererek paylaşın.
|
||||
|
||||
</details>
|
||||
|
||||
## Mach mesajlaşması Portlar aracılığıyla
|
||||
## Portlar Aracılığıyla Mach Mesajlaşması
|
||||
|
||||
### Temel Bilgiler
|
||||
|
||||
Mach, kaynakları paylaşmak için **görevleri** en **küçük birim** olarak kullanır ve her görev **çoklu iş parçacığı** içerebilir. Bu **görevler ve iş parçacıkları POSIX işlemlerine ve iş parçacıklarına 1:1 eşlenir**.
|
||||
Mach, kaynakları paylaşmak için **görevleri** en **küçük birim** olarak kullanır ve her görev **çoklu iş parçacığı** içerebilir. Bu **görevler ve iş parçacıkları POSIX işlemleri ve iş parçacıklarına 1:1 olarak eşlenir**.
|
||||
|
||||
Görevler arasındaki iletişim, Mach Arası İşlem İletişimi (IPC) aracılığıyla gerçekleşir ve bir yönlü iletişim kanallarını kullanır. **Mesajlar portlar arasında aktarılır**, bu portlar çekirdek tarafından yönetilen bir tür **mesaj kuyruğu** gibi davranır.
|
||||
Görevler arasındaki iletişim, Mach İşlem Arası İletişim (IPC) aracılığıyla gerçekleşir ve tek yönlü iletişim kanallarını kullanır. **Mesajlar portlar arasında aktarılır**, bu portlar çekirdek tarafından yönetilen bir tür **mesaj kuyruğu** gibi davranır.
|
||||
|
||||
Bir **port**, Mach IPC'nin temel öğesidir. Bu, **mesaj göndermek ve almak** için kullanılabilir.
|
||||
|
||||
|
@ -32,52 +32,52 @@ Bir işlem ayrıca bir port adını bazı haklarla **farklı bir göreve gönder
|
|||
|
||||
Bir görevin yapabileceği işlemleri tanımlayan port hakları, bu iletişimde önemlidir. Mümkün olan **port hakları** şunlardır ([buradan tanımlamalar](https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html)):
|
||||
|
||||
* **Alma hakkı**, porta gönderilen mesajları almayı sağlar. Mach portları MPSC (çoklu üretici, tek tüketici) kuyruklarıdır, bu da demektir ki tüm sistemde bir port için yalnızca **bir alma hakkı olabilir** (borularla, birden fazla işlemin bir borunun okuma ucuna dosya tanımlayıcıları tutabileceği durumun aksine).
|
||||
* **Alma hakkı**, porta gönderilen mesajları almayı sağlar. Mach portları MPSC (çoklu üretici, tek tüketici) kuyruklarıdır, bu da demektir ki tüm sistemde bir port için yalnızca **bir alma hakkı olabilir** (borular gibi, burada birden fazla işlemin aynı borunun okuma ucuna dosya tanımlayıcıları tutabileceği gibi).
|
||||
* **Alma hakkına sahip bir görev**, mesajları alabilir ve **Gönderme hakları oluşturabilir**, böylece mesaj gönderebilir. Başlangıçta yalnızca **kendi görevi kendi portu üzerinde Alma hakkına sahiptir**.
|
||||
* Alma hakkının sahibi **öldüğünde** veya onu sonlandırdığında, **gönderme hakkı işlevsiz hale gelir (ölü ad).**
|
||||
* Alma hakkının sahibi **öldüğünde** veya onu sonlandırdığında, **gönderme hakkı işlevsiz hale gelir (ölü ad)**.
|
||||
* **Gönderme hakkı**, porta mesaj göndermeyi sağlar.
|
||||
* Gönderme hakkı **klonlanabilir**, böylece bir Gönderme hakkına sahip bir görev, hakkı klonlayabilir ve **üçüncü bir göreve verebilir**.
|
||||
* Gönderme hakkı **klonlanabilir**, böylece gönderme hakkına sahip bir görev hakkı klonlayabilir ve **üçüncü bir göreve verilebilir**.
|
||||
* **Port hakları** ayrıca Mac mesajları aracılığıyla da **geçirilebilir**.
|
||||
* **Bir kez gönderme hakkı**, porta bir mesaj göndermeyi ve ardından kaybolmayı sağlar.
|
||||
* Bu hak **klonlanamaz**, ancak **taşınabilir**.
|
||||
* **Port kümesi hakkı**, yalnızca tek bir port değil bir _port kümesini_ belirtir. Bir port kümesinden bir mesaj çıkarmak, içerdiği portlardan birinden bir mesaj çıkarır. Port kümeleri, Unix'teki `select`/`poll`/`epoll`/`kqueue` gibi aynı anda birkaç portu dinlemek için kullanılabilir.
|
||||
* **Ölü ad**, gerçek bir port hakkı değil, yalnızca bir yer tutucudur. Bir port yok edildiğinde, portun tüm var olan port hakları ölü adlara dönüşür.
|
||||
* **Port kümesi hakkı**, yalnızca tek bir port değil bir _port kümesini_ belirtir. Bir port kümesinden bir mesaj çıkarmak, içerdiği portlardan birinden bir mesaj çıkarır. Port kümeleri, Unix'teki `select`/`poll`/`epoll`/`kqueue` gibi birkaç porta aynı anda dinlemek için kullanılabilir.
|
||||
* **Ölü ad**, gerçek bir port hakkı değil, yalnızca bir yer tutucudur. Bir port yok edildiğinde, portun tüm varolan port hakları ölü adlara dönüşür.
|
||||
|
||||
**Görevler, SEND haklarını başkalarına aktarabilir**, böylece onlara geri mesaj gönderme yeteneği kazandırabilir. **SEND hakları da klonlanabilir**, böylece bir görev hakkı kopyalayabilir ve **üçüncü bir göreve verebilir**. Bu, **aracı bir süreç olan** **başlangıç sunucusu** ile birlikte, görevler arasında etkili iletişim sağlar.
|
||||
**Görevler, SEND haklarını başkalarına aktarabilir**, böylece onlara geri mesaj göndermelerini sağlar. **SEND hakları da klonlanabilir**, böylece bir görev hakkı kopyalayabilir ve hakkı **üçüncü bir göreve verebilir**. Bu, **aracı bir süreç olan** **başlangıç sunucusu** ile birlikte, görevler arasında etkili iletişim sağlar.
|
||||
|
||||
### Dosya Portları
|
||||
|
||||
Dosya portları, dosya tanımlayıcılarını Mac portlarına (Mach port haklarını kullanarak) kapsüllüyor. Belirli bir FD'den bir `fileport` oluşturmak için `fileport_makeport` kullanarak ve bir FD oluşturmak için `fileport_makefd` kullanarak mümkündür.
|
||||
Dosya portları, dosya tanımlayıcılarını Mac portlarına (Mach port haklarını kullanarak) kapsüllüyebilir. Belirli bir FD'den `fileport_makeport` kullanarak bir `fileport` oluşturmak ve bir FD oluşturmak mümkündür.
|
||||
|
||||
### İletişim Kurma
|
||||
|
||||
Önceden belirtildiği gibi, Mach mesajları aracılığıyla hakları göndermek mümkündür, ancak **zaten bir mesaj gönderme hakkına sahip olmadan bir hakkı gönderemezsiniz**. Peki, ilk iletişim nasıl kurulur?
|
||||
Daha önce belirtildiği gibi, Mach mesajları aracılığıyla hakları göndermek mümkündür, ancak **zaten bir Mach mesajı gönderme hakkına sahip olmadan bir hakkı gönderemezsiniz**. Peki, ilk iletişim nasıl kurulur?
|
||||
|
||||
Bunun için **başlangıç sunucusu** (**mac'te launchd**) devreye girer, çünkü **herkes başlangıç sunucusuna bir SEND hakkı alabilir**, böylece başka bir işleme mesaj göndermek için bir hakkı istemek mümkündür:
|
||||
|
||||
1. Görev **A**, **ALMA hakkı** alarak **yeni bir port oluşturur**.
|
||||
2. ALMA hakkının sahibi olan Görev **A**, port için bir **GÖNDERME hakkı oluşturur**.
|
||||
3. Görev **A**, **başlangıç sunucusu** ile bir **bağlantı kurar** ve başlangıçta oluşturduğu porta **GÖNDERME hakkını gönderir**.
|
||||
1. Görev **A**, **ALMA hakkına sahip yeni bir port oluşturur**.
|
||||
2. ALMA hakkının sahibi olan Görev **A**, port için **GÖNDERME hakkı oluşturur**.
|
||||
3. Görev **A**, **başlangıç sunucusu** ile bir **bağlantı kurar** ve başlangıçta oluşturduğu port için **GÖNDERME hakkını sunucuya gönderir**.
|
||||
* Unutmayın ki herkes başlangıç sunucusuna bir GÖNDERME hakkı alabilir.
|
||||
4. Görev A, başlangıç sunucusuna bir `bootstrap_register` mesajı göndererek verilen porta `com.apple.taska` gibi bir **isimle ilişkilendirir**.
|
||||
5. Görev **B**, **başlangıç sunucusu** ile etkileşime girerek bir başlangıç **hizmeti için arama yapar** (`bootstrap_lookup`). Başlangıç sunucusu yanıt verebilsin diye, görev B, arama mesajı içinde önceden oluşturduğu bir **port için bir GÖNDERME hakkı gönderir**. Arama başarılı olursa, **sunucu Task A'dan aldığı SEND hakkını kopyalar ve Task B'ye iletir**.
|
||||
5. Görev **B**, hizmet adı için bir başlangıç **araması yapmak üzere başlangıç sunucusu** ile etkileşime girer (`bootstrap_lookup`). Başlangıç sunucusu yanıt verebilsin diye, görev B, arama mesajı içinde önceden oluşturduğu bir **port için bir GÖNDERME hakkı gönderir**. Arama başarılı olursa, **sunucu Görev A'dan aldığı GÖNDERME hakkını kopyalar ve Görev B'ye iletir**.
|
||||
* Unutmayın ki herkes başlangıç sunucusuna bir GÖNDERME hakkı alabilir.
|
||||
6. Bu SEND hakkı ile **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ı içeren yeni bir port oluşturur ve **Görev A'ya GÖNDERME hakkını verir** böylece Görev A, GÖREV B'ye mesaj gönderebilir (iki yönlü iletişim).
|
||||
6. Bu GÖNDERME hakkı ile **Görev B**, **Görev A'ya bir mesaj gönderebilir**.
|
||||
7. İki yönlü bir iletişim için genellikle görev **B**, bir **ALMA** hakkı ve bir **GÖNDERME** hakkı olan yeni bir port oluşturur ve **Görev A'ya GÖNDERME hakkını verir**, böylece Görev A, GÖREV B'ye mesaj gönderebilir (iki yönlü iletişim).
|
||||
|
||||
Başlangıç sunucusu, bir görevin iddia ettiği hizmet adını **kimlik doğrulayamaz**. Bu, bir **görevin** potansiyel olarak **herhangi bir sistem görevini taklit edebileceği** anlamına gelir, örneğin yanlışlıkla **bir yetkilendirme hizmeti adını iddia edebilir** ve ardından her isteği onaylayabilir.
|
||||
Başlangıç sunucusu, bir görevin iddia ettiği hizmet adını kimlik doğrulayamaz. Bu, bir görevin potansiyel olarak **herhangi bir sistem görevini taklit edebileceği** anlamına gelir, örneğin yanlışlıkla **bir yetkilendirme hizmet adını iddia edebilir** ve ardından 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 korumalı** dizinlerde bulunur: `/System/Library/LaunchDaemons` ve `/System/Library/LaunchAgents`. Her hizmet adının yanında, **ilişkili ikili dosya da saklanır**. Başlangıç sunucusu, bu hizmet adları için her biri için bir **ALMA hakkı oluşturur ve saklar**.
|
||||
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ının yanında **ilişkili ikili dosya da saklanır**. Başlangıç sunucusu, bu hizmet adları için her biri için bir **ALMA hakkı oluşturur ve saklar**.
|
||||
|
||||
Bu önceden tanımlanmış hizmetler için, **arama süreci biraz farklıdır**. Bir hizmet adı aranırken, launchd hizmeti dinamik olarak başlatır. Yeni iş akışı şöyle:
|
||||
|
||||
* Görev **B**, bir hizmet adı için başlangıç **araması başlatır**.
|
||||
* Görev **B**, bir hizmet adı için bir başlangıç **araması 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 **başlangıç kontrolü gerçekleştirir** (`bootstrap_check_in()`). Burada, **başlangıç** sunucusu bir GÖNDERME hakkı oluşturur, saklar ve **ALMA hakkını Görev A'ya aktarır**.
|
||||
* launchd, **Görev B'ye SEND hakkını kopyalar ve iletir**.
|
||||
* Görev **B**, bir **ALMA** hakkı ve bir **GÖNDERME** hakkı içeren yeni bir port oluşturur ve **Görev A'ya GÖNDERME hakkını verir** (hizmet) böylece Görev A, GÖREV B'ye mesaj gönderebilir (iki yönlü iletişim).
|
||||
* Görev **A** (hizmet), bir **başlangıç kontrolü gerçekleştirir** (`bootstrap_check_in()`). Burada, **başlangıç sunucusu bir GÖNDERME hakkı oluşturur, saklar ve ALMA hakkını Görev A'ya aktarır**.
|
||||
* launchd, **GÖNDERME hakkını kopyalar ve Görev B'ye iletir**.
|
||||
* Görev **B**, bir **ALMA** hakkı ve bir **GÖNDERME** hakkı olan yeni bir port oluşturur ve **Görev A'ya GÖNDERME hakkını verir** (hizmet), böylece Görev A, 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 hala önceki şekilde çalışır, bu da taklit edilme olasılığına izin verebilir.
|
||||
Ancak, bu süreç yalnızca önceden tanımlanmış sistem görevleri için geçerlidir. Sistem dışı görevler hala önceki şekilde çalışır, bu da taklit edilmesine olanak tanıyabilir.
|
||||
|
||||
{% hint style="danger" %}
|
||||
Bu nedenle, launchd asla çökmemeli veya tüm sistem çökecektir.
|
||||
|
@ -86,7 +86,7 @@ Bu nedenle, launchd asla çökmemeli veya tüm sistem çökecektir.
|
|||
|
||||
[Daha fazla bilgiyi burada bulabilirsiniz](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/)
|
||||
|
||||
`mach_msg` işlevi, temelde bir sistem çağrısı olan Mach iletilerini göndermek ve almak için kullanılır. İşlev, gönderilecek iletiyi başlangıç argümanı olarak gerektirir. Bu ileti, bir `mach_msg_header_t` yapısı ile başlamalıdır ve ardından gerçek ileti içeriği gelmelidir. Yapı aşağıdaki gibi tanımlanmıştır:
|
||||
`mach_msg` işlevi, temelde bir sistem çağrısı olan Mach iletilerini göndermek ve almak için kullanılır. İşlev, iletilmesi gereken iletiyi başlangıç argümanı olarak gerektirir. Bu ileti, bir `mach_msg_header_t` yapısı ile başlamalı ve ardından gerçek ileti içeriği gelmelidir. Yapı aşağıdaki gibi tanımlanmıştır:
|
||||
```c
|
||||
typedef struct {
|
||||
mach_msg_bits_t msgh_bits;
|
||||
|
@ -97,17 +97,17 @@ mach_port_name_t msgh_voucher_port;
|
|||
mach_msg_id_t msgh_id;
|
||||
} mach_msg_header_t;
|
||||
```
|
||||
İşlemler bir _**alma hakkına**_ sahip olduklarında, bir Mach bağlantı noktasında mesaj alabilirler. Tersine, **gönderenler** bir _**gönderme hakkı**_ veya bir _**bir kez gönderme hakkı**_ alırlar. Bir kez gönderme hakkı yalnızca bir mesaj göndermek için kullanılır, ardından geçersiz hale gelir.
|
||||
İşlemciler, bir Mach bağlantı noktasında ileti alabilen bir _**alma hakkına**_ sahip olabilirler. Tersine, **gönderenler** bir _**gönderme hakkı**_ veya bir _**bir kez gönderme hakkı**_ alırlar. Bir kez gönderme hakkı yalnızca bir ileti göndermek için kullanılır, ardından geçersiz hale gelir.
|
||||
|
||||
Başlangıç alanı **`msgh_bits`** bir bit haritasıdır:
|
||||
Başlangıç alanı **`msgh_bits`** bir bit eşlemidir:
|
||||
|
||||
* İlk bit (en anlamlı) bir mesajın karmaşık olduğunu belirtmek için kullanılır (aşağıda daha fazla bilgi)
|
||||
* İlk bit (en anlamlı) bir ileti'nin karmaşık olduğunu belirtmek için kullanılır (aşağıda daha fazla bilgi)
|
||||
* 3. ve 4. bitler çekirdek tarafından kullanılır
|
||||
* 2. baytın **en az 5 anlamlı bitsi** **makbuz** için kullanılabilir: anahtar/değer kombinasyonları göndermek için başka bir bağlantı nokta türü.
|
||||
* 3. baytın **en az 5 anlamlı bitsi** **yerel bağlantı noktası** için kullanılabilir
|
||||
* 4. baytın **en az 5 anlamlı bitsi** **uzak bağlantı noktası** için kullanılabilir
|
||||
* 2. baytın **en az 5 anlamlı bits**i **fiş**: başka bir tür anahtar/değer kombinasyonu göndermek için kullanılabilir.
|
||||
* 3. baytın **en az 5 anlamlı bits**i **yerel bağlantı noktası** için kullanılabilir
|
||||
* 4. baytın **en az 5 anlamlı bits**i **uzak bağlantı noktası** için kullanılabilir
|
||||
|
||||
Makbuzda, yerel ve uzak bağlantı noktalarında belirtilebilecek türler [**mach/message.h**](https://opensource.apple.com/source/xnu/xnu-7195.81.3/osfmk/mach/message.h.auto.html) adresinden alınabilir:
|
||||
Fiş, yerel ve uzak bağlantı noktalarında belirtilebilecek türler (kaynak: [**mach/message.h**](https://opensource.apple.com/source/xnu/xnu-7195.81.3/osfmk/mach/message.h.auto.html)):
|
||||
```c
|
||||
#define MACH_MSG_TYPE_MOVE_RECEIVE 16 /* Must hold receive right */
|
||||
#define MACH_MSG_TYPE_MOVE_SEND 17 /* Must hold send right(s) */
|
||||
|
@ -120,34 +120,34 @@ Makbuzda, yerel ve uzak bağlantı noktalarında belirtilebilecek türler [**mac
|
|||
#define MACH_MSG_TYPE_DISPOSE_SEND 25 /* must hold send right(s) */
|
||||
#define MACH_MSG_TYPE_DISPOSE_SEND_ONCE 26 /* must hold sendonce right */
|
||||
```
|
||||
Örneğin, `MACH_MSG_TYPE_MAKE_SEND_ONCE`, bu bağlantı noktası için türetilmiş ve aktarılmış bir **tek seferlik gönderme hakkının** belirtildiğini göstermek için kullanılabilir. Alıcı yanıt göndermesin diye `MACH_PORT_NULL` belirtilebilir.
|
||||
Örneğin, `MACH_MSG_TYPE_MAKE_SEND_ONCE`, bu bağlantı noktası için türetilmiş ve aktarılmış bir **tek seferlik gönderme hakkının** belirtildiğini **belirtmek** için kullanılabilir. Alıcı yanıt göndermesin diye `MACH_PORT_NULL` belirtilebilir.
|
||||
|
||||
Kolay **iki yönlü iletişim** sağlamak için bir işlem, _yanıt bağlantı noktası_ (**`msgh_local_port`**) olarak adlandırılan bir **mach bağlantı noktası** belirtebilir, burada mesajın alıcısı bu iletiye yanıt gönderebilir.
|
||||
Kolay **iki yönlü iletişim** sağlamak için bir işlem, _yanıt bağlantı noktası_ (**`msgh_local_port`**) olarak adlandırılan bir **mach bağlantı noktası** belirtebilir, burada mesajın alıcısı bu mesaja yanıt gönderebilir.
|
||||
|
||||
{% hint style="success" %}
|
||||
Bu tür iki yönlü iletişimin XPC iletilerinde kullanıldığını unutmayın (`xpc_connection_send_message_with_reply` ve `xpc_connection_send_message_with_reply_sync`). Ancak genellikle farklı bağlantı noktaları oluşturulur, böylece iki yönlü iletişim oluşturulur.
|
||||
Bu tür iki yönlü iletişimin 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ı bağlantı noktaları oluşturulur, önceki açıklamalarda belirtildiği gibi iki yönlü iletişimi oluşturmak için.
|
||||
{% endhint %}
|
||||
|
||||
Mesaj başlığının diğer alanları şunlardır:
|
||||
|
||||
- `msgh_size`: tüm paketin boyutu.
|
||||
- `msgh_remote_port`: bu iletiyi gönderilen bağlantı noktası.
|
||||
- `msgh_remote_port`: bu mesajın gönderildiği bağlantı noktası.
|
||||
- `msgh_voucher_port`: [mach fişleri](https://robert.sesek.com/2023/6/mach\_vouchers.html).
|
||||
- `msgh_id`: alıcı tarafından yorumlanan bu ileti ID'si.
|
||||
- `msgh_id`: bu mesajın kimliği, alıcı tarafından yorumlanır.
|
||||
|
||||
{% hint style="danger" %}
|
||||
**Mach iletileri**, mach çekirdeğine yerleştirilmiş **tek alıcı**, **çoklu gönderen** iletişim kanalı olan bir `mach bağlantı noktası` üzerinden gönderilir. **Birden fazla işlem**, bir mach bağlantı noktasına **ileti gönderebilir**, ancak herhangi bir anda yalnızca **bir işlem okuyabilir**.
|
||||
**Mach mesajları**, mach çekirdeğine yerleştirilmiş **tek alıcı**, **çoklu gönderen** iletişim kanalı olan bir **mach bağlantı noktası** üzerinden gönderilir. **Birden fazla işlem**, bir mach bağlantı noktasına **mesaj gönderebilir**, ancak herhangi bir zamanda sadece **bir işlem** ondan **okuyabilir**.
|
||||
{% endhint %}
|
||||
|
||||
İletiler daha sonra **`mach_msg_header_t`** başlık kısmı, ardından **gövde** ve **trailer** (varsa) ile oluşturulur ve yanıt verme izni verebilir. Bu durumlarda, çekirdek sadece mesajı bir görevden diğerine iletmelidir.
|
||||
Mesajlar daha sonra **`mach_msg_header_t`** başlık ile **gövde** ve **trailer** (varsa) ile oluşturulur ve yanıt verme izni verebilir. Bu durumlarda, çekirdek sadece mesajı bir görevden diğerine iletmelidir.
|
||||
|
||||
Bir **trailer**, **çekirdek tarafından iletiye eklenen bilgilerdir** (kullanıcı tarafından ayarlanamaz) ve ileti alımında `MACH_RCV_TRAILER_<trailer_opt>` bayraklarıyla istenebilir (istenebilecek farklı bilgiler vardır).
|
||||
Bir **trailer**, **kullanıcı tarafından ayarlanamayan** mesaja eklenen bilgidir ve mesaj alımında `MACH_RCV_TRAILER_<trailer_opt>` bayrakları ile istenebilir (istenebilecek farklı bilgiler vardır).
|
||||
|
||||
#### Karmaşık İletiler
|
||||
#### Karmaşık Mesajlar
|
||||
|
||||
Ancak, ek port hakları geçiren veya belleği paylaşan daha **karmaşık** iletiler gibi diğer durumlar vardır, burada çekirdek bu nesneleri de alıcıya göndermelidir. Bu durumlarda, başlık `msgh_bits`'in en anlamlı biti ayarlanır.
|
||||
Ancak, ek port hakları geçiren veya belleği paylaşan daha **karmaşık** mesajlar gibi durumlar vardır, burada çekirdek bu nesneleri alıcıya göndermek zorundadır. Bu durumlarda, başlık `msgh_bits`'in 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)'de 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) içinde tanımlanmıştır.
|
||||
```c
|
||||
#define MACH_MSG_PORT_DESCRIPTOR 0
|
||||
#define MACH_MSG_OOL_DESCRIPTOR 1
|
||||
|
@ -166,24 +166,24 @@ mach_msg_descriptor_type_t type : 8;
|
|||
```
|
||||
### Mac Port API'leri
|
||||
|
||||
Portların görev alanıyla ilişkilendirildiğini unutmayın, bu nedenle bir port oluşturmak veya aramak için görev alanı da sorgulanır (`mach/mach_port.h` içinde daha fazla bilgi):
|
||||
Portların görev alanı ile ilişkilendirildiğini unutmayın, bu nedenle bir port oluşturmak veya aramak için görev alanı da sorgulanır (daha fazlası için `mach/mach_port.h`):
|
||||
|
||||
- **`mach_port_allocate` | `mach_port_construct`**: Bir port oluşturur.
|
||||
- `mach_port_allocate` ayrıca bir **port seti** oluşturabilir: bir grup port üzerinde alınan hak. Bir ileti alındığında, iletiyi gönderen port belirtilir.
|
||||
- **`mach_port_allocate` | `mach_port_construct`**: Bir port **oluşturur**.
|
||||
- `mach_port_allocate` ayrıca bir **port seti** oluşturabilir: bir grup port üzerinde alım hakkı. Bir ileti alındığında, iletiyi gönderen port belirtilir.
|
||||
- `mach_port_allocate_name`: Portun adını değiştirir (varsayılan olarak 32 bitlik tamsayı).
|
||||
- `mach_port_names`: Bir hedeften port adlarını alır.
|
||||
- `mach_port_type`: Bir görevin bir ada sahip olma haklarını alır.
|
||||
- `mach_port_rename`: Bir portun adını değiştirir (FD'ler için dup2 gibi).
|
||||
- `mach_port_allocate`: YENİ ALMA, PORT_SET veya DEAD_NAME oluşturur.
|
||||
- `mach_port_insert_right`: ALMA hakkına sahip olduğunuz bir portta yeni bir hak oluşturur.
|
||||
- `mach_port_allocate`: YENİ ALIM, PORT\_SET veya DEAD\_NAME oluşturur.
|
||||
- `mach_port_insert_right`: ALIM hakkına sahip olduğunuz bir portta yeni bir hak oluşturur.
|
||||
- `mach_port_...`
|
||||
- **`mach_msg`** | **`mach_msg_overwrite`**: Mach iletilerini göndermek ve almak için kullanılan işlevler. Üzerine yazma sürümü, ileti alımı için farklı bir önbellek belirtmenizi sağlar (diğer sürüm sadece onu yeniden kullanır).
|
||||
- **`mach_msg`** | **`mach_msg_overwrite`**: Mach iletilerini **göndermek ve almak** için kullanılan işlevler. Üzerine yazma sürümü, ileti alımı için farklı bir önbellek belirtmeyi sağlar (diğer sürüm sadece onu yeniden kullanır).
|
||||
|
||||
### Debug mach\_msg
|
||||
### Hata Ayıklama mach\_msg
|
||||
|
||||
`mach_msg` ve `mach_msg_overwrite` işlevlerinin gönderme ve alma işlemlerinde kullanıldığı için bunlara bir kesme noktası ayarlamak, gönderilen ve alınan iletileri incelemeyi sağlar.
|
||||
**`mach_msg`** ve **`mach_msg_overwrite`** işlevlerinin ileti göndermek ve almak için kullanılan işlevler olduğu için bunlara bir kesme noktası ayarlamak, gönderilen ve alınan iletileri incelemeyi sağlar.
|
||||
|
||||
Örneğin, bu işlevi kullanan **`libSystem.B`'yi yükleyecek bir uygulamayı hata ayıklamaya başlayın**.
|
||||
Örneğin, bu işlevi kullanan **`libSystem.B`'yi yükleyecek herhangi bir uygulamayı hata ayıklamaya başlayın**.
|
||||
|
||||
<pre class="language-armasm"><code class="lang-armasm"><strong>(lldb) b mach_msg
|
||||
</strong>Kesme Noktası 1: nerede = libsystem_kernel.dylib`mach_msg, adres = 0x00000001803f6c20
|
||||
|
@ -212,7 +212,7 @@ frame #8: 0x000000018e59e6ac libSystem.B.dylib`libSystem_initializer + 236
|
|||
frame #9: 0x0000000181a1d5c8 dyld`invocation function for block in dyld4::Loader::findAndRunAllInitializers(dyld4::RuntimeState&) const::$_0::operator()() const + 168
|
||||
</code></pre>
|
||||
|
||||
**`mach_msg`**'nin argümanlarını almak için kayıtları kontrol edin. Bu argümanlar şunlardır ([mach/message.h](https://opensource.apple.com/source/xnu/xnu-7195.81.3/osfmk/mach/message.h.auto.html) adresinden):
|
||||
**`mach_msg`**'nin argümanlarını almak için kayıtları kontrol edin. Bunlar argümanlardır ([mach/message.h](https://opensource.apple.com/source/xnu/xnu-7195.81.3/osfmk/mach/message.h.auto.html) adresinden):
|
||||
```c
|
||||
__WATCHOS_PROHIBITED __TVOS_PROHIBITED
|
||||
extern mach_msg_return_t mach_msg(
|
||||
|
@ -248,7 +248,7 @@ x6 = 0x0000000000000000 ;mach_port_name_t (notify)
|
|||
; 0x00000b07 -> mach_port_name_t (msgh_voucher_port)
|
||||
; 0x40000322 -> mach_msg_id_t (msgh_id)
|
||||
```
|
||||
O tür `mach_msg_bits_t` türü, bir yanıtı izin vermek için çok yaygındır.
|
||||
O tür `mach_msg_bits_t`, bir yanıtı izin vermek için çok yaygındır.
|
||||
|
||||
|
||||
|
||||
|
@ -276,15 +276,15 @@ name ipc-object rights flags boost reqs recv send sonce oref q
|
|||
+ send -------- --- 1 <- 0x00002603 (74295) passd
|
||||
[...]
|
||||
```
|
||||
**İsim**, bağlantı noktasına verilen varsayılan isimdir (ilk 3 baytının nasıl **arttığını** kontrol edin). **`ipc-object`** ise bağlantı noktasının **şifrelenmiş** benzersiz **tanımlayıcısı**dır.\
|
||||
**İsim**, bağlantı noktasına verilen varsayılan isimdir (ilk 3 baytın nasıl **arttığını** kontrol edin). **`ipc-object`** ise bağlantı noktasının **şifrelenmiş** benzersiz **tanımlayıcısıdır**.\
|
||||
Ayrıca, yalnızca **`send`** hakkına sahip bağlantı noktalarının sahibini belirlediğine dikkat edin (bağlantı noktası adı + pid).\
|
||||
Ayrıca, **aynı bağlantı noktasına bağlı diğer görevleri** belirtmek için **`+`** işaretinin kullanımına dikkat edin.
|
||||
Ayrıca, **diğer görevleri belirtmek** için **`+`** işaretinin kullanımına dikkat edin.
|
||||
|
||||
Ayrıca [**procesxp**](https://www.newosxbook.com/tools/procexp.html) kullanarak **kayıtlı hizmet adlarını** (SIP devre dışı bırakıldığında `com.apple.system-task-port` gerektiği için) görmek de mümkündür:
|
||||
Ayrıca, [**procesxp**](https://www.newosxbook.com/tools/procexp.html) kullanarak **kayıtlı hizmet adlarını** (SIP devre dışı bırakıldığında `com.apple.system-task-port` gerektiğinden) görmek de mümkündür:
|
||||
```
|
||||
procesp 1 ports
|
||||
```
|
||||
Bu aracı iOS'a [http://newosxbook.com/tools/binpack64-256.tar.gz](http://newosxbook.com/tools/binpack64-256.tar.gz) adresinden indirerek yükleyebilirsiniz.
|
||||
Bu aracı iOS'ta [http://newosxbook.com/tools/binpack64-256.tar.gz](http://newosxbook.com/tools/binpack64-256.tar.gz) adresinden indirerek yükleyebilirsiniz.
|
||||
|
||||
### Kod örneği
|
||||
|
||||
|
@ -359,7 +359,46 @@ printf("Text: %s, number: %d\n", message.some_text, message.some_number);
|
|||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="sender.c" %}Dosya gönderme işlemi başlatıldı.{% endtab %}
|
||||
{% tab title="sender.c" %}
|
||||
|
||||
### sender.c
|
||||
|
||||
Bu program, bir mesaj kuyruğuna bir dizi mesaj gönderen basit bir örnektir.
|
||||
|
||||
```c
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/ipc.h>
|
||||
#include <sys/msg.h>
|
||||
|
||||
struct mesaj {
|
||||
long mesaj_tipi;
|
||||
char icerik[100];
|
||||
};
|
||||
|
||||
int main() {
|
||||
key_t anahtar;
|
||||
int msgid;
|
||||
struct mesaj m;
|
||||
|
||||
anahtar = ftok("sender.c", 65);
|
||||
msgid = msgget(anahtar, 0666 | IPC_CREAT);
|
||||
m.mesaj_tipi = 1;
|
||||
|
||||
printf("Mesajı girin: ");
|
||||
fgets(m.icerik, sizeof(m.icerik), stdin);
|
||||
|
||||
msgsnd(msgid, &m, sizeof(m), 0);
|
||||
|
||||
printf("Gönderilen mesaj: %s", m.icerik);
|
||||
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
{% endtab %}
|
||||
```c
|
||||
// Code from https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html
|
||||
// gcc sender.c -o sender
|
||||
|
@ -414,22 +453,22 @@ printf("Sent a message\n");
|
|||
{% endtab %}
|
||||
{% endtabs %}
|
||||
|
||||
### Ayrıcalıklı Portlar
|
||||
### Ayrıcalıklı Bağlantı Noktaları
|
||||
|
||||
* **Ana bilgisayar portu**: Bir işlem bu porta **Gönderme** ayrıcalığına sahipse, **sistem** hakkında **bilgi** alabilir (ör. `host_processor_info`).
|
||||
* **Ana bilgisayar ayrıcalıklı portu**: Bu porta **Gönderme** hakkına sahip bir işlem, bir çekirdek uzantısını yükleme gibi **ayrıcalıklı işlemler** gerçekleştirebilir. Bu izne sahip olmak için **işlemin kök kullanıcı olması** gerekir.
|
||||
* Ayrıca, **`kext_request`** API'sını çağırmak için yalnızca Apple ikilere verilen **`com.apple.private.kext*`** gibi diğer ayrıcalıklara ihtiyaç vardır.
|
||||
* **Görev adı portu:** _Görev portu_ nun ayrıcalıksız bir sürümüdür. Görevi referans alır, ancak kontrol etmeye izin vermez. Yalnızca üzerinden `task_info()` işlemi yapılabilen şey budur.
|
||||
* **Görev portu** (ayrıca çekirdek portu olarak da bilinir)**:** Bu porta **Gönderme** izniyle, görevi kontrol etmek mümkündür (belleği okuma/yazma, iş parçacığı oluşturma...).
|
||||
* **Ç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()`** işlemi sırasında **miras alınır**; `fork()` ile oluşturulan yeni bir görev, yeni bir görev portu alır (`exec()` işleminden sonra bir suid ikilide de özel bir durum olarak, bir görev ayrıca yeni bir görev portu alır). Bir görevi başlatmak ve portunu almanın tek yolu, bir `fork()` işlemi yaparken ["port takası dansını"](https://robert.sesek.com/2014/1/changes\_to\_xnu\_mach\_ipc.html) gerçekleştirmektir.
|
||||
* Bu porta erişim kısıtlamaları (binary `AppleMobileFileIntegrity`'den `macos_task_policy` üzerinden):
|
||||
* Uygulamanın **`com.apple.security.get-task-allow` ayrıcalığı** varsa, aynı kullanıcıdan işlemler görev portuna erişebilir (genellikle hata ayıklama için Xcode tarafından eklenir). **Notarizasyon** işlemi bunu üretim sürümlerine izin vermez.
|
||||
* **`com.apple.system-task-ports`** ayrıcalığına sahip uygulamalar, çekirdek hariç, herhangi bir işlemin **görev portunu alabilir**. Daha eski sürümlerde **`task_for_pid-allow`** olarak adlandırılıyordu. Bu yalnızca Apple uygulamalarına verilir.
|
||||
* **Kök kullanıcı**, **sıkılaştırılmış** bir çalışma zamanıyla derlenmemiş uygulamaların görev portlarına erişebilir (ve Apple'dan olmayanlardan).
|
||||
* **Ana bağlantı noktası**: Bir işlem bu bağlantı noktası üzerinde **Gönderme** ayrıcalığına sahipse, **sistem** hakkında **bilgi** alabilir (örneğin, `host_processor_info`).
|
||||
* **Ana ayrıcalıklı bağlantı noktası**: Bu bağlantı noktası üzerinde **Gönderme** hakkına sahip bir işlem, bir çekirdek uzantısını yükleme gibi **ayrıcalıklı işlemler** gerçekleştirebilir. Bu izne sahip olmak için **işlemin kök olması** gerekir.
|
||||
* Ayrıca, **`kext_request`** API'sını çağırmak için yalnızca Apple ikili dosyalarına verilen **`com.apple.private.kext*`** gibi diğer ayrıcalıklara sahip olmak gerekmektedir.
|
||||
* **Görev adı bağlantı noktası**: _Görev bağlantı noktasının_ ayrıcalıksız bir sürümüdür. Görevi referans alır, ancak kontrol etmeye izin vermez. Yalnızca üzerinden `task_info()` işlevine erişilebileceği görünmektedir.
|
||||
* **Görev bağlantı noktası** (ayrıca çekirdek bağlantı noktası olarak da bilinir)**:** Bu bağlantı noktası üzerinde Gönderme izni ile görevi kontrol etmek mümkündür (bellek okuma/yazma, iş parçacığı oluşturma...).
|
||||
* **Çağıran görev için bu bağlantı noktasının adını almak** için `mach_task_self()` işlevini çağırın. Bu bağlantı noktası yalnızca **`exec()`** işlemi sırasında **miras alınır**; `fork()` ile oluşturulan yeni bir görev yeni bir görev bağlantı noktası alır (`exec()` işleminden sonra bir suid ikili dosyada da özel bir durum olarak, bir görev ayrıca yeni bir görev bağlantı noktası alır). Bir görevi başlatmak ve bağlantı noktasını almanın tek yolu, `fork()` işlemi sırasında ["port takası dansını" gerçekleştirmek](https://robert.sesek.com/2014/1/changes\_to\_xnu\_mach\_ipc.html) olacaktır.
|
||||
* Bu bağlantı noktasına erişim kısıtlamaları (binary `AppleMobileFileIntegrity`'den `macos_task_policy` üzerinden):
|
||||
* Uygulamanın **`com.apple.security.get-task-allow` ayrıcalığı** varsa, aynı kullanıcıdan işlemler görev bağlantı noktasına erişebilir (genellikle hata ayıklama için Xcode tarafından eklenir). **Notarizasyon** işlemi bunu üretim sürümlerine izin vermez.
|
||||
* **`com.apple.system-task-ports`** ayrıcalığına sahip uygulamalar, çekirdek hariç olmak üzere herhangi bir işlemin **görev bağlantı noktasını alabilir**. Daha eski sürümlerde **`task_for_pid-allow`** olarak adlandırılmıştır. Bu yalnızca Apple uygulamalarına verilir.
|
||||
* **Kök**, **sıkılaştırılmış** bir çalışma zamanı ile derlenmemiş uygulamaların görev bağlantı noktalarına erişebilir (ve Apple'dan olmayan uygulamalardan).
|
||||
|
||||
### Görev portu aracılığıyla İş Parçacığına Shellcode Enjeksiyonu
|
||||
### Görev Bağlantı Noktası Aracılığıyla İş Parçacığına Kabuk Kodu Enjeksiyonu
|
||||
|
||||
Shellcode'u aşağıdaki yerden alabilirsiniz:
|
||||
Kabuk kodunu aşağıdaki yerden alabilirsiniz:
|
||||
|
||||
{% content-ref url="../../macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md" %}
|
||||
[arm64-basic-assembly.md](../../macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md)
|
||||
|
@ -467,10 +506,26 @@ return 0;
|
|||
|
||||
{% tab title="entitlements.plist" %}
|
||||
|
||||
## IPC (İşlem Arası İletişim) - macOS
|
||||
## Yetkilendirmeler
|
||||
|
||||
Bu bölümde, macOS'ta IPC'nin nasıl kötüye kullanılabileceğini ve ayrıcalık yükseltme saldırıları için nasıl kullanılabileceğini inceleyeceğiz. IPC, farklı süreçler arasında iletişim kurmak için kullanılan bir mekanizmadır ve kötü niyetli aktörler için bir saldırı vektörü olabilir. Bu bölümde, IPC'nin nasıl istismar edilebileceğini ve macOS'ta ayrıcalık yükseltme saldırıları için nasıl kullanılabileceğini öğreneceksiniz.
|
||||
Bu dosya, uygulamanın hangi sistem kaynaklarına erişebileceğini belirleyen yetkilendirmeleri içerir. Bu yetkilendirmeler, uygulamanın çalışma zamanında belirli işlemleri gerçekleştirmesine izin verir. Bu dosya, uygulamanın güvenliğini artırmak ve ayrıcalık yükseltme saldırılarına karşı korumak için önemlidir.
|
||||
|
||||
Örnek bir `entitlements.plist` dosyası aşağıdaki gibi olabilir:
|
||||
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>com.apple.security.network.client</key>
|
||||
<true/>
|
||||
<key>com.apple.security.files.user-selected.read-write</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
```
|
||||
|
||||
Bu örnekte, uygulamanın ağ istemcisi olarak davranmasına ve kullanıcı tarafından seçilen dosyaları okuma ve yazma yetkisine sahip olmasına izin verilmiştir. Bu yetkilendirmeler, uygulamanın belirli işlevleri yerine getirmesine olanak tanırken, güvenlik açıklarını en aza indirmek için dikkatlice yönetilmelidir.
|
||||
{% endtab %}
|
||||
```xml
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
|
@ -692,13 +747,15 @@ gcc -framework Foundation -framework Appkit sc_inject.m -o sc_inject
|
|||
```
|
||||
### Görev bağlantısı aracılığıyla thread üzerinde Dylib Enjeksiyonu
|
||||
|
||||
MacOS'ta **thread'ler**, **Mach** veya **posix `pthread` api** kullanılarak manipüle edilebilir. Önceki enjeksiyonda oluşturduğumuz thread, Mach api kullanılarak oluşturulduğundan **posix uyumlu değil**.
|
||||
macOS'ta **thread'ler**, **Mach** veya **posix `pthread` api** kullanılarak manipüle edilebilir. Önceki enjeksiyonda oluşturduğumuz thread, Mach api kullanılarak oluşturulduğundan **posix uyumlu değildir**.
|
||||
|
||||
Bir komutu çalıştırmak için **basit bir shellcode enjekte etmek mümkündü** çünkü bu, **posix uyumlu api'lerle çalışmayı gerektirmiyordu**, sadece Mach ile çalışıyordu. **Daha karmaşık enjeksiyonlar** için thread'in aynı zamanda **posix uyumlu olması** gerekir.
|
||||
Bir komutu çalıştırmak için **basit bir shellcode enjekte etmek mümkündü** çünkü bu, **posix uyumlu api'lerle çalışmaya ihtiyaç duymuyordu**, sadece Mach ile çalışıyordu. **Daha karmaşık enjeksiyonlar** için thread'in aynı zamanda **posix uyumlu olması** gerekir.
|
||||
|
||||
Bu nedenle, **thread'i iyileştirmek** için **`pthread_create_from_mach_thread`** çağrılmalıdır ki bu da **geçerli bir pthread oluşturacaktır**. Sonra, bu yeni pthread, özel kütüphaneleri yüklemek için **dlopen**'ı **çağırabilir**, böylece farklı işlemleri gerçekleştirmek için yeni shellcode yazmak yerine özel kütüphaneler yüklemek mümkün olacaktır.
|
||||
Bu nedenle, **thread'i iyileştirmek** için **`pthread_create_from_mach_thread`** çağrılmalıdır ki bu da **geçerli bir pthread oluşturacaktır**. Daha sonra, bu yeni pthread, özel kütüphaneleri yüklemek için **dlopen** çağrısını yapabilir.
|
||||
|
||||
Örnek dylib'leri (örneğin bir log oluşturan ve ardından onu dinleyebileceğiniz bir tane) şurada bulabilirsiniz:
|
||||
Özel kütüphaneleri yüklemek için yeni bir shellcode yazmak yerine sistemden bir dylib yüklemek mümkün olduğundan, bu şekilde farklı eylemler gerçekleştirmek için yeni shellcode yazmak yerine özel kütüphaneler yüklenebilir.
|
||||
|
||||
Örnek dylib'leri (örneğin bir log oluşturan ve ardından onu dinleyebileceğiniz bir dylib):
|
||||
|
||||
{% content-ref url="../macos-library-injection/macos-dyld-hijacking-and-dyld_insert_libraries.md" %}
|
||||
[macos-dyld-hijacking-and-dyld\_insert\_libraries.md](../macos-library-injection/macos-dyld-hijacking-and-dyld\_insert_libraries.md)
|
||||
|
@ -907,20 +964,20 @@ return (-3);
|
|||
|
||||
// Set the permissions on the allocated code memory
|
||||
```c
|
||||
kr = vm_protect(remoteTask, remoteCode64, 0x70, FALSE, VM_PROT_READ | VM_PROT_EXECUTE);
|
||||
kr = vm_protect(uzakGorev, uzakKod64, 0x70, FALSE, VM_PROT_READ | VM_PROT_EXECUTE);
|
||||
|
||||
if (kr != KERN_SUCCESS)
|
||||
{
|
||||
fprintf(stderr,"Uzak iş parçacığının kodu için bellek izinlerini ayarlayamadı: Hata %s\n", mach_error_string(kr));
|
||||
fprintf(stderr,"Uzak iş parçacığının kodu için bellek izinlerinin ayarlanamadı: Hata %s\n", mach_error_string(kr));
|
||||
return (-4);
|
||||
}
|
||||
|
||||
// Ayrılan yığın belleğinin izinlerini ayarla
|
||||
kr = vm_protect(remoteTask, remoteStack64, STACK_SIZE, TRUE, VM_PROT_READ | VM_PROT_WRITE);
|
||||
kr = vm_protect(uzakGorev, uzakYığın64, STACK_SIZE, TRUE, VM_PROT_READ | VM_PROT_WRITE);
|
||||
|
||||
if (kr != KERN_SUCCESS)
|
||||
{
|
||||
fprintf(stderr,"Uzak iş parçacığının yığını için bellek izinlerini ayarlayamadı: Hata %s\n", mach_error_string(kr));
|
||||
fprintf(stderr,"Uzak iş parçacığının yığını için bellek izinlerinin ayarlanamadı: Hata %s\n", mach_error_string(kr));
|
||||
return (-4);
|
||||
}
|
||||
|
||||
|
@ -931,19 +988,19 @@ thread_act_t remoteThread;
|
|||
|
||||
memset(&remoteThreadState64, '\0', sizeof(remoteThreadState64) );
|
||||
|
||||
remoteStack64 += (STACK_SIZE / 2); // bu gerçek yığın
|
||||
//remoteStack64 -= 8; // 16'lık hizalamaya ihtiyaç var
|
||||
uzakYığın64 += (STACK_SIZE / 2); // bu gerçek yığın
|
||||
//uzakYığın64 -= 8; // 16'lık hizalamaya ihtiyaç var
|
||||
|
||||
const char* p = (const char*) remoteCode64;
|
||||
const char* p = (const char*) uzakKod64;
|
||||
|
||||
remoteThreadState64.ash.flavor = ARM_THREAD_STATE64;
|
||||
remoteThreadState64.ash.count = ARM_THREAD_STATE64_COUNT;
|
||||
remoteThreadState64.ts_64.__pc = (u_int64_t) remoteCode64;
|
||||
remoteThreadState64.ts_64.__sp = (u_int64_t) remoteStack64;
|
||||
remoteThreadState64.ts_64.__pc = (u_int64_t) uzakKod64;
|
||||
remoteThreadState64.ts_64.__sp = (u_int64_t) uzakYığın64;
|
||||
|
||||
printf ("Uzak Yığın 64 0x%llx, Uzak kod %p\n", remoteStack64, p );
|
||||
printf ("Uzak Yığın 64 0x%llx, Uzak kod %p\n", uzakYığın64, p );
|
||||
|
||||
kr = thread_create_running(remoteTask, ARM_THREAD_STATE64, // ARM_THREAD_STATE64,
|
||||
kr = thread_create_running(uzakGorev, ARM_THREAD_STATE64, // ARM_THREAD_STATE64,
|
||||
(thread_state_t) &remoteThreadState64.ts_64, ARM_THREAD_STATE64_COUNT , &remoteThread );
|
||||
|
||||
if (kr != KERN_SUCCESS) {
|
||||
|
@ -960,8 +1017,8 @@ int main(int argc, const char * argv[])
|
|||
{
|
||||
if (argc < 3)
|
||||
{
|
||||
fprintf (stderr, "Kullanım: %s _pid_ _action_\n", argv[0]);
|
||||
fprintf (stderr, " _action_: diskteki bir dylib yoludur\n");
|
||||
fprintf (stderr, "Kullanım: %s _pid_ _aksiyon_\n", argv[0]);
|
||||
fprintf (stderr, " _aksiyon_: diskteki bir dylib dosyasının yolu\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
|
@ -983,9 +1040,9 @@ fprintf(stderr,"Dylib bulunamadı\n");
|
|||
gcc -framework Foundation -framework Appkit dylib_injector.m -o dylib_injector
|
||||
./inject <pid-of-mysleep> </path/to/lib.dylib>
|
||||
```
|
||||
### Görev Bağlantısı Aracılığıyla İş Parçası Kaçırma <a href="#adım-1-görev-bağlantısı-aracılığıyla-iş-parçası-kaçırma" id="adım-1-görev-bağlantısı-aracılığıyla-iş-parçası-kaçırma"></a>
|
||||
### Görev Bağlantısı Aracılığıyla İş Parçası Kaçırma <a href="#step-1-thread-hijacking" id="step-1-thread-hijacking"></a>
|
||||
|
||||
Bu teknikte bir işlemin iş parçası kaçırılır:
|
||||
Bu teknikte, işlemin bir iş parçası kaçırılır:
|
||||
|
||||
{% content-ref url="macos-thread-injection-via-task-port.md" %}
|
||||
[macos-thread-injection-via-task-port.md](macos-thread-injection-via-task-port.md)
|
||||
|
@ -995,9 +1052,9 @@ Bu teknikte bir işlemin iş parçası kaçırılır:
|
|||
|
||||
### Temel Bilgiler
|
||||
|
||||
XPC, macOS ve iOS'ta **işlemler arasındaki iletişim** için bir çerçevedir ve XNU (macOS tarafından kullanılan çekirdek) arasında İşlem İletişimi anlamına gelir. XPC, sistemin farklı işlemler arasında **güvenli, asenkron yöntem çağrıları yapma** mekanizması sağlar. Apple'ın güvenlik paradigmasının bir parçası olup, her **bileşenin** sadece işini yapabilmesi için gereken izinlere sahip olarak çalıştığı **ayrıcalıkları ayrılmış uygulamaların oluşturulmasına** izin verir, böylece bir işlem etkilenirse olası zararı sınırlar.
|
||||
XPC, macOS ve iOS üzerindeki işlemler arasında iletişim için bir çerçeve olan XNU (macOS tarafından kullanılan çekirdek) arasındaki İşlem İletişimi anlamına gelir. XPC, sistemin farklı işlemleri arasında güvenli, asenkron yöntem çağrıları yapma mekanizması sağlar. Apple'ın güvenlik paradigmasının bir parçası olup, her bileşenin yalnızca işini yapabilmesi için gereken izinlere sahip olduğu ayrıcalıklarla ayrılmış uygulamaların oluşturulmasına izin verir, böylece bir işlem etkilenirse olası zararı sınırlar.
|
||||
|
||||
Bu **iletişimin nasıl çalıştığı** ve **neden savunmasız olabileceği** hakkında daha fazla bilgi için kontrol edin:
|
||||
Bu **iletişimin nasıl çalıştığı** ve **neden savunmasız olabileceği** hakkında daha fazla bilgi için şuraya bakın:
|
||||
|
||||
{% content-ref url="macos-xpc/" %}
|
||||
[macos-xpc](macos-xpc/)
|
||||
|
@ -1005,9 +1062,11 @@ Bu **iletişimin nasıl çalıştığı** ve **neden savunmasız olabileceği**
|
|||
|
||||
## MIG - Mach Arayüzü Oluşturucusu
|
||||
|
||||
MIG, Mach IPC işlem kodu oluşturma sürecini **basitleştirmek** için oluşturulmuştur. Temelde, sunucu ve istemcinin belirli bir tanım ile iletişim kurması için **gereken kodu oluşturur**. Oluşturulan kodun çirkin olması önemli değildir, geliştirici sadece bunu içe aktarması ve kodu öncekinden çok daha basit hale getirecektir.
|
||||
MIG, Mach IPC kodu oluşturma sürecini basitleştirmek amacıyla oluşturulmuştur. Bu, çünkü RPC programlamak için gereken birçok işlem aynı eylemleri içerir (argümanları paketleme, mesajı gönderme, sunucuda verileri açma...).
|
||||
|
||||
Daha fazla bilgi için kontrol edin:
|
||||
MIC, sunucu ve istemcinin belirli bir tanım ile iletişim kurması için gerekli kodu **oluşturur**. Oluşturulan kod ne kadar kötü olursa olsun, bir geliştirici sadece bunu içe aktarması ve kodu öncekinden çok daha basit hale getirecektir.
|
||||
|
||||
Daha fazla bilgi için şuraya bakın:
|
||||
|
||||
{% content-ref url="macos-mig-mach-interface-generator.md" %}
|
||||
[macos-mig-mach-interface-generator.md](macos-mig-mach-interface-generator.md)
|
||||
|
@ -1027,10 +1086,10 @@ Daha fazla bilgi için kontrol edin:
|
|||
|
||||
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!
|
||||
* **Şirketinizi HackTricks'te reklamını görmek 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 grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) katılın veya bizi **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**'da takip edin.**
|
||||
* **Hacking püf noktalarınızı göndererek HackTricks** ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks) github depolarına PR göndererek paylaşın.
|
||||
* **💬 [Discord grubuna](https://discord.gg/hRep4RUj7f) veya [telegram grubuna](https://t.me/peass) katılın 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>
|
||||
|
|
|
@ -1,20 +1,39 @@
|
|||
# macOS MIG - Mach Arayüzü Oluşturucusu
|
||||
# macOS MIG - Mach Arayüz Oluşturucusu
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Sıfırdan kahraman olmaya kadar AWS hacklemeyi öğ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>
|
||||
<summary><strong>Sıfırdan kahraman olacak şekilde AWS hacklemeyi öğ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'ı desteklemenin diğer yolları:
|
||||
|
||||
* **Şirketinizi HackTricks'te reklamını görmek istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARINI**](https://github.com/sponsors/carlospolop) kontrol edin!
|
||||
* **Ş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 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 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.
|
||||
* [**PEASS Ailesi'ni**](https://opensea.io/collection/the-peass-family) keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuz
|
||||
* **💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) katılın veya bizi **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)'da **takip edin**.
|
||||
* **Hacking püf noktalarınızı paylaşarak PR'lar göndererek** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına katkıda bulunun.
|
||||
|
||||
</details>
|
||||
|
||||
MIG, **Mach IPC işlemi** kod oluşturma sürecini basitleştirmek için oluşturulmuştur. Temelde, sunucu ve istemcinin iletişim kurması için gerekli olan kodu **belirli bir tanım ile oluşturur**. Oluşturulan kod ne kadar kötü görünürse görünsün, bir geliştirici sadece bunu içe aktarması yeterli olacak ve kodu öncekinden çok daha basit olacaktır.
|
||||
## Temel Bilgiler
|
||||
|
||||
MIG, **Mach IPC işlemi oluşturma sürecini basitleştirmek** için oluşturulmuştur. Temelde, sunucu ve istemcinin iletişim kurması için gerekli kodu **oluşturur**. Oluşturulan kodun çirkin olması durumunda bile, bir geliştiricinin sadece bunu içe aktarması ve kodunun öncekinden çok daha basit olması yeterlidir.
|
||||
|
||||
Tanım, `.defs` uzantısını kullanarak Arayüz Tanım Dili (IDL) ile belirtilir.
|
||||
|
||||
Bu tanımlar 5 bölüme sahiptir:
|
||||
|
||||
* **Alt sistem bildirimi**: Alt sistem anahtar kelimesi, **adı** ve **kimliği**ni belirtmek için kullanılır. Sunucunun çekirdekte çalışması gerekiyorsa **`KernelServer`** olarak işaretlenebilir.
|
||||
* **Dahil etmeler ve içe aktarmalar**: MIG, C ön işleyiciyi kullanır, bu nedenle içe aktarmaları kullanabilir. Ayrıca, kullanıcı veya sunucu tarafından oluşturulan kodlar için `uimport` ve `simport` kullanmak mümkündür.
|
||||
* **Tür bildirimleri**: Veri tiplerini tanımlamak mümkündür, genellikle `mach_types.defs` ve `std_types.defs` dosyalarını içe aktarır. Özel olanlar için bazı sözdizimi kullanılabilir:
|
||||
* \[i`n/out]tran`: Gelen veya giden bir iletiyi çevirmesi gereken işlev
|
||||
* `c[user/server]type`: Başka bir C türüne eşleme.
|
||||
* `destructor`: Tür serbest bırakıldığında bu işlevi çağırın.
|
||||
* **İşlemler**: Bunlar RPC yöntemlerinin tanımlarıdır. 5 farklı tür bulunmaktadır:
|
||||
* `routine`: Yanıt bekler
|
||||
* `simpleroutine`: Yanıt beklemeyen
|
||||
* `procedure`: Yanıt bekler
|
||||
* `simpleprocedure`: Yanıt beklemeyen
|
||||
* `function`: Yanıt bekler
|
||||
|
||||
### Örnek
|
||||
|
||||
|
@ -37,7 +56,9 @@ n2 : uint32_t);
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
Şimdi mig'i kullanarak birbirleriyle iletişim kurabilecek sunucu ve istemci kodunu oluşturun ve Çıkarma işlevini çağırmak için:
|
||||
İlk **argümanın bağlanacak bağlantı noktası** olduğunu unutmayın ve MIG, yanıt bağlantı noktasını **otomatik olarak işleyecektir** (istemci kodunda `mig_get_reply_port()` çağrılmadıkça). Dahası, **işlemlerin kimliği** belirtilen alt sistem kimliği ile başlayarak **ardışık** olacaktır (bu nedenle bir işlem kullanımdan kaldırıldığında silinir ve hala ID'sini kullanmak için `skip` kullanılır).
|
||||
|
||||
Şimdi, birbirleriyle iletişim kurabilecek sunucu ve istemci kodunu oluşturmak için MIG'i kullanın ve Çıkarma işlevini çağırmak için:
|
||||
```bash
|
||||
mig -header myipcUser.h -sheader myipcServer.h myipc.defs
|
||||
```
|
||||
|
@ -64,394 +85,7 @@ myipc_server_routine,
|
|||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="myipcServer.h" %}
|
||||
|
||||
## myipcServer.h
|
||||
|
||||
```c
|
||||
#ifndef myipcServer_h
|
||||
#define myipcServer_h
|
||||
|
||||
#include <stdio.h>
|
||||
#include <mach/mach.h>
|
||||
#include <servers/bootstrap.h>
|
||||
#include <mach/mach_traps.h>
|
||||
#include <mach/mach_interface.h>
|
||||
#include <mach/mach_init.h>
|
||||
#include <mach/mach_port.h>
|
||||
#include <mach/mach_error.h>
|
||||
#include <mach/mach_types.h>
|
||||
#include <mach/mach_host.h>
|
||||
#include <mach/mach_vm.h>
|
||||
#include <mach/mach_voucher.h>
|
||||
#include <mach/mach_time.h>
|
||||
#include <mach/mach_init.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#includejson <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher_types.h>
|
||||
#include <mach/mach_voucher_attr_control.h>
|
||||
#include <mach/mach_voucher_deallocate.h>
|
||||
#include <mach/mach_voucher_extract_attr_recipe.h>
|
||||
#include <mach/mach_voucher_notify.h>
|
||||
#include <mach/mach_voucher
|
||||
{% tab title="myipcServer.h" %}Dosya: myipcServer.h{% endtab %}
|
||||
```c
|
||||
/* Description of this subsystem, for use in direct RPC */
|
||||
extern const struct SERVERPREFmyipc_subsystem {
|
||||
|
@ -482,7 +116,7 @@ return 0;
|
|||
return SERVERPREFmyipc_subsystem.routine[msgh_id].stub_routine;
|
||||
}
|
||||
```
|
||||
Bu örnekte tanımlamalar içinde sadece 1 fonksiyon tanımladık, ancak daha fazla fonksiyon tanımlasaydık, bunlar **`SERVERPREFmyipc_subsystem`** dizisinin içinde olacaktı ve ilk fonksiyon **500** ID'sine, ikinci fonksiyon ise **501** ID'sine atanacaktı...
|
||||
Bu örnekte tanımlamalar içinde sadece 1 fonksiyon tanımladık, ancak daha fazla fonksiyon tanımlasaydık, bunlar **`SERVERPREFmyipc_subsystem`** dizisinin içinde olacaktı ve ilk fonksiyon **500** ID'sine, ikinci fonksiyon **501** ID'sine atanacaktı...
|
||||
|
||||
Aslında bu ilişkiyi **`myipcServer.h`** dosyasındaki **`subsystem_to_name_map_myipc`** yapısında tanımlayabiliriz:
|
||||
```c
|
||||
|
@ -584,7 +218,7 @@ int main() {
|
|||
return 1;
|
||||
}
|
||||
|
||||
myipc_do_mach_msg(server_port);
|
||||
myipc_server_routine(server_port);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -617,9 +251,9 @@ USERPREFSubtract(port, 40, 2);
|
|||
```
|
||||
### Binary Analizi
|
||||
|
||||
Birçok ikili dosya artık mach bağlantı noktalarını açığa çıkarmak için MIG'yi kullandığından, MIG'nin kullanıldığını **tanımlamanın** ve her ileti kimliği ile MIG'nin yürüttüğü **işlevleri** bilmek ilginç olabilir.
|
||||
Birçok ikili dosya artık mach bağlantı noktalarını açığa çıkarmak için MIG'yi kullandığından, MIG'nin kullanıldığını **tanımanın** ve her mesaj kimliği ile MIG'nin 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, ileti kimliğini gösterir ve yürütülecek işlevi tanımlar:
|
||||
[**jtool2**](../../macos-apps-inspecting-debugging-and-fuzzing/#jtool2), bir Mach-O ikili dosyasından MIG bilgilerini ayrıştırabilir, mesaj kimliğini gösterir ve yürütülecek işlevi tanımlar:
|
||||
```bash
|
||||
jtool2 -d __DATA.__const myipc_server | grep MIG
|
||||
```
|
||||
|
@ -639,13 +273,13 @@ var_18 = arg1;
|
|||
*(int32_t *)(var_18 + 0x10) = 0x0;
|
||||
if (*(int32_t *)(var_10 + 0x14) <= 0x1f4 && *(int32_t *)(var_10 + 0x14) >= 0x1f4) {
|
||||
rax = *(int32_t *)(var_10 + 0x14);
|
||||
// Çağrılacak işlevi tanımlamaya yardımcı olabilecek sign_extend_64 çağrısı
|
||||
// Bu işlevi tanımlamaya yardımcı olabilecek sign_extend_64 çağrısı
|
||||
// Bu, çağrılması gereken işlevin işaretçisini rax'a depolar
|
||||
// Kullanılan adres 0x100004040'ı kontrol edin (işlev adresleri dizisi)
|
||||
// 0x1f4 = 500 (başlangıç ID'si)
|
||||
<strong> rax = *(sign_extend_64(rax - 0x1f4) * 0x28 + 0x100004040);
|
||||
</strong> var_20 = rax;
|
||||
// If - else, if yanıtı yanlış döndürürken else doğru işlevi çağırır ve doğru döndürür
|
||||
// If - else, if döndürmezken else doğru işlevi çağırır ve true döndürür
|
||||
<strong> if (rax == 0x0) {
|
||||
</strong> *(var_18 + 0x18) = **_NDR_record;
|
||||
*(int32_t *)(var_18 + 0x20) = 0xfffffffffffffed1;
|
||||
|
@ -744,7 +378,7 @@ return r0;
|
|||
{% endtab %}
|
||||
{% endtabs %}
|
||||
|
||||
Aslında, **`0x100004000`** işlevine giderseniz, **`routine_descriptor`** yapılarının bir dizisini bulacaksınız. Yapının ilk öğesi, **işlevin uygulandığı adres** ve **yapının 0x28 bayt aldığını** göz önünde bulundurarak her 0x28 baytta (bayt 0'dan başlayarak) 8 bayt alabilir ve bu, **çağrılacak işlevin adresi** olacaktır:
|
||||
Aslında **`0x100004000`** işlevine giderseniz, **`routine_descriptor`** yapılarının dizisini bulacaksınız. Yapının ilk elemanı **işlevin uygulandığı adres** olup, **yapı 0x28 bayt alır**, bu yüzden her 0x28 baytta (bayt 0'dan başlayarak) 8 bayt alabilir ve bu, **çağrılacak işlevin adresi** olacaktır:
|
||||
|
||||
<figure><img src="../../../../.gitbook/assets/image (35).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
|
@ -754,12 +388,12 @@ Bu veriler [**bu Hopper betiği kullanılarak**](https://github.com/knightsc/hop
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>Sıfırdan başlayarak AWS hacklemeyi öğ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>Sıfırdan başlayarak AWS hacklemeyi</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong> ile öğrenin!</strong></summary>
|
||||
|
||||
HackTricks'i desteklemenin diğer yolları:
|
||||
|
||||
* **Şirketinizi HackTricks'te reklam görmek** veya **HackTricks'i PDF olarak indirmek** için [**ABONELİK PLANLARINI**](https://github.com/sponsors/carlospolop) kontrol edin!
|
||||
* **Ş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 Ailesi'ni**](https://opensea.io/collection/the-peass-family) keşfedin, özel [**NFT'lerimiz**](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** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)** takip edin.**
|
||||
* **Hacker hilelerinizi göndererek PR'ler oluşturarak paylaşın** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)'i keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuzu
|
||||
* **💬 [Discord grubuna](https://discord.gg/hRep4RUj7f)** veya [telegram grubuna](https://t.me/peass)** katılın veya** bizi **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)** takip edin.**
|
||||
* **Hacker hilelerinizi paylaşarak PR'ler gönderin** [**HackTricks**](https://github.com/carlospolop/hacktricks) **ve** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **github depolarına.**
|
||||
|
|
Loading…
Add table
Reference in a new issue