前言

本文归纳整理DNS缓存投毒的漏洞与防御

1、基础知识

(1)关于DNS

参见一文搞明白DNS与域名解析

关键是DNS缓存
DNS 解析器会将对 IP 地址查询的响应保存一定的时间。这样,解析器便可更快地响应未来查询,并且无需与典型 DNS 解析过程中涉及的许多服务器进行通信。只要与该 IP 地址关联的指定生存时间 (TTL) 允许,DNS 解析器就会将响应保存在其高速缓存中。

(2)IP数据包分片

IP(Internet Protocal)是TCP/IP协议族中的核心协议,所有TCP、UDP和ICMP等数据报都是通过IP数据报进行传输。互联网协议允许IP数据包分片,当数据包比链路最大传输单元(MTU)大的时候,就会被分解为很多的小分片,以便大数据包能够在链路上传输。


被分片的IP数据包是通过IP首部的一些字段进行重新组装的:

  • Identification位,简称为IPID,是IP数据包的标识字段,这些标识字段都是一个单一值,这个值在分片的时候被复制到每一个分片中,这个值最重要
  • DF(Don’t Fragment)是不分片位,置为1就表示不会对数据包进行分片操作
  • MF(More Fragment)是更多的分片位,除了最后一片以外,其他每个组成数据包的分片都要把这个位置为1
  • Fragment Offset是当前数据包分片距离原始数据包开始处的位置,偏移的字节数是字节乘以8

2、DNS缓存投毒

DNS 缓存投毒也称为“DNS 欺骗”,是向 DNS 缓存中输入错误信息的行为,以使 DNS 查询返回错误响应并将用户定向到错误网站

打个比方,IP 地址是 Internet 的“教室号”,其能够使网络流量到达正确位置。DNS 解析器缓存是“校园目录”,当它们存储错误信息时,流量将转向错误位置,直到缓存的信息被更正为止。 DNS 解析器通常无法验证其缓存中的数据,因此错误 DNS 信息会保留在缓存中,直到生存时间(TTL)到期或手动将其移除为止

(1)生日攻击的盲目响应伪造

DNS 协议交换不验证对递归迭代查询的响应,验证查询只会检查 16 位事务 ID 以及响应数据包的源 IP 地址和目标端口

在 2008 年之前,所有 DNS 使用固定端口53 解析。因此,除了事务 ID 之外,欺骗 DNS 回复所需的所有信息都是可预测的

用这种弱点攻击 DNS 被称为“生日悖论”,平均需要 216 次来猜测事务 ID

缺点:为了使攻击成功,伪造的 DNS 回复必须在合法权威响应之前到达目标解析器。如果合法响应首先到达,它将由解析器缓存,并且直到其生存时间(TTL)到期,解析器将不会要求权威服务器解析相同的域名,从而防止攻击者投毒该域,直到 TTL 到期

(2)Kaminsky 漏洞

在 2008 Black Hat 上Dan Kaminsky 展示了一种新型DNS 缓存投毒攻击

Kaminsky缓存投毒攻击克服了传统DNS 缓存投毒攻击存在的攻击所需时间长、成功率很低的缺陷。其攻击原理如下:

  • 攻击者向被攻击的本地缓存DNS发送一个域名的DNS 查询请求,该查询请求中的域名主机使用随机序列和目标域名的组合。
    例如www123456.test.com,其中ns2.test.com为目标域名,www123456是随机生成的。很显然,这个查询的域名主机记录在test.com的权威DNS中是不存在的。正常test.com的权威DNS要返回NXDOMIAN(代表域名不存在)。换句话说就是本地缓存DNS中肯定没有www123456.test.com的缓存记录,本地缓存DNS接收到这个域名查询请求后肯定是要出去迭代请求的。

  • 攻击者伪造test.com的权威DNS应答数据包中,应答资源记录部分与正确应答包中部分是与正常结果一样的,比如test.com的DNS的IP地址、UDP端口号、应答结果是NXDOMAIN。
    但是,在应答报文中的授权资源记录部分,攻击者伪造一个test.com的NS记录为ns2.test.com,且该记录对应的A记录IP是2.2.2.2(可能是一个钓鱼网站的IP)。那么该资源记录信息将也被写入本地缓存DNS的Cache 中,在Cache 保持时间内,对test.com名字服务器所管辖的所有域名的查询都将被发送到攻击者自己控制的IP(2.2.2.2)中。

关键点

  • 要把握住时机,要能控制或知道什么时候LDNS发出针对某个域名的查询包。
  • 响应包中的目的端口正是查询包里的源端口。
  • 响应包中的QID也是对的。
  • 响应包中的记录被LDNS接受并计入缓存。(这是最重要的)

优势

  • 传统DNS 缓存投毒攻击中,存在攻击所需时间长、攻击成功率低的问题,而Kaminsky 攻击克服了这一缺陷,主要是绕过了TTL约束。因为Kaminsky 攻击中,每次查询都会在目标域名上添加随机序列,这使得在被攻击的本地缓存DNS的 Cache 中根本就不存在各个临时构造域名主机的记录,因此若攻击不成功,则立即更换随机序列连续不断地进行攻击,不存在有效攻击时间的问题进而提升了攻击成功率。
  • 传统DNS 缓存投毒攻击成功后,只是污染了该与权威区中的某个域名,而Kaminsky 攻击成功后,污染的是本地缓存DNS Cache中一个域名主机的NS记录(即该域名的权威主机记录),之后对该名字服务器管辖的所有域名主机的查询都将被发送到攻击者控制的IP 地址中,破坏力度远高于传统缓存投毒攻击。

复现

  • Kali Linux(二)***案例:DNS Kaminsky缓存投毒
  • kaminsky 漏洞复现
  • SEED LAB 远程DNS 缓存中毒–Kaminsky 攻击复现

(3)分片整理攻击

2012年,来自Bar Ilan大学的研究人员Amir Herzberg和Haya Schulman发现一种基于IP分片整理(Defragmentation Attacks)的新型DNS缓存投毒攻击方法,远程攻击者可能会破坏源端口随机化提供的保护

这种攻击主要利用了这样一个事实,即被分片的DNS响应包中的第二个分片段并不包含DNS或UDP报文中的报头(header)或是问题部分(question section),所以这种攻击方式可以避开针对伪造攻击的防御措施,如ID/端口随机化措施。

核心思想

  • 在DNS中毒攻击中需要猜测的所有随机性都集中在DNS消息的开头(UDP标头和DNS标头)
  • 如果UDP响应数据包(有时称为数据报)分为两个片段,第一部分包含消息ID和源端口,第二部分包含DNS响应的一部分,然后攻击者所需要做的就是伪造第二个片段,并确保伪造的第二个片段到达解析器
  • 在真正的第二个片段之前。当数据报被分段时,每个分段被分配一个16位ID(称为IP-ID),该ID用于在连接的另一端重新组装它。由于第二个片段仅具有IP-ID作为熵(再次,这是该领域的常见用法),使用较少数量的伪造数据包,这种攻击是可行的

攻击流程

  • 攻击者构造虚假的第2个分片(2nd fragment),将这个不完整的第2个分片数据包发送给递归解析器,递归解析器缓存该记录。
  • 然后攻击者发起关于受害domain的DNS查询请求,递归解析器的记录中没有相关记录,所以会再去询问权威解析器。
  • 从权威解析器返回的数据包因为某些不可抗力因素被分片转发给递归解析器。然后在递归解析器这里,从权威解析器发出的第一个合法的分片数据包和之前缓存在递归解析器的第2个攻击者伪造的分片数据包重新组装,最后形成一个能被递归解析器接受的“合法”响应包。并且该响应被递归解析器缓存下来。


关键点:必须首先对响应进行分段,并且必须仔细更改分段以通过原始节计数和UDP校验和,主要有两种方式:

  • 降低PMTU数值
  • 发送DNSSEC查询,用DNSSEC记录填充DNS响应数据包,使它们达到MTU的限制,从而迫使数据包通过分片的方式转发

缺点

  • 有限制,PMTU-based碎片整理攻击需要攻击者先伪造一个发送给权威域名解析器的ICMP包,来欺骗权威域名解析器去降低PMTU数值。但是作者发现这在大多数情况下不太适用。如下图所示,对于Alexa网站上排名前100K的权威域名服务器,在构造这样的ICMP数据包之后,只有0.7%的权威域名服务器将它们的PMTU值降低到528bytes之下。由于DNS响应数据包通常小于512字节,因此它们不太可能被强制分片。
  • 随着DNS提供商逐渐消除对碎片化DNS数据包的支持(DNS 2020年卖旗日的主要目标之一),基于碎片化的攻击的有效性越来越低

3、防御和缓解

(1)源端口随机化

2008年“卡明斯基事件”之后,DNS服务器每次通信都会在1024~65536号端口中随机选一个端口号和对方建立通信连接。还是和之前一样,只有当端口号、QueryID、域名同时匹配才接受对方的消息。

如此一来,黑客同时蒙中端口号、QueryID的概率就是2^16×(65536-1024)=4,227,858,432分之一

攻击所需的时间从一开始的几秒钟变成了十几天,从理论上来说就不可能赶在真消息到达之前“加塞”。

优点

  • 最有效和部署最广泛的防御,因为它将随机性从16位增加到32位

(2)0x20编码

0x20 encoding,即随机化大小写验证技术,该技术会匹配请求包和响应包的大小写,如果大小写不匹配就会丢弃响应包,比如对于长度为8个字符串的域名,那么就会产生2^8个不同的字符串

缺点

  • 一些授权DNS服务器并不支持大小写混合应答:例如,googledns仅将其用于一组列入白名单的名称服务器;Cloudflare最近甚至完全禁用了0x20编码
  • 由于上面这个兼容性问题,部署极少

(3)多个权威DNS

作为权威域名的负责方,要尽量的部署多台权威DNS,比如一主多备。这样能有效的防止自己域名被投毒。

例如,test.com区,本来只有一个DNS服务器,NS为dns.test.com,对应的IP为1.1.1.1。那么攻击者伪造源IP回包的时候只需要伪造这一个IP应答给本地缓存DNS就可以了,因为本地缓存DNS肯定是向1.1.1.1发起了迭代请求。但如果有多台权威DNS,那么这个攻击的成功率就会降低,攻击的时间就会变长。因为,本地缓存DNS可能是向5.5.5.5发了www123456.test.com的域名解析请求。攻击者回的包可能回的是3.3.3.3,就算是伪造5.5.5.5回的包,那么可能已经在真正应答之后了。

缺点

  • 提供的随机性太少,只有2-3bit

(4)DNSSEC

防止DNS 缓存被投毒的最佳方法是实现加密和身份验证的安全方法。DNS 作为一种过时的协议以及整个互联网的支柱,令人惊讶的是仍然是一种未加密的协议,没有对它收到的条目和响应进行任何形式的验证。

当然,解决方案是提供一种称为 DNS Secure 或 DNSSEC的验证和身份验证方法。该协议创建了与 DNS 记录一起存储的唯一加密签名。然后 DNS 解析器使用签名来验证 DNS 响应,确保记录未被篡改。此外,它还提供了从 TLD 到域权威区域的信任链,确保了 DNS 解析的整个过程是安全的。

尽管有这些明显的好处,但 DNSSEC 的采用速度很慢,许多不那么受欢迎的 TLD 仍然没有利用 DNSSEC 来保证安全。主要问题是 DNSSEC 设置复杂,需要升级设备来处理新协议,另外由于历史上大多数 DNS 欺骗攻击的罕见和不可知性,DNSSEC 的实现不被视为优先级,通常只执行一次应用就达到其生命周期的终点。

优点

  • 基本杜绝了DNS缓存投毒攻击

缺点

  • 部署极少

结语

对DNS缓存投毒做了个小结

参考

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

  • DNS新劫持方法(“侧信道攻击“攻破“端口随机化“)

  • 针对DNS转发设备的缓存投毒攻击

一文搞明白DNS缓存投毒相关推荐

  1. 网络知识扫盲,一文搞懂 DNS

    在找工作面试的过程中,面试官非常喜欢考察基础知识,除了数据结构与算法之外,网络知识也是一个非常重要的考察对象. 而网络知识,通常是很抽象,不容易理解的,有很多同学就在这里裁了跟头.为了更好地通过面试, ...

  2. 12年前的 Linux bug 复活,DNS 缓存投毒攻击重现

     聚焦源代码安全,网罗国内外最新资讯! 编译:奇安信代码卫士团队 清华大学和加州大学组成的研究团队发现一种可发动 DNS 缓存投毒攻击的新方法.这种方法重新激活了本以为已完全修复的2008年现身的一个 ...

  3. DNS安全 DNS缓存投毒与防护

    http://blog.51cto.com/zdzhu/1575498 http://www.cis.syr.edu/~wedu/seed/Labs_12.04/Networking/DNS_Remo ...

  4. DNS安全(一)DNS缓存投毒与防护

    互联网的飞速发展,把人们带入了一个新的时代.一方面,人们享受着互联网带来的便捷多彩的生活,另一方面,个人信息安全也正面临者新的挑战. 如今的互联网,时时刻刻都在发生网络***.病毒传播.一边是攻,另一 ...

  5. 一文搞明白Python并发编程和并行编程

    目录 前言 一.基础知识 1.并行和并发 (1)定义 (2)联系 2.进程.线程和协程 (1)定义 (2)联系 3.生成器 (1)yield (2)send, next (3)yield from 4 ...

  6. 一文搞清楚 DNS 的来龙去脉

    文章目录 美国霸权 ICANN:互联网界的联合国 IP 地址分配 域名解析架构 分层架构: DNS 缓存: 根 DNS 服务器: 顶级 DNS 服务器(TLD): 权威 DNS 服务器: 本地 DNS ...

  7. 一文搞明白GIT——Git原理解析与常用命令

    工作中经常用git,但是不少命令经常使用出现各种各样的问题,也不太理解其中的原理.今天专门总结一下git的原理,理解原理之后想实现什么样的功能直接找相应的命令即可.如有错误和不足,欢迎指正! 一. 工 ...

  8. 一文搞懂 DNS 基础知识,收藏起来有备无患

    点击上方 "编程技术圈"关注, 星标或置顶一起成长 后台回复"大礼包"有惊喜礼包! 每日英文 Life is just like a journey. Ther ...

  9. 一文搞明白域前置(Domain Fronting)技术

    目录 前言 一.概述 1.简介 2.简单示例 (1)使用 curl 演示域前置 (2)使用 wget演示域前置 3.影响范围 二.原理 1.挑战与应对 (1)按内容阻塞 (2)按地址阻塞 (3)主动探 ...

  10. 一文搞懂 DNS 基础知识,收藏起来有备无患~

    你知道的越多,不知道的就越多,业余的像一棵小草! 你来,我们一起精进!你不来,我和你的竞争对手一起精进! 编辑:业余草 juejin.cn/post/6844903497494855687 推荐:ht ...

最新文章

  1. python实现人像美颜
  2. mybatis-plus自动生成文件
  3. OpenGL CPU光线跟踪
  4. 20145324 《Java程序设计》第6周学习总结
  5. 单例模式的5种实现方式,以及在多线程环境下5种创建单例模式的效率
  6. oracle一列有多个约束,在oracle中创建unique唯一约束(单列和多列)
  7. gitlab+jenkins=自动化构建
  8. ASP.NET AJAX 1.0 Beta 2 发布
  9. Python 2.7.5 CentOS 6.4 编译 错误
  10. 操作系统安装教程之图解Ubuntu Server 14.04安装
  11. 水经注叠加cad_水经注CAD智能影像加载插件使用教程
  12. python自动化中使用unittestreport输出测试报告
  13. macd ema java源码_MACD指标源码汇总,成功率极高,买卖点提前一目了然!
  14. 《东周列国志》第四十回 先轸诡谋激子玉 晋楚城濮大交兵
  15. 使用UMI仿今日头条首页
  16. 微信域名检测接口文档
  17. 喜讯 | 联诚发斩获2020年度LED显示屏十佳品牌
  18. 【UOJ 454】打雪仗(通信题)(分块)
  19. 证明调和级数发散的方法
  20. 本周大新闻|FDA公布XR认证医疗名单,索尼推数字孪生平台Mapray

热门文章

  1. php euc-cn,php配置中文解说
  2. Debezium报错处理系列:Creation of database history topic failed, please create the topic manually
  3. python绘图之Times New Roman字体以及Helvetica字体
  4. va_buffersharing example
  5. 毕业四年间,一壶漂泊,歌者默然(转帖)
  6. 怎么把ppt弄成链接的形式_ppt链接excle表格:如何在ppt中超级链接到指定的excel工作表...
  7. Sqlmap全参数详解
  8. Imagination发布开源项目:适配PowerVR IP的Vulkan驱动和编译器合入Mesa 3D 图形库
  9. git语法大全(值得收藏)
  10. python可以ps吗_Python功能确实非常强大!不止PS可以美化照片Python也可以!满分...