【scapy】进行DNS协议测试

http://www.cnblogs.com/xiaowuyi/p/3333276.html

一、进行dns访问

参数参考rfc http://www.ietf.org/rfc/rfc1035.txt

>>> default_dstIp="10.235.160.73"
>>> default_dstPort=5333
>>> default_srcProt=10000
>>> default_url="img01.xxxxcdn.com.danuoyi.com"
>>> ans=sr1(IP(dst=default_dstIp)/UDP(dport=default_dstPort)/DNS(qd=DNSQR(qname=default_url, qtype=1)), verbose=0)
>>> result = ans[DNS].show()
###[ DNS ]###
  id        = 0
  qr        = 0L
  opcode    = QUERY
  aa        = 0L
  tc        = 0L
  rd        = 0L
  ra        = 0L
  z         = 0L
  rcode     = ok
  qdcount   = 1
  ancount   = 0
  nscount   = 0
  arcount   = 0
  \qd        \
   |###[ DNS Question Record ]###
   |  qname     = 'img01.taobaocdn.com.danuoyi.tbcache.com.'
   |  qtype     = A
   |  qclass    = IN
  an        = None
  ns        = None
  ar        = None
>>> ans[DNS].command()
"DNS(aa=0L, qr=0L, an=None, nscount=0, qdcount=1, ns=None, tc=0L, rd=0L, arcount=0, ar=None, opcode=0L, ra=0L, z=0L, rcode=0L, id=0, ancount=0, qd=DNSQR(qclass=1, qtype=1, qname='img01.taobaocdn.com.danuoyi.tbcache.com.'))"

二、对相应结果的解析:

对于command返回的元素,本打算逐个元素解析,但因为格式是raw的,对ns对象解析的时候出现乱码;

一开始可能会解析出乱码的执行函数

 def exec_test(func):
    #print "Start %s case..."%func
    #print "Start to query DNS.....\n---Pharos address:%s\n---Client address:%s"%(dst,qname)
    resp = eval(func)
#     try:
#         an = eval(resp).an
#         qd = eval(resp).qd
#         rtjson = ""
#         anjson = ""
#         qdjson = ""
#         dnsjson = ""
#         if an<>None:
#             for key in vars(an)['fields']:
#                 anjson = ",".join([anjson,"%s:%s"%(key,getattr(an, str(key)))])
#
#         if qd<>None:
#             for key in vars(qd)['fields']:
#                 qdjson = ",".join([qdjson,"%s:%s"%(key,getattr(qd, str(key)))])
#
#         dns = eval(resp)
#         for key in vars(dns)['fields']:
#             if key not in ('an','qd'):
#                 dnsjson = ",".join([dnsjson,"%s:%s"%(key,getattr(dns, str(key)))])
#
#         rtjson ='{"DNSRR":{%s},"DNSQR":{%s}%s}'%(anjson.lstrip(","),qdjson.lstrip(","), dnsjson)
#         print rtjson
#
#     except:
#         print sys.exc_info()


后改称通过索引得到key对应的value

def getvaluebyName(org, name):
    index=org.index(name)
    index2=org.index(',', index)
    result = org[(index+len(name)+1):index2]
    if result[0] == "\'":
        result=result[1:len(result)-1]

    return result

result = ans[DNS].command() 
rdata = getvaluebyName(result, "rdata")



你可能感兴趣的:(【scapy】进行DNS协议测试)