From 6adca64154f0a559500f1b522e29e3788e604b0d Mon Sep 17 00:00:00 2001 From: derv82 Date: Thu, 16 Aug 2018 11:10:03 -0700 Subject: [PATCH] 2.1.8: Check hashcat tools before trying PMKID attack. Should resolve #124. Also, capturing PMKID will skip WPA handshake capture. --- wifite/attack/all.py | 4 ++-- wifite/attack/pmkid.py | 15 +++++++++++++-- wifite/attack/wpa.py | 5 ++++- wifite/config.py | 2 +- wifite/tools/dependency.py | 11 +++++++---- 5 files changed, 27 insertions(+), 10 deletions(-) diff --git a/wifite/attack/all.py b/wifite/attack/all.py index 21c6d89..d9085de 100755 --- a/wifite/attack/all.py +++ b/wifite/attack/all.py @@ -55,8 +55,8 @@ class AttackAll(object): for attack in attacks: try: result = attack.run() - if result and attack.success: - break # We cracked it. + if result: + break # Attack was successful, stop other attacks. except Exception as e: Color.pl("\n{!} {R}Error: {O}%s" % str(e)) if Configuration.verbose > 0 or Configuration.print_stack_traces: diff --git a/wifite/attack/pmkid.py b/wifite/attack/pmkid.py index 8c394a4..e0522ab 100755 --- a/wifite/attack/pmkid.py +++ b/wifite/attack/pmkid.py @@ -55,7 +55,17 @@ class AttackPMKID(Attack): def run(self): - # TODO: Check ./hs/ for previously-captured PMKID, skip to crack if found. + # TODO: Check that we have all hashcat programs + dependencies = [ + Hashcat.dependency_name, + HcxDumpTool.dependency_name, + HcxPcapTool.dependency_name + ] + missing_deps = [dep for dep in dependencies if not Process.exists(dep)] + if len(missing_deps) > 0: + Color.pl('{!} Skipping PMKID attack, missing required tools: {O}%s{W}' % ', '.join(missing_deps)) + return False + pmkid_file = None # Load exisitng has from filesystem @@ -74,7 +84,8 @@ class AttackPMKID(Attack): # Crack it. self.success = self.crack_pmkid_file(pmkid_file) - return self.success + + return True # Even if we don't crack it, capturing a PMKID is "successful" def capture_pmkid(self): diff --git a/wifite/attack/wpa.py b/wifite/attack/wpa.py index 742538c..e7cbb65 100755 --- a/wifite/attack/wpa.py +++ b/wifite/attack/wpa.py @@ -250,7 +250,10 @@ class AttackWPA(Attack): os.mkdir(Configuration.wpa_handshake_dir) # Generate filesystem-safe filename from bssid, essid and date - essid_safe = re.sub('[^a-zA-Z0-9]', '', handshake.essid) + if handshake.essid and type(handshake.essid) is str: + essid_safe = re.sub('[^a-zA-Z0-9]', '', handshake.essid) + else: + essid_safe = 'UnknownEssid' bssid_safe = handshake.bssid.replace(':', '-') date = time.strftime('%Y-%m-%dT%H-%M-%S') cap_filename = 'handshake_%s_%s_%s.cap' % (essid_safe, bssid_safe, date) diff --git a/wifite/config.py b/wifite/config.py index 802eb10..a39d2f9 100755 --- a/wifite/config.py +++ b/wifite/config.py @@ -8,7 +8,7 @@ from .tools.macchanger import Macchanger class Configuration(object): ''' Stores configuration variables and functions for Wifite. ''' - version = '2.1.7' + version = '2.1.8' initialized = False # Flag indicating config has been initialized temp_dir = None # Temporary directory diff --git a/wifite/tools/dependency.py b/wifite/tools/dependency.py index d130bf0..812e1ab 100755 --- a/wifite/tools/dependency.py +++ b/wifite/tools/dependency.py @@ -30,6 +30,7 @@ class Dependency(object): from .pyrit import Pyrit from .tshark import Tshark from .macchanger import Macchanger + from .hashcat import Hashcat, HcxDumpTool, HcxPcapTool apps = [ # Aircrack @@ -40,6 +41,8 @@ class Dependency(object): Reaver, Bully, # Cracking/handshakes Pyrit, Tshark, + # Hashcat + Hashcat, HcxDumpTool, HcxPcapTool, # Misc Macchanger ] @@ -61,11 +64,11 @@ class Dependency(object): return False if cls.dependency_required: - Color.pl('{!} {R}error: required app {O}%s{R} was not found' % cls.dependency_name) - Color.pl(' {W}install @ {C}%s{W}' % cls.dependency_url) + Color.pp('{!} {R}error: required app {O}%s{R} was not found' % cls.dependency_name) + Color.pl(' {W}install @ {C}%s{W}' % cls.dependency_url) return True else: - Color.pl('{!} {O}warning: recommended app {R}%s{O} was not found' % cls.dependency_name) - Color.pl(' {W}install @ {C}%s{W}' % cls.dependency_url) + Color.p('{!} {O}warning: recommended app {R}%s{O} was not found' % cls.dependency_name) + Color.pl(' {W}install @ {C}%s{W}' % cls.dependency_url) return False