SAD DNS--新型DNS缓存中毒攻击

2023-10-28 20:50
文章标签 新型 攻击 缓存 dns sad 中毒

本文主要是介绍SAD DNS--新型DNS缓存中毒攻击,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

本文是对 DNS Cache Poisoning Attack Reloaded: Revolutions with Side Channels这篇论文的学习总结,若想了解更多知识,可去详细阅读。

文章目录

  • 前言
  • 一、DNS基础知识:
    • 1.DNS简介:
    • 2.DNS数据包:
    • 3.DNS记录类型:
      • NS记录
      • A记录
      • CNAME记录
      • 其他记录类型
    • 4.DNS服务器类型:
      • DNS递归解析器
      • 根域名服务器
      • 顶级域名服务器
      • 权威域名服务器
    • 5.DNS解析过程:
  • 二、攻击原理:
    • 推测源端口
    • 扩大攻击窗口
    • TTL时间
  • 参考文档:


一、DNS基础知识:

1.DNS简介:

DNS 域名服务,用于建立 域名与 ip地址的 一对一 映射。DNS 将域名转换为 IP地址,以便浏览器能够加载 Internet 资源。

类似于一个翻译系统,将xxx.com 翻译为 ip地址(如:192.0.2.254),这种转换发生在幕后,因此用户只需记住域名,而不需要记住难记的IP

2.DNS数据包:

DNS数据包使用UDP进行封装,至于为什么使用UDP进行封装,可参考 为什么DNS使用UDP协议?

下面是DNS报文格式:

DNS协议

  • Transaction ID(16bit):事务ID,区分DNS应答报文对应哪个请求报文,DNS查询报文与DNS响应报文的会话ID相同,表示是对这个查询作出的响应。

  • Queries:其中包括查询的域名,查询的类型,查询的类。

    查询的类型,通常是A类型,表示要查的是域名对应的IP地址。第3节会进行详细介绍。

    查询类:地址类型,通常为互联网地址,值为1

  • Answers:一般在响应包,在请求包为空,主要包括name,type,address等,name表示要查的域名,type表示类型,同queries区域的类型,address 即返回的IP地址。

若想知道详细报文格式,可参考DNS报文格式解析(非常详细)

3.DNS记录类型:

DNS记录是用于解析的数据,最常见的3种记录为:NS记录、A记录、CNAME记录。

NS记录

如果DNS给你回应一条NS记录,就是告诉你,这个家伙是这个域的权威DNS,有事你去问它。

比如在com的DNS里,记录着baidu.com这个域的DNS,长的大概是这个样子:

baidu.com.  NS  ns1.baidu.com.
baidu.com.  NS  ns2.baidu.com.
baidu.com.  NS  ns3.baidu.com.

这三条记录,就是说ns1.baidu.com、ns2.baidu.com、ns3.baidu.com(以下简称ns1、ns2、ns3)都是baidu.com域的权威DNS,问任意其中一个都可以(一般都是顺序问的,如果连不上第一个,就去找第二个)。

注意,域名后面会比我们平时见到的多一个“.”,这就代表了根,严格地说,所有域名后面都应该有这一个“.”的,比如完整的www.baidu.com域名应该是www.baidu.com.,也可以把所有域名都看作有一个.root的后缀,比如www.baidu.com.root,但由于每个域名都有这个后缀,所以干脆就都省略了。

当然在com的权威域名服务器,也记录ns1,ns2,ns3这几个的ip地址,会一并返回让解析器去找这几个服务器解析。

A记录

A记录就是最经典的域名和IP的对应,在ns1.baidu.com里面,记录着百度公司各产品的域名和IP的对应关系,每一个这样的记录,就是一个A记录,比如下面的3个A记录(随意举的例子,IP都是随意写的)。

image.baidu.com   A   1.2.3.4
wenku.baidu.com   A   5.6.7.8
tieba.baidu.com   A   9.10.11.12

如果有人问ns1.baidu.com:“wenku.baidu.com的IP是多少?”,ns1就会找到对应的A记录或者CNAME记录并返回。

CNAME记录

这种记录比较有趣,你问DNS一个域名,它回CNAME记录,意思是说,你要解析的这个域名,还有另一个别名,你去解析那个好了。

比如,在ns1中,其实并没有www.baidu.com的A记录,而是一个CNAME记录:

www.baidu.com  CNAME  www.a.shifen.com

这就是在告诉递归解析器,www.baidu.com的别名是www.a.shifen.com,去解析www.a.shifen.com

其他记录类型

类型描述
A记录保存域名的IPv4地址的记录
AAAA记录保存域名的IPv6地址的记录
NS 记录存储 DNS 条目的权威域名服务器
CNAME 记录将一个域或子域转发到另一个域,不提供 IP 地址
MX 记录将邮件定向到电子邮件服务器
TXT 记录可使管理员在记录中存储文本注释
SOA 记录存储域的管理信息
SRV 记录指定用于特定服务的端口
PTR 记录把ip地址转化为域名

4.DNS服务器类型:

DNS递归解析器

也可以当作local DNS,也称为DNS解析器。是DNS查询中的第一站,作为客户端与 DNS 域名服务器的中间人。从 Web 客户端收到 DNS 查询后,递归解析器将使用缓存的数据进行响应,或者将向根域名服务器发送请求,接着向 TLD 域名服务器发送另一个请求,然后向权威性域名服务器发送最后一个请求。收到来自包含已请求 IP 地址的权威性域名服务器的响应后,递归解析器将向客户端发送响应。

大多数 Internet 用户使用他们 ISP 提供的递归解析器,但还有其他可用选择;例如 Google的8.8.8.8。

根域名服务器

一共有13个根域名服务器(并不表示只有13台计算机,13种类型),解析器查询的第一站,根域名接收到查询后,告知相应的顶级域名服务器(TLD DNS)所在域地址,如.com域。

顶级域名服务器

例如,.com TLD 域名服务器包含以“.com”结尾的每个网站的信息。如果用户正在搜索 baidu.com,则在收到来自根域名服务器的响应后,递归解析器将向 .com TLD 域名服务器发送查询,然后将通过针对该域的权威性域名服务器进行响应。

权威域名服务器

​ 递归解析的最后一站,查找IP地址的最后一步。此时根据要查询的域名,返回相应的IP地址或其他类型记录。

5.DNS解析过程:

DNS 查询图

客户端在浏览器输入example.com,去进行访问,需要找到该域名的IP地址。

1.向DNS 递归解析器(DNS Resolver)发送查询,优先查看缓冲区是否存在记录,若没有 ,继续 2。

2.向根域名服务器发出查询。

3.根域名服务器给出.com (TLD)顶级域名服务器的地址。

4.然后,DNS解析器向 .com TLD Server 发出请求。

5.TLD 服务器随后使用该域的域名服务器 example.com 的 IP 地址进行响应。

6.最后,递归解析器将查询发送到example.com的权威域名服务器。

7.权威域名服务器将example.com 的 IP 地址响应给解析器。

8.然后 DNS 解析器将最初请求的域的 IP 地址响应 Web 浏览器,并在自己的高速缓存,记录下来,以备下次使用,不用再次查询。

DNS 查找的这 8 个步骤返回 example.com 的 IP 地址后,浏览器便能发出对该网页的请求:

9.浏览器向该 IP 地址发出 HTTP 请求。

10.位于该 IP 的服务器将网页返回。

二、攻击原理:

这里引用,清华大学团队的原理图,进行解释。

DhWpt0

trudy是一个偏离信道的攻击者(off-path),即不可以进行监听和篡改 递归解析器 到权威域名服务器 信道上的内容,trudy拥有一定的IP spoof 能力。

  • Trudy 通过web浏览器访问 www.bank.com,假如此时 resolver 缓存中并无此记录。
  • 解析器进行递归查询,向根域名服务器,顶级域名服务器,以及权威域名服务器发出查询。
  • 攻击者Trudy此时使用 bank.com的权威域名服务器IP地址,伪造 回应报文向 解析器发送。 该回应报文解析的IP地址,指向攻击者自己的服务器。
  • 解析器收到Trudy假冒的DNS响应报文之后,将 www.bank.com对应的假冒 IP =6.6.6.6 写入缓存。
  • 待真正的响应报文到达解析器时,为时已晚,此时解析器发现已经有了相应的记录,会进行丢弃
  • 这时 用户 Alice 想要访问www.bank.com,通过解析器查看自己的错误缓存表,会访问到一个错误的IP,得到一个攻击者伪造一模一样的错误页面。(此时如果用户输入各种账号密码,会被窃取。)

但真正的攻击却不是如此简单,根据上文介绍的DNS协议数据包,IP头|UDP头|DNS

攻击者伪造的响应数据包,如下:

DhokjK

注意:

这里的目的端口与事务ID都是未知的,攻击者如果想要同时爆破这两个字段,目的端口两个字节,事务ID两个字节,一共 2 32 2^{32} 232种可能,目前不太可能实现。

DNS权威域名服务器 响应的源端口 一般是确定的53端口, DNS 解析器客户端以前也默认用源端口53去查询,这样随机性只靠TxID,很容易进行攻击 , 2 16 2 ^{16} 216,65536种可能。 2008年7月,Dan Kaminsky就利用了这个。因此,为了有效的防御,DNS解析器采取了源端口随机化。

为了解决上述问题,在这篇论文中,清华大学安全团队,提出了一种分治的思想,即先通过ICMP侧信道探测开放的端口,后猜测相应事务ID,一共 2 17 2^{17} 217 种可能。

另外,相应的扩大攻击窗口的时间,可更容易的实现这种进攻。

推测源端口

​ 这里只介绍其中的一个 Private Source Port Scan Method。首先了解一下以下知识:

IP速率限制: 比如IP 速率限制 为 1/s ,即在1秒这段时间内只限1个IP访问DNS解析器上的端口。

ICMP速率限制:表示在这段时间内,DNS解析器最多能发出的ICMP响应报文个数。比如:ICMP 速率限制为 50 /20ms ,这里表示 在20ms内只能返回50个ICMP响应。比如攻击者以 1000/20ms 的速度进行探测端口,这里只能返回50个ICMP不可达报文。

侧信道攻击:大体意思是,攻击者借助服务器进行响应的一些信息,发动攻击。

端口探测:意思是通过向DNS解析器发送UDP报文,遍历目的端口,如果端口未开放,则会返回ICMP不可达报文,如果开放,不会收到响应报文

临时端口:只对权威域名服务器开放,攻击者并不知晓,所以要用到IP欺骗,伪造权威域名服务器的IP发送UDP探测报文。

D49zQS

在上图中,假设解析器的ICMP速率限制为 50/20ms, 攻击者通过伪造权威域名服务器的IP,向解析器发送50个探测UDP报文,那么攻击者以自己的IP再向解析器发送一个UDP报文,如果没收到任何ICMP回复,说明已达到ICMP速率限制,可进行下一个20ms的探测,不断循环。如果此时收到回复,说明至少有一个端口是开放的。可通过二分查找,查找开放的端口。

但是 存在IP速率限制怎么办?

假如IP速率限制为1个/秒,即在这一秒内只允许一个IP访问解析器。在这篇论文中提到,清华大学安全团队通过观察源码发现,ICMP速率限制 是在IP速率限制之前 进行验证的。所以,即使最后一个IP只返回一个ICMP响应包,但是ICMP 速率限制的计数器是变化的。 所以与上图同理,只在这一方面有些许变化。

论文原图如下:
D4i95n

扩大攻击窗口

攻击窗口,指DNS解析器向服务器发送查询,到权威域名服务器响应报文到达解析器的这段时间。

所以扩大攻击窗口的主要思路,应该集中在阻止响应报文的到达,或延迟响应报文的到达。

通过发送大量的DNS查询来淹没权威域名服务器,类似于攻击者伪造解析器,发送大量DNS query,高于配置限制的速率(服务器上配置的RRL),会权威域名服务器不发送响应,创建足够高的丢失率。

TTL时间

​ 对于解析器缓冲区而言,可能已经拥有某条记录,但攻击者不得不等待这条记录消失之后,再发动攻击。TTL即表示这条记录的生存时间,时间可能为1天或者更久。

这就很头疼,有没有解决办法?

​ 有。

​ 攻击者可以去问类似1.xxx.com、2.xxx.com、3.xxx.com等等这些大概率就完全不存在的域名,由于DNS解析器并没有这些域名的缓存,就会发起查询,假设ns1.xxx.com是xxx.com的权威DNS,DNS解析器就会去ns1.xxx.com询问。

Q:要投毒的是www.xxx.com,搞定83.xxx.com有什么意义啊。

A:没错,我们的目标并不是83.xxx.com,这个攻击比较精彩的地方是,可以并不是在应答区做手脚,而是在权威区和附加区行骗!

伪造的响应包,大约是这个样子:

问题区:83.xxx.com A
应答区:(空)
权威区:xxx.com NS www.xxx.com
附加区:www.xxx.com A 6.6.6.6

这个响应的意思是:“我不知道83.xxx.com的A记录,你去问问www.xxx.com吧,它负责xxx.com这个域,对了,他的IP是6.6.6.6”。

而这里的6.6.6.6,就是攻击者意欲让DNS解析器相信的IP地址。

本文参考DNS Cache Poisoning Attack Reloaded: Revolutions with Side Channels这篇论文,若想详细了解,可去阅读!同时,若有不太理解的问题,欢迎在下面评论进行讨论!


参考文档:

SADDNS官网

SADDNS explained

DNS服务器类型

一次出人意料而名留青史的 DNS 投毒攻击

IP报文分片

这篇关于SAD DNS--新型DNS缓存中毒攻击的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/295879

相关文章

缓存雪崩问题

缓存雪崩是缓存中大量key失效后当高并发到来时导致大量请求到数据库,瞬间耗尽数据库资源,导致数据库无法使用。 解决方案: 1、使用锁进行控制 2、对同一类型信息的key设置不同的过期时间 3、缓存预热 1. 什么是缓存雪崩 缓存雪崩是指在短时间内,大量缓存数据同时失效,导致所有请求直接涌向数据库,瞬间增加数据库的负载压力,可能导致数据库性能下降甚至崩溃。这种情况往往发生在缓存中大量 k

速盾高防cdn是怎么解决网站攻击的?

速盾高防CDN是一种基于云计算技术的网络安全解决方案,可以有效地保护网站免受各种网络攻击的威胁。它通过在全球多个节点部署服务器,将网站内容缓存到这些服务器上,并通过智能路由技术将用户的请求引导到最近的服务器上,以提供更快的访问速度和更好的网络性能。 速盾高防CDN主要采用以下几种方式来解决网站攻击: 分布式拒绝服务攻击(DDoS)防护:DDoS攻击是一种常见的网络攻击手段,攻击者通过向目标网

Redis中使用布隆过滤器解决缓存穿透问题

一、缓存穿透(失效)问题 缓存穿透是指查询一个一定不存在的数据,由于缓存中没有命中,会去数据库中查询,而数据库中也没有该数据,并且每次查询都不会命中缓存,从而每次请求都直接打到了数据库上,这会给数据库带来巨大压力。 二、布隆过滤器原理 布隆过滤器(Bloom Filter)是一种空间效率很高的随机数据结构,它利用多个不同的哈希函数将一个元素映射到一个位数组中的多个位置,并将这些位置的值置

防止缓存击穿、缓存穿透和缓存雪崩

使用Redis缓存防止缓存击穿、缓存穿透和缓存雪崩 在高并发系统中,缓存击穿、缓存穿透和缓存雪崩是三种常见的缓存问题。本文将介绍如何使用Redis、分布式锁和布隆过滤器有效解决这些问题,并且会通过Java代码详细说明实现的思路和原因。 1. 背景 缓存穿透:指的是大量请求缓存中不存在且数据库中也不存在的数据,导致大量请求直接打到数据库上,形成数据库压力。 缓存击穿:指的是某个热点数据在

PHP APC缓存函数使用教程

APC,全称是Alternative PHP Cache,官方翻译叫”可选PHP缓存”。它为我们提供了缓存和优化PHP的中间代码的框架。 APC的缓存分两部分:系统缓存和用户数据缓存。(Linux APC扩展安装) 系统缓存 它是指APC把PHP文件源码的编译结果缓存起来,然后在每次调用时先对比时间标记。如果未过期,则使用缓存的中间代码运行。默认缓存 3600s(一小时)。但是这样仍会浪费大量C

缓存策略使用总结

缓存是提高系统性能的最简单方法之一。相对而言,数据库(or NoSQL数据库)的速度比较慢,而速度却又是致胜的关键。 如果使用得当,缓存可以减少相应时间、减少数据库负载以及节省成本。本文罗列了几种缓存策略,选择正确的一种会有很大的不同。缓存策略取决于数据和数据访问模式。换句话说,数据是如何写和读的。例如: 系统是写多读少的吗?(例如基于时间的日志)数据是否是只写入一次并被读取多次?(例如用户配

DNS协议基础笔记

1.定义 DNS(Domain Name System,域名系统)是互联网的一项核心服务,它作为将域名和 IP 地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。 2.域名解析过程 当用户在浏览器中输入一个域名,浏览器首先会检查自己的缓存中是否有该域名对应的 IP 地址。本地 DNS 服务器收到查询请求后,首先会检查自己的缓存中是否有该域名对应的 IP 地址。根域名服务器收到查询请

uniapp小程序下载缓存服务器上的图片

1. 使用uni.downloadFile,但是注意下载图片的地址里的域名,需要在微信公众平台里面的downloadFile合法域名进行配置。 export default function downloadAndCacheImage(imageUrl, name) {return new Promise((resolve, reject) => {console.log("imageUrl",

基于canal的Redis缓存双写

canal地址:alibaba/canal: 阿里巴巴 MySQL binlog 增量订阅&消费组件 (github.com)https://github.com/alibaba/canal 1. 准备 1.1 MySQL 查看主机二进制日志 show master status 查看binlog是否开启 show variables like 'log_bin' 授权

插件:清理maven错误缓存.bat

插件:https://pan.baidu.com/s/1nHIxHoo1C4MvFlW7QbZe5Q?pwd=7zenhttps://pan.baidu.com/s/1nHIxHoo1C4MvFlW7QbZe5Q?pwd=7zen没错误缓存时: 有错误缓存时: