From a637855ab4dc2219747721bf76a32c94b539f716 Mon Sep 17 00:00:00 2001 From: derv82 Date: Thu, 23 Aug 2018 15:11:52 -0700 Subject: [PATCH] Fix & optimize reaver output parsing. --- wifite/tools/reaver.py | 43 +++++++++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 15 deletions(-) diff --git a/wifite/tools/reaver.py b/wifite/tools/reaver.py index 846005e..e07afb4 100755 --- a/wifite/tools/reaver.py +++ b/wifite/tools/reaver.py @@ -29,6 +29,8 @@ class Reaver(Attack, Dependency): self.total_attempts = 0 self.total_timeouts = 0 self.total_wpsfails = 0 + self.last_pins = set() + self.last_line_number = 0 self.crack_result = None @@ -129,25 +131,23 @@ class Reaver(Attack, Dependency): def get_status(self): - # Include percentage - if not self.pixie_dust: - main_status = '({G}%s{W}) ' % self.progress - else: + if self.pixie_dust: main_status = '' + else: + # Include percentage + main_status = '({G}%s{W}) ' % self.progress - # Current state + # Current state (set in parse_* methods) main_status += self.state # Counters, timeouts, failures, locked. 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: meta_statuses.append('{O}Timeouts:%d{W}' % self.total_timeouts) 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: meta_statuses.append('{R}Locked{W}') @@ -217,6 +217,7 @@ class Reaver(Attack, Dependency): def parse_state(self, stdout): state = self.state + # Check last line for current status stdout_last_line = stdout.split('\n')[-1] if 'Waiting for beacon from' in stdout_last_line: @@ -256,13 +257,20 @@ class Reaver(Attack, Dependency): state = 'Rate-Limited by AP' 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 - 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: self.progress = percentages[-1][0] - tried_pins = set(re.findall(r'Trying pin "([0-9]+)"', stdout)) - self.total_attempts = len(tried_pins) + # Calculate number of PINs tried + 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. @@ -273,14 +281,19 @@ class Reaver(Attack, Dependency): # Print message with attack information. if self.pixie_dust: 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: 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.pattack('WPS', - self.target, - 'Pixie-Dust' if self.pixie_dust else 'PIN Attack', - '{W}[{C}%s{W}] %s' % (Timer.secs_to_str(time_left), message)) + Color.pattack('WPS', self.target, attack_name, + '{W}[%s] %s' % (time_msg, message)) if newline: Color.pl('')