Java DNS Deserialization, GadgetProbe and Java Deserialization Scanner
Last updated
Last updated
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE) GCP Hacking'i öğrenin ve pratik yapın: HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)
java.net.URL
sınıfı Serializable
'ı uygular, bu da bu sınıfın serileştirilebileceği anlamına gelir.
Bu sınıfın meraklı bir davranışı var. Belgelerden: “İki ana bilgisayar, her iki ana bilgisayar adı da aynı IP adreslerine çözümlenebiliyorsa eşdeğer kabul edilir.”
Bu durumda, 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, bu nesneyi deseralize edilecek bir HashMap
içine yerleştirmek yeterlidir. Bunun nedeni, HashMap
'in readObject
fonksiyonunun sonunda bu kodun çalıştırılmasıdır:
Bu, HashMap
içindeki her değerle putVal
'ı çalıştıracak. Ancak, daha önemli olan her değerle hash
çağrısıdır. İşte hash
fonksiyonunun kodu:
Gözlemleyebileceğiniz gibi, deserialization sırasında bir HashMap
için hash
fonksiyonu her nesne ile birlikte çalıştırılacak ve hash
çalıştırılması sırasında nesnenin .hashCode()
çalıştırılacak. Bu nedenle, eğer bir URL nesnesi içeren bir HashMap
deserialization ederseniz, URL nesnesi .hashCode()
çalıştıracaktır.
Şimdi URLObject.hashCode()
koduna bir göz atalım:
Aşağıda görebileceğiniz gibi, bir URLObject
.hashCode()
çalıştırdığında hashCode(this)
olarak çağrılır. Devamında bu fonksiyonun kodunu görebilirsiniz:
Bir getHostAddress
'in domaine uygulandığını görebilirsiniz, bir DNS sorgusu başlatıyor.
Bu nedenle, bu sınıf istismar edilebilir ve deserialization'ın mümkün olduğunu göstermek veya hatta bilgi sızdırmak için bir DNS sorgusu başlatmak amacıyla kullanılabilir (bir komut yürütme çıktısını alt alan adı olarak ekleyebilirsiniz).
URDNS yük kodunu ysoserial'den burada bulabilirsiniz. Ancak, kodlamayı anlamayı kolaylaştırmak için kendi PoC'mi (ysoserial'den olanına dayalı) oluşturdum:
Orijinal fikirde commons collections yükü, bir DNS sorgusu gerçekleştirmek için değiştirildi, bu önerilen yöntemden daha az güvenilir, ancak bu gönderi: https://www.gosecure.net/blog/2017/03/22/detecting-deserialization-bugs-with-dns-exfiltration/
GadgetProbe Burp Suite Uygulama Mağazası'ndan (Extender) indirilebilir.
GadgetProbe, sunucunun Java sınıfında bazı Java sınıflarının var olup olmadığını anlamaya çalışacak, böylece eğer bilinen bir istismara duyarlı olup olmadığını bilebilirsiniz.
GadgetProbe, önceki bölümün aynı DNS yükünü kullanacak, ancak DNS sorgusunu çalıştırmadan önce rastgele bir sınıfı deseralize etmeye çalışacak. Eğer rastgele sınıf mevcutsa, DNS sorgusu gönderilecek ve GadgetProbe bu sınıfın var olduğunu not edecektir. Eğer DNS isteği asla gönderilmezse, bu, rastgele sınıfın başarıyla deseralize edilmediği anlamına gelir, yani ya mevcut değildir ya da serileştirilebilir/istismar edilebilir değildir.
GitHub içinde, GadgetProbe bazı kelime listelerine sahiptir ve test edilmek üzere Java sınıfları içerir.
Bu tarayıcı Burp Uygulama Mağazası'ndan (Extender) indirilebilir. Eklenti, pasif ve aktif yeteneklere sahiptir.
Varsayılan olarak, Java serileştirilmiş sihirli baytları aramak için gönderilen tüm istekleri ve yanıtları pasif olarak kontrol eder ve herhangi bir bulursa bir güvenlik açığı uyarısı sunar:
Manuel Test
Bir isteği seçebilir, sağ tıklayıp DS'ye istek gönder - Manuel Test
seçeneğini tıklayabilirsiniz.
Ardından, Deserialization Tarayıcı Sekmesi --> Manuel test sekmesi içinde ekleme noktasını seçebilirsiniz. Ve testi başlatın (Kullanılan kodlamaya bağlı olarak uygun saldırıyı seçin).
Bu "Manuel test" olarak adlandırılsa da, oldukça otomatikleştirilmiştir. Deserialization'ın herhangi bir ysoserial yüküne duyarlı olup olmadığını kontrol edecek ve web sunucusunda mevcut olan kütüphaneleri kontrol ederek duyarlı olanları vurgulayacaktır. Duyarlı kütüphaneleri kontrol etmek için Java Sleeps, CPU tüketimi yoluyla sleeps veya daha önce bahsedildiği gibi DNS kullanarak başlatmayı seçebilirsiniz.
İstismar
Duyarlı bir kütüphane tanımladıktan sonra isteği İstismar Sekmesine gönderebilirsiniz. Bu sekmede, enjekte etme noktasını tekrar seçmeli, istismar etmek istediğiniz duyarlı kütüphaneyi ve komutu yazmalısınız. Ardından, uygun Saldırı butonuna basın.
Yükünüzü aşağıdakine benzer bir şey çalıştıracak şekilde yapın:
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE) GCP Hacking'i öğrenin ve pratik yapın: HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)