基于Python3的Scapy构造DNS报文

一:DNS协议

        DNS(Domain Name System)协议是计算机网络中的一种基础协议,它用于将域名(如www.baidu.com)转换为IP地址(如192.168.0.1),从而实现计算机之间的通信。

        DNS 分为查询请求和查询响应,请求和响应的报文结构基本相同。DNS 报文格式如图所示

        上图中显示了 DNS 的报文格式。其中,事务 ID、标志、问题计数、回答资源记录数、权威名称服务器计数、附加资源记录数这 6 个字段是DNS的报文首部,共 12 个字节。
        整个 DNS 格式主要分为 3 部分内容,即基础结构部分、问题部分、资源记录部分。下面将详细地介绍每部分的内容及含义。

基础结构部分

DNS 报文的基础结构部分指的是报文首部,如图所示。
 

该部分中每个字段含义如下。

  • 事务 ID:DNS 报文的 ID 标识。对于请求报文和其对应的应答报文,该字段的值是相同的。通过它可以区分 DNS 应答报文是对哪个请求进行响应的。
  • 标志:DNS 报文中的标志字段。
  • 问题计数:DNS 查询请求的数目。
  • 回答资源记录数:DNS 响应的数目。
  • 权威名称服务器计数:权威名称服务器的数目。
  • 附加资源记录数:额外的记录数目(权威名称服务器对应 IP 地址的数目)。


基础结构部分中的标志字段又分为若干个字段,如图所示。
 

标志字段中每个字段的含义如下:

  • QR(Response):查询请求/响应的标志信息。查询请求时,值为 0;响应时,值为 1。
  • Opcode:操作码。其中,0 表示标准查询;1 表示反向查询;2 表示服务器状态请求。
  • AA(Authoritative):授权应答,该字段在响应报文中有效。值为 1 时,表示名称服务器是权威服务器;值为 0 时,表示不是权威服务器。
  • TC(Truncated):表示是否被截断。值为 1 时,表示响应已超过 512 字节并已被截断,只返回前 512 个字节。
  • RD(Recursion Desired):期望递归。该字段能在一个查询中设置,并在响应中返回。该标志告诉名称服务器必须处理这个查询,这种方式被称为一个递归查询。如果该位为 0,且被请求的名称服务器没有一个授权回答,它将返回一个能解答该查询的其他名称服务器列表。这种方式被称为迭代查询。
  • RA(Recursion Available):可用递归。该字段只出现在响应报文中。当值为 1 时,表示服务器支持递归查询。
  • Z:保留字段,在所有的请求和应答报文中,它的值必须为 0。
  • rcode(Reply code):返回码字段,表示响应的差错状态。当值为 0 时,表示没有错误;当值为 1 时,表示报文格式错误(Format error),服务器不能理解请求的报文;当值为 2 时,表示域名服务器失败(Server failure),因为服务器的原因导致没办法处理这个请求;当值为 3 时,表示名字错误(Name Error),只有对授权域名解析服务器有意义,指出解析的域名不存在;当值为 4 时,表示查询类型不支持(Not Implemented),即域名服务器不支持查询类型;当值为 5 时,表示拒绝(Refused),一般是服务器由于设置的策略拒绝给出应答,如服务器不希望对某些请求者给出应答。

问题部分

问题部分指的是报文格式中查询问题区域(Queries)部分。该部分是用来显示 DNS 查询请求的问题,通常只有一个问题。该部分包含正在进行的查询信息,包含查询名(被查询主机名字)、查询类型、查询类。

问题部分格式如图所示。
 

该部分中每个字段含义如下:

  • 查询名:一般为要查询的域名,有时也会是 IP 地址,用于反向查询。
  • 查询类型:DNS 查询请求的资源类型。通常查询类型为 A 类型,表示由域名获取对应的 IP 地址。
  • 查询类:地址类型,通常为互联网地址,值为 1。

资源记录部分

资源记录部分是指 DNS 报文格式中的最后三个字段,包括回答问题区域字段、权威名称服务器区域字段、附加信息区域字段。这三个字段均采用一种称为资源记录的格式,格式如图所示。
 

资源记录格式中每个字段含义如下:

  • 域名:DNS 请求的域名。
  • 类型:资源记录的类型,与问题部分中的查询类型值是一样的。
  • 类:地址类型,与问题部分中的查询类值是一样的。
  • 生存时间:以秒为单位,表示资源记录的生命周期,一般用于当地址解析程序取出资源记录后决定保存及使用缓存数据的时间。它同时也可以表明该资源记录的稳定程度,稳定的信息会被分配一个很大的值。
  • 资源数据长度:资源数据的长度。
  • 资源数据:表示按查询段要求返回的相关资源记录的数据。

资源记录部分只有在 DNS 响应包中才会出现。下面通过 DNS 响应包来进一步了解资源记录部分的字段信息。

二:构造DNS报文

        scapy具有强大的报文构造能力和修改能力,我们一般定制化DNS报文都是修改DNS请求里的域名和响应里的IP地址。最方便的方法就是基于一个现有的DNS请求和响应报文去修改我们目标字段。

        我们可以先看看scapy解析dns的能力

 scapy解析请求和响应

###[ DNS ]### id        = 49586qr        = 1opcode    = QUERYaa        = 0tc        = 0rd        = 1ra        = 1z         = 0ad        = 0cd        = 0rcode     = okqdcount   = 1ancount   = 23nscount   = 2arcount   = 0\qd        \|###[ DNS Question Record ]### |  qname     = 'upload-z1.qbox.me.'|  qtype     = A|  qclass    = IN\an        \|###[ DNS Resource Record ]### |  rrname    = 'upload-z1.qbox.me.'|  type      = CNAME|  rclass    = IN|  ttl       = 516|  rdlen     = None|  rdata     = 'upload-z1.clouddn.com.'|###[ DNS Resource Record ]### |  rrname    = 'upload-z1.clouddn.com.'|  type      = CNAME|  rclass    = IN|  ttl       = 80|  rdlen     = None|  rdata     = 'upload-z1-oss.clouddn.com.'|###[ DNS Resource Record ]### |  rrname    = 'upload-z1-oss.clouddn.com.'|  type      = CNAME|  rclass    = IN|  ttl       = 54|  rdlen     = None|  rdata     = 'bc-gate-up.qiniu.com.'|###[ DNS Resource Record ]### |  rrname    = 'bc-gate-up.qiniu.com.'|  type      = A|  rclass    = IN|  ttl       = 104|  rdlen     = None|  rdata     = 111.31.48.121|###[ DNS Resource Record ]### |  rrname    = 'bc-gate-up.qiniu.com.'|  type      = A|  rclass    = IN|  ttl       = 104|  rdlen     = None|  rdata     = 111.31.48.33|###[ DNS Resource Record ]### |  rrname    = 'bc-gate-up.qiniu.com.'|  type      = A|  rclass    = IN|  ttl       = 104|  rdlen     = None|  rdata     = 111.13.229.82|###[ DNS Resource Record ]### |  rrname    = 'bc-gate-up.qiniu.com.'|  type      = A|  rclass    = IN|  ttl       = 104|  rdlen     = None|  rdata     = 111.13.229.81|###[ DNS Resource Record ]### |  rrname    = 'bc-gate-up.qiniu.com.'|  type      = A|  rclass    = IN|  ttl       = 104|  rdlen     = None|  rdata     = 111.13.229.68|###[ DNS Resource Record ]### |  rrname    = 'bc-gate-up.qiniu.com.'|  type      = A|  rclass    = IN|  ttl       = 104|  rdlen     = None|  rdata     = 111.13.229.74|###[ DNS Resource Record ]### |  rrname    = 'bc-gate-up.qiniu.com.'|  type      = A|  rclass    = IN|  ttl       = 104|  rdlen     = None|  rdata     = 111.31.48.20|###[ DNS Resource Record ]### |  rrname    = 'bc-gate-up.qiniu.com.'|  type      = A|  rclass    = IN|  ttl       = 104|  rdlen     = None|  rdata     = 111.13.229.73|###[ DNS Resource Record ]### |  rrname    = 'bc-gate-up.qiniu.com.'|  type      = A|  rclass    = IN|  ttl       = 104|  rdlen     = None|  rdata     = 111.31.48.19|###[ DNS Resource Record ]### |  rrname    = 'bc-gate-up.qiniu.com.'|  type      = A|  rclass    = IN|  ttl       = 104|  rdlen     = None|  rdata     = 111.31.48.122|###[ DNS Resource Record ]### |  rrname    = 'bc-gate-up.qiniu.com.'|  type      = A|  rclass    = IN|  ttl       = 104|  rdlen     = None|  rdata     = 111.31.48.23|###[ DNS Resource Record ]### |  rrname    = 'bc-gate-up.qiniu.com.'|  type      = A|  rclass    = IN|  ttl       = 104|  rdlen     = None|  rdata     = 111.31.48.21|###[ DNS Resource Record ]### |  rrname    = 'bc-gate-up.qiniu.com.'|  type      = A|  rclass    = IN|  ttl       = 104|  rdlen     = None|  rdata     = 111.13.229.78|###[ DNS Resource Record ]### |  rrname    = 'bc-gate-up.qiniu.com.'|  type      = A|  rclass    = IN|  ttl       = 104|  rdlen     = None|  rdata     = 111.31.48.123|###[ DNS Resource Record ]### |  rrname    = 'bc-gate-up.qiniu.com.'|  type      = A|  rclass    = IN|  ttl       = 104|  rdlen     = None|  rdata     = 111.31.48.18|###[ DNS Resource Record ]### |  rrname    = 'bc-gate-up.qiniu.com.'|  type      = A|  rclass    = IN|  ttl       = 104|  rdlen     = None|  rdata     = 111.31.48.22|###[ DNS Resource Record ]### |  rrname    = 'bc-gate-up.qiniu.com.'|  type      = A|  rclass    = IN|  ttl       = 104|  rdlen     = None|  rdata     = 111.13.229.75|###[ DNS Resource Record ]### |  rrname    = 'bc-gate-up.qiniu.com.'|  type      = A|  rclass    = IN|  ttl       = 104|  rdlen     = None|  rdata     = 111.13.229.80|###[ DNS Resource Record ]### |  rrname    = 'bc-gate-up.qiniu.com.'|  type      = A|  rclass    = IN|  ttl       = 104|  rdlen     = None|  rdata     = 111.31.48.25|###[ DNS Resource Record ]### |  rrname    = 'bc-gate-up.qiniu.com.'|  type      = A|  rclass    = IN|  ttl       = 104|  rdlen     = None|  rdata     = 111.31.48.24\ns        \|###[ DNS Resource Record ]### |  rrname    = 'qiniu.com.'|  type      = NS|  rclass    = IN|  ttl       = 78188|  rdlen     = None|  rdata     = 'ns3.dnsv5.com.'|###[ DNS Resource Record ]### |  rrname    = 'qiniu.com.'|  type      = NS|  rclass    = IN|  ttl       = 78188|  rdlen     = None|  rdata     = 'ns4.dnsv5.com.'ar        = None[Finished in 2.3s]

 可以看到scapy具备完整的DNS解析能力,那我们的目标就是利用scapy的解析能力去修改我们的目标字段,另外修改目标字段后报文的各种校验和也需要重新计算。

        下面给出完整的构造DNS报文的代码

def dnsPcapProc(self):savefile = 'dns_'+ datetime.now().strftime("%H%M%S") + '.pcap'srcpcap = rdpcap(self.dnsPcapFilePath)srcpcap[1][DNS].show2()oriDomainLen = len(srcpcap[0][DNS].fields['qd'].fields['qname'])diff = len(self.dnsDomainInputEntry)+1 - oriDomainLenoriIPLen = srcpcap[0][IP].lenoriUDPLen = srcpcap[0][UDP].lensrcpcap[0][IP].len = oriIPLen + diffsrcpcap[0][UDP].len = oriUDPLen + diffsrcpcap[0][DNS].fields['qd'].fields['qname'] = self.dnsDomainInputEntry.encode("utf-8")try:del srcpcap[0][IP].lendel srcpcap[0][IP].chksumexcept:srcpcap[0][DNS].fields['qd'].fields['qtype'] = 28del srcpcap[0][IPv6].plendel srcpcap[0][IPv6].chksumflg =6del srcpcap[0][UDP].lendel srcpcap[0][UDP].chksumsrcpcap[0][IP].len = oriIPLen + diffsrcpcap[0][UDP].len = oriUDPLen + diffip_list = list()ip_list.append(self.dnsIPInputEntry)srcpcap[1][UDP].payload.ancount = len(ip_list)srcpcap[1][UDP].payload.qd.qname =  self.dnsDomainInputEntry.encode("utf-8")dns_anser_as_ord = []for ip in ip_list:ipstr,flg = self.ipstr_trans2_hexlist(ip)if flg == 4:dns_anser_as_ord += [0xc0, 0x0c, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x1c, 0x20, 0x00, 0x04]else:dns_anser_as_ord += [0xc0, 0x0c, 0x00, 0x1c, 0x00, 0x01, 0x00, 0x00, 0x1c, 0x20, 0x00, 0x10]dns_anser_as_ord += ipstrhexByteOri = "".join(["%02x" % c for c in dns_anser_as_ord]).encode("utf-8")hexByte = binascii.a2b_hex(hexByteOri)srcpcap[1][UDP].payload.an = hexBytetry:del srcpcap[1][IP].lendel srcpcap[1][IP].chksumexcept:del srcpcap[1][IPv6].plendel srcpcap[1][IPv6].chksumdel srcpcap[1][UDP].lendel srcpcap[1][UDP].chksum#srcpcap[0].show2()#wrpcap(savefile, srcpcap)pktdump = PcapWriter(savefile, append=True, sync=True)ether_layer = srcpcap[0]['Ether']newpcap = Ether(src=ether_layer.src, dst=ether_layer.dst) / srcpcap[0].getlayer('IP')newpcap2 = Ether(src=ether_layer.dst, dst=ether_layer.src) / srcpcap[1].getlayer('IP')pktdump.write(newpcap)pktdump.write(newpcap2)

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

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

相关文章

React基础: 项目创建 JSX 基础语法 React基础的组件使用 useState状态 基础样式控制

01 React 文章目录 01 React一、React是什么1、React的优势 二、React开发环境搭建1、创建项目2、运行项目3、项目的目录结构 三、JSX基础1、什么是 JSX代码示例: 2、JSX使用场景2.1代码示例: 3、JSX中实现列表渲染4、JSX - 实现基本的条件渲染5、JSX - …

喜讯!持安科技入选2023年北京市知识产权试点单位!

近日,北京市知识产权局发布了“2023年度北京市知识产权试点示范单位及2020年度北京市知识产权试点示范单位复审通过名单”名单。 经过严格的初审、形式审核和专家评审,北京持安科技有限公司入选“2023年北京市知识产权试点单位”。 北京市知识产权试点示…

并发性Socket通信源码(基于linux环境下多线程)

服务器端&#xff1a;server.c 1 #include <stdio.h>2 #include <stdlib.h>3 #include <unistd.h>4 #include <string.h>5 #include <arpa/inet.h>6 #include <pthread.h>7 void* working(void *arg);8 //信息结构体9 struct sockinfo10 …

《数据结构、算法与应用C++语言描述》-队列的应用-图元识别问题

《数据结构、算法与应用C语言描述》-队列的应用-图元识别问题 图元识别 问题描述 数字化图像是一个 mxm 的像素矩阵。在单色图像中&#xff0c;每一个像素要么为0&#xff0c;要么为 1。值为0的像素表示图像的背景。值为1的像素表示图元上的一个点&#xff0c;称其为图元像素…

分布式定时任务xxljob

xxl-job的xxl为作者名徐雪里拼音首字母。 xxl-job的作者是2015年开始开发这个项目&#xff0c;那时候springmvcbootstrapadminlte 大行其道&#xff0c;所以这个框架调度器一直沿用这个架构。 一、运行调度器 调度器可以集群或单点运行&#xff0c;以单点运行为例 下载代码…

Linux shell编程学习笔记14:编写和运行第一个shell脚本hello world!

* 20231020 写这篇博文断断续续花了好几天&#xff0c;为了说明不同shell在执行同一脚本文件时的差别&#xff0c;我分别在csdn提供线上Linux环境 &#xff08;使用的shell是zsh&#xff09;和自己的电脑上&#xff08;使用的shell是bash&#xff09;做测试。功夫不负有心人&am…

视频怎么压缩?视频过大这样压缩变小

在日常生活中&#xff0c;我们常常会遇到需要压缩视频的情况&#xff0c;视频压缩不仅可以减小文件大小&#xff0c;方便存储和传输&#xff0c;还可以在保证质量的同时&#xff0c;满足不同的使用需求。那么&#xff0c;如何有效地压缩视频呢&#xff1f; 方法一&#xff1a;嗨…

GEO生信数据挖掘(九)肺结核数据-差异分析-WGCNA分析(900行代码整理注释更新版本)

第六节&#xff0c;我们使用结核病基因数据&#xff0c;做了一个数据预处理的实操案例。例子中结核类型&#xff0c;包括结核&#xff0c;潜隐进展&#xff0c;对照和潜隐&#xff0c;四个类别。第七节延续上个数据&#xff0c;进行了差异分析。 第八节对差异基因进行富集分析。…

Git 安装和基础命令、IDEA 基础操作

目录 总结命令&#xff1a;1、安装&#xff1a;1、安装2、配置环境变量&#xff1a; 2、Git操作&#xff1a;1、初始化&#xff1a;1、姓名邮箱&#xff1a;2、初始化仓库&#xff1a;3、工作区和暂存区分析 2、提交文件3、查看版本库状态4、安装小乌龟git不显示图标 5、查看提…

解剖—单链表相关OJ练习题

目录 一、移除链表元素 二、找出链表的中间节点 三、合并两个有序链表 四、反转链表 五、求链表中倒数第k个结点 六、链表分割 七、链表的回文结构 八、判断链表是否相交 九、判断链表中是否有环(一) 十、 判断链表中是否有环(二) 注&#xff1a;第六题和第七题牛…

docker 基本用法-操作镜像

1.下载镜像 docker search centos #默认从 Docker Hub 中搜索镜像 访问 dockerhub&#xff1a;https://registry.hub.docker.com docker pull centos 拉取镜像 如果不能拉取 方法 1.需要配置配置镜像加速器 tee /etc/docker/daemon.json << EOF {"registry-mirro…

【文献copilot】调用文心一言api对论文逐段总结

文献copilot&#xff1a;调用文心一言api对论文逐段总结 当我读文献的时候&#xff0c;感觉读得太慢了&#xff0c;看翻译软件翻译的又觉得翻译的不好。于是我就写了个程序辅助我读文献&#xff0c;它可以逐段总结&#xff0c;输出格式是&#xff1a;原文一句话总结分段总结&a…

css钟表数字样式

如图&#xff1a; 代码 font-size: 28px;font-family: Yourname;font-weight: 500;color: #00e8ff;

CSS基础入门01

目录 1.CSS是什么 2.基本语法规范 3.引入方式 3.1内部样式表 3.2行内样式表 3.3外部样式 4.代码风格 4.1样式格式 4.2样式大小写 4.3空格规范 5.选择器 5.1选择器的功能 5.2选择器的种类 6.基础选择器 6.1标签选择器 6.2类选择器 6.3id 选择器 6.4通配符选择…

jQuery实现输入框提示并点击回显功能呢

html代码: <input type"text" id"affOrganization" name"affOrganization" class"form-control" placeholder"Search..." style"width: 300px" > <div class"search_suggest" id"gov_se…

黑豹程序员-架构师学习路线图-百科:开启分布式架构开发先河,让Java戴上全球第一的皇冠-EJB

文章目录 1、EJB的传奇2、什么是 EJB3、从拥抱到抛弃4、最终版EJB3.0 1、EJB的传奇 EJB这项技术其实已经消亡了&#xff0c;但为何我还专门单另拿出来讲呢&#xff1f;原因有三。 第一、EJB是J2EE雄霸全球的功臣&#xff0c;它把我们编程推向了分布式架构开发&#xff0c;为开…

Ubuntu的EFI分区无法删除

本文解决的问题&#xff1a;双系统装完后需要删除ubuntu的分区&#xff0c;但是EFI系统分区无法删除。 第一步&#xff1a;cmd中输入命令 diskpart 并回车&#xff0c;如图中①&#xff1b; 第二步&#xff1a;在弹出窗口②中依次输入如下命令即可删除EFI分区&#xff1b; /…

移动App安全检测的必要性,app安全测试报告的编写注意事项

随着移动互联网的迅猛发展&#xff0c;移动App已经成为人们日常生活中不可或缺的一部分。然而&#xff0c;虽然App给我们带来了便利和乐趣&#xff0c;但也伴随着一些潜在的安全风险。黑客、病毒、恶意软件等威胁着用户的隐私和财产安全&#xff0c;因此进行安全检测就显得尤为…

什么是USRP软件无线电设备?

什么是USRP软件无线电设备&#xff1f; USRP软件无线电设备提供软件定义的RF架构&#xff0c;可让工程师使用自定义信号处理功能来设计、原型验证和部署无线系统。从基于大型开放式FPGA的经济款到高性能无线电设备&#xff0c;多种硬件可满足您的不同需求。您可以使用LabVIEW或…

施密特正交化

相信大家在平时的期末考试中一定少不了对某某向量组执行标准正交化类型的题目。今天我们从这个题目入手&#xff0c;说明这个如何执行施密特正交化&#xff0c;以及为什么要进行正交化。 一、例子 例子&#xff1a;设 a 1 [ 1 2 − 1 ] a_1\begin{bmatrix}1\\2\\-1\end{bmat…