如何突破DNS报文的512字节限制
“DNS协议大家都应该很熟悉,最近有同学问到如何获得UDP承载的超过512字节的DNS报文,借此机会,我们一起了解下DNS协议与报文长度有关的一些细节。”
在之前的文章里,对DNS协议进行了介绍:
使用Wireshark进行DNS协议解析
Windows下的DNS命令用法
看完这两篇文章,大家应该对DNS协议有一些初步的了解。对DNS协议而言,在IETF网站上,能够很容易地获取到相关的RFC文档及扩展信息。
在大部分讲解DNS协议的文章里,都会这样描述DNS协议的特性:
当封装的DNS响应的长度超过512字节时,协议应采用TCP传输,而不是UDP。
根据协议标准文档RFC1035,这当然是对的,实际使用DNS协议的过程中,抓取的报文也确实是这样的,但是,不要忘记这份RFC文档产生于三十年前,这么多年,随着网络环境的变化,协议是会发展的,大家想想,网络上是不是到处都是超过512字节的UDP数据呀,那超过512字节的UDP DNS又有何不可?
RFC 6891这份标准文档,对DNS进行了扩展,描述了超过512字节的DNS的情况,即EDNS0。
本文将首先描述DNS协议的长度限制情况,然后对EDNS0进行说明,接着用示例说明DNS工具在超过512字节时的通常情况,最后将介绍如何方便地产生超过512字节的UDP承载的DNS报文。大家可以根据需要,跳到对应章节查阅。
01
—
DNS的512字节限制
根据协议标准,DNS协议同时占用UDP和TCP的53端口,这是为什么呢?
翻阅DNS资料,可以发现,DNS协议默认按UDP传输,为优化传输性能,DNS协议有一个512字节的限制,当数据长度超过了512字节时,DNS协议会改用TCP进行传输。
DNS协议从UDP切换到TCP的过程如下:
1、客户端向服务器发起UDP DNS请求;
2、如果服务器发现DNS响应数据超过512字节,则返回UDP DNS响应中置truncated位,告知客户端改用TCP进行重新请求;
3、客户端向服务器发起TCP DNS请求;
4、服务器返回TCP DNS响应。
那为什么限制是512字节呢?
一个说法是:IPV4标准规定了各个主机必须能够重组576字节或更少字节的数据包。具有512字节内容的DNS报文加上IP头和UDP头,将小于576字节。
02
—
EDNS0
EDNS0:即Extension Mechanisms for DNS (EDNS(0)),详细情况可参考RFC 6891这份文档。
EDNS0是随着网络的发展,在DNS消息格式和它支持的消息内容已不足以满足一些DNS服务器的需求的情况下被提出的,它用于传递包大小,扩展了DNS协议。
EDNS0是在遵循已有的DNS消息格式的基础上增加一些字段,来支持更多的DNS请求业务。当然,具备向后兼容性,未支持EDNS0的旧的DNS服务器仍然能够很好地处理EDNS0。
EDNS0特征如下:
扩展DNS使用UDP传输时的最大报文限制,可以超过512字节
扩展RCODE,由4为增加到12位
建议利用域名标签类型的剩余两个
我们在这里关注的是ENDS0突破DNS 512字节限制的能力。
DNS协议在发起请求时,通过在Additional部分增加OPT RR字段,告知服务器能处理的最大UDP报文长度,当服务器准备进行回应时,如果响应数据大于该值,则在DNS协议中置truncated位,否则,可发送小于该值大小的报文。这相当于突破了512字节的长度限制。
在ENDS0标准文档中,很容易找到OPT RR字段的格式:
各字段如下:
NAME:目前为空
TYPE:OPT RR的类型编号,41
CLASS:最大UDP报文长度
TTL:扩展的DNS消息头部
RDLEN:紧接着的RDATA的长度
RDATA:可变部分数据。
RDATA格式如下:
说明如下:
OPTION-CODE:由IANA分配
OPTION-LENGTH:OPTION-DATA的长度
OPTION-DATA:具体内容
而TTL则是用来存储扩展消息头部中的RCODE和flags,格式如下:
说明如下:
EXTENDED-RCODE:扩展RCODE(返回状态码),这8个bit加上DNS头部的4bit总共有12bit(8bit在高位),这样就可以表示更多的返回类型
VERSOION:EDNS的版本
DO:DNSSEC OK,见相关RFC文档定义
Z:一般被发送者设置为0,接收方可以忽略它
因此,只要在进行DNS请求时,设置了OPT RR的CLASS值,则当响应超过了512字节,但未超过该值时,会仍然使用UDP进行传输。
03
—
DNS超过512字节时常规交互
在进行示例之前,我们首先要找到能够产生超过512字节DNS报文的域名及DNS服务器。这是由于大部分的DNS响应都不会很长,而同时,不同的DNS服务器缓存的DNS数据是有差异的。
经过搜集,我们选取了微软的DNS服务器之一:208.84.2.53,同时,选取了进行示例的域名:outlook.com。
常规的DNS请求,不会设置OPT RR的CLASS值,因此会默认在DNS报文大于512字节时,换用TCP传输。
常规DNS交互的实力,选择使用windows自带的nslookup服务进行,命令如下:
nslookup -qt=ANY outlook.com 208.84.2.53
使用Wireshark抓包可看到报文如下:
可以看到,DNS在UDP传输之后自动进行了TCP DNS请求,响应体长度达到1010字节。
自动进行的关键是UDP的DNS响应报文里给truncated进行了置位:
因此,我们只需要找到超过512字节DNS响应的域名及DNS服务器,就能很容易获取到DNS TCP的报文。
04
—
DNS突破UDP 512字节限制
对于超过512字节的DNS UDP报文,就不是那么容易获得的。一个简单的办法是,到骨干网络上去抓包,抓取DNS服务器之间的DNS同步报文。当然,对很多分析DNS协议的朋友,这不现实。
这里,将介绍一种在PC上产生超过512字节的UDP DNS报文的办法。
使用的仍然是前一节的DNS域名和服务器。
这里,需要找到设置DNS协议的OPT RR的CLASS值的方法,很幸运,有这样的工具存在,即dig这个小工具,一款Linux下用于查看域名详情的小工具,类似于nslookup,但功能更强大。dig也存在Windows版,它包含在BIND工具包中,BIND工具包可以在BIND官网下载,地址如下:https://www.isc.org/downloads/
在页面下方即可找到BIND各个版本的下载按钮。
下载好bind包,解压后,直接命令行进入解压目录,即可使用dig进行DNS请求,为构造UDP的DNS大包,设置了参数+notcp以及+bufsize=1400:
dig.exe @208.84.2.53 outlook.com ANY IN +notcp +bufsize=1400
wireshark获取到报文如下:
没有从UDP跳转为TCP进行DNS请求,而是直接在UDP中返回了完整的DNS数据。
其中请求如下:
在OPT RR中,设置了UDP的payload size 1400。
响应如下:
响应体达1031字节。
很容易地,就设置了DNS协议的OPT RR的CLASS值。从而获得了超过512字节的UDP承载的DNS协议报文。
05
—
总结
只要找到合适的方法,就能很方便地突破DNS协议的UDP 512字节限制。如果有什么疑问,可以随时联系我。
长按进行关注。
相关文章:

Fragment为什么须要无参构造方法
日前在项目代码里遇到偷懒使用重写Fragment带参构造方法来传参的做法,顿生好奇,继承android.support.v4.app.Fragment而又不写无参构造方法不是会出现lint错误编译不通过的咩?仔细追究,原来是这货被加了SuppressLint("ValidF…

CentOS 安装FTP
# 安装FTP * 1 安装命令> yum -y install vsftpd * 2 使用如下命令增加账户,其中 /var/www/html 是我们的 ftp 目录,ftpadmin 为 ftp 用户名。 > useradd -d /var/www/html -s /sbin/nologin ftpadmin * 3 给 ftpadmin 这个用户设置密码 > pa…

HTTP协议中的Range和Content-Range
“ 琢磨HTTP协议的每一个细节。”HTTP协议博大精深,每一个细节都应细细体会。否则,在协议还原的过程中,你会遇到各种问题。今天,本文中将对HTTP协议的Range和Content-Range进行分析。Range和Content-Range是 HTTP/1.1中新增的HTTP…

【HTML5游戏开发】简单的《找不同汉字版》,来考考你的眼力吧
一,准备工作 本次游戏开发需要用到lufylegend.js开源游戏引擎,版本我用的是1.5.2(现在最新的版本是1.6.0)。 引擎下载的位置:http://lufylegend.googlecode.com/files/lufylegend-1.5.2.rar 引擎API文档:ht…

FTP 命令的使用详解
# 使用Terminal 连接FTP ####Tips: 1 通过!进入本地主机的shell,然后通过exit退出本地主机进入远程服务器shell 2 要把文件下载到哪一个目录 就要先cd 到 哪个目录,再去进行ftp 连接,这样 执行 get 文件 自动下载到目录3 下载的文件的时候…

html 11 内联(行内)
行内元素 <span> 块级元素 <div> <p> <section> <header> <footer> 行内元素,这是高 margin-top margin-bottom 无意义 ,无效果,因为它仅仅在行内 ,它跳不出行,行多少它就多少。…

宅男抖音某猫协议分析及应用破解
“ 分析传说中的快x,顺便提供破VIP线路及去启动广告方法。”在当今这个由应用市场主导的网络上,流传着一批应用,它们低调又神秘,依赖口碑与独立网站在地下渠道传播,应用市场中从来都找不到它们的身影。这类应用&#x…

AdminLTE的使用
官方文档link1.AdminLTE的必要配置文件<!-- Tell the browser to be responsive to screen width --> <meta content"widthdevice-width, initial-scale1, maximum-scale1, user-scalableno" name"viewport"> <!-- Bootstrap 3.3.5 --> …

Linux sendmail发送邮件失败诊断案例(一)
在新服务器上测试sendmail发送邮件时,发现邮件发送不成功,检查日志文件发现如下错误(Notice:由于涉及公司服务器,邮箱等,故下面hostname、邮箱地址等信息使用xxx代替) tail -40 /var/log/maill…

CentOS 安装Python3
# 基于Linux的 Python3 环境的安装 最近买了一台centOS 阿里云轻量级服务器 自带Python2 准备安装Python3.6 版本的 ## Step * 1 查看当前版本python 的路径 使用以下命令,以便后面安装完毕 建立软链接 > which python 正常情况下会显示python 路径,例如…

某米浏览器黑名单文件破解
“粗粮系统自带浏览器的网址黑名单提取。”某米手机作为高性价比的代表,比起菊厂及OV厂妹风手机,向来被我高看一眼,毕竟雷布斯也是我等码农的典范,以至于我都买过好几件粗粮的产品。虽然它的各个应用,包括系统…

函数的四种调用模式.上下文调用.call.apply
闭包:函数就是一个闭包,一个封闭的作用域; 返回函数,要返回多个函数就用一个对象封装一下,立即执行函数return回调函数JS动态创建的DOM,不会被搜索引擎抓取,对SEO不友好./*window的name属性*/function fn(){ console.log(this.name);} fn.call({name:"zhangsan"});//…

IOC和DI(转)
1、IoC(Inversion of Control)控制反转和 DI(Dependency Injection)依赖注入 首先想说说IoC(Inversion of Control,控制倒转)。这是spring的核心,贯穿始终。所谓IoC,对于spring框架来说,就是由spring来负责…

生成公钥链接github
# 生成公钥 连接Git### 1 检查本机是否有公钥 > cd ~/.ssh### 2 如果有的话 直接使用 不要随便删除电脑公钥 没有的话进行生成 生成如下 id_rsa 是 私钥 id_rsa.pub 是公钥 ### 3 生成公钥命令如下 邮箱是你的邮箱地址 终端会提示输入密码 可以以回车带过 如果设置密码…

精确哈克,以贪婪为基础的欺诈式引流法
“ 一种seo手段探讨。”前一段时间,有朋友在后台留言,让我测评一个网站上的信用卡号码生成器:我兴致勃勃,以为是什么黑科技出现了。打开网站,一股熟悉的wordpress风迎面飘来,伴随着风骚的黑色风味。多点击几…

HTML 基础知识(特殊字符的转义)
1. body、head(meta) <body></body>标签的常见属性: bgcolor:整个页面的背景;text:设置文本颜色link:设置连接颜色(),vlink:已经访问…

1 组件化的了解
组件化 概念:讲一个单一的工程的项目,分解成为各个独立的组件,然后按照某一种方式,任意的组织成一个拥有完整业务逻辑的工程 优势 组件的独立–> 独立编写,独立编译,独立运行,独立测试资源的重用–&g…

WebView通过loadDataWithBaseURL加载本地页面卡死
最近开发遇到一个使用 Android WebView加载本地页面进度条始终卡在20%左右不动的情况。打 Log、抓包发现卡在 WebView对象调用 loadDataWithBaseURL方法。 去网上搜了一下解决方案,stackoverflow上有人说是因为 JELLY_BEAN以上版本没有设置 WebView访问文件的权限导…

微信出现“已停止访问该网页”或“关于潜在的违法或违规内容”怎么办?如何获取被屏蔽的网页的网址?...
点击上方↑↑↑蓝字[协议分析与还原]关注我们今天介绍一个微信使用技巧。微信出现“已停止访问该网页”或“关于潜在的违法或违规内容”怎么办?如何获取被屏蔽的网页的网址?由于微信严格的管控措施,经常会导致一些分享的网址被微信屏蔽&#…

self.navigationController push到指定控制器
1 返回到当前页面上面第三级控制器int idx (int)[[self.navigationController viewControllers]indexOfObject:self]; [self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:(idx -3)] animated:YES];2 //遍…

Google搜索的常用技巧
个人搜索方案 1、选择合适的搜索词,一些行业术语或专家名字可以带来更加高质量的结果。 2、搜索词手动使用空格分隔,先进行第一次搜索,看搜索结果标题是否满足预期,如果不满足,采用更换关键词,添加关键词&a…
hdu 1085 Holding Bin-Laden Captive!
Description We all know that Bin-Laden is a notorious terrorist, and he has disappeared for a long time. But recently, it is reported that he hides in Hang Zhou of China! “Oh, God! How terrible! ” Don’t be so afraid, guys. Although he hides in a cave of…

GPS NMEA-0183协议常用报文数据格式
点击上方↑↑↑蓝字[协议分析与还原]关注我们“ 整理的GPS有关的协议分析资料。”之前分析一些车载设备的流量时,有部分经验,在这里和大家分享。产生这些流量的设备通常是实体终端设备,里面装有处理芯片,与GPS通信,也通…

【tyvj1052】【树状dp】没有上司的舞会
描述 Ural大学有N个职员,编号为1~N。他们有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司。每个职员有一个快乐指数。现在有个周年庆宴会,要求与会职员的快乐指数最大。但是,没有职员…

java中memcached
http://www.oschina.net/code/snippet_250396_9181 转载于:https://www.cnblogs.com/suifengbingzhu/p/3737053.html

01内存管理-概述
内存管理 内存消耗内存管理模型语言架构减少内存使用的实践 1 内存消耗 栈大小 每一个线程都有专有的栈空间,栈内存在线程存在期间自由使用。 每一个函数都有其自己的栈帧,所有的变量都会载入到方法的栈帧中,并且消耗一定的内存。 &…

linux下unzip解压报错“symlink error: File name too long”怎么办?提供解决方案。
点击上方↑↑↑蓝字[协议分析与还原]关注我们“ 分享unzip工具的一个bug。”最近在研究菠菜站,中间用到了Spidermonkey,碰到一些小波折,在这里分享出来,以便大家快速跳坑。从全球最大的男性交友网站GitHub上把Spidermonkey-master…

EF-Linq将查询结果转换为Liststring
List<int> id_list new List<int>() { 1 };//测试数据...List<string> guid_list (from uinfo in db.UserInfowhere id_list.Contains(uinfo.ID)select new{uid uinfo.Guid}).ToList().Select(u > u.uid).ToList<string>(); 转载于:https://www.c…

hdu 2594 kmp
这个题和kmp算法的共同点,也就是可以用kmp解的原因,在于当前缀所在串(kmp中的模式串)字符pj≠后缀所在串(kmp中文本串)字符tj时,应使前缀串(kmp中模式串)尽量往右移动最大位移,而暴力算法则是每次移动位移为…

途游斗地主加密协议分析及破解
点击上方↑↑↑蓝字[协议分析与还原]关注我们“ 分析途游斗地主的加密协议。”作为一个手机棋牌游戏厂商,途游是排得上号的,它的途游斗地主一直很火热,隐约记得,这个厂商一直在搞斗地主的全国竞技赛事,并蹭上了体育总局…