Beispiel #1
0
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))]
Beispiel #3
0
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
Beispiel #4
0
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)
Beispiel #5
0
        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