#!/usr/bin/env python # Threads is modified from: # Tutorial on Threads Programming with Python by Norman Matloff & Francis Hsu import sys, threading, socket, re, getopt, time, os class scanner(threading.Thread): tlist = [] maxthreads = 50 timeout = 3 evnt = threading.Event() lck = threading.Lock() def __init__(self,port,host): threading.Thread.__init__(self) self.port = port self.host = host def run(self): logfile = open("tcpscan6.log","a"); s = socket.socket(socket.AF_INET6,socket.SOCK_STREAM,0) s.settimeout(scanner.timeout) try: s.connect((self.host, self.port)) print "[OPEN] "+self.host+" on "+str(self.port)+"/tcp" record = "[OPEN] "+self.host+" on "+str(self.port)+"/tcp\n" logfile.write(record) s.close() except: print "[CLOSE] "+self.host+" on "+str(self.port)+"/tcp" logfile.close() scanner.lck.acquire() scanner.tlist.remove(self) if len(scanner.tlist) == scanner.maxthreads-1: scanner.evnt.set() scanner.evnt.clear() scanner.lck.release() def newthread(pn,hst): scanner.lck.acquire() sc = scanner(pn,hst) scanner.tlist.append(sc) scanner.lck.release() sc.start() newthread = staticmethod(newthread) def isvalid6(dst): igot = None igot = re.search(":",dst) if igot is None: print dst+" is not IPv6 address" sys.exit() def usage(): print """ TCP IPv6 Scanner Usage : [--help|h] - This help [--target|-t] - Target single IPv6 address [--in-file|-i] - Target list of IPv6 address in file [--port|-p] - Target port. Multiple ports separated by comma [--range|-r] - Target range port. Ex : 100-200 """ def main(argv): victim = None file = None mports = None rports = None os.unlink("tcpscan6.log") try: opts, args = getopt.getopt(argv, "ht:i:p:r:", ["help","target=","in-file=","port=","range="]) except: usage() sys.exit() if len(opts) == 0: usage() sys.exit() for o, a in opts: if o in ("-h","--help"): usage() sys.exit() elif o in ("-t","--target"): victim = str(a) elif o in ("-i","--in-file"): file = str(a) elif o in ("-p","--port"): mports = str(a) elif o in ("-r","--range"): rports = str(a) else: assert False, "unhandled option" if victim and file: print "ERR! -t/--target can not be used with -i/--in-file! " sys.exit() if mports and rports: print "ERR! -p/--port can not be used with -r/--range! " sys.exit() if victim is not None: isvalid6(victim) if mports is not None: n=0 print time.ctime() allports = mports.split(',') for port in allports: scanner.lck.acquire() if len(scanner.tlist) >= scanner.maxthreads: scanner.lck.release() scanner.evnt.wait() else: scanner.lck.release() scanner.newthread(int(port),victim) n+=1 for sc in scanner.tlist: sc.join() print "Finish scanning "+str(n)+" ports in single host" print time.ctime() sys.exit() if rports is not None: n=0 print time.ctime() allports = rports.split('-') for port in range(int(allports[0]),int(allports[1])): scanner.lck.acquire() if len(scanner.tlist) >= scanner.maxthreads: scanner.lck.release() scanner.evnt.wait() else: scanner.lck.release() scanner.newthread(int(port),victim) n+=1 for sc in scanner.tlist: sc.join() print "Finish scanning "+str(n)+" ports in single host" print time.ctime() sys.exit() if file is not None: f = open(file,"r") n = 0 x = 0 print time.ctime() for dest in f: if mports is not None: allports = mports.split(',') for port in allports: scanner.lck.acquire() if len(scanner.tlist) >= scanner.maxthreads: scanner.lck.release() scanner.evnt.wait() else: scanner.lck.release() scanner.newthread(int(port),dest.rstrip()) n+=1 for sc in scanner.tlist: sc.join() if rports is not None: allports = rports.split('-') for port in range(int(allports[0]),int(allports[1])): scanner.lck.acquire() if len(scanner.tlist) >= scanner.maxthreads: scanner.lck.release() scanner.evnt.wait() else: scanner.lck.release() scanner.newthread(int(port),dest.rstrip()) n+=1 for sc in scanner.tlist: sc.join() x+=1 print "Finish scanning "+str(n)+" ports in "+str(x)+" hosts" print time.ctime() if __name__ == "__main__": main(sys.argv[1:])