Java DNS Deserialization, GadgetProbe and Java Deserialization Scanner
Last updated
Last updated
Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Die klas java.net.URL
implementeer Serializable
, dit beteken dat hierdie klas geserialiseer kan word.
Hierdie klas het 'n nuuskierige gedrag. Uit die dokumentasie: “Twee gasheer is gelykwaardig as beide gasheername in dieselfde IP adresse opgelos kan word.”
Dan, elke keer as 'n URL objek enige van die funksies equals
of hashCode
aanroep, gaan 'n DNS versoek om die IP Adres te kry gestuur word.
Om die funksie hashCode
van 'n URL objek aan te roep is redelik maklik, dit is genoeg om hierdie objek binne 'n HashMap
in te voeg wat gedeserialiseer gaan word. Dit is omdat aan die einde van die readObject
funksie van HashMap
hierdie kode uitgevoer word:
Dit is gaan die uitvoer putVal
met elke waarde binne die HashMap
. Maar, meer relevant is die oproep na hash
met elke waarde. Dit is die kode van die hash
funksie:
As you can observe, wanneer deserialiseer 'n HashMap
gaan die funksie hash
uitgevoer word met elke objek en tydens die hash
uitvoering gaan dit .hashCode()
van die objek uitvoer. Daarom, as jy deserialiseer 'n HashMap
wat 'n URL objek bevat, sal die URL objek .hashCode()
uitvoer.
Nou, kom ons kyk na die kode van URLObject.hashCode()
:
As you can see, when a URLObject
executes.hashCode()
it is called hashCode(this)
. 'n Voortsetting kan jy die kode van hierdie funksie sien:
You can see that a getHostAddress
is executed to the domain, wat 'n DNS-navraag ontketen.
Therefore, this class can be misbruik in orde om 'n DNS-navraag te ontketen om te demonstrate dat deserialisering moontlik is, of selfs om inligting te exfiltreer (jy kan die uitvoer van 'n opdraguitvoering as subdomein byvoeg).
You can find the URDNS payload code from ysoserial here. However, just for make it easier to understand how to code it I created my own PoC (based on the one from ysoserial):
In die oorspronklike idee is die commons collections payload verander om 'n DNS-navraag uit te voer, dit was minder betroubaar as die voorgestelde metode, maar dit is die pos: https://www.gosecure.net/blog/2017/03/22/detecting-deserialization-bugs-with-dns-exfiltration/
Jy kan GadgetProbe aflaai van die Burp Suite App Store (Extender).
GadgetProbe sal probeer om uit te vind of sommige Java klasse bestaan op die Java klas van die bediener sodat jy kan weet of dit kwulnerbaar is vir 'n bekende ontploffing.
GadgetProbe sal dieselfde DNS payload van die vorige afdeling gebruik, maar voor dit die DNS-navraag uitvoer, sal dit probeer om 'n arbitrêre klas te deserialiseer. As die arbitrêre klas bestaan, sal die DNS-navraag gestuur word en GadgetProbe sal opteken dat hierdie klas bestaan. As die DNS versoek nooit gestuur word, beteken dit dat die arbitrêre klas nie suksesvol gedeserialiseer is nie, so dit is of nie teenwoordig nie of dit is nie serialiseerbaar/uitbuitbaar nie.
Binne die github, GadgetProbe het 'n paar woordlyste met Java klasse wat getoets kan word.
Hierdie scanner kan afgelaai word van die Burp App Store (Extender). Die uitbreiding het passiewe en aktiewe vermoëns.
Standaard kontroleer dit passief al die versoeke en antwoorde wat gestuur word soek vir Java geserialiseerde magiese bytes en sal 'n kwesbaarheid waarskuwing aanbied as enige gevind word:
Handmatige Toetsing
Jy kan 'n versoek kies, regs klik en Stuur versoek na DS - Handmatige Toetsing
.
Dan, binne die Deserialization Scanner Tab --> Handmatige toetsing tab kan jy die invoegpunt kies. En begin die toetsing (Kies die toepaslike aanval afhangende van die kodering wat gebruik word).
Selfs al word dit "Handmatige toetsing" genoem, is dit redelik geoutomatiseer. Dit sal outomaties kontroleer of die deserialisering kwulnerbaar is vir enige ysoserial payload deur die biblioteke wat op die webbediener teenwoordig is te kontroleer en sal die kwesbare uitlig. Om te kontroleer vir kwulnerbare biblioteke kan jy kies om Javas Sleeps te begin, slaap via CPU verbruik, of deur DNS soos voorheen genoem.
Uitbuiting
Sodra jy 'n kwesbare biblioteek geïdentifiseer het, kan jy die versoek na die Uitbuiting Tab stuur. In hierdie tab moet jy die inspuitpunt weer kies, en skryf die kwulnerbare biblioteek waarvoor jy 'n payload wil skep, en die opdrag. Druk dan net die toepaslike Aanval knoppie.
Maak jou payload iets soos die volgende uitvoer:
Leer & oefen AWS Hacking:HackTricks Opleiding AWS Red Team Expert (ARTE) Leer & oefen GCP Hacking: HackTricks Opleiding GCP Red Team Expert (GRTE)