2.1.9: --pmkid option, cleaned up --cracked, other bug fixes.
PMKID: * `--pmkid` option only attacks WPA networks with PMKID capture + crack * Decreased PMKID capture time from 60 seconds to 15 seconds. * Ignores PMKID attack if `--wps-only` is set. WPS: * Ctrl+C while waiting for `bully` to fetch PSK = remembers PIN, PSK is unknown. Misc: * `--cracked` prints results on single lines (much easier to read) * Fixed typo when required dependencies are not found (closes #127)
This commit is contained in:
@@ -30,6 +30,13 @@ class CrackResultPMKID(CrackResult):
|
||||
else:
|
||||
Color.pl('{!} %s {O}key unknown{W}' % ''.rjust(19))
|
||||
|
||||
def print_single_line(self, longest_essid):
|
||||
self.print_single_line_prefix(longest_essid)
|
||||
Color.p('{G}%s{W}' % 'PMKID'.ljust(5))
|
||||
Color.p(' ')
|
||||
Color.p('Key: {G}%s{W}' % self.key)
|
||||
Color.pl('')
|
||||
|
||||
def to_dict(self):
|
||||
return {
|
||||
'type' : self.result_type,
|
||||
|
||||
@@ -15,6 +15,7 @@ class CrackResult(object):
|
||||
|
||||
def __init__(self):
|
||||
self.date = int(time.time())
|
||||
self.readable_date = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(self.date))
|
||||
|
||||
def dump(self):
|
||||
raise Exception('Unimplemented method: dump()')
|
||||
@@ -22,6 +23,19 @@ class CrackResult(object):
|
||||
def to_dict(self):
|
||||
raise Exception('Unimplemented method: to_dict()')
|
||||
|
||||
def print_single_line(self, longest_essid):
|
||||
raise Exception('Unimplemented method: print_single_line()')
|
||||
|
||||
def print_single_line_prefix(self, longest_essid):
|
||||
essid = self.essid if self.essid else 'N/A'
|
||||
Color.p('{W} ')
|
||||
Color.p('{C}%s{W}' % essid.ljust(longest_essid))
|
||||
Color.p(' ')
|
||||
Color.p('{GR}%s{W}' % self.bssid.ljust(17))
|
||||
Color.p(' ')
|
||||
Color.p('{D}%s{W}' % self.readable_date.ljust(19))
|
||||
Color.p(' ')
|
||||
|
||||
def save(self):
|
||||
''' Adds this crack result to the cracked file and saves it. '''
|
||||
name = CrackResult.cracked_file
|
||||
@@ -52,12 +66,32 @@ class CrackResult(object):
|
||||
|
||||
if len(cracked_targets) == 0:
|
||||
Color.pl('{!} {R}no results found in {O}%s{W}' % name)
|
||||
else:
|
||||
Color.pl('{+} displaying {G}%d {C}cracked target(s){W}\n' % len(cracked_targets))
|
||||
for item in cracked_targets:
|
||||
cr = cls.load(item)
|
||||
cr.dump()
|
||||
Color.pl('')
|
||||
return
|
||||
|
||||
Color.pl('\n{+} Displaying {G}%d{W} cracked target(s) from {C}%s{W}\n' % (
|
||||
len(cracked_targets), name))
|
||||
|
||||
results = sorted([cls.load(item) for item in cracked_targets], key=lambda x: x.date, reverse=True)
|
||||
longest_essid = max([len(result.essid or 'ESSID') for result in results])
|
||||
|
||||
# Header
|
||||
Color.p('{D} ')
|
||||
Color.p('ESSID'.ljust(longest_essid))
|
||||
Color.p(' ')
|
||||
Color.p('BSSID'.ljust(17))
|
||||
Color.p(' ')
|
||||
Color.p('DATE'.ljust(19))
|
||||
Color.p(' ')
|
||||
Color.p('TYPE'.ljust(5))
|
||||
Color.p(' ')
|
||||
Color.p('KEY')
|
||||
Color.pl('{D}')
|
||||
Color.p(' ' + '-' * (longest_essid + 17 + 19 + 5 + 11 + 12))
|
||||
Color.pl('{W}')
|
||||
# Results
|
||||
for result in results:
|
||||
result.print_single_line(longest_essid)
|
||||
Color.pl('')
|
||||
|
||||
|
||||
@classmethod
|
||||
@@ -97,6 +131,7 @@ class CrackResult(object):
|
||||
json['pmkid_file'],
|
||||
json['key'])
|
||||
result.date = json['date']
|
||||
result.readable_date = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(result.date))
|
||||
return result
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
@@ -23,7 +23,16 @@ class CrackResultWEP(CrackResult):
|
||||
Color.pl('{+} Hex Key: {G}%s{W}' % self.hex_key)
|
||||
if self.ascii_key:
|
||||
Color.pl('{+} Ascii Key: {G}%s{W}' % self.ascii_key)
|
||||
|
||||
|
||||
def print_single_line(self, longest_essid):
|
||||
self.print_single_line_prefix(longest_essid)
|
||||
Color.p('{G}%s{W}' % 'WEP'.ljust(5))
|
||||
Color.p(' ')
|
||||
Color.p('Hex: {G}%s{W}' % self.hex_key.replace(':', ''))
|
||||
if self.ascii_key:
|
||||
Color.p(' (ASCII: {G}%s{W})' % self.ascii_key)
|
||||
Color.pl('')
|
||||
|
||||
def to_dict(self):
|
||||
return {
|
||||
'type' : self.result_type,
|
||||
|
||||
@@ -29,7 +29,14 @@ class CrackResultWPA(CrackResult):
|
||||
Color.pl('{+} %s: {G}%s{W}' % ('PSK (password)'.rjust(19), self.key))
|
||||
else:
|
||||
Color.pl('{!} %s {O}key unknown{W}' % ''.rjust(19))
|
||||
|
||||
|
||||
def print_single_line(self, longest_essid):
|
||||
self.print_single_line_prefix(longest_essid)
|
||||
Color.p('{G}%s{W}' % 'WPA'.ljust(5))
|
||||
Color.p(' ')
|
||||
Color.p('Key: {G}%s{W}' % self.key)
|
||||
Color.pl('')
|
||||
|
||||
def to_dict(self):
|
||||
return {
|
||||
'type' : self.result_type,
|
||||
|
||||
@@ -27,6 +27,15 @@ class CrackResultWPS(CrackResult):
|
||||
Color.pl('{+} %s: {G}%s{W}' % ( 'WPS PIN'.rjust(12), self.pin))
|
||||
Color.pl('{+} %s: {G}%s{W}' % ('PSK/Password'.rjust(12), psk))
|
||||
|
||||
def print_single_line(self, longest_essid):
|
||||
self.print_single_line_prefix(longest_essid)
|
||||
Color.p('{G}%s{W}' % 'WPS'.ljust(5))
|
||||
Color.p(' ')
|
||||
if self.psk:
|
||||
Color.p('Key: {G}%s{W} ' % self.psk)
|
||||
Color.p('PIN: {G}%s{W}' % self.pin)
|
||||
Color.pl('')
|
||||
|
||||
def to_dict(self):
|
||||
return {
|
||||
'type' : self.result_type,
|
||||
|
||||
Reference in New Issue
Block a user