Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import socket
- import struct
- import binascii
- import sys
- def readDomainName(dat, off, lvl_ptr = 0):
- got_ptr = False
- ret = ''
- while not got_ptr and ord(dat[off]):
- if ret: ret = ret + '.'
- isptr = struct.unpack('>H', dat[off:off+2])[0]
- if isptr >= 0xc000:
- got_ptr = True
- if lvl_ptr < 5: #avoid inf loops
- ret += readDomainName(dat, isptr & 0x3fff, lvl_ptr+1)[0]
- else: ret += '[depth err]'
- off += 2
- else:
- off2 = off + ord(dat[off]) + 1
- ret += dat[off + 1: off2]
- off = off2
- if not got_ptr and ord(dat[off]) == 0: off += 1 #skip /0
- return ret, off
- def getIPv4(dat, off):
- ip = struct.unpack('BBBB', dat[off:off+4])
- strip = '.'.join(str(i) for i in ip)
- return strip, off + 4
- DOMAIN = raw_input("Input domain name: ") #'www.google.com'
- REM_IP = raw_input("Input DNS server address [8.8.8.8]: ") or '8.8.8.8'
- REM_PORT = 53
- dmn_parts = DOMAIN.split('.')
- dmn_parts_len = ()
- values = (0x0123, 0x0100, 1, 0, 0, 0)
- for part in dmn_parts:
- values += (len(part), part,)
- dmn_parts_len += (len(part),)
- values += (0, 0x0001, 0x0001,)
- dmn_parts_fmt = ''.join(['B%ds' for i in xrange(len(dmn_parts_len))])
- s = struct.Struct(('>HHHHHH' + dmn_parts_fmt + 'BHH') % dmn_parts_len)
- MESSAGE = s.pack(*values)
- sock = socket.socket( socket.AF_INET, # Internet
- socket.SOCK_DGRAM) # UDP
- sock.sendto( MESSAGE, (REM_IP, REM_PORT) )
- ANSWER, addr = sock.recvfrom( 1024 ) # buffer size is 1024 bytes
- h = struct.unpack('>HHHHHH', ANSWER[0:12])
- que_n = h[2]
- ans_n = h[3]
- aut_n = h[4]
- add_n = h[5]
- print "DNS server:", REM_IP + ":" + str(REM_PORT)
- print "Query (UDP):", binascii.hexlify(MESSAGE)
- print "Answer from", addr[0] + ":" + str(addr[1]) + ":", binascii.hexlify(ANSWER)
- print
- print "Transaction ID:", hex(h[0])
- print "Flags:", hex(h[1])
- print "Questions:", que_n
- print "Answer RRs:", ans_n
- print "Authority RRs:", aut_n
- print "Additional RRs:", add_n
- print
- #Queries
- pos = 12
- for i in xrange(que_n):
- name, pos = readDomainName(ANSWER, pos)
- print i + 1, "Query for:", name
- pos += 2 + 2
- print
- #Answers
- for i in xrange(ans_n):
- name, pos = readDomainName(ANSWER, pos)
- if name:
- answ = ''
- type = struct.unpack('>H', ANSWER[pos:pos+2])[0]
- pos += 2 + 2 + 4 + 2
- if type == 0x0001: #A record
- answ, pos = getIPv4(ANSWER, pos)
- elif type == 0x0005: #CNAME
- answ, pos = readDomainName(ANSWER, pos)
- if answ:
- print i + 1, "Answer for", name, "is", answ
- else:
- print i + 1, "Corrupted answer for", name
- break
- else:
- print i + 1, "Corrupted answer"
- break
Advertisement
Add Comment
Please, Sign In to add comment