--bully option to use bully (instead of reaver).

Previously used bully by-default.
Removed Configurations named 'reaver' (instead of 'WPS attack')

Should resolve #39
This commit is contained in:
derv82
2018-02-28 02:03:21 -05:00
parent 21e340ab08
commit aaf7845177
5 changed files with 69 additions and 60 deletions

View File

@@ -86,7 +86,7 @@ class Arguments(object):
wep.add_argument('--wep', wep.add_argument('--wep',
action='store_true', action='store_true',
dest='wep_filter', dest='wep_filter',
help=Color.s('Filter to display WEP-encrypted networks (default: {G}off{W})')) help=Color.s('Filter to display only WEP-encrypted networks (default: {G}off{W})'))
wep.add_argument('-wep', help=argparse.SUPPRESS, action='store_true', dest='wep_filter') wep.add_argument('-wep', help=argparse.SUPPRESS, action='store_true', dest='wep_filter')
wep.add_argument('--require-fakeauth', wep.add_argument('--require-fakeauth',
action='store_true', action='store_true',
@@ -170,7 +170,7 @@ class Arguments(object):
wpa.add_argument('--wpa', wpa.add_argument('--wpa',
action='store_true', action='store_true',
dest='wpa_filter', dest='wpa_filter',
help=Color.s('Filter to display WPA-encrypted networks (includes WPS)')) help=Color.s('Filter to display only WPA-encrypted networks (includes WPS)'))
wpa.add_argument('-wpa', help=argparse.SUPPRESS, action='store_true', dest='wpa_filter') wpa.add_argument('-wpa', help=argparse.SUPPRESS, action='store_true', dest='wpa_filter')
wpa.add_argument('--wpadt', wpa.add_argument('--wpadt',
action='store', action='store',
@@ -219,20 +219,24 @@ class Arguments(object):
wps.add_argument('--wps', wps.add_argument('--wps',
action='store_true', action='store_true',
dest='wps_filter', dest='wps_filter',
help=Color.s('Filter to display WPS-enabled networks')) help=Color.s('Filter to display only WPS-enabled networks'))
wps.add_argument('-wps', help=argparse.SUPPRESS, action='store_true', dest='wps_filter') wps.add_argument('-wps', help=argparse.SUPPRESS, action='store_true', dest='wps_filter')
wps.add_argument('--reaver', wps.add_argument('--no-wps',
action='store_true', action='store_true',
dest='reaver_only', dest='no_wps',
help=Color.s('ONLY use Reaver on WPS networks (default: {G}off{W})')) help=Color.s('{O}NEVER{W} use WPS attacks (Pixie-Dust, PIN) (default: {G}off{W})'))
wps.add_argument('--no-reaver', wps.add_argument('--wps-only',
action='store_true', action='store_true',
dest='no_reaver', dest='wps_only',
help=Color.s('Do NOT use Reaver on WPS networks (default: {G}off{W})')) help=Color.s('Only perform WPS attacks on WPA networks (default: {G}off{W})'))
wps.add_argument('--bully',
action='store_true',
dest='use_bully',
help=Color.s('Use {C}bully{W} instead of {C}reaver{W} for WPS attacks (default: {G}reaver{W})'))
wps.add_argument('--pixie', wps.add_argument('--pixie',
action='store_true', action='store_true',
dest='pixie_only', dest='pixie_only',
help=Color.s('Only use the WPS Pixie-Dust attack (default: {G}off{W})')) help=Color.s('Only use the WPS Pixie-Dust attack (no PIN) (default: {G}off{W})'))
wps.add_argument('--pixiet', wps.add_argument('--pixiet',
action='store', action='store',
dest='wps_pixie_timeout', dest='wps_pixie_timeout',
@@ -268,7 +272,7 @@ class Arguments(object):
dest='wps_fail_threshold', dest='wps_fail_threshold',
metavar='[fails]', metavar='[fails]',
type=int, type=int,
help=Color.s('Maximum number of Reaver Failures before failing attack (default: {G}%d{W})') help=Color.s('Maximum number of WPS Failures before failing attack (default: {G}%d{W})')
% Configuration.wps_fail_threshold) % Configuration.wps_fail_threshold)
wps.add_argument('-wpsmf', help=argparse.SUPPRESS, action='store', dest='wps_fail_threshold', type=int) wps.add_argument('-wpsmf', help=argparse.SUPPRESS, action='store', dest='wps_fail_threshold', type=int)
wps.add_argument('--wpsmt', wps.add_argument('--wpsmt',

View File

@@ -8,6 +8,7 @@ from Configuration import Configuration
from CrackResultWPS import CrackResultWPS from CrackResultWPS import CrackResultWPS
from Process import Process from Process import Process
from Bully import Bully from Bully import Bully
from Reaver import Reaver
class AttackWPS(Attack): class AttackWPS(Attack):
def __init__(self, target): def __init__(self, target):
@@ -18,21 +19,45 @@ class AttackWPS(Attack):
def run(self): def run(self):
''' Run all WPS-related attacks ''' ''' Run all WPS-related attacks '''
# Drop out if user specified to not use Reaver # Drop out if user specified to not use Reaver/Bully
if Configuration.no_reaver: if Configuration.no_wps:
self.success = False self.success = False
return self.success return self.success
# Run Pixie-Dust attack ###################
bully = Bully(self.target, pixie=True) # Pixie-Dust attack
if bully.crack_result is not None: if Configuration.use_bully:
# Pixie-Dust attack succeeded. We're done. # Bully: Pixie-dust
self.crack_result = bully.crack_result bully = Bully(self.target, pixie=True)
elif Configuration.pixie_only: if bully.crack_result is not None:
Color.pl('\r{!} {O}--pixie{R} set, ignoring WPS-PIN attack{W}') self.crack_result = bully.crack_result
return True
else: else:
# Run WPS-PIN attack reaver = Reaver(self.target)
bully = Bully(self.target, pixie=False) if reaver.is_pixiedust_supported():
self.crack_result = bully.crack_result # Reaver: Pixie-dust
return self.crack_result is not None reaver = Reaver(self.target)
if reaver.run_pixiedust_attack():
return True
else:
Color.pl("{!} {R}your version of 'reaver' does not support the {O}WPS pixie-dust attack{W}")
if Configuration.pixie_only:
Color.pl('\r{!} {O}--pixie{R} set, ignoring WPS-PIN attack{W}')
return False
###################
# PIN attack
if Configuration.use_bully:
# Bully: PIN guessing
bully = Bully(self.target, pixie=False)
if bully.crack_result is not None:
self.crack_result = bully.crack_result
return True
else:
# Reaver: PIN guessing
reaver = Reaver(self.target)
if reaver.run_wps_pin_attack():
return True
return False

View File

@@ -11,6 +11,8 @@ from Configuration import Configuration
import os, time, re import os, time, re
from threading import Thread from threading import Thread
# TODO: Support Pixie/PIN settings in Configuration
class Bully(Attack): class Bully(Attack):
def __init__(self, target, pixie=False): def __init__(self, target, pixie=False):
super(Bully, self).__init__(target) super(Bully, self).__init__(target)

View File

@@ -78,11 +78,12 @@ class Configuration(object):
# WPS variables # WPS variables
Configuration.wps_filter = False # Only attack WPS networks Configuration.wps_filter = False # Only attack WPS networks
Configuration.no_reaver = False # Do not use Reaver on WPS networks Configuration.no_wps = False # Do not use WPS attacks (Pixie-Dust & PIN attacks)
Configuration.reaver = False # ONLY use Reaver on WPS networks Configuration.wps_only = False # ONLY use WPS attacks on non-WEP networks
Configuration.use_bully = False # Use bully instead of reaver
Configuration.pixie_only = False # ONLY use Pixie-Dust attack on WPS Configuration.pixie_only = False # ONLY use Pixie-Dust attack on WPS
Configuration.wps_pin_timeout = 600 # Seconds to wait for PIN before reaver fails Configuration.wps_pin_timeout = 600 # Seconds to wait for PIN before WPS PIN attack fails
Configuration.wps_pixie_timeout = 300 # Seconds to wait for PIN before pixie fails Configuration.wps_pixie_timeout = 300 # Seconds to wait for PIN before WPS Pixie attack fails
Configuration.wps_pixie_step_timeout = 30 # Seconds to wait for a step to change before pixie fails Configuration.wps_pixie_step_timeout = 30 # Seconds to wait for a step to change before pixie fails
Configuration.wps_max_retries = 20 # Retries before failing Configuration.wps_max_retries = 20 # Retries before failing
Configuration.wps_fail_threshold = 30 # Max number of failures Configuration.wps_fail_threshold = 30 # Max number of failures
@@ -197,12 +198,15 @@ class Configuration(object):
# WPS # WPS
if args.wps_filter: if args.wps_filter:
Configuration.wps_filter = args.wps_filter Configuration.wps_filter = args.wps_filter
if args.reaver_only: if args.wps_only:
Configuration.reaver_only = args.reaver_only Configuration.wps_only = args.wps_only
Color.pl('{+} {C}option:{W} will *only* use {G}reaver{W} to attack WPA targets') Color.pl('{+} {C}option:{W} will *only* attack non-WEP networks with {G}WPS attacks{W} (no handshake capture)')
if args.no_reaver: if args.no_wps:
Configuration.no_reaver = args.no_reaver Configuration.no_wps = args.no_wps
Color.pl('{+} {C}option:{W} will *never* use {G}reaver{W} to attack WPA targets') Color.pl('{+} {C}option:{W} will {O}never{W} use {C}WPS attacks{W} (Pixie-Dust/PIN) on targets')
if args.use_bully:
Configuration.use_bully = args.use_bully
Color.pl('{+} {C}option:{W} use {C}bully{W} instead of {C}reaver{W} for WPS Attacks')
if args.pixie_only: if args.pixie_only:
Configuration.pixie_only = args.pixie_only Configuration.pixie_only = args.pixie_only
Color.pl('{+} {C}option:{W} will only use {G}WPS pixie-dust attack{W} on WPS targets') Color.pl('{+} {C}option:{W} will only use {G}WPS pixie-dust attack{W} on WPS targets')

View File

@@ -16,32 +16,6 @@ class Reaver(Attack):
self.success = False self.success = False
self.crack_result = None self.crack_result = None
def run(self):
''' Run all WPS-related attacks '''
# Drop out if user specified to not use Reaver
if Configuration.no_reaver:
self.success = False
return self.success
# Run Pixie-Dust attack
if self.is_pixiedust_supported():
if self.run_pixiedust_attack():
# Pixie-Dust attack succeeded. We're done.
self.success = True
return self.success
else:
Color.pl("{!} {R}your version of 'reaver' does not support the {O}WPS pixie-dust attack{W}")
if Configuration.pixie_only:
Color.pl('\r{!} {O}--pixie{R} set, ignoring WPS-PIN attack{W}')
self.success = False
else:
# Run WPS-PIN attack
self.success = self.run_wps_pin_attack()
return self.success
def is_pixiedust_supported(self): def is_pixiedust_supported(self):
''' Checks if 'reaver' supports WPS Pixie-Dust attack ''' ''' Checks if 'reaver' supports WPS Pixie-Dust attack '''
output = Process(['reaver', '-h']).stderr() output = Process(['reaver', '-h']).stderr()