【第二版】【DNS】DNS安全性拓展——DNS缓存污染(投毒)——DNSSEC

165 阅读5分钟

DNS缓存污染(投毒)

我们在之前上网冲浪时偶然会遇到这种情况: 访问某个之前浏览过的网站时,但网站所展示的并非我们之前看到过的样子,不能说完全不同,只能说毫不相干。那么,它的dns缓存有可能就是污染了。

那dns缓存污染具体是什么呢

它其实是一种网络攻击,攻击者会篡改递归DNS服务器中的DNS缓存,使得用户访问的域名被解析到错误的IP地址,返回恶意的域名解析结果,从而导致用户被重定向到攻击者控制的恶意网站。这种攻击会破坏DNS系统的完整性,使得用户无法正常访问其所期望的网站。

正常流程:客户端发送请求到暂存缓存服务器,找不到向dns服务器发送查询,找到后,存到缓存服务器,缓存服务器再向客户端返回结果,客户端进入正常网页

graph LR
客户端 --1--> 暂存缓存 --2--> DNS服务器 --3-->暂存缓存 --4--> 客户端 --5--> 正常网页

被污染的后流程:客户端发送请求到暂存缓存服务器,找不到向dns服务器发送查询 1.攻击者抢先发送大量伪造的dns reply报文给缓存服务器,抢先命中(Query ID)并置入缓存,缓存服务器向客户端返回错误结果,客户端进入恶意网页 2.攻击者窃取合法域名的响应,然后修改并发送伪造的响应,将其缓存在递归DNS服务器中 (①劫持方式/方法)

graph LR
客户端 --1--> 暂存缓存 --2--> DNS服务器
攻击者--3-->暂存缓存 --4--> 客户端 --5--> 恶意网页

重点来咯~如何防范?

我们接下来介绍的是使用DNSSEC的方法

DNSSEC是一种安全扩展机制,通过数字签名验证域名解析结果的真实性,可以防止DNS缓存污染(投毒)攻击。域名拥有者使用私钥对DNS记录进行签名,而递归DNS服务器使用公钥验证签名的有效性。提供对域名解析的完整性和认证。

graph LR
根域名-根DNSSEC-KEY/KSK --> 顶级域名-DNSSEC-KEY/KSK --> 域名A-DNSSEC-KEY/ZSK--> 域名资源记录-签名

在以上流程图中,根域名(Root)拥有根DNSSEC密钥(KSK),顶级域名(Top-Level Domain)拥有自己的DNSSEC密钥(KSK),而域名A(Domain A)拥有专属的DNSSEC密钥(ZSK)。每个密钥都用于对相应的域名资源记录(Resource Records)进行签名,确保其完整性和真实性。

通过使用数字签名链式信任的方式,DNSSEC提供了一种可靠的方法来验证域名解析结果的有效性,从而大大增强了DNS的安全性。 (②RSA加解密) 消息的数字签名和验证流程:

image.png

注释知识点:

①劫持方式/方法

  1. 本地网络劫持:攻击者可能在本地网络(如公共WiFi)上设置一个恶意的DNS服务器或对现有的路由器进行攻击,使得所有通过该网络的DNS请求都被劫持。
  2. ISP级别的劫持:有时候,互联网服务提供商(ISP)可能会故意修改DNS响应,以进行审查或其他目的。
  3. 中间人攻击(Man-in-the-Middle, MitM):攻击者在用户和真实的DNS服务器之间拦截通信,然后篡改响应数据。
  4. DNS服务器的漏洞利用:攻击者可能会利用递归DNS服务器的安全漏洞,直接将恶意的DNS记录注入到服务器的缓存中。
  5. DNS递归服务器缓存污染:攻击者可能会发送特制的DNS响应,试图在递归DNS服务器的缓存中留下错误的记录,导致后续对相同域名的查询都会收到伪造的回应。
  6. DNS重绑定攻击:攻击者可以利用DNS重绑定技术,将域名短暂地解析到一个合法的IP地址,然后迅速改变解析到一个恶意的IP地址,从而绕过某些安全措施。
  7. DNS劫持软件或恶意代码:通过恶意软件或病毒感染用户的计算机,修改本地DNS设置或系统文件,使得DNS查询被重定向。

②RSA加解密

密钥生成

  1. 选择两个大的质数:p和q。
  2. 计算它们的乘积:n=p*q,这里的n表示密钥的长度。
  3. 计算欧拉函数:phi(n)=(p-1)*(q-1)。
  4. 选择一个整数 :e,作为公钥指数,它通常是一个小于phi(n)的质数,并且e与phi(n)互质。
  5. 计算 ( e ) 对应的私钥指数:d,使得e*d \mod phi(n)=1,即d是e在模phi(n)下的乘法逆元。(\mod是取模) 公钥由(n, e)组成,私钥由(n, d)组成。

加密过程

  1. 明文消息 M 被转换成一个整数 m,其中 ( 0 ≤ m < n )。
  2. 使用公钥 (n, e) 计算密文 c,公式为 ( c = m^e \mod n )。

解密过程

  1. 接收者使用私钥 (n, d) 来计算 m,公式为 ( m = c^d \mod n )。
  2. 将整数 m 转换回原始明文消息 M。

公私密钥-使用流程

  1. 首先 接收方 生成一对密钥,即私钥和公钥;
  2. 然后,接收方 将公钥发送给 发送方;
  3. 发送方用收到的公钥对数据加密,再发送给接收方;
  4. 接收方收到数据后,使用自己的私钥解密。 公钥加密的数据必须用对应的私钥才能解密,而私钥又只有接收方自己知道,这样就保证了数据传输的安全性。

图示: image.png