基于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)
相关文章:

基于Python3的Scapy构造DNS报文
一:DNS协议 DNS(Domain Name System)协议是计算机网络中的一种基础协议,它用于将域名(如www.baidu.com)转换为IP地址(如192.168.0.1),从而实现计算机之间的通信。 DNS 分…...
Jupyter Notebook修改默认浏览器方法
Jupyter Notebook修改默认浏览器方法 Create a Jupyter Notebook Config file jupyter notebook --generate-config打开配置文件.jupyter/jupyter_notebook_config.py找到c.NotebookApp.browser 改成只向自己喜欢的浏览器路径’,这里给出选择google浏览器方法&…...
云计算系统与传统计算系统的比较
随着技术的不断发展,云计算系统逐渐成为了企业和个人使用的主要计算方式之一。然而,很多人对云计算系统与传统计算系统之间的区别和相似之处还存在一些疑惑。本文将以云计算系统和传统计算系统为方向,探讨它们之间的异同点。 首先࿰…...

使用GoogleNet网络实现花朵分类
一.数据集准备 新建一个项目文件夹GoogleNet,并在里面建立data_set文件夹用来保存数据集,在data_set文件夹下创建新文件夹"flower_data",点击链接下载花分类数据集https://storage.googleapis.com/download.tensorflow.org/exampl…...
STM32之Bootloader、USB、IAP/DFU下载
STM32 IAP应用开发——通过内置DFU实现USB升级(方式2) STM32 IAP应用开发——通过内置DFU实现USB升级(方式1) STM32程序下载4:通过STM32CubePro-USB下载 STM32程序下载3:通过STM32CubePro-UART下载 STM…...

解决 Element-ui中 表格(Table)使用 v-if 条件控制列显隐时数据展示错乱的问题
本文 Element-ui 版本 2.x 问题 在 el-table-column 上需根据不同 v-if 条件来控制列显隐时,就会出现列数据展示错乱的情况(要么 A 列的数据显示在 B 列上,或者后端返回有数据的但是显示的为空),如下所示。 <tem…...
Android JNI笔记
JNI、java native interface 。可以实现Java和C、C之间的调用。 在Android开发中是必须要掌握的内容。 在应用开发中,编写JNI代码的注册可分为动态注册和静态注册 动态注册: 声明好方法、注意这些签名 在JNI_OnLoad中进行注册。 static const JNINativ…...
Web开发中会话跟踪的隐藏表单字段(隐藏input)方法
隐藏表单字段是一种会话跟踪方法,通过在HTML表单中添加一个隐藏字段来存储会话标识符。 这样,每次用户提交表单时,会话标识符将与请求一起发送到服务器,以便服务器可以跟踪用户的会话状态。 以下是一个隐藏表单字段的示例&#…...
线性代数相关笔记
线性基 导入 线性基,顾名思义,就是一个包含数字最少的集合,使得原集合中的任何数都能用线性基中的元素表示。 集合中的元素满足一些性质: 原集合中的任意元素都可以用线性基中的若干元素的异或和表示线性基中任意数异或和不为…...
【SA8295P 源码分析 (四)】69 - Android 侧添加支持 busybox telnetd 服务
【SA8295P 源码分析】69 - Android 侧添加支持 busybox telnetd 服务 一、下载 busybox-1.36.1.tar.bz2 源码包二、编译 busybox 源码三、将编译后的 busybox 打包编入Android 镜像中系列文章汇总见:《【SA8295P 源码分析 (四)】网络模块 文章链接汇总 - 持续更新中》 本文链接…...

如何开发一个 Safari 插件
本文字数:2493字 预计阅读时间:15分钟 由于常用浏览器是Safari,而Safari浏览器的插件比不上Chrome,所以就有了自己开发常用的Safari插件的想法。 打算开发当前页面生成二维码的Extension,因为网络原因,AirD…...
n皇后问题,不用递归
注释如下: class Solution:def totalNQueens(self, n: int) -> int:if n < 1: # 如果 n 小于 1,直接返回 0return 0count 0 # 初始化解的个数为 0stack [(0, set(), set(), set())] # 初始化一个栈,元素为当前处理的行数、已经放…...

Verilog基础:$fopen和$fclose系统函数、任务的使用
相关阅读 Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm1001.2014.3001.5482 $fopen和$fclose是两个用于打开和关闭文件的系统函数、任务。最初,在Verilog-1995标准中,最多只能同时打开32个文件,其所使用的…...
python之字典的用法
python之字典的用法 Python中的字典是一种无序、可变、可迭代的数据类型,它由键值对组成,每个键都映射到一个值。字典在Python中被视为可变对象,这意味着我们可以随时更新、添加或删除字典中的键值对。 以下是一些关于Python字典的基本用法&a…...

Leetcode1971. 寻找图中是否存在路径
Every day a Leetcode 题目来源:1971. 寻找图中是否存在路径 解法1:并查集 并查集介绍:并查集详解 代码: /** lc appleetcode.cn id1971 langcpp** [1971] 寻找图中是否存在路径*/// lc codestart class UnionFind {vector&…...

程序可以创建多少个用户界面对象?
有人提到这样一个问题:”一个程序最多可以注册多少个窗口类?” 问题的答案不是一个具体的数字。因为大多数用户界面对象都来自一个共享的内存池,我们称之为”桌面堆内存”。尽管我们可以计算一个最大的理论值,但是在实际的场景中࿰…...
业绩不俗,毛利率下滑,股价接连下跌,片仔癀将向何处去?
撰稿|行星 来源|贝多财经 10月16日,中药龙头企业漳州片仔癀药业股份有限公司(600436.SH,下称“片仔癀”)发布截至9月30日的2023年前三季度业绩报告。发布财报后,片仔癀的股价多日下跌。 10月17日、18日、19日和20日…...
云安全—docker容器镜像检测
0x00 前言 docker镜像是属于整个云原生的重要基石之一,如果从镜像开始就没有安全性的话,那么整个云原生也就没有任何的安全性可言。所以镜像检测技术就成为了一个比较重要的点,本篇将通过研究docker镜像工具来整体分析风险以及应对方案。 市…...

JDBC相关记录
JDBC:Java DadaBase Connectivity 即Java语言连接数据库。 本质:JDBC是SUN公司制定的一套接口(interface)。 作用:不同的数据库有自己独特设计原理,JDBC的可以让Java程序员关注业务本身,而不需要…...

Nginx的基本介绍 安装 配置文件 日志
一、Nginx介绍二、nginx的优点三、多路复用1、I/O multiplexing 多并发 四、nginx内部技术架构五、安装NginxNginx部署-yum安装获取Nginx的yum源yum安装Nginx浏览器访问 编译安装Nginx安装编译环境安装依赖环境创建nginx用户安装nginx启动nginx实现nginx开机自启(脚…...

测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...

idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...

《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...

uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...