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.mfbz.cn/a/352302.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python之数据可视化(地图)

目录 一 基础地图应用 二 全国疫情图 一 数据准备 二 数据处理 二 湖北省疫情图 一 数据准备 二 数据处理 一 基础地图应用 导入map地图对象 from pyecharts.charts import Map map Map() 写入数据 data [("北京市",100),("上海市"…

详细解读vcruntime140_1.dll修复的手段,如何快速解决vcruntime140_1.dll丢失问题

当出现“无法找到vcruntime140_1.dll”或程序“未能正常启动”时,这通常指示系统中缺失了一个关键文件:vcruntime140_1.dll。作为Visual C Redistributable组件的一部分,这个小文件在很多用Visual Studio编译的C程序运行时发挥着重要作用。解…

OJ_叠框问题

问题描述 c语言实现 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> using namespace std;int main() {int n; //存放外框尺寸int a,b; //存放两个字符char matrix[100][100] { 0 };//全部初始化为休止符/0while (scanf("%d %c %c&…

【开源】基于JAVA的实验室耗材管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 耗材档案模块2.2 耗材入库模块2.3 耗材出库模块2.4 耗材申请模块2.5 耗材审核模块 三、系统展示四、核心代码4.1 查询耗材品类4.2 查询资产出库清单4.3 资产出库4.4 查询入库单4.5 资产入库 五、免责说明 一、摘要 1.1…

IntelliJ IDEA 快捷键大全

IntelliJ IDEA 快捷键大全 一、文本编辑二、构建、编译项目 一、文本编辑 CtrlN 查找类 CtrlN 查找文件 CtrlF 查找文本 可以根据需求去选择红框内的选项 CtrlX 剪切 剪切选中文本&#xff0c;如果未选中则剪切当前行CtrlC 复制 复制选中文本&#xff0c;如果未选中则复制当前…

机房环境动力监控系统:S275远程控制网关助力高效管理

现场问题 1、机房安全隐患 机房存在意外断电、温湿度过高过低、漏水断路等隐患&#xff0c;传统监测手段难以提前发现和预警。 2、机房远程运维困难 因环境改变、非授权活动、设备状态变化等引起的事故&#xff0c;难以满足机房远程运维的可靠管控要求。 3、机房改造成本高…

数论Leetcode204. 计数质数、Leetcode858. 镜面反射、Leetcode952. 按公因数计算最大组件大小

Leetcode204. 计数质数 题目 给定整数 n &#xff0c;返回 所有小于非负整数 n 的质数的数量 。 代码 class Solution:def countPrimes(self, n: int) -> int:if n < 2:return 0prime_arr [1 for _ in range(n)]prime_arr[0], prime_arr[1] 0, 0ls list()for i in…

南方故乡吹来的风

故乡的风 - 张明敏 词&#xff1a;刘因国 曲&#xff1a;刘因国 南方故乡吹来的风 带着潮水的呼唤 吹着你的秀发 飘散着茉莉的香 茉莉的香哟 南方故乡吹来的风 带着渔船的归航 吹着你的欢畅 吹着渔帆点点醉哟 点点的醉哟 远方的姑娘 你是否听见 我的心在嘿哟 你…

缓存技术—redis

一、redis介绍 1.什么是NoSQL NosQL (Not-Only:sQL)&#xff0c;泛指非关系型的数据库(关系型数据库: 以二维表形式存储数据) 非关系型的数据库现在成了一个极其热门的新领域&#xff0c;发展非常迅速。而传统的关系数据库在应付超大规模和高并发的网站已经显得力不从…

设计模式-生成器设计模式

什么是生成器设计模式 众所周知我们设计代码的时候要将代码设计出模块化的&#xff0c;一个功能是一个模块&#xff0c;那么生成器设计模式&#xff0c;是将一个类再度进行了一个拆分&#xff0c;让一个类的内部进行了单一职责化&#xff0c;其实我们在平时开发的时候就会不经…

金智易表通构建学生缴费数据查询+帆软构建缴费大数据报表并整合到微服务

使用金智易表通挂接外部数据,快速建设查询类服务,本次构建学生欠费数据查询,共有3块设计,规划如下: 1、欠费明细查询:学校领导和财务处等部门可查询全校欠费学生明细数据;各二级学院教职工可查询本二级学院欠费学生明细数据。 2、大数据统计报表:从应收总额、欠费总额…

Debezium发布历史90

原文地址&#xff1a; https://debezium.io/blog/2020/04/09/using-debezium-with-apicurio-api-schema-registry/ 欢迎关注留言&#xff0c;我是收集整理小能手&#xff0c;工具翻译&#xff0c;仅供参考&#xff0c;笔芯笔芯. 将 Debezium 与 A​​picurio API 和架构注册表…

每次请求sessionid变化【SpringBoot+Vue】

引言&#xff1a;花了一晚上的时间&#xff0c;终于把问题解决了&#xff0c;一开始后端做完后,用apifox所有接口测试都是可以的,但当前端跑起来后发现接收不到后端的数据。 当我写完前后端&#xff0c;主页面和获取当前页面信息接口后&#xff0c;配置了cros注解 CrossOrigin…

【PythonRS】Rasterio库安装+基础函数使用教程

Rasterio是一个Python库&#xff0c;专门用于栅格数据的读写操作。它支持多种栅格数据格式&#xff0c;如GeoTIFF、ENVI和HDF5&#xff0c;为处理和分析栅格数据提供了强大的工具。RasterIO适用于各种栅格数据应用&#xff0c;如卫星遥感、地图制作等。通过RasterIO&#xff0c…

奇怪问题说 - 测试篇

文章目录 1.什么是软件测试2.软件测试和开发的区别3.软件测试的发展&#xff1a;4.软件测试岗位5.软件测试在不同类型公司的定位6.一个优秀的软件测试人员具备的素质6.1综合能力6.2掌握自动化测试技术6.3优秀的测试用例设计能力6.4探索性思维6.5有责任感和一定的压力 7.软件测试…

SpringSecurity(15)——OAuth2密码模式

工作流程 将用户和密码传过去&#xff0c;直接获取access_token&#xff0c;用户同意授权动作是在第三方应用上完成&#xff0c;而不是在认证服务器&#xff0c;第三方应用申请令牌时&#xff0c;直接带用户名和密码去向认证服务器申请令牌。这种方式认证服务器无法判断用户是…

力扣hot100 字符串解码 栈 辅助栈

Problem: 394. 字符串解码 文章目录 思路&#x1f496; 辅助栈 思路 &#x1f468;‍&#x1f3eb; 路飞 &#x1f496; 辅助栈 ⏰ 时间复杂度: O ( n ) O(n) O(n) &#x1f30e; 空间复杂度: O ( n ) O(n) O(n) class Solution {public String decodeString(String s…

1.26 C++ day3

思维导图 作业&#xff1a; 设计一个Per类&#xff0c;类中包含私有成员:姓名、年龄、指针成员身高、体重&#xff0c;再设计一个Stu类&#xff0c;类中包含私有成员:成绩、Per类对象p1&#xff0c;设计这两个类的构造函数、析构函数和拷贝构造函数。 代码 #include <ios…

C语言指针数组的一篇补充

这段代码是我今早在想指针数组应该怎么去了解清楚的时候想到的一个代码&#xff0c;纠结了1半个多小时将代码理清楚&#xff0c;分享给大家看一下&#xff0c;对我最近发布的博文应该有一个补充帮助理解的作用。 对于这段代码的解释&#xff1a; 要正确理解指针数组是一个数组&…

java版代码生成器

之前实现的JRT代码生成器是M版的&#xff0c;那么用户必须用M库才能有代码生成器的功能。为了提供给就是不用M库的用户使用&#xff0c;JRT再提供脚本版的java代码生成器&#xff0c;方便直接连关系库生成JRT的代码。 实现&#xff1a; import JRT.Core.MultiPlatform.JRTCon…