Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #this program will parse alexas top 1 million domains for responses larger than 500 bytes. it tests every type of query available on 10 of the fastest dns servers on the planet.
- #enjoy. FUCK RFC 8482 !!!
- #coded by Freak @ Kek Security
- #pip2 install dnslib
- #updated at 1.12.2021 added multithreading for faster list generation
- import socket,os,random,select,time,threading
- from dnslib import DNSRecord
- #qtypes = {'a': '\x01', 'txt' : '\x10', 'cname' : '\x05', 'ns' : '\x02', 'mx', '\x0f', 'ptr' : '\x0c', 'any' : '\xff', 'axfr' : '\xfc', 'soa' : '\x06', 'HINFO' : '\r'}
- def make_dns_query_domain(domain):
- def f(s):
- return chr(len(s)) + s
- parts = domain.split('.')
- parts = list(map(f, parts))
- return ''.join(parts)
- def make_dns_request_data(dns_query, qtype):
- req = os.urandom(2) + "\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00"
- req += dns_query
- req += '\x00\x00' + qtype + '\x00\x01'
- return req
- if raw_input("Download domain list? (y/n): ").lower().startswith("y"):
- os.popen("wget -q http://s3.amazonaws.com/alexa-static/top-1m.csv.zip;unzip top-1m.csv.zip; awk -F ',' '{print $2}' top-1m.csv>top1m.txt")
- domains=open("top1m.txt","r").read().replace("\r", "").split("\n")
- servers=["1.1.1.1", "1.0.0.1", "8.8.8.8", "8.8.4.4", "8.26.56.26", "8.20.247.20", "9.9.9.9", "149.112.112.112", "64.6.64.6", "64.6.65.6"]
- responses=[]
- global running
- running = 0
- def stringproc(s):
- ch = (ord(c) for c in s)
- return ''.join(('\\x%02x' % c) if c <= 255 else ('\\u%04x' % c) for c in ch)
- fh=open("queries.txt","w")
- def getdata(qname,fh):
- global running
- running += 1
- for qtype in ['\x01', '\x10', '\x05','\x02', '\x0f', '\x0c', '\xff', '\xfc', '\x06','\r']:
- try:
- forward_addr = (random.choice(servers), 53) # dns and port
- client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
- client.setblocking(0)
- dnspkt=make_dns_request_data(make_dns_query_domain(qname), qtype)
- client.sendto(dnspkt, forward_addr)
- ready = select.select([client], [], [], 0.3)
- if ready[0]:
- data, _ = client.recvfrom(1024*1024*1024)
- if len(data) > 500:
- print DNSRecord.parse(dnspkt)
- print DNSRecord.parse(data)
- print "Response size: " + str(len(data))
- # responses.append([len(data),qname,qtype])
- fh.write("['"+stringproc(qtype)+"','"+qname+"'],") #add size here if you'd like
- fh.flush()
- except:
- pass
- running -= 1
- for qname in domains:
- try:
- while running >= 512:
- time.sleep(0.4)
- threading.Thread(target=getdata,args=(qname,fh,)).start()
- except KeyboardInterrupt:
- os.kill(os.getpid(),9)
Add Comment
Please, Sign In to add comment