Пример #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)
Пример #2
0
 def parseEDNS(self, edns, dns):
     args = {}
     m = re.search('version: (\d+),', edns)
     if m:
         args['version'] = int(m.group(1))
     m = re.search('flags:\s*(.*?);', edns)
     if m:
         args['flags'] = m.group(1)
     m = re.search('udp: (\d+)', edns)
     if m:
         args['udp_len'] = int(m.group(1))
     dns.add_ar(EDNS0(**args))
Пример #3
0
    p.add_argument("--dnssec",action='store_true',default=False,
                    help="Set DNSSEC (DO/AD) flags in query (default: false)")
    p.add_argument("--debug",action='store_true',default=False,
                    help="Drop into CLI after request (default: false)")
    p.add_argument("domain",metavar="<domain>",
                    help="Query domain")
    p.add_argument("qtype",metavar="<type>",default="A",nargs="?",
                    help="Query type (default: A)")
    args = p.parse_args()

    # Construct request
    try:
        q = DNSRecord(q=DNSQuestion(args.domain,getattr(QTYPE,args.qtype)))

        if args.dnssec:
            q.add_ar(EDNS0(flags="do",udp_len=4096))
            q.header.ad = 1

        address,_,port = args.server.partition(':')
        port = int(port or 53)

        if args.query:
            print(";; Sending%s:" % (" (TCP)" if args.tcp else ""))
            if args.hex:
                print(";; QUERY:",binascii.hexlify(q.pack()).decode())
            print(q)
            print()

        a_pkt = q.send(address,port,tcp=args.tcp)
        a = DNSRecord.parse(a_pkt)