DNS欺骗

 DNS(域名系统)作为当前全球最大 、最复杂的分布式层次数据库系统,具有着开放、庞大、复杂的特性。它为全球用户提供域名解析服务,是互联网的重要基础设施。但由于其在设计之初未考虑安全性、人为破坏等因素 ,DNS系统在互联网高度发达的今天面临着严重 的安全威胁。而解决此威胁则首先需要知己知彼,既了解 DNS 设计存在的具体缺陷,又需要了解攻击手段的方式种类。本篇报告以 DNS协议原理简述切入,着重于DNS攻击(DNS反射放大攻击、DNS缓存投毒攻击)的原理与分析 。最后进行 DNS安全增强相关标准如 DNSSEC 、DNSCrypt 协议的简介。  

DNS协议机制

DNS的三个主要部分

域名空间与资源记录(domain namespace and resource records)。二者是树状结构名 称空间和与这些名称关联的数据的规范。

名称服务器(name servers)。名称服务器是保存着有关域树的结构信息和设置信息的 服务器程序。

解析器(resolvers)。解析器是为了响应客户端请求从名称服务器提取信息的程序。三者在应用中的简单组织关系如下:

 解析器也可以适用于缺乏解析器功能的PC群中,此时可以从本地机器中移出解析功能,并将其移进支持递归查询的名称服务器,使之同时为多个PC提供解析服务。

名词辨析:域(domain)与区域(zone)

    在逻辑上,DNS由域(domain)组成,在物理上,DNS由区域(zone)组成。通过域名结构可以清晰直观地了解DNS的层次化划分,而解析过程所需的文件是以区域为单位进行存储的。

DNS域名结构:层次化的树形结构

    如下图表示的是DNS的域的结构。可见通过域的划分可以清晰地了解DNS的层次划分。 

DNS区域组织形式:树形结构

    如下图是DNS中区域的树形结构。每个DNS区域要求至少有一个权威域名服务器发布关于这个区域的信息,因此在某些情况下域和区域的划分并不是完全重叠的。

 以上便是DNS的原理简述。在实际应用过程中,用户访问本地DNS服务器时使用递归方式,即在用户视角中通过一次请求就能得到所需要的解析结果。而本地DNS服务器查询则采用迭代方式,即通过一次或多次请求才能层次渐进地找到所需结果。

DNS报文响应格式简述

    DNS 查询和响应使用标准的消息格式。此消息格式有包括众多固定字段的首部和携带查询参数和 RRs 的4个部分。四个部分依次为:问题、回答、权威、附加。后三部分内皆由多条RRs组成。

    首部中:操作码(4 位) 用于区分查询。1表示标准查询,2表示反向查询和状态查询。四个部分的大致含义如下:

问题查询名称等参数。

回答直接回答问题的RRs。

权威携带描述其它权威服务器的RRs。

附加其它可能有帮助的资源记录。


DNS攻击的原理与分析

    由于DNS在设计之初并未考虑安全性因素,如在消息传输中未进行加密、认证、签名 等安全手段,DNS 攻击是非常常见的。攻击者开展攻击通常是为了得到收益。而对 DNS 的 攻击也可根据收益类型进行区分。一是表层利益,对应DNS欺骗。如攻击者通过克隆网站欺骗消费者进行支付,再通过欺骗手段使用户收到的解析结果为克隆网站而非正规网站。二则是深层利益,对应 Dos(拒绝服务)  攻击。如2019年亚马逊的云计算部门DNS服务器 遭受了持续了大约八小时的 DDoS (分布式拒绝服务)攻击,造成大量客户无法使用该服务。亚马逊权威 DNS 遭受到海量的查询数据,资源耗尽,无法正常响应。导致DNS服务彻底瘫痪。

DNS缓存投毒攻击

    DNS 的缓存机制可以说是一把双刃剑。在性能提升方面,DNS通过在一次查询结束时 将查询结果缓存在本地服务器,在下一次查找同样域名时,直接读取对应IP地址,节省了 DNS 解析服务器间通信所需时间,能有效地缩短域名解析时间 、减少大量重复的查询 、优化用户体验,从而提升 DNS 的性能。

    而在安全性方面,缓存策略增加了安全威胁,因为只要攻击者修改了缓存,所有使用该 DNS 服务器的客户都可能得到攻击者提供的 IP 地址。DNS 查询时优先从缓存中寻找解析后地址的操作,使得恶意对象只需更改缓存中特定域名对应地址,即可让 DNS 向客户端返回错误的解析结果。

    DNS缓存投毒攻击属于表层收益类型。它利用DNS 欺骗技术,即使客户端查询到虚假的 IP 解析地址,再利用 DNS 服务器的缓存机制将虚假信息进行缓存,从而产生持续危害。

    DNS欺骗技术需要伪造DNS回复,类型通常是UDP 数据包。为了实现伪造 UDP 数据包,攻击者需要知道请求中的一些参数,如 UDP 源端口号、请求的交易 ID、请求的问题等。由于UDP 包并没有加密措施,处于同一局域网内的攻击者可以直接捕获请求,从而嗅探到所需信息。由此可以引申出 DNS缓存投毒机制的两个子分类: 本地DNS缓存中毒攻击与远程DNS缓存中毒攻击。

本地 DNS 缓存中毒攻击

    此种攻击中,攻击者与用户端处于同一局域网内。此时攻击者可以在局域网直接捕获并 解析本地 DNS 服务器请求数据包,从而实现攻击。如下图所示,①②两处消息都可被攻击 者获取,而由于 DNS 报文并未加密认证等,攻击者可以直接拦截报文获取需要的一切信息 并将内容进行篡改后给出伪造报文,发送给本地 DNS 服务器或用户端。 

针对报文伪造区域又可以分为两种类别。其一是只针对DNS响应报文中回复部分的伪造,此种伪造相对危害较小,只影响一个主机名  (如将 www.baidu.com 映射到攻击者 IP)。 其二是针对DNS响应报文中权威和附加部分的伪造。攻击者将由自己控制的域名当作权威 域名服务器域名插入权威区并在附加区给出对应域名与攻击者 IP 的映射关系。伪造记录被本地DNS服务器放入缓存后,当查询目标域内任何一个主机名时,本地服务器会把请求发 给伪造的、攻击者控制的“权威域名服务器”。此种方式危害较大,可以殃及整个目标域内的 主机。

    本地DNS缓存中毒攻击的弊端也很明显,由于需要与本地 DNS服务器处于一个局域网内,该攻击对攻击者的物理位置做了限制,因此很难在现实中使用,大部分缓存中毒攻击 都采用远程攻击实现。

远程 DNS 缓存中毒攻击

    远程 DNS 缓存攻击应用范围更为广泛,但其难度较本地也显著增加。由于不同局域网内不能嗅探 DNS 请求数据包,远程攻击很难获取报文的两个数据:一是UDP的源端口号,二是 DNS 响应报文头部的交易 ID,二者皆为 16 比特。因此,远程 DNS 攻击需要猜测至少32位数据。然而猜测所需的时间往往超过本地 DNS服务器得到真实回答并存入缓存的时间,接受后 LDNS 就不再向权威服务器发起请求,这就会导致攻击者伪造的回复失去作用,攻击失败。因此,远程DNS缓存中毒攻击若想成功,必须想办法让 LDNS 持续发出查询请求。而当本地 DNS 的缓存失效后,伪造报文才会被接受。因此,远程DNS缓存中毒攻击需要完成三个任务:

    (1)  令标 DNS 服务器发出查询报文;

    (2)  伪造回复;

    (3)  使缓存失效。

    Kaminsky攻击是第一个成功实现的远程缓存中毒攻击。一方面,它通过发送DNS请求给目标DNS服务器触发服务器发送请求;另一方面,这种攻击手段通过不断查询随机化的域名、针对性的伪造授权记录从而绕过缓存失效的束。

    具体而言,Kaminsky攻击方动访问不存在的域名,这种域名在名称服务器的缓存中并不存在,因此不存在缓存时限问题。

    具体攻击方式及图示如下:

攻击者向被攻击DNS服务器询问一个随机产生的域名。

被攻击 DNS 服务器向权威域名服务器请求。

攻击者发送大量回复,猜测源端口号和交易 ID。

猜对则本地 DNS 服务器接受其中的 IP 和 NS 记录,污染被攻击 DNS 服务器的缓存。 

猜错了,重新开始用另一个随机产生的域名查询实施新一轮攻击。 

DNS反射放大攻击

    DNS 反射放大攻击是 DDos 攻击  (分布式拒绝服务攻击)  的一种 。“放大”是指诱发一个与发送的原始包请求不成比例的服务器响应。这种攻击主要利用 DNS 应答报文比请求包大 的特点,以沿途DNS服务器为放大器,从而实现放大流量。

    在DNS反射放大攻击中,攻击者通过将 DNS 报文的源地址修改为受攻击者地址,同时面向大量互联网公共递归请求海量的全记录类型域名查询,将应答包的流量引入受害的服务器,从而造成被攻击者的网络带宽、服务器性能资源的耗尽。这种攻击的对象是主机  (终端用户) 。      在 DNS 放大攻击期间,攻击者将一个伪造的 IP 地址发送到一个开放的 DNS 解析器中,促使它使用 DNS 响应报文回复该地址。无数的伪造查询被发送出去,  并且有若干 DNS 解析器同时回复 。这样受害者的网络很容易被大量DNS 响应所淹没。

    普通 Dos 攻击的常见流程如下:

僵尸主机群发起大量的  (随机)  伪造域名的 DNS 请求。

收到请求的 DNS 服务器查询本地数据,如不存在则来到③。

本地服务器缓存中对应项不存在,向下一个DNS服务器请求。流程2、3多次重复。

僵尸主机群的 DNS 请求被逐级放大,大量占用目标服务器的资源。

反射放大攻击的机理与上述流程相似。放大攻击的特点也是攻击者不把通信包直接发给 受害者, 而是发给放大器(DNS 服务器),然后再反射给受害者。攻击者利用 DNS 协议回复 包比请求包大的特点,对流量进行放大,伪造请求包的源 IP,最终将 DNS 服务器的应答包 引向被攻击的目标。反射放大攻击的流程如下:

 僵尸主机群发送大量、全类型的伪造源地址为受害者 IP (例如 100.100.1.1)  的 DNS 请求报文

DNS 服务器经过正常查询流程,且以为是受害者发送的请求

由于 DNS 应答报文比查询报文更大  (伪造报文时请求的是全类型) ,被攻击者  (例如 100.100.1.1)  收到大量 DNS 服务器返回的全类型应答报文,直接导致大量服务器、带宽资源被挤占,其正常功能受到极大影响,攻击成功。 

对以上介绍的两类 DNS攻击的对象,做总结如下: 

  针对以上介绍的两种 DNS 攻击手段,主要的检测方法如下:

    1.  被动监听检测法

    针对DNS缓存中毒攻击 (DNS 欺骗类型) ,DNS服务器可以采用被动监听检测法检查一段时间内接收到的 DNS 应答报文。本机发出的一个DNS请求报文只会对应一个DNS响应报文,所以在一条请求后如果额定时间内收到了多个应答报文,则考虑是否遭受到了DNS欺骗。

    2.  主动试探检测法

    另一种针对 DNS 欺骗攻击的检测手段是主动试探检测法。DNS 服务器主动发送一个已知不可能收到回复的检测数据包,如果收到了回复,说明收到的大概率是攻击 者伪造的欺骗报文,系统正在遭受欺骗攻击。

    3.  交叉检查查询法

    此种方法依赖于 DNS 的反向查询功能,即通过 IP 查找对应域名,如与查询的对象一致,则确定安全 。采用此种检测方式的 DNS 服务器在收到DNS响应报文后需用 反向查询功能进行验证后才对结果予以采信。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/653135.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu下APT下载工具(Ubuntu 下最常用的下载和安装软件方法)

前言 本篇文章记录我学习Ubuntu 下用的最多的下载工具: APT 下载工具, APT 下载工具可以实现软件自动下载、配置、安装二进制或者源码的功能。 APT 下载工具和我们前面一篇文章讲解的“install”命令结合在一起构成了 Ubuntu 下最常用的下载和安装软件方…

【代码随想录】LC 242. 有效的字母异位词

文章目录 前言一、题目1、原题链接2、题目描述 二、解题报告1、思路分析2、时间复杂度3、代码详解 前言 本专栏文章为《代码随想录》书籍的刷题题解以及读书笔记,如有侵权,立即删除。 一、题目 1、原题链接 242. 有效的字母异位词 2、题目描述 二、解题…

刘知远团队大模型技术与交叉应用L5-BMSystem

为什么需要BMTrain? PLM越来越大。为了使训练更高效和廉价。我们有必要 1.分析GPU的显存去哪了? 2.理解GPU间的合作模式是如何的? 显存都去了哪里? CPU vs GPU CPU适合复杂逻辑运算。GPU适合大量重复的数值运算。 显存成分 1.前…

csp----寻宝!大冒险!

题目描述&#xff1a; AC代码如下&#xff1a; /*思路&#xff1a; 把A变成小块 因为B是A里的一部分 通过把A变成小块 去寻找B这样速度更快 如果AB,BA&#xff0c;说明找到了。 */#include <iostream> #include <cstring> #include <algorithm> #include …

【Java】初识Spring Mvc

SpringMVC_day01 今日内容 理解SpringMVC相关概念完成SpringMVC的入门案例学会使用PostMan工具发送请求和数据掌握SpringMVC如何接收请求、数据和响应结果掌握RESTful风格及其使用完成基于RESTful的案例编写 1&#xff0c;SpringMVC简介 看到SpringMVC这个名字我们会发现其中…

【人工智能】主要人工智能技术及深度学习及传统机器学习区别与联系

主要人工智能技术的基本概念和应用场景 机器学习英文简称ML是一门涉及统计学、系统辨识、逼近理论、优化理论、计算机科学、脑科学等诸多领域的交叉学科&#xff0c;主要研究计算机怎样模拟或实现人类的学习行为&#xff0c;以获取新的知识或技能&#xff0c;重新组织已有的知识…

【GAMES101】Lecture 10 几何表示

目录 隐式表示 代数曲面&#xff08;Algebraic surfaces&#xff09; CSG&#xff08;Constructive solid geometry&#xff09; 距离函数&#xff08;Distance Functions&#xff09; 水平集&#xff08;Level set methods&#xff09; 分形&#xff08;Fractals&#x…

【Android】MediaCodec学习

在开源Android屏幕投屏代码scrcpy中&#xff0c;使用了MediaCodec去获取和display关联的surface的内容&#xff0c;再通过写fd的方式&#xff08;socket等&#xff09;传给PC端&#xff0c; MediaCodec的处理看起来比较清楚&#xff0c;数据in和数据out 这里我们做另外一个尝试…

AI嵌入式K210项目(19)-安装CanMV IDE开发软件

文章目录 前言一、软件下载安装二、软件简介三、设备连接四、在线模拟五、开机运行程序附录&#xff1a;MicroPython固件烧录总结 前言 前几章我们介绍K210使用C语言裸机开发方法&#xff0c;大家对K210内部的硬件和各种加速器有了初步的了解&#xff0c;但是开发人工智能相关…

TypeScript(四) 运算符

1. 运算符 1.1. 描述 运算符用于执行程序代码运算。 1.2. 运算符主要包括&#xff1a; &#xff08;1&#xff09;算术运算符 &#xff08;2&#xff09;逻辑运算符 &#xff08;3&#xff09;关系运算符 &#xff08;4&#xff09;按位运算符 &#xff08;5&#xff09;赋值…

内部类 --java学习笔记

内部类 是类中的五大成分之一&#xff08;成员变量、方法、构造器、内部类、代码块&#xff09;&#xff0c;如果一个类定义在另一个类的内部&#xff0c;那么这个类就是内部类当一个类的内部包含了一个整体的事务&#xff0c;且这个事务没必要单独设计时&#xff0c;就可以把…

(十三)centos7案例实战——用户、用户组及用户权限管理

前言 对于完备的centos系统来说&#xff0c;创建一套规范的账户权限系统是十分必要的。针对不同的用户提供不同的操作权限&#xff0c;避免直接使用root账号&#xff0c;造成系统的误操作&#xff0c;导致一些不必要的损失&#xff0c;将删库跑路扼杀在摇篮中。本节内容会从用…

基于springboot校园台球厅人员与设备管理系统源码和论文

在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括校园台球厅人员与设备管理系统的网络应用&#xff0c;在外国管理系统已经是很普遍的方式&#xff0c;不过国内的管理网站可能还处于起步阶段。校园台球厅人员与设备管理系统具…

Fastbee物联网项目新手快速入门

一&#xff0c;前提条件 后端环境准备如下&#xff1a; 正式环境推荐硬件资源最低要求4c8G&#xff0c;硬盘40G。JDK 1.8.0_2xx (需要小版本号大于200) 。Maven3.6.3。&#xff08;IDEA启动时使用IDEA默认自带的版本即可&#xff09;。 启动fastbee之前&#xff0c;请先确定…

课时6:编程语言逻辑

1.2.2 编程语言逻辑 学习目标 这一节&#xff0c;我们从 语言分类、编程逻辑、小结 三个方面来学习。 语言分类 语言分类 低级编程语言&#xff1a;机器&#xff1a;- 二进制的0和1的序列&#xff0c;称为机器指令。- 一般人看不懂汇编&#xff1a;- 用一些助记符号替代机…

LPC804开发(4.ctimer使用)

1.前言 昨天晚上画完板子&#xff0c;还剩点时间就再翻了翻手册&#xff0c;大致清楚了时钟树的运行&#xff0c;顺带搞清楚了定时的使用&#xff0c;那就出一份教程吧。 如果各位在此之前没有接触过LPC单片机&#xff0c;还是建议先把程序直接贴进自己的项目&#xff0c;稍微…

“拔叔”的新片又杀疯了!

近&#xff0c;“拔叔”麦斯米科尔斯的新片登上口碑榜。 该片曾入围去年威尼斯金狮奖&#xff0c;上映后颇受好评&#xff0c;目前豆瓣评分8.2分。 将代表丹麦角逐2024年奥斯卡最佳外语片&#xff0c;目前已入15强。 作为“丹麦最性感的男人”&#xff0c;拔叔的实力不容小觑。…

Logistics 逻辑回归概念

1. sigmoid函数 逻辑回归算法的拟合函数&#xff0c;叫做sigmoid函数&#xff1a; 函数图像如下&#xff08;百度图片搜到的图&#xff09;&#xff1a; sigmoid函数是一个s形曲线&#xff0c;就像是阶跃函数的温和版&#xff0c;阶跃函数在0和1之间是突然的起跳&#xff0c;…

std::for_each

std::for_each 是 C STL 中的标准函数之一&#xff0c;用于对指定的容器或序列中的元素执行指定的操作。该函数的头文件为 <algorithm>&#xff0c;定义在 namespace std 中&#xff0c;因此需要包含该头文件才能使用该函数。 std::for_each 函数是 C STL 中自 C98 就开…

【JavaSE篇】——类和对象

目录 &#x1f393;类定义和使用 &#x1f393;简单认识类 &#x1f6a9;类的定义格式 ❗注意事项 &#x1f393;类的实例化 &#x1f6a9;什么是实例化 &#x1f6a9;类和对象的说明 &#x1f393;this引用 &#x1f6a9;为什么要有this引用 &#x1f6a9;什么是thi…