From 0940b39554c8716b5f98db236c520a8731cbc22d Mon Sep 17 00:00:00 2001 From: derv82 Date: Mon, 1 Jun 2015 01:32:19 -0700 Subject: [PATCH] WPA handshake capture and cracking and deauth works Probably needs some tweaks/bug fixes, but yea. --- py/AttackWPA.py | 113 ++++++++++++++++++++++------ py/Color.py | 6 +- py/Handshake.py | 69 ++++++++++++----- py/tests/files/handshake_exists.cap | Bin 120681 -> 10536 bytes 4 files changed, 143 insertions(+), 45 deletions(-) diff --git a/py/AttackWPA.py b/py/AttackWPA.py index 6a480dc..4be860a 100644 --- a/py/AttackWPA.py +++ b/py/AttackWPA.py @@ -9,6 +9,9 @@ from Process import Process from WPAResult import WPAResult import time +import os +import re +from shutil import copy class AttackWPA(Attack): def __init__(self, target): @@ -34,16 +37,21 @@ class AttackWPA(Attack): time_since_deauth = time.time() + deauth_proc = None + while True: - Color.p('\r %s' % (' ' * 45)) + Color.clear_line() Color.p('\r{+} waiting for {C}handshake{W}...') time.sleep(1) + # Find .cap file cap_files = airodump.find_files(endswith='.cap') if len(cap_files) == 0: # No cap files yet continue cap_file = cap_files[0] + # TODO: Copy .cap file to temp for consistency + # Check for Handshake bssid = airodump_target.bssid essid = None @@ -52,21 +60,36 @@ class AttackWPA(Attack): handshake = Handshake(cap_file, bssid=bssid, essid=essid) if handshake.has_handshake(): # We got a handshake - Color.pl(' {G}captured handshake!{W}') + Color.pl('\n\n{+} {G}successfully captured handshake{W}') break - # TODO: Send deauth to a client or broadcast + # TODO: Delete copied .cap file in temp to save space + + # Check status of deauth process + if deauth_proc and deauth_proc.poll() == None: + # Deauth process is still running + time_since_deauth = time.time() + + # Send deauth to a client or broadcast if time.time()-time_since_deauth > Configuration.wpa_deauth_timeout: + # We are N seconds since last deauth was sent, + # And the deauth process is not running. if len(clients) == 0 or client_index >= len(clients): - # Send deauth for broadcoast + # TODO: Send deauth for broadcast + deauth_proc = self.deauth(airodump_target.bssid) client_index = 0 else: - # Send deauth for client + # TODO: Send deauth for client client = clients[client_index] + deauth_proc = self.deauth(client.bssid) client_index += 1 time_since_deauth = time.time() continue + # Stop the deauth process if needed + if deauth_proc and deauth_proc.poll() == None: + deauth_proc.interrupt() + if not handshake: # No handshake, attack failed. raise Exception('Handshake not captured') @@ -74,32 +97,25 @@ class AttackWPA(Attack): key = None - # TODO: Save copy of handshake to ./hs/ - import os - if not os.path.exists('hs'): - os.mkdir('hs') - import re - essid_safe = re.sub('[^a-zA-Z0-9]', '', handshake.essid) - 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) - cap_filename = os.path.join('hs', cap_filename) - from shutil import copy - Color.p('{+} saving copy of {C}handshake{W} to {C}%s{W} ' % cap_filename) - copy(handshake.capfile, cap_filename) - Color.pl(' {G}saved{W}') - handshake.capfile = cap_filename + # Save copy of handshake to ./hs/ + self.save_handshake(handshake) - # TODO: Crack handshake + # Print analysis of handshake file + Color.pl('\n{+} analysis of captured handshake file:') + handshake.analyze() + + # Crack handshake wordlist = Configuration.wordlist if wordlist != None: + wordlist_name = wordlist.split(os.sep)[-1] if not os.path.exists(wordlist): Color.pl('{!} {R}unable to crack:' + ' wordlist {O}%s{R} does not exist{W}' % wordlist) else: # We have a wordlist we can use - Color.p('{+} {G}cracking{W} handshake using {C}%s{W} wordlist' - % wordlist.split(os.sep)[-1]) + Color.p('\n{+} {C}cracking handshake{W}' + + ' using {C}aircrack-ng{W}' + + ' with {C}%s{W} wordlist' % wordlist_name) # TODO: More-verbose cracking status # 1. Read number of lines in 'wordlist' @@ -119,18 +135,65 @@ class AttackWPA(Attack): aircrack.wait() if os.path.exists(key_file): # We cracked it. - Color.pl('{G}cracked{W}') + Color.pl('\n\n{+} {G}successfully cracked PSK{W}\n') f = open(key_file, 'r') key = f.read() f.close() else: - Color.pl('{R}failed{W}') + Color.pl('\n{!} {R}handshake crack failed:' + + ' {O}%s did not contain password{W}' + % wordlist.split(os.sep)[-1]) self.crack_result = WPAResult(bssid, essid, handshake.capfile, key) self.crack_result.dump() return True + def save_handshake(self, handshake): + ''' + Saves a copy of the handshake file to hs/ + Args: + handshake - Instance of Handshake containing bssid, essid, capfile + ''' + # Create handshake dir + if not os.path.exists(Configuration.wpa_handshake_dir): + 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) + 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) + cap_filename = os.path.join(Configuration.wpa_handshake_dir, cap_filename) + + Color.p('{+} saving copy of {C}handshake{W} to {C}%s{W} ' % cap_filename) + copy(handshake.capfile, cap_filename) + Color.pl(' {G}saved{W}') + + # Update handshake to use the stored handshake file for future operations + handshake.capfile = cap_filename + + + def deauth(self, target_bssid, station_bssid=None): + ''' + Sends deauthentication request. + Args: + target_bssid - AP BSSID to deauth + station_bssid - Client BSSID to deauth + Deauths 'broadcast' if no client is specified. + ''' + command = [ + 'aireplay-ng', + '--ignore-negative-one', + '-0', # Deauthentication + '-a', self.target.bssid + ] + if station_bssid: + # Deauthing a specific client + command.extend(['-h', station_bssid]) + command.append(Configuration.interface) + return Process(command) + if __name__ == '__main__': from Target import Target fields = "A4:2B:8C:16:6B:3A, 2015-05-27 19:28:44, 2015-05-27 19:28:46, 11, 54e,WPA, WPA, , -58, 2, 0, 0. 0. 0. 0, 9, Test Router Please Ignore, ".split(',') diff --git a/py/Color.py b/py/Color.py index 846ca44..37939ba 100644 --- a/py/Color.py +++ b/py/Color.py @@ -34,7 +34,11 @@ class Color(object): ''' sys.stdout.write(Color.s(text)) sys.stdout.flush() - Color.last_sameline_length += len(text) + if '\r' in text: + text = text[text.rfind('\r')+1:] + Color.last_sameline_length = len(text) + else: + Color.last_sameline_length += len(text) @staticmethod def pl(text): diff --git a/py/Handshake.py b/py/Handshake.py index f6fc9ea..0176d5c 100644 --- a/py/Handshake.py +++ b/py/Handshake.py @@ -4,6 +4,7 @@ from Process import Process from Color import Color import re +import os class Handshake(object): def __init__(self, capfile, bssid=None, essid=None): @@ -22,7 +23,7 @@ class Handshake(object): # Find bssid/essid pairs that have handshakes in Pyrit pairs = self.pyrit_handshakes() - if len(pairs) == 0: + if len(pairs) == 0 and not self.bssid and not self.essid: # Tshark and Pyrit failed us, nothing else we can do. raise Exception("Cannot find BSSID or ESSID in cap file") @@ -57,19 +58,19 @@ class Handshake(object): def has_handshake(self): if not self.bssid or not self.essid: - self.divine_essid_and_bssid() + self.divine_bssid_and_essid() if len(self.tshark_handshakes()) > 0: return True - if len(self.cowpatty_handshakes()) > 0: - return True - if len(self.pyrit_handshakes()) > 0: return True - # XXX: Disabling aircrack check since I don't think it's reliable. + + # XXX: Disabling these checks since I don't think they are reliable. ''' + if len(self.cowpatty_handshakes()) > 0: + return True if len(self.aircrack_handshakes()) > 0: return True ''' @@ -294,6 +295,37 @@ class Handshake(object): pairs = self.aircrack_handshakes() Handshake.print_pairs(pairs, self.capfile, 'aircrack') + + def strip(self, outfile=None): + # XXX: This method might break aircrack-ng, use at own risk. + ''' + Strips out packets from handshake that aren't necessary to crack. + Leaves only handshake packets and SSID broadcast (for discovery). + Args: + outfile - Filename to save stripped handshake to. + If outfile==None, overwrite existing self.capfile. + ''' + if not outfile: + outfile = self.capfile + '.temp' + replace_existing_file = True + else: + replace_existing_file = False + + cmd = [ + 'tshark', + '-r', self.capfile, # input file + '-R', 'wlan.fc.type_subtype == 0x08 || eapol', # filter + '-w', outfile # output file + ] + proc = Process(cmd) + proc.wait() + if replace_existing_file: + from shutil import copy + copy(outfile, self.capfile) + os.remove(outfile) + pass + + @staticmethod def print_pairs(pairs, capfile, tool=None): ''' @@ -304,28 +336,27 @@ class Handshake(object): tool_str = '{C}%s{W}: ' % tool.rjust(8) if len(pairs) == 0: - Color.pl("{!} %s%s {R}does not{O} contain a handshake{W}" - % (tool_str, capfile)) + Color.pl("{!} %s.cap file {R}does not{O} contain a valid handshake{W}" + % (tool_str)) return for (bssid, essid) in pairs: if bssid and essid: - Color.pl("{+} %s%s {G}contains a handshake{W} for {G}%s{W} ({G}%s{W})" - % (tool_str, capfile, bssid, essid)) + Color.pl('{+} %s.cap file' % tool_str + + ' {G}contains a valid handshake{W}' + + ' for {G}%s{W} ({G}%s{W})' % (bssid, essid)) elif bssid: - Color.pl("{+} %s%s {G}contains a handshake{W} for {G}%s{W}" - % (tool_str, capfile, bssid)) + Color.pl('{+} %s.cap file' % tool_str + + ' {G}contains a valid handshake{W}' + + ' for {G}%s{W}' % bssid) elif essid: - Color.pl("{+} %s%s {G}contains a handshake{W} for ({G}%s{W})" - % (tool_str, capfile, essid)) - + Color.pl('{+} %s.cap file' % tool_str + + ' {G}contains a valid handshake{W}' + + ' for ({G}%s{W})' % essid) if __name__ == '__main__': - #hs = Handshake('/tmp/test.cap') - hs = Handshake('/tmp/test.cap', bssid='30:85:a9:39:d2:18') - #hs = Handshake('/tmp/test.cap', bssid='30:85:a9:39:d2:18', essid="Uncle Router's Gigabit LAN Party") - #hs = Handshake('/tmp/test.cap.stripped.tshark') + hs = Handshake('./tests/files/handshake_exists.cap', bssid='A4:2B:8C:16:6B:3A') hs.analyze() print "has_hanshake() =", hs.has_handshake() diff --git a/py/tests/files/handshake_exists.cap b/py/tests/files/handshake_exists.cap index 4e89e8ac220bb49138d7647f1202965141ae865f..b6001fa39ce1998a01394398ac077f9fc9df151c 100644 GIT binary patch literal 10536 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