前序
DNS(Domain Name Server,域名服务器)是进行域名(domainname)和与之相对应的IP地址 (IP address)转换的服务器。DNS中保存了一张域名(domain name)和与之相对应的IP地址 (IP address)的表以解析消息的域名。 域名是Internet上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。域名是由一串用点分隔的名字组成的,通常包含组织名,而且始终包括两到三个字母的后缀,以指明组织的类型或该域所在的国家或地区。
DNS是计算机域名系统 (Domain NameSystem 或Domain Name Service) 的缩写,它是由域名解析器和域名服务器组成的。域名服务器是指保存有该网络中所有主机的域名和对应IP地址,并具有将域名转换为IP地址功能的服务器。其中域名必须对应一个IP地址,一个IP地址可以有多个域名,而IP地址不一定有域名。域名系统采用类似目录树的等级结构。域名服务器通常为客户机/服务器模式中的服务器方,它主要有两种形式:主服务器和转发服务器。将域名映射为IP地址的过程就称为“域名解析”。
要干什么?
2020年CVE-2020-1350漏洞爆出来之后,一堆人对DNS server进行的漏洞挖掘,挖掘出了很多的新漏洞,因为实习期间做了相关的研究,所以想要总结一下DNS的漏洞,漏洞对应的poc在网上可能能搜到或者搜不到,但是因为DNS协议本身比较简单,根据漏洞构造poc还是不难的。
DNS的攻击面
DNS Query/Response
DNS解析流程分为递归查询和迭代查询,递归查询是以本地名称服务器为中心查询,递归查询是默认方式,迭代查询是以DNS客户端,也就是客户机器为中心查询。其实DNS客户端和本地名称服务器是递归,而本地名称服务器和其他名称服务器之间是迭代。
Zone Transfer/DNS Notify
当一个新的DNS服务器添加到区域中并配置为从DNS服务器时,它则会执行完全区域传送,在主DNS服务器上获取完整的资源记录副本;同时,为了保证数据同步,主域名服务器有更新时也会及时通知辅助域名服务器从而进行更新(增量区域传送)。
Dynamic Update
允许通过授权的更新者updater对权威DNS服务器的区数据动态的增加、删除资源记录。
下表来源于DNS安全实践
攻击面参照:Secure Domain Name System(DNS)Deployment Guide
漏洞简介
DNS Query/Response
CVE-2020-1350
漏洞出现在SigWireread,该函数会在向域名服务器查询记录,对返回的Sig记录进行处理,该漏洞在网上已有公开exp,自己也对exp进行了分析,链接在这里
CVE-2020-1228/0836
有两个内存泄漏的漏洞在迭代查询的时候,接收到返回报文,未释放一些变量
CVE-2021-24078
当接收到域名服务器的返回报文,对0xf0f0的报文进行存储,但是这个类型的报文是DNS服务器使用的类型,两者处理代码不同,造成混淆
DNS动态更新
CVE-2021-26877
TxtFileWrite函数是对域文件进行写入,动态更新
CVE-2021-26897
SigFileWrite函数接收Sig记录更新,缓存区未考虑溢出
CVE-2021-26893
整数下溢,Key记录动态更新如果长度小于4的话
CVE-2021-26894
Atma记录更新发生整数下溢
CVE-2021-26895
对AAAA记录更新发生整数下溢
CVE-2021-26896
wks记录也会发生类似溢出的漏洞
CVE-2021-xxxxx
Nsec3FileWrite,编号未知,可能会溢出一个字节
CVE-2021-xxxxx
Name_WriteCountNameToBufferAsDottedName,将DNS编码的域名转换成字符串,memcpy未加边界验证
DNS管理端漏洞
下面是CVE-2021-33749,CVE-2021-33750,CVE-2021-33752,CVE-2021-33756
KeyFlatWrite,管理端对key记录读取会造成溢出
NxtFlatWrite,同样缓存区没有做验证
WKSFlatWrite,缓存区也没有做验证
SigFlatWrite,也没有对记录的长度进行限制