New skip action

pull/154/head
lanjelot 3 years ago
parent 2692d6a5c9
commit d96663bc3d

@ -1406,7 +1406,8 @@ class Controller:
builtin_actions = ( builtin_actions = (
('ignore', 'do not report'), ('ignore', 'do not report'),
('retry', 'try payload again'), ('retry', 'try payload again'),
('free', 'dismiss future similar payloads'), ('skip', 'skip keyword value'),
('free', 'skip parameter value'),
('quit', 'terminate execution now'), ('quit', 'terminate execution now'),
) )
@ -1587,6 +1588,7 @@ Please read the README inside for more examples and usage information.
self.ns = manager.Namespace() self.ns = manager.Namespace()
self.ns.actions = {} self.ns.actions = {}
self.ns.free_list = [] self.ns.free_list = []
self.ns.skip_list = []
self.ns.paused = False self.ns.paused = False
self.ns.quit_now = False self.ns.quit_now = False
self.ns.start_time = 0 self.ns.start_time = 0
@ -1745,12 +1747,10 @@ Please read the README inside for more examples and usage information.
actions[action] = opts actions[action] = opts
return actions return actions
def check_free(self, payload): def should_free(self, payload):
# free_list: 'host=10.0.0.1', 'user=anonymous', 'host=10.0.0.7,user=test', ... # free_list: [[('host', '10.0.0.1')], [('user', 'anonymous')], [('host', '10.0.0.7'),('user','test')], ...
for m in self.ns.free_list: for l in self.ns.free_list:
args = m.split(',', 1) for k, v in l:
for arg in args:
k, v = arg.split('=', 1)
if payload[k] != v: if payload[k] != v:
break break
else: else:
@ -1759,9 +1759,24 @@ Please read the README inside for more examples and usage information.
return False return False
def register_free(self, payload, opts): def register_free(self, payload, opts):
self.ns.free_list += [','.join('%s=%s' % (k, payload[k]) for k in opts.split('+'))] self.ns.free_list += [[(k, payload[k]) for k in opts.split('+')]]
logger.debug('free_list updated: %s' % self.ns.free_list) logger.debug('free_list updated: %s' % self.ns.free_list)
def should_skip(self, prod):
# skip_list: [[(0, '10.0.0.1')], [(1, 'anonymous')], [(0, '10.0.0.7'), (1, 'test')], ...
for l in self.ns.skip_list:
for k, v in l:
if prod[k] != v:
break
else:
return True
return False
def register_skip(self, prod, opts):
self.ns.skip_list += [[(k, prod[k]) for k in map(int, opts.split('+'))]]
logger.debug('skip_list updated: %s' % self.ns.skip_list)
def fire(self): def fire(self):
logger.info('Starting %s at %s' % (__banner__, strftime('%Y-%m-%d %H:%M %Z', localtime()))) logger.info('Starting %s at %s' % (__banner__, strftime('%Y-%m-%d %H:%M %Z', localtime())))
@ -2058,7 +2073,13 @@ Please read the README inside for more examples and usage information.
logger.debug('product: %s' % prod) logger.debug('product: %s' % prod)
prod_str = ':'.join(prod) prod_str = ':'.join(prod)
if self.check_free(payload): if self.should_free(payload):
logger.debug('skipping')
report_queue.put(('skip', prod_str, None, 0))
continue
if self.should_skip(prod):
logger.debug('skipping')
report_queue.put(('skip', prod_str, None, 0)) report_queue.put(('skip', prod_str, None, 0))
continue continue
@ -2118,6 +2139,10 @@ Please read the README inside for more examples and usage information.
self.register_free(payload, actions['free']) self.register_free(payload, actions['free'])
break break
if 'skip' in actions:
self.register_skip(prod, actions['skip'])
break
if 'fail' in actions: if 'fail' in actions:
break break

Loading…
Cancel
Save