如何通过Python构造一个DNS查询包
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何通过Python构造一个DNS查询包相关的知识,希望对你有一定的参考价值。
可以尝试以下步骤:ping一个域名,用wireshark抓一个DNS的query,看看各个字段分别是什么值;
用python的struct将这些字段按顺序pack成二进制数据;
用python的socket将构造好的数据发到DNS服务器UDP的53号端口,本地端口可以自行指定;
用python的socket从buffer中读取server返回的数据;
用python的struct将二进制数据中各个字段按顺序unpack回来;
打印显示。
按照这个方法,同样可以写一个简单的DNS服务器,希望能有所帮助。
再具体点,可以参照The TCP/IP Guide 中的DNS message format来构造query的各个字段:
Header部分
Identifier:16位的int,就是0-65535,可以用随机数产生。
Flags:0x0100,其中:
#0... .... .... .... = Query/Response
Flag: query=0
#.000 0... .... .... = Opcode: standard query=0
#.... .0.. .... .... = Authoritative
Answer Flag
#.... ..0. .... .... = Truncated: not truncated=0
#.... ...1 .... .... = Recursion desired: recursively=1,如果想 iteratively就置1
#.... .... 0... .... = Recursion Available: response的东西,=0
#.... .... .000 .... = Zero: 保留字段,=0
#.... .... .... 0000 = Response Code:=0
3.Question Count:16位的int,=0x0001
4.Answer Record Count:16位的int,=0x0000
5.Authority
Record Count:16位的int,=0x0000
6.Additional Record Count:16位的int,=0x0000
Question部分
QName:直接把域名打包进去;
QType:16位的int,我们要得到的是主机名,所以=0x0001,
QClass:16位的int,=0x0001 参考技术A Dragonfly 是一个用 Python 开发的语音识别框架。提供高级对象模型,可编写简单脚本来实现语音的识别。当前支持语音识别引擎有:Dragon NaturallySpeaking (DNS), a product of Nuance, Window Speech Recognition (WSR), as included in Microsoft Windows Vista.
通过抓包获取跳转url并通过dnspython模块查询监控服务是否正常
最近看到网上有一个例子,是用于通过DNS轮询来查看同个DNS下,多个ip对应服务页面监控的脚本,自己在试验过程中,发现访问有些网站会出现conn.getresponse()为空的情况,通过conn.getresponse().status、conn.getresponse().reason得出是303 SEE OTHER,这种情况不能做出服务是否正常的判断,所以通过wireshark抓包来查看返回200 OK上面一个包,然后通过分析包,加到headers进行访问。具体过程如下:
1、打开wireshark,启动网卡,在浏览器进行网页访问,过滤掉没用的包
http and ip.addr==服务端地址 and tcp.port == 80
2、选中右击相应的包,选择Follow TCP stream,得到类似如下的过程
....................GET / HTTP/1.1 Host: 主机DNS Connection: keep-alive Cache-Control: max-age=0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36 Accept-Encoding: gzip, deflate, sdch Accept-Language: zh-CN,zh;q=0.8,en;q=0.6 Cookie: 对应的cookie HTTP/1.1 200 OK Date: Fri, 25 Mar 2016 03:27:55 GMT 以下省略......
3、用以下代码进行访问测试
def checkip(ip): url=ip+":80" #端口ip依据实际而定 getcontent="" httplib.socket.setdefaulttimeout(5) conn = httplib.HTTPConnection(url) try: conn.request("GET","/",headers={"Host":"主机DNS","Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/w ebp,*/*;q=0.8","Connection":"keep-alive","Cookie":"对应的cookie"}) r = conn.getresponse() getcontent = r.read(15) print getcontent finally: if getcontent=="<!DOCTYPE html>": #一般已经定义好 print ip+" [OK]" else: print ip+" [ERROR]"
最后运行输出结果如下:
主机ip [OK]
本文出自 “随笔记” 博客,请务必保留此出处http://yaonet.blog.51cto.com/5933544/1755154
以上是关于如何通过Python构造一个DNS查询包的主要内容,如果未能解决你的问题,请参考以下文章
如何在 dns-python 中进行 dns 查询作为 dig(带有附加记录部分)?