Java DNS Deserialization, GadgetProbe and Java Deserialization Scanner
DNS zahtev prilikom deserijalizacije
Klasa java.net.URL
implementira Serializable
, što znači da ova klasa može biti serializovana.
Ova klasa ima zanimljivo ponašanje. Prema dokumentaciji: "Dva domaćina se smatraju ekvivalentnim ako se oba imena domaćina mogu prevesti u iste IP adrese".
Zatim, svaki put kada objekat URL pozove bilo koju od funkcija equals
ili hashCode
poslaće se DNS zahtev da se dobije IP adresa.
Pozivanje funkcije hashCode
iz objekta URL je prilično jednostavno, dovoljno je ubaciti ovaj objekat unutar HashMap
koji će biti deserializovan. To je zato što se na kraju funkcije readObject
iz HashMap
izvršava ovaj kod:
To će izvršiti putVal
sa svakom vrednošću unutar HashMap
. Međutim, važniji je poziv funkcije hash
sa svakom vrednošću. Ovo je kod funkcije hash
:
Kao što možete primetiti, prilikom deserializacije HashMap
-a funkcija hash
će biti izvršena sa svakim objektom i tokom izvršenja hash
-a biće izvršen .hashCode()
objekta. Dakle, ako deserijalizujete HashMap
koji sadrži objekat URL, objekat URL će izvršiti .hashCode()
.
Sada, pogledajmo kod URLObject.hashCode()
:
Kao što možete videti, kada URLObject
izvrši .hashCode()
, poziva se hashCode(this)
. Nastavak možete videti u kodu ove funkcije:
Možete videti da se izvršava getHostAddress
za domen, pokreće se DNS upit.
Stoga se ovaj razred može zloupotrebiti kako bi se pokrenuo DNS upit kako bi se pokazalo da je deserijalizacija moguća, ili čak da se eksfiltriraju informacije (možete dodati kao poddomen izlaz iz izvršenja komande).
Primer koda URLDNS payloada
Možete pronaći kod URLDNS payloada od ysoserial ovde. Međutim, samo radi lakšeg razumevanja kako ga kodirati, kreirao sam svoj PoC (baziran na onom iz ysoserial):
Više informacija
U originalnoj ideji, payload za kolekcije je promenjen kako bi izvršio DNS upit, što je manje pouzdano od predložene metode, ali ovo je post: https://www.gosecure.net/blog/2017/03/22/detecting-deserialization-bugs-with-dns-exfiltration/
GadgetProbe
Možete preuzeti GadgetProbe sa Burp Suite App Store (Extender).
GadgetProbe će pokušati da utvrdi da li neke Java klase postoje na Java klasi servera kako biste znali da li je ranjiv na neki poznati eksploatacioni metod.
Kako radi
GadgetProbe će koristiti isti DNS payload iz prethodne sekcije ali pre slanja DNS upita će pokušati da deserijalizuje proizvoljnu klasu. Ako proizvoljna klasa postoji, DNS upit će biti poslat i GadgetProbe će zabeležiti da ta klasa postoji. Ako DNS zahtev nikada nije poslat, to znači da proizvoljna klasa nije uspešno deserijalizovana, pa ili nije prisutna ili nije serijalizovana/eksploatabilna.
Unutar github-a, GadgetProbe ima neke liste reči sa Java klasama koje treba testirati.
Više informacija
Java Deserialization Scanner
Ovaj skener možete preuzeti sa Burp App Store (Extender). Ova ekstenzija ima pasivne i aktivne mogućnosti.
Pasivne
Podrazumevano pasivno proverava sve zahteve i odgovore poslate tražeći Java serijalizovane magične bajtove i prikazaće upozorenje o ranjivosti ako ih pronađe:
Aktivne
Ručno testiranje
Možete izabrati zahtev, desni klik i Send request to DS - Manual Testing
.
Zatim, unutar Deserialization Scanner Tab --> Manual testing tab možete izabrati tačku umetanja. I pokrenuti testiranje (Izaberite odgovarajući napad u zavisnosti od korišćenog enkodiranja).
Iako se ovo naziva "Ručno testiranje", prilično je automatizovano. Automatski će proveriti da li je deserijalizacija ranjiva na bilo koji ysoserial payload proveravajući biblioteke prisutne na web serveru i istaćiće one koje su ranjive. Da biste proverili za ranjive biblioteke možete izabrati da pokrenete Javas Sleeps, sleeps putem CPU potrošnje, ili korišćenjem DNS-a kako je prethodno pomenuto.
Eksploatisanje
Kada identifikujete ranjivu biblioteku, možete poslati zahtev na Exploiting Tab. U ovom tabu ponovo morate izabrati tačku ubacivanja, napisati ranjivu biblioteku za koju želite da napravite payload, i komandu. Zatim, samo pritisnite odgovarajući Attack dugme.
Java Deserialization DNS Exfil informacije
Napravite svoj payload da izvrši nešto slično sledećem:
Više informacija
Last updated