Java DNS Deserialization, GadgetProbe and Java Deserialization Scanner
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking:
HackTricks Training GCP Red Team Expert (GRTE)
DNS zahtev na deserializaciji
Klasa java.net.URL
implementira Serializable
, što znači da se ova klasa može serijalizovati.
Ova klasa ima znatiželjno ponašanje. Iz dokumentacije: “Dva hosta se smatraju ekvivalentnim ako se oba imena hosta mogu rešiti u iste IP adrese”.
Zatim, svaki put kada URL objekat pozove bilo koju od funkcija equals
ili hashCode
, DNS zahtev za dobijanje IP adrese će biti poslat.
Pozivanje funkcije hashCode
iz URL objekta je prilično jednostavno, dovoljno je da se ovaj objekat umetne unutar HashMap
koja će biti deserializovana. 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
. Ali, relevantniji je poziv na hash
sa svakom vrednošću. Ovo je kod funkcije hash
:
Kao što možete primetiti, kada se deserializuje HashMap
, funkcija hash
će biti izvršena sa svakim objektom i tokom izvršenja hash
biće izvršena .hashCode()
objekta. Stoga, ako deserializujete HashMap
koja sadrži URL objekat, URL objekat će izvršiti .hashCode()
.
Sada, hajde da pogledamo kod URLObject.hashCode()
:
Kao što možete videti, kada URLObject
izvrši .hashCode()
, poziva se hashCode(this)
. U nastavku možete videti kod ove funkcije:
Možete videti da se getHostAddress
izvršava za domen, pokrećući DNS upit.
Stoga, ova klasa može biti zloupotrebljena kako bi se pokrenuo DNS upit da prikaže da je deseralizacija moguća, ili čak da ekstrahuje informacije (možete dodati kao poddomen izlaz izvršenja komande).
URLDNS payload kod primer
Možete pronaći URDNS payload kod od ysoserial ovde. Međutim, samo da bi bilo lakše razumeti kako to kodirati, napravio sam svoj PoC (zasnovan na onom iz ysoserial):
Više informacija
U originalnoj ideji, payload commons collections je promenjen da izvrši DNS upit, ovo je bilo 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 iz Burp Suite App Store-a (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 exploit.
Kako to funkcioniše
GadgetProbe će koristiti isti DNS payload iz prethodne sekcije ali pre nego što izvrši DNS upit, pokušaće da deserijalizuje proizvoljnu klasu. Ako proizvoljna klasa postoji, DNS upit će biti poslat i GadgetProbe će zabeležiti da ova klasa postoji. Ako DNS zahtev nikada nije poslat, to znači da proizvoljna klasa nije uspešno deserijalizovana, tako da ili nije prisutna ili nije serializable/exploitable.
Unutar github-a, GadgetProbe ima neke rečnike sa Java klasama za testiranje.
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F3850298721-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252Fs712eRnz5qRNRafWqq3N%252Fuploads%252Fgit-blob-75ac066e3db39effbb723a0bfc06cc9f3d85f198%252Fintruder4%2520%281%29%2520%281%29.gif%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=510e59aa&sv=1)
Više informacija
Java Deserialization Scanner
Ovaj skener se može preuzeti iz Burp App Store-a (Extender). Ekstenzija ima pasivne i aktivne mogućnosti.
Pasivno
Podrazumevano pasivno proverava sve zahteve i odgovore koji se šalju tražeći Java serializovane magične bajtove i predstaviće upozorenje o ranjivosti ako se bilo koja pronađe:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F3850298721-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252Fs712eRnz5qRNRafWqq3N%252Fuploads%252Fgit-blob-dd473120602f042a13ca176063ed9a5497fa5f1b%252Fimage%2520%28765%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=e1d607bd&sv=1)
Aktivno
Ručno testiranje
Možete odabrati zahtev, desni klik i Send request to DS - Manual Testing
.
Zatim, unutar Deserialization Scanner Tab --> Manual testing tab možete odabrati tačku umetanja. I pokrenuti testiranje (Odaberite odgovarajući napad u zavisnosti od korišćenog kodiranja).
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F3850298721-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252Fs712eRnz5qRNRafWqq3N%252Fuploads%252Fgit-blob-0b526479acce0fe251f09c7d7104c3bc73040171%252F3-1.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=529cd962&sv=1)
Čak i ako 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 istaknuti one ranjive. Da biste proverili ranjive biblioteke, možete odabrati da pokrenete Javas Sleeps, sleeps putem CPU potrošnje, ili koristeći DNS kao što je prethodno pomenuto.
Eksploatacija
Kada identifikujete ranjivu biblioteku, možete poslati zahtev na Exploiting Tab. U ovoj kartici morate ponovo odabrati tačku injekcije, napišite ranjivu biblioteku za koju želite da kreirate payload, i komandu. Zatim, samo pritisnite odgovarajući Attack dugme.
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F3850298721-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252Fs712eRnz5qRNRafWqq3N%252Fuploads%252Fgit-blob-1cb2ee1425024eff539602a8df04038d960a7f1c%252F4.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=a125deb&sv=1)
Java Deserialization DNS Exfil informacije
Neka vaš payload izvrši nešto poput sledećeg:
Više Informacija
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking:
HackTricks Training GCP Red Team Expert (GRTE)
Last updated