Java DNS Deserialization, GadgetProbe and Java Deserialization Scanner
Deserialization'da DNS isteği
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. Belgede: “İki ana bilgisayar, her iki ana bilgisayar adı da aynı IP adreslerine çözümlenebiliyorsa eşdeğer 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, 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 HashMap
içinde bir URL nesnesi 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).
URLDNS yük kodu örneği
URDNS yük kodunu ysoserial'den burada bulabilirsiniz. Ancak, kodlamayı anlamayı kolaylaştırmak için kendi PoC'mi oluşturdum (ysoserial'den alınan birine dayalı):
Daha fazla bilgi
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
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.
Nasıl çalışır
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 mevcut 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 Java sınıflarının test edilmesi için kullanılabilir.
Daha Fazla Bilgi
Java Deserialization Tarayıcı
Bu tarayıcı Burp Uygulama Mağazası'ndan (Extender) indirilebilir. Eklenti, pasif ve aktif yeteneklere sahiptir.
Pasif
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:
Aktif
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üphaneyi tanımladıktan sonra isteği İstismar Sekmesine gönderebilirsiniz. Bu sekmede, enjekte etme noktasını tekrar seçmeniz, oluşturmak istediğiniz duyarlı kütüphaneyi ve komutu yazmanız gerekir. Ardından, uygun Saldırı butonuna basın.
Java Deserialization DNS Exfil bilgisi
Yükünüzü aşağıdakine benzer bir şey çalıştıracak şekilde yapın:
Daha Fazla Bilgi
Last updated