Phân tích gadget URLDNS
Phân tích gadget URLDNS
Setup
Tạo chain bằng ysoserial:
1 | # Switch Java về Java 8 |
Đoạn code deserialize:
1 | package org.example; |
Sau khi deserialize, đã có DNS đến RequestRepo:
Debug gadget chain
Tổng quan
Vì gadgetchain này lợi dụng class có sẵn trong Java nên ta không cần phải khai báo thêm thư viện gì cả
Sơ đồ gadgetchain URLDNS:
1 | HashMap.readObject() |
Xem luôn cách ysoserial tạo payload ở đây
1 | public Object getObject(final String url) throws Exception { |
Đầu tiên Object của class URL được tạo với url là input của ta, handler là Object của class URLStreamHandler.
Tiếp theo class u (URL) được put vào hashmap.
Cuối cùng dùng Reflection để thay đổi giá trị của property private hashCode. (Reflections : import ysoserial.payloads.util.Reflections;)
Debug
Gadget này được trigger khi ta gọi readObject() của class HashMap() nên ta bắt đầu đặt breakpoint từ HashMap.
Mở InteliJ, nhấn F1 để tìm file HashMap.java (Tích Include non-project items)
Trong file HashMap.java , Ctrl F để tìm hàm readObject()
Tại đây, nó sẽ loop qua từng key của HashMap và thực hiện putVal(hash(key))
1 | // Read the keys and values, and put the mappings in the HashMap |
Đặt breakpoint đầu tiên tại đây để xem giá trị của key
Ở đây key chính là object URL ta đã truyền vào.
Tiếp tục đặt breakpoint ở hàm hash()
Tiếp tục gọi đến key.hashCode() .Do ở đây key chính là Object URL ta truyền vào, nghĩa là đang gọi đến URL.hashCode()
Step into (F11) để nhảy vào method hashCode()
Method này sẽ kiểm tra giá trị của property hashCode có khác -1 hay không, nếu khác thì tiếp tục gọi đến handler.hasCode() còn nếu không thì return.
Do khi put ht.put(u, url); thì Object đã Object đã bị gọi hashCode() (tính toán và cache giá trị hash) dẫn đến property của hashCode khác -1 nên sau khi put, cần sử dụng Reflection để thay đổi giá trị của hashCode trong runtime về lại -1.
Sau khi check điều kiện hashCode != 1,tiếp tục đến handler.hashCode()
handler là class của object URLStreamHandler
1 | transient URLStreamHandler handler; |
Tiếp tục đặt breakpoint ở hàm hashCode() của handler ta thấy nó sẽ gọi đến getHostAddress() với u là class URL do ta truyền vào.
Tiếp tục debug, trong hàm getHostAddress() sẽ gọi đến InetAddress.getByName()
để resolve DNS đến host của ta.
Khi này ở RequestRepo sẽ thấy có DNS đến.
Vậy thì gadgetchain đầy đủ sẽ là:
1 | HashMap.readObject() |
Đây là gadgetchain đơn giản nhất trong các gadgetchain ysoserial, nó giúp có cái nhìn tổng quát về gadgetchain trong Java cũng như là học được cách debug trong InteliJ.