一、介绍DNS外带执行链
目标:
为了让读者了解dns外带执行链的条件和在反序列化漏洞中的角色
1、dns外带的概念
(1):DNS协议的工作原理
①用户在浏览器中输入网址,如(www.baidu.com),然后浏览器会像DNS服务器发送DNS查询请求,询问网址对应的IP地址。
②先是本地DNS服务器接收到请求后会查看缓存,如果没有该网址的缓存则会向更高层次的DNS服务器转发该请求,如根DNS服务器。
③值得注意的是,根服务器并不会提供IP地址,而是会根据后缀(.com)找到负责该后缀的权威DNS服务器。
④权威服务器存储了域名与IP地址的映射关系,将请求转发到最准确的DNS服务器,然后返回相对应的IP地址。
⑤最后IP地址返回给本地DNS服务器并缓存起来,然后浏览器根据该IP地址访问网站。
(2)外带的介绍和危害
①外带的概念
”外带“简单来说就是将数据信息隐蔽的带入或带出系统,该过程通长使用DNS请求或响应的字段来传递数据。
②具体方式
Ⅰ DNS请求传递数据:由于DNS查询本就可以携带一些额外的信息,因此攻击者可以利用这一特点来携带一些信息,如:通过查询子域名的方式,将恶意数据编码放入到子域名当中,然后将精心构造好的请求发送给目标DNS服务器,实现信息的传递
Ⅱ DNS响应传递数据:由于响应也可携带如TXT类型的数据,攻击者可以将恶意的数据分段编码写入响应中,让目标系统提取这些数据,实现信息的传递。
③具体应用
Ⅰ 反序列化攻击:将可以执行反序列化漏洞的恶意代码序列化数据通过外带传递给目标系统,然后目标系统在对传来的数据序列化时执行恶意代码触发漏洞。
Ⅱ 数据窃取或命令控制:通过DNS查询使得目标系统将一些敏感信息分段发送给攻击者控制的DNS服务器,从而实现数据窃取。
通过DNS响应,将控制命令和恶意配置传递给被感染的系统,从而实现对目标系统的控制。
2、利用DNS执行链外带触发和传播漏洞的原理:
(1)执行链的含义
“执行链”通常指的是一系列步骤或操作,这些步骤或操作链条在计算机系统中实现特定的目标,例如触发漏洞、执行恶意代码或完成某种功能。
(2)触发和传播漏洞的原理
利用了DNS协议中附加记录或递归查询过程中的特性来进行攻击。比如,攻击者可以在附加记录中注入指向恶意服务器的地址。这就是常见的恶意附加记录攻击。
二、分析反序列化漏洞的条件
目标:分析和解释触发反序列化漏洞的必要条件。
1、序列化和反序列化
序列化:将数据结构或对象转化为可以存储和传输的格式,达成对象持久化和网络传输的目的。更具体的概念和作用读者可以自行扩展。
反序列化:将序列化文件转回成原始对象,使其恢复成对象的状态,然后能在程序中使用。
2. 反序列化漏洞的概念
简单来说就是攻击者可以根据目标系统存在的逻辑漏洞精心构造一个序列化文件,然后当目标系统进行反序列化文件时执行恶意程序,从而导致产生各种安全问题。
3、反序列化漏洞触发条件
条件一:首先就要确认目标程序使用了序列化和反序列化的功能。
条件二:仔细审查代码,返现程序存在的逻辑漏洞,然后攻击者创建特定格式的序列化数据,可能包括特定的类、对象或方法。这些数据在反序列化时会导致系统执行恶意操作。
条件三:能将序列化后的精心构造后的代码传输给目标系统,并使其反序列化执行恶意代码,这样才能达成目的。(该步骤在本文中不进行讨论,感兴趣的可以去学习)
三、复现 Java中的DNS反序列化漏洞
目标:
提供复现漏洞的具体步骤,帮助读者理解如何验证和测试反序列化漏洞。
1、环境准备
(1)软件是IDEA,版本:2022.2.3.0,使用基于Maven管理的Spring框架
(2)使用该网址测试是否产生DNS外带:www.dnslog.cn
2、复现
(1)Java外带API
①在网址:www.dnslog.cn网址获取一个子域名:uumw33.dnslog.cn,如图一
图一
②测试 :
Java代码:
public static void main(String[] args) throws Exception {
//InetAddress的getByName方法 存在带外漏洞
InetAddress byName = InetAddress.getByName("22222.uumw33.dnslog.cn");
}