如何通过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(带有附加记录部分)?

python可以模拟dns劫持吗?

python实现dns查询

通过抓包获取跳转url并通过dnspython模块查询监控服务是否正常

如何利用dns漏洞入侵

DNS域名解析协议