加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

scapy---DNS报文格式解析

(2009-10-10 14:46:50)
标签:

dns

dns包结构

scapy

可变部分

报文

分类: Python
主要看DNS请求包,其实请求包和应答包格式是一样的,只是一些参数的取值不同而已
    先看一个截图,是当我访问一个新浪网的时候用wireshak抓的DNS请求包(点击图可放大看)
scapy---DNS报文格式解析

      一个DNS报文(不管是请求包还是应答包)可分为两大部分,不可变部分与可变部分(指长度是否可变)
     其中不可变部分有六个定常域,每个域长2个字节,也就是我们在上图中看到的:Transaction ID, Flags, Questions, Anwser RRS, Authority RRs, Additional RRs六个每个长度为2个字节。
     可变部分分为四个小部分:问题部分,回答部分,管理机构部分和附加信息部分,下面会讨论。
     下面结合scapy中的DNS类说明:(下面黑色部分为6个定长域,蓝色部分为可变域)
>>> ls(DNS)
id         : ShortField           = (0)   #Transaction ID,2字节标识,用于解释器匹配请求与响应
qr         : BitField             = (0)            *    ** **************************
opcode     : BitEnumField     = (0)      *       
aa         : BitField             = (0)          
tc         : BitField             = (0)            *     这里是2字节的Flags,具体到每一位下面会通过截图详细说
rd         : BitField             = (0)          
ra         : BitField             = (0)           
         : BitField             = (0)            
rcode      : BitEnumField         = (0)    ******************************
qdcount    : DNSRRCountField      = (None) #问题(域名解析询问)数上面例子是1
ancount    : DNSRRCountField      = (None) #回答数目:请求包此处为0,应该包看情况。
nscount    : DNSRRCountField      = (None)  #管理机构
arcount    : DNSRRCountField      = (None)  #附加信息
qd         : DNSQRField           = (None)         
an         : DNSRRField           = (None)
ns         : DNSRRField           = (None)
ar         : DNSRRField           = (None)         

   下面具体看看Flags中16bit标志字段的取值,通过截图看看(上图的部分):
scapy---DNS报文格式解析

qr:0表示查询报文,1表示响应报文
Opcode:通常值为0(标准查询),其他值为1(反向查询)和2(服务器状态请求)。
aa:表示授权回答(authoritative answer)
tc:表示可截断的(truncated)
rd:表示期望递归
ra:表示可用递归
z:    随后3bit必须为0(保留字段)
rcode:返回码,通常为0(没有差错)和3(名字差错)
   对于我们用scapy发DNS请求包的话,这个定长部分的六个双字节段,也就是前面列出的DNS类中黑色的参数,我们一般大部分采用默认值即可:可以看看默认时的情况:和我们实际截图值的不同地方:(其中右半图为我们第一个wireshark截图中的DNS报文部分,左半图为一个scapy默认参数取值时的各个参数情况)
scapy---DNS报文格式解析
    可见,定长部分中(也就是qd参数以上的参数,默认情况下,只要改变下问题数(qdcount),让其为1,或者根据情况定,然后ID可以改,任意数,两个字节内。其余的基本可以满足我们基本需求。
  
   下面我们主要看看可变域部分,这是我们要创建一个DNS包的重点,基本由我们来填写,也就是参数里面的  qd , an , ns, ar (问题部分,回答部分,管理机构部分和附加信息部分),下面我们分别来看

    首先看问题部分(qd)  ,它有三部分组成:
    qname
(询问域名,比如说www.sina.com),它由一个或者多个标示符序列组成。每个标示符已首字节数的计数值来说明该标示符长度,每个名字以0结束。计数字节数必须是0~63之间。该字段无需填充字节。
   qtype
(询问类型,表示希望得到什么类型的回答),通常设为A,表示是由域名获得该域名的IP地址,当然还有其他的类型,这里不作介绍。
   qclass(询问类),此处一般为IN,表示为Internet名字空间,别的类这里不作介绍。
   后面的 an(回答部分),ns(管理机构部分),ar(附加信息部分),这三部分作为DNS请求包来说一般是不用写的,为空。

     现简单写这么些吧,关键是自己抓包,自己看看。

  
  





0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有