def new_test(domain,qtype,address="8.8.8.8",port=53,nodig=False,dnssec=False): tcp = False q = DNSRecord.question(domain,qtype) if dnssec: q.add_ar(EDNS0(flags="do",udp_len=4096)) q.header.ad = 1 a_pkt = q.send(address,port) a = DNSRecord.parse(a_pkt) if a.header.tc: tcp = True a_pkt = q.send(address,port,tcp) a = DNSRecord.parse(a_pkt) if not nodig: if dnssec: dig = getoutput("dig +qr +dnssec -p %d %s %s @%s" % ( port, domain, qtype, address)) else: dig = getoutput("dig +qr +noedns +noadflag -p %d %s %s @%s" % ( port, domain, qtype, address)) dig_reply = list(iter(DigParser(dig))) # DiG might have retried in TCP mode so get last q/a q_dig = dig_reply[-2] a_dig = dig_reply[-1] if q != q_dig or a != a_dig: if q != q_dig: print(";;; ERROR: Diff Question differs") for (d1,d2) in q.diff(q_dig): if d1: print(";; - %s" % d1) if d2: print(";; + %s" % d2) if a != a_dig: print(";;; ERROR: Diff Response differs") for (d1,d2) in a.diff(a_dig): if d1: print(";; - %s" % d1) if d2: print(";; + %s" % d2) return if dnssec: fname = "%s-%s-dnssec" % (domain,qtype) else: fname = "%s-%s" % (domain,qtype) print("Writing test file: %s" % (fname)) with open(fname,"w") as f: print(";; Sending:",file=f) print(";; QUERY:",binascii.hexlify(q.pack()).decode(),file=f) print(q,file=f) print(file=f) print(";; Got answer:",file=f) print(";; RESPONSE:",binascii.hexlify(a_pkt).decode(),file=f) print(a,file=f) print(file=f)
def resolveDNS(query, server, port, type="A"): allowedTypes = ("A", "AAAA", "PTR") if type not in allowedTypes: raise ValueError ipv6Server = False if isinstance(ip_address(server), IPv6Address): ipv6Server = True q = DNSRecord.question(query, type) answer_paquet = q.send(server, port, tcp=False, ipv6=ipv6Server) a = DNSRecord.parse(answer_paquet) return [str(a.rr[i].rdata) for i in range(len(a.rr))]
def dns_request(domain, qtype, address, port): """ Simple DNS Client - may be used to testing responses from DNS server. Results are displayed in the console domain - domain to resolve qtype - DNS record type address - DNS server address port - DNS server port """ request = DNSRecord.question(domain, qtype) paket = request.send(address, port) answer = DNSRecord.parse(paket) return answer
def new_test(domain,qtype,address="8.8.8.8",port=53,nodig=False): tcp = False q = DNSRecord.question(domain,qtype) a_pkt = q.send(address,port) a = DNSRecord.parse(a_pkt) if a.header.tc: tcp = True a_pkt = q.send(address,port,tcp) a = DNSRecord.parse(a_pkt) if not nodig: dig = getoutput("dig +qr -p %d %s %s @%s" % ( port, domain, qtype, address)) dig_reply = list(iter(DigParser(dig))) # DiG might have retried in TCP mode so get last q/a q_dig = dig_reply[-2] a_dig = dig_reply[-1] if q != q_dig or a != a_dig: if q != q_dig: print(";;; ERROR: Diff Question differs") for (d1,d2) in q.diff(q_dig): if d1: print(";; - %s" % d1) if d2: print(";; + %s" % d2) if a != a_dig: print(";;; ERROR: Diff Response differs") for (d1,d2) in a.diff(a_dig): if d1: print(";; - %s" % d1) if d2: print(";; + %s" % d2) return print("Writing test file: %s-%s" % (domain,qtype)) with open("%s-%s" % (domain,qtype),"w") as f: print(";; Sending:",file=f) print(";; QUERY:",binascii.hexlify(q.pack()).decode(),file=f) print(q,file=f) print(file=f) print(";; Got answer:",file=f) print(";; RESPONSE:",binascii.hexlify(a_pkt).decode(),file=f) print(a,file=f) print(file=f)
reply = request.reply() reply.add_answer(*RR.fromZone(f"{domain_query} 60 A {ip_address}")) return reply resolver = BasicResolver() logger = DNSLogger(prefix=False) server = DNSServer(resolver, port=PORT, address=DNS_SERVER_IP_ADDRESS, logger=logger) server.start_thread() # Testing if TEST: print("Testing connection...") q = DNSRecord.question("www.bank.com") print("Sending request to server...\n") a = q.send(DNS_SERVER_IP_ADDRESS, PORT) print("\n\nParsing reply from server...\n") print(DNSRecord.parse(a)) time.sleep(2) print("Test done...") time.sleep(1) print("\n" * 20) print(f"Hosting server at {DNS_SERVER_IP_ADDRESS}:{PORT}") print("Ctrl-C to stop server...") while True: pass