Fix & optimize reaver output parsing.

This commit is contained in:
derv82
2018-08-23 15:11:52 -07:00
parent 75d4d8e99d
commit a637855ab4

View File

@@ -29,6 +29,8 @@ class Reaver(Attack, Dependency):
self.total_attempts = 0 self.total_attempts = 0
self.total_timeouts = 0 self.total_timeouts = 0
self.total_wpsfails = 0 self.total_wpsfails = 0
self.last_pins = set()
self.last_line_number = 0
self.crack_result = None self.crack_result = None
@@ -129,25 +131,23 @@ class Reaver(Attack, Dependency):
def get_status(self): def get_status(self):
# Include percentage if self.pixie_dust:
if not self.pixie_dust:
main_status = '({G}%s{W}) ' % self.progress
else:
main_status = '' main_status = ''
else:
# Include percentage
main_status = '({G}%s{W}) ' % self.progress
# Current state # Current state (set in parse_* methods)
main_status += self.state main_status += self.state
# Counters, timeouts, failures, locked. # Counters, timeouts, failures, locked.
meta_statuses = [] meta_statuses = []
if self.total_attempts > 0 and not self.pixie_dust:
meta_statuses.append('{C}PINs:%s{W}' % self.total_attempts)
if self.total_timeouts > 0: if self.total_timeouts > 0:
meta_statuses.append('{O}Timeouts:%d{W}' % self.total_timeouts) meta_statuses.append('{O}Timeouts:%d{W}' % self.total_timeouts)
if self.total_wpsfails > 0: if self.total_wpsfails > 0:
meta_statuses.append('{O}WPSFail:%d{W}' % self.total_wpsfails) meta_statuses.append('{O}Fails:%d{W}' % self.total_wpsfails)
if self.locked: if self.locked:
meta_statuses.append('{R}Locked{W}') meta_statuses.append('{R}Locked{W}')
@@ -217,6 +217,7 @@ class Reaver(Attack, Dependency):
def parse_state(self, stdout): def parse_state(self, stdout):
state = self.state state = self.state
# Check last line for current status
stdout_last_line = stdout.split('\n')[-1] stdout_last_line = stdout.split('\n')[-1]
if 'Waiting for beacon from' in stdout_last_line: if 'Waiting for beacon from' in stdout_last_line:
@@ -256,13 +257,20 @@ class Reaver(Attack, Dependency):
state = 'Rate-Limited by AP' state = 'Rate-Limited by AP'
self.locked = True self.locked = True
# Parse all lines since last check
stdout_diff = stdout[self.last_line_number:]
self.last_line_number = len(stdout)
# Detect percentage complete # Detect percentage complete
percentages = re.findall(r"([0-9.]+%) complete .* \(([0-9.]+) seconds/pin\)", stdout_last_line) percentages = re.findall(
r"([0-9.]+%) complete .* \(([0-9.]+) seconds/pin\)", stdout_diff)
if len(percentages) > 0: if len(percentages) > 0:
self.progress = percentages[-1][0] self.progress = percentages[-1][0]
tried_pins = set(re.findall(r'Trying pin "([0-9]+)"', stdout)) # Calculate number of PINs tried
self.total_attempts = len(tried_pins) new_pins = set(re.findall(r'Trying pin "([0-9]+)"', stdout_diff))
self.total_attempts += len(new_pins.difference(self.last_pins))
self.last_pins = new_pins
# TODO: Look for "Sending M6 message" which indicates first 4 digits are correct. # TODO: Look for "Sending M6 message" which indicates first 4 digits are correct.
@@ -273,14 +281,19 @@ class Reaver(Attack, Dependency):
# Print message with attack information. # Print message with attack information.
if self.pixie_dust: if self.pixie_dust:
time_left = Configuration.wps_pixie_timeout - self.running_time() time_left = Configuration.wps_pixie_timeout - self.running_time()
time_msg = '{O}%s{W}' % Timer.secs_to_str(time_left)
attack_name = 'Pixie-Dust'
else: else:
time_left = self.running_time() time_left = self.running_time()
time_msg = '{C}%s{W}' % Timer.secs_to_str(time_left)
attack_name = 'PIN Attack'
if self.total_attempts > 0 and not self.pixie_dust:
time_msg += ' {D}PINs:{W}{C}%d{W}' % self.total_attempts
Color.clear_entire_line() Color.clear_entire_line()
Color.pattack('WPS', Color.pattack('WPS', self.target, attack_name,
self.target, '{W}[%s] %s' % (time_msg, message))
'Pixie-Dust' if self.pixie_dust else 'PIN Attack',
'{W}[{C}%s{W}] %s' % (Timer.secs_to_str(time_left), message))
if newline: if newline:
Color.pl('') Color.pl('')