def main(): log = logging.getLogger(__name__) log.setLevel(logging.INFO) options, args = getargs() ipranges = ip4range(*args) port = options.port if options.filename: fn = options.filename else: fn = str(random.randrange(1000, 9999)) + '.xml' s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) s.settimeout(5) t = tftp() start_time = datetime.datetime.now() finito = False data = t.makerrq(fn) while 1: r, w, e = select.select([s], [], [], 0.1) if len(r) > 0: for s in r: try: recv = s.recvfrom(1024) except socket.error, e: print e continue buff = recv[0] ipaddr = recv[1] try: response = tftpstruct.parse(buff) except Exception, e: print e log.info("IP: %s:%s responded: %s" % (ipaddr[0], ipaddr[1], response))
def main(): log = logging.getLogger(__name__) log.setLevel(logging.INFO) options,args = getargs() ipranges = ip4range(*args) port = options.port if options.filename: fn = options.filename else: fn = str(random.randrange(1000,9999)) + '.xml' s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) s.settimeout(5) t = tftp() start_time = datetime.datetime.now() finito = False data = t.makerrq(fn) while 1: r,w,e = select.select([s],[],[],0.1) if len(r) > 0: for s in r: try: recv = s.recvfrom(1024) except socket.error,e: print e continue buff = recv[0] ipaddr = recv[1] try: response = tftpstruct.parse(buff) except Exception,e: print e log.info("IP: %s:%s responded: %s" % (ipaddr[0],ipaddr[1],response))
def main(): log = logging.getLogger(__name__) log.setLevel(logging.INFO) options,args = getargs() log.setLevel(calcloglevel(options)) if options.listtemplates: print "Templates available:" print "\r\n".join(listtemplates()) sys.exit() if len(args) != 1: parser.error("Please pass just one destination tftp server name") if options.debug: log.setLevel(logging.DEBUG) debughandler = logging.handlers.WatchedFileHandler('debug.log') log.addHandler(debughandler) dst = (args[0],int(options.port)) s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.settimeout(5) mydirtysocks = mylist(limit=100) mydirtysocks.append(s) t = tftp() if options.range: ranges = getRange(options.range,rangetype=options.rangetype) fntemplate = getfntemplate(options.fntemplate) try: fntemplate % 100 except TypeError: log.critical('The template specified is not a valid one or not found') return filelist = gen_range(fntemplate, ranges) filelist2 = gen_range(fntemplate, ranges) else: filelist = gen_tftpfilelist(options.filenamesfile) filelist2 = gen_tftpfilelist(options.filenamesfile) dumpfiles = dict() ackbucket = list() sportmap = dict() start_time = datetime.datetime.now() cleansocks = list() finito = False lastrecv = time() maxlastrecv = 5 if not os.path.exists(options.dstdir): os.mkdir(options.dstdir) if not options.quiet: widgets = ['Test: ', progressbar.Percentage(), ' ', progressbar.Bar(marker=progressbar.RotatingMarker()), ' ', progressbar.ETA(), ' '] filelistlen = 0 for _tmp in filelist2: filelistlen += 1 fnno = 0 pbar = progressbar.ProgressBar(widgets=widgets, maxval=filelistlen).start() while 1: socklists = list() socklists.extend(mydirtysocks.list) socklists.extend(cleansocks) r,w,e = select.select(socklists,[],[],0.1) if len(r) > 0: for s in r: recv = s.recvfrom(1024) log.debug('Recv: %s' % `recv`) lastrecv = time() buff = recv[0] ipaddr = recv[1] try: response = tftpstruct.parse(buff) except lib.contrib.construct.core.RangeError: response = None if response is None: log.warn('Error parsing response') continue if response.operation == 'ERROR': if (response.data.errorcode == 'FileNotFound' or response.data.ErrMsg == 'No such file or directory'): pass else: log.debug(str(response)) log.warn( "Time for a siesta.. I think the tftp can't keep up") sleep(2) elif response.operation == 'DATA': addresses = (ipaddr,s.getsockname()) if addresses not in dumpfiles: dumpfiles[addresses] = dict() dumpfiles[addresses][response.data.block] = response.data.data if s in mydirtysocks.list: mydirtysocks.list.remove(s) cleansocks.append(s) ackbucket.append([response.data.block,ipaddr,s]) else: if time() - lastrecv > maxlastrecv: finito = True if len(ackbucket) > 0: block,datadst,s = ackbucket.pop(-1) data = t.makeack(block) s.sendto(data,datadst) elif finito: break if not finito: try: fn = filelist.next() if not options.quiet: fnno += 1 pbar.update(fnno) except StopIteration: finito = True continue data = t.makerrq(fn) log.debug('asking for %s' % fn) s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.settimeout(5) log.debug('sending %s' % `data`) s.sendto(data,dst) mydirtysocks.append(s) saddr,sport = s.getsockname() sportmap[sport] = fn if random.randrange(84) == 42: dumpfiles,files = dumpnassemble(dumpfiles,sportmap,options.dstdir,partialdump=False) for fn in files: log.info("Dumped %s" % fn) if (time() - lastrecv > maxlastrecv) or len(dumpfiles.keys()) == 0: log.error('Did not receive a response after %s seconds, quitting' \ % (time()-lastrecv)) dumpfiles,files = dumpnassemble(dumpfiles,sportmap,options.dstdir,partialdump=True) for fn in files: log.info( "pos 2 Dumped %s" % fn) log.info( "Total time: %s" % (datetime.datetime.now() - start_time) )
def main(): log = logging.getLogger(__name__) log.setLevel(logging.INFO) options, args = getargs() log.setLevel(calcloglevel(options)) if options.listtemplates: print "Templates available:" print "\r\n".join(listtemplates()) sys.exit() if len(args) != 1: parser.error("Please pass just one destination tftp server name") if options.debug: log.setLevel(logging.DEBUG) debughandler = logging.handlers.WatchedFileHandler('debug.log') log.addHandler(debughandler) dst = (args[0], int(options.port)) s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.settimeout(5) mydirtysocks = mylist(limit=100) mydirtysocks.append(s) t = tftp() if options.range: ranges = getRange(options.range, rangetype=options.rangetype) fntemplate = getfntemplate(options.fntemplate) try: fntemplate % 100 except TypeError: log.critical( 'The template specified is not a valid one or not found') return filelist = gen_range(fntemplate, ranges) filelist2 = gen_range(fntemplate, ranges) else: filelist = gen_tftpfilelist(options.filenamesfile) filelist2 = gen_tftpfilelist(options.filenamesfile) dumpfiles = dict() ackbucket = list() sportmap = dict() start_time = datetime.datetime.now() cleansocks = list() finito = False lastrecv = time() maxlastrecv = 5 if not os.path.exists(options.dstdir): os.mkdir(options.dstdir) if not options.quiet: widgets = [ 'Test: ', progressbar.Percentage(), ' ', progressbar.Bar(marker=progressbar.RotatingMarker()), ' ', progressbar.ETA(), ' ' ] filelistlen = 0 for _tmp in filelist2: filelistlen += 1 fnno = 0 pbar = progressbar.ProgressBar(widgets=widgets, maxval=filelistlen).start() while 1: socklists = list() socklists.extend(mydirtysocks.list) socklists.extend(cleansocks) r, w, e = select.select(socklists, [], [], 0.1) if len(r) > 0: for s in r: recv = s.recvfrom(1024) log.debug('Recv: %s' % ` recv `) lastrecv = time() buff = recv[0] ipaddr = recv[1] try: response = tftpstruct.parse(buff) except lib.contrib.construct.core.RangeError: response = None if response is None: log.warn('Error parsing response') continue if response.operation == 'ERROR': if (response.data.errorcode == 'FileNotFound' or response.data.ErrMsg == 'No such file or directory'): pass else: log.debug(str(response)) log.warn( "Time for a siesta.. I think the tftp can't keep up" ) sleep(2) elif response.operation == 'DATA': addresses = (ipaddr, s.getsockname()) if addresses not in dumpfiles: dumpfiles[addresses] = dict() dumpfiles[addresses][ response.data.block] = response.data.data if s in mydirtysocks.list: mydirtysocks.list.remove(s) cleansocks.append(s) ackbucket.append([response.data.block, ipaddr, s]) else: if time() - lastrecv > maxlastrecv: finito = True if len(ackbucket) > 0: block, datadst, s = ackbucket.pop(-1) data = t.makeack(block) s.sendto(data, datadst) elif finito: break if not finito: try: fn = filelist.next() if not options.quiet: fnno += 1 pbar.update(fnno) except StopIteration: finito = True continue data = t.makerrq(fn) log.debug('asking for %s' % fn) s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.settimeout(5) log.debug('sending %s' % ` data `) s.sendto(data, dst) mydirtysocks.append(s) saddr, sport = s.getsockname() sportmap[sport] = fn if random.randrange(84) == 42: dumpfiles, files = dumpnassemble(dumpfiles, sportmap, options.dstdir, partialdump=False) for fn in files: log.info("Dumped %s" % fn) if (time() - lastrecv > maxlastrecv) or len(dumpfiles.keys()) == 0: log.error('Did not receive a response after %s seconds, quitting' \ % (time()-lastrecv)) dumpfiles, files = dumpnassemble(dumpfiles, sportmap, options.dstdir, partialdump=True) for fn in files: log.info("pos 2 Dumped %s" % fn) log.info("Total time: %s" % (datetime.datetime.now() - start_time))