当前位置: 首页 > news >正文

wireshark抓取dns_利用Scapy打造简单的DNS监测脚本

简介

因为最近工作中有个需求是需要记录终端的dns请求,并进行对比和记录,这里研究了一下,使用python写了一个简单的本机dns请求的监控脚本。脚本设置后可以监控本机对特定域名的请求记录,以及记录这些dns请求的响应内容。用到了python一个看起来应用可以很广的(据我搜索的结果,可以使用这个模块进行本机的, 好像并没有什么明显的意义, DNS欺骗)模块——scapy。本文只使用了这个模块的一小部分功能。

Scapy

Scapy是python一个非常强大的应用框架,可以非常方便的实现数据包的发送,嗅探,拆解和伪造(原文是forge,想了好几个词,不太确定要用生成和捏造...orz好像更奇怪了)数据包,可以用于编写对网络探测,扫描和攻击的工具。官方的介绍文档在这里:

https:// scapy.readthedocs.io/en /latest/ --scapy official documentation

我在自己的python 3.7环境下使用pip安装了scapy[basic]

pip install --pre scapy[basic]

这里因为时间比较赶,直接使用了官方的推荐安装方式(这种做法以后还是少一点好),之后就可以愉快的使用命令行中的wireshark了。另外需要注意的是,我使用的是win10系统,并且安装了npcap,所以其他版本的捕包软件不一定能和脚本兼容,所以运行前一定先检查scpay能在当前环境下抓取到什么格式的报文,如果报文格式不对,脚本运行不会出结果或直接报错,请知悉。

开始干活!

开始之前有几点需要注意的,scapy会使用wincap捕捉数据包,所以开始前确保电脑是安装了winpcap或npcap的,不然嗅探是无法正常工作的。另外先了解一下TCP/IP四层模型中的DNS协议报文。 我在下面直接贴了一个:

v2-b1a7c330721615b7359ad2b516a24c9a_b.jpg

这个报文是直接使用sniff(filter='udp and port 53', prn=lambda x:x.summary)模块抓取下来的,我对长报文进行了重新排版(狠狠夸一波VScode,相见恨晚),你可以看出这个报文遵循了TCP/IP的四层模型,对应如下:

Ether部分 -- 对应网络接口层
IP部分 -- 对应网络层
UDP部分 -- 对应传输层
DNS部分 -- 对应应用层

从报文的实际内容也可以看出,上面是query,下面是收到的response,即客户机向1.1.1.1这个dns服务器请求http://bing.com的地址,1.1.1.1则回复了两个可用的IP,204开头的和13开头的。下面是实际nslookup的回复内容:

v2-0f301bde1aa6a52d2e5b207c91c23586_b.jpg

上面的dns报文只是使用过滤器简单过滤了可能的dns报文后进行的简单展示,我们后面会展示代码对DNS请求和DNS应答进行进一步过滤。

代码部分

参考了一些其他脚本后写的,使用VScode 预运行的时候提示有很多import了但未使用的组件,估计还有优化空间。(优化和前面的几篇文章说的一样,是以后的事orz..)

# -*- coding:utf8 -*-
from scapy.all import *
from scapy.layers.dns import DNSRR, DNSQR
import time


def dns_sniff(pkt):
    if DNSQR in pkt and pkt.dport == 53:
        if 'bing.com' in str(pkt[DNSQR].qname):
            print(time.strftime("%H:%M:%S",time.localtime()))
            print("Host is requesting for url: %s from %s" %(
                pkt[DNSQR].qname[:-1], pkt[IP].dst))
    elif DNSRR in pkt and pkt.sport == 53:
            if 'bing.com' in str(pkt[DNSRR].rrname):
                for i in range(pkt[DNS].ancount):
                    dnsrr = pkt[DNS].an[i]
                    print("Server offers: %s is in %s" %(
                        dnsrr.rrname[:-1], dnsrr.rdata))

def main():
    sniff(filter="udp and port 53", prn=dns_sniff)
if __name__ == "__main__":
    main()

这里实现的主要是监控并过滤出对http://bing.com的DNS请求。代码部分请结合sniff得到的较原始的报文内容进行查阅,如果有对报文其他部分内容的摘出需求,可以结合报文去修改脚本以实现更自主化的应用。

运行后,我们再在客户机上访问目标地址或直接使用nslookup发送DNS请求,你就可用看到输出的内容了:

v2-7e5416505c27b65f27de12c919f51331_b.png

实际上脚本可以使用python对字符串的操作把域名附近的b'**'内容去掉,不过这是美观的需求了,这个脚本实际上已经可以满足我的需求了,为了方便记录我还加上了时间戳,为了记录DNS请求发生的时间。

后面可以继续使用探测到的结果进行其他的操作,这里就不一一说明了。另外发现nslookup进行DNS请求的时候实际上会进行两次,一次是ipv4的请求,另一次是ipv6的请求,暂时没有对这个现象进行深入的研究,应该是nslookup会默认针对ipv4和ipv6进行两次请求,因为sniff给出的报文在Ether部分有type字段,估计不能在一个请求中同时包含两种地址的type。

参考链接

https:// stackoverflow.com/quest ions/25092538/scapy-dns-sniff-with-additional-records --参考了帖子中对报文解析的思路 https:// blog.csdn.net/nixawk/ar ticle/details/45933299 --参考了sniff的用法

相关文章:

  • flash动画在新媒体中的应用_2020年宁德市新媒体新技术创新应用课堂教学研讨活动(高中组)在宁德市高级中学举行(二)...
  • python语言流程控制语句的格式_慢步学python,编程基础知识,流程控制语句if
  • 输变电设备物联网传感器数据通信规约_物联网大潮来袭,无线通讯模块如何连接未来?...
  • python怎么爬取app数据_python高级教程 爬虫抓取App数据
  • python中loop函数_为何GAMLOOP中函数输出的Python Scopage不计算?
  • springboot 源码_SpringBoot是如何实现自动配置的? SpringBoot源码(四)
  • etw系统provider事件较多_使用Spring Gateway和KeyCloak构建一个OIDC认证系统
  • @data注解_一枚 架构师 也不会用的Lombok注解,相见恨晚
  • java中int和integer的区别_Java中关于强、软、弱、虚引用的区别
  • android 投屏_[Android] 虫洞手机投屏电脑(支持键盘映射和传声音)
  • 云丁智能锁说明书_真硬核!行业爆发前夜,这把锁登上航母
  • python调用node_node-python:在nodejs中调用python代码
  • python多线程读取文件内容_python多线程读取logcat内容,导致其他线程阻塞
  • python闭包满足的三个条件_Python中的闭包
  • javascript等待异步线程完成_程序员修神之路--问世间异步为何物?
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • C++类的相互关联
  • conda常用的命令
  • js递归,无限分级树形折叠菜单
  • Laravel Mix运行时关于es2015报错解决方案
  • Mocha测试初探
  • Node + FFmpeg 实现Canvas动画导出视频
  • node.js
  • Vue2 SSR 的优化之旅
  • 基于 Babel 的 npm 包最小化设置
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 系统认识JavaScript正则表达式
  • 应用生命周期终极 DevOps 工具包
  • 用Python写一份独特的元宵节祝福
  • 正则表达式
  • hi-nginx-1.3.4编译安装
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • 国内开源镜像站点
  • ​HTTP与HTTPS:网络通信的安全卫士
  • ​你们这样子,耽误我的工作进度怎么办?
  • ​如何防止网络攻击?
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • (2022 CVPR) Unbiased Teacher v2
  • (31)对象的克隆
  • (5)STL算法之复制
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (分享)自己整理的一些简单awk实用语句
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET Core 和 .NET Framework 中的 MEF2
  • .NET Core 中插件式开发实现
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .net解析传过来的xml_DOM4J解析XML文件
  • .NET开源的一个小而快并且功能强大的 Windows 动态桌面软件 - DreamScene2
  • .NET中使用Redis (二)