Java DNS Deserialization, GadgetProbe and Java Deserialization Scanner
Serileştirme üzerinden DNS isteği
java.net.URL
sınıfı Serializable
arabirimini uygular, bu da bu sınıfın serileştirilebileceği anlamına gelir.
Bu sınıfın ilginç bir davranışı var. Belgelendirmeye göre: "İki ana makine, her iki ana makine adı da aynı IP adreslerine çözümlenebiliyorsa eşit kabul edilir".
Sonra, bir URL nesnesi herhangi bir equals
veya hashCode
fonksiyonunu çağırdığında bir IP Adresi almak için bir DNS isteği gönderilecektir.
Bir URL nesnesinden hashCode
fonksiyonunu çağırmak oldukça kolaydır, bu nesneyi deserialize edilecek bir HashMap
içine eklemek yeterlidir. Bu, HashMap
'ın readObject
fonksiyonunun sonunda bu kodun çalıştırılmasından dolayıdır:
Bu, HashMap
içindeki her değerle putVal
'in çalıştırılacağını gösteriyor. Ancak, daha önemli olan her değerle hash
'ın çağrılmasıdır. İşte hash
fonksiyonunun kodu:
Gözlemleyebileceğiniz gibi, bir HashMap
de-serileştirildiğinde, hash
fonksiyonu her nesne ile yürütülecek ve hash
yürütülürken nesnenin .hashCode()
'u yürütülecektir. Dolayısıyla, bir HashMap
içeren bir URL nesnesi de-serileştirildiğinde, URL nesnesi .hashCode()
'u yürütecektir.
Şimdi, URLObject.hashCode()
koduna bir göz atalım:
Gördüğünüz gibi, bir URLObject
bir .hashCode()
çalıştırdığında, buna hashCode(this)
denir. Devamında bu fonksiyonun kodunu görebilirsiniz:
Görüldüğü gibi bir getHostAddress
alanı etki alanına yönlendirilir, bir DNS sorgusu başlatılır.
Bu nedenle, bu sınıf istismar edilebilir ve deserilizasyonun mümkün olduğunu göstermek veya hatta bilgi sızdırmak için bir DNS sorgusu başlatmak için kullanılabilir (bir komut yürütme çıktısını alt alan adı olarak ekleyebilirsiniz).
URLDNS yükü kod örneği
URDNS yükü kodunu buradan bulabilirsiniz. Ancak, kodlamayı nasıl yapılacağını anlamanızı kolaylaştırmak için kendi PoC'umu oluşturdum (ysoserial'dan alınan bir örneğe dayanarak):
Daha fazla bilgi
Orijinal fikirde, commons collections yükü bir DNS sorgusu gerçekleştirmek üzere değiştirildi, bu önerilen yöntemden daha az güvenilirdi, ancak bu yazı: https://www.gosecure.net/blog/2017/03/22/detecting-deserialization-bugs-with-dns-exfiltration/
GadgetProbe
GadgetProbe'u Burp Suite Uygulama Mağazası'ndan (Extender) indirebilirsiniz.
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ızı bilebilirsiniz.
Nasıl çalışır
GadgetProbe, önceki bölümdeki DNS yükü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 belirtecek. 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 demektir.
Github içinde, GadgetProbe'un bazı kelime listeleri test edilmek üzere Java sınıflarına sahiptir.
Daha Fazla Bilgi
Java Deserialization Tarayıcı
Bu tarayıcıyı Burp App Store'dan (Extender) indirebilirsiniz. Uzantı, pasif ve aktif yeteneklere sahiptir.
Pasif
Varsayılan olarak, Java serileştirilmiş sihirli baytları arayan ve herhangi bir bulursa bir güvenlik açığı uyarısı sunan tüm istekleri ve yanıtları pasif olarak kontrol eder:
Aktif
Manuel Test
Bir isteği seçebilir, sağ tıklayabilir ve Send request to DS - Manual Testing
seçeneğini seçebilirsiniz.
Ardından, Deserialization Scanner Tab --> Manual testing tab içinde yerleştirme noktasını seçebilirsiniz. Ve testi başlatabilirsiniz (Kullanılan kodlamaya bağlı olarak uygun saldırıyı seçin).
Bu "Manuel test" olarak adlandırılsa da oldukça otomatiktir. Web sunucusunda bulunan kütüphaneleri kontrol ederek serileştirmenin herhangi bir ysoserial yüküne 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 aracılığıyla sleeps veya daha önce belirtildiği gibi DNS kullanarak başlatmayı seçebilirsiniz.
Sömürü
Bir savunmasız kütüphane belirledikten sonra isteği Exploiting Tab'a gönderebilirsiniz. Bu sekmede yerleştirme noktasını yeniden seçmeniz, bir sömürülebilir kütüphane oluşturmak istediğiniz ve komutu yazmanız gerekecektir. Ardından, uygun Saldırı düğmesine basmanız yeterlidir.
Java Deserialization DNS Exfil bilgisi
Payload'ınızın aşağıdakine benzer bir şeyi çalıştırmasını sağlayın:
Daha Fazla Bilgi
Last updated