#!/usr/bin/env python #Basic Threaded DNS Filter #by K-Metal import sys import os import time import socket import threading # Check args if len(sys.argv) < 4: print "Usage: " sys.exit() RUNNING = True ''' Customize ''' THREADS = 20 TIMEOUT = 0.05 #secs PORT = 53 BUFFER = 65500 # [root] dns recursive payload payload = "\x23\x61\x01\x20\x00\x01\x00\x00\x00\x00\x00\x01\x03\x31\x78\x31\x02\x63\x7a\x00\x00\xff\x00\x01\x00\x00\x29\x10\x00\x00\x00\x00\x00\x00\x00" #payload = "\xc4\x75\x01\x00\x00\x01\x00\x00\x00\x00\x00\x01\x00\x00\xff\x00\x01\x00\x00\x29\x23\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" # split input list into thread chunks def chunklist(l, n): parts = len(l) / n for i in xrange(0, len(l), parts): yield l[i:i+parts] with open(sys.argv[1],'r') as f: data = f.read().splitlines() SIZE = len(data) CHUNKS = list(chunklist( data, THREADS )) print len(CHUNKS) output = open( sys.argv[2], 'w' ) ### Logger thread ### logs = [] def log(msg): global logs logs.append( msg ) def logger_thread(): global logs, output while True: time.sleep(0.1) if logs != []: log_data = str(logs.pop(-1)) print log_data output.write( log_data.split()[0]+'\n' ) # Scan dns list # def scanner(scan_list): global payload, TIMEOUT, PORT, RUNNING sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) sock.settimeout( TIMEOUT ) pkt_size = len(payload) + 28 #udp pkt hdr min size for ip in scan_list: try: ip = str(socket.gethostbyname(ip)) if RUNNING: sock.sendto( payload, (ip, PORT)) else: break try: recvdata, addr = sock.recvfrom( BUFFER ) ip_addr = str(addr[0]) if len(recvdata) > int(sys.argv[3]): #sucess amp = len(recvdata) / pkt_size*1.0 amp = round( amp, 2 ) log( "{} {} [x{}]".format(ip_addr,len(recvdata),amp) ) except: pass except: pass ## Create threads ### def create_thread(function, *args): thread = threading.Thread(target=function,args=args) thread.daemon = True thread.start() return thread if __name__ == '__main__': # create logging thread create_thread(logger_thread) print "Started Scanning "+str(SIZE)+" targets" # create threads thread_list = [] for t in CHUNKS: thread = create_thread( scanner, t ) thread_list.append( thread ) # wait for threads to end print "ThreadCount: " + str(threading.active_count()) for t in thread_list: try: t.join() except KeyboardInterrupt: RUNNING = False break output.close() if 'nt' not in os.name: # for unix systems os.system("chmod 0777 "+str(sys.argv[2])) sys.exit()