* Şirketinizi HackTricks'te **reklamınızı görmek** veya **HackTricks'i PDF olarak indirmek** için [**ABONELİK PLANLARINI**](https://github.com/sponsors/carlospolop) kontrol edin!
* Özel [**NFT'lerden**](https://opensea.io/collection/the-peass-family) oluşan koleksiyonumuz [**The PEASS Family**](https://opensea.io/collection/the-peass-family)'i keşfedin
* 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) **katılın** veya **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)'u **takip edin**.
Bu sınıfın **ilginç bir davranışı** vardır. Dokümantasyona göre: "**İki ana bilgisayar, her iki ana bilgisayar adı da aynı IP adreslerine çözümlenebilirse eşit kabul edilir**".\
Bu nedenle, bir URL nesnesi **`equals`** veya **`hashCode`** fonksiyonlarından herhangi birini çağırdığında IP adresini almak için bir **DNS isteği** gönderilecektir.
Bir URL nesnesinden **`hashCode`** fonksiyonunu çağırmak oldukça kolaydır, yeterli olan bu nesneyi bir `HashMap` içine yerleştirmektir ve bu `HashMap` deserialize edilecektir. Bu, `HashMap`'in **`readObject`** fonksiyonunun sonunda bu kodun çalıştırılmasından dolayıdır:
Bu, `HashMap` içindeki her değerle birlikte `putVal`'i **çalıştıracak**. Ancak, daha önemli olan her değerle `hash`'in çağrılmasıdır. İşte `hash` fonksiyonunun kodu:
Gözlemleyebileceğiniz gibi, bir `HashMap` nesnesini **serileştirirken**, `hash` işlevi her nesneyle birlikte **çalıştırılacak** ve **`hash`** işlevinin **nesnenin `.hashCode()`'unu çalıştıracağı** sırada **çalıştırılacaktır**. Bu nedenle, bir **URL** nesnesi içeren bir **`HashMap`** nesnesini **serileştirirseniz**, **URL nesnesi**`.hashCode()`'u **çalıştıracaktır**.
Gördüğünüz gibi, bir `URLObject` nesnesi `.hashCode()` işlemini gerçekleştirdiğinde `hashCode(this)` olarak adlandırılır. Devamında bu fonksiyonun kodunu görebilirsiniz:
Bu nedenle, bu sınıf, **deserializasyonun mümkün olduğunu göstermek** veya hatta bilgi **sızdırmak** için **kötüye kullanılabilir** (bir komutun çıktısını alt alan adına ekleyebilirsiniz).
[ysoserial'dan URDNS payload kodunu burada bulabilirsiniz](https://github.com/frohoff/ysoserial/blob/master/src/main/java/ysoserial/payloads/URLDNS.java). Ancak, nasıl kodlanacağını daha iyi anlamanız için kendi PoC'umu (ysoserial'dan alınan bir temel üzerine) oluşturdum.
* Orijinal fikirde, commons collections payload'u DNS sorgusu yapmak için değiştirildi, bu, önerilen yöntemden daha güvenilir değildi, ancak bu yazıda yer alıyor: [https://www.gosecure.net/blog/2017/03/22/detecting-deserialization-bugs-with-dns-exfiltration/](https://www.gosecure.net/blog/2017/03/22/detecting-deserialization-bugs-with-dns-exfiltration/)
**GadgetProbe**, sunucunun Java sınıfında bazı**Java sınıflarının var olup olmadığını** belirlemeye çalışacak, böylece **bilinen bir saldırıya karşı savunmasız olup olmadığını** bilebilirsiniz.
**GadgetProbe**, önceki bölümdeki **DNS payload'ını** kullanacak, ancak **DNS sorgusunu çalıştırmadan önce** bir **keyfi sınıfı deserialize etmeye** çalışacak. Eğer **keyfi sınıf varsa**, **DNS sorgusu** gönderilecek ve GadgetProbe bu sınıfın var olduğunu belirtecektir. Eğer **DNS** isteği **hiç gönderilmezse**, bu, **keyfi sınıfın başarılı bir şekilde deserialize edilmediği** anlamına gelir, bu da ya mevcut değil ya da **serileştirilemez/sömürülemez**.
Github içinde, [**GadgetProbe'un bazı kelime listeleri**](https://github.com/BishopFox/GadgetProbe/tree/master/wordlists) test edilmek üzere Java sınıfları içerir.
Varsayılan olarak, **Java serileştirilmiş sihirli baytları** arayan ve bulunan herhangi bir durumda bir güvenlik uyarısı sunan **tüm istekleri ve yanıtları pasif olarak kontrol eder**:
Bir isteği seçebilir, sağ tıklayabilir ve `DS - Manual Testing'e isteği gönder` seçebilirsiniz.
Ardından, _Deserialization Scanner Tab_ --> _Manual testing tab_ içinde **ekleme noktasını** seçebilir ve testi başlatabilirsiniz (Kullanılan kodlamaya bağlı olarak uygun saldırıyı seçin).
Bu "Elle test" olarak adlandırılsa da oldukça **otomatiktir**. Web sunucusunda bulunan kütüphaneleri kontrol ederek **serileştirme**nin **herhangi bir ysoserial payload'ına karşı savunmasız olup olmadığını otomatik olarak kontrol eder** ve savunmasız olanları vurgular. **Savunmasız kütüphaneleri kontrol etmek** için **Javas Sleeps**, **CPU** tüketimi yoluyla **sleeps** veya daha önce bahsedildiği gibi **DNS** kullanmayı seçebilirsiniz.
Savunmasız bir kütüphane tespit ettikten sonra isteği _Exploiting Tab_'a gönderebilirsiniz.
Bu sekmede, **enjeksiyon noktasını** tekrar seçmeniz, oluşturmak istediğiniz **savunmasız kütüphaneyi** ve **komutu** yazmanız gerekmektedir. Ardından, uygun **Attack** düğmesine basmanız yeterlidir.
<summary><strong>AWS hacklemeyi sıfırdan kahraman olmak için</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Kırmızı Takım Uzmanı)</strong></a><strong> öğrenin!</strong></summary>
* **Şirketinizi HackTricks'te reklamınızı görmek veya HackTricks'i PDF olarak indirmek** için [**ABONELİK PLANLARI**](https://github.com/sponsors/carlospolop)'na göz atın!
* Özel [**NFT'lerden**](https://opensea.io/collection/the-peass-family) oluşan koleksiyonumuz [**The PEASS Family**](https://opensea.io/collection/the-peass-family)'i keşfedin
* 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) **katılın** veya **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)'u **takip edin**.