diff --git a/wifite/args.py b/wifite/args.py index 442ea94..edbf75d 100755 --- a/wifite/args.py +++ b/wifite/args.py @@ -24,25 +24,15 @@ class Arguments(object): ''' Returns parser.args() containing all program arguments ''' parser = argparse.ArgumentParser(usage=argparse.SUPPRESS, - formatter_class=lambda prog: argparse.HelpFormatter(prog, max_help_position=80, width=130)) + formatter_class=lambda prog: argparse.HelpFormatter( + prog, max_help_position=80, width=130)) - glob = parser.add_argument_group('SETTINGS') - self._add_global_args(glob) - - wep_group = parser.add_argument_group('WEP') - self._add_wep_args(wep_group) - - wpa_group = parser.add_argument_group('WPA') - self._add_wpa_args(wpa_group) - - wps_group = parser.add_argument_group('WPS') - self._add_wps_args(wps_group) - - eviltwin_group = parser.add_argument_group('EVIL TWIN') - self._add_eviltwin_args(eviltwin_group) - - commands_group = parser.add_argument_group('COMMANDS') - self._add_command_args(commands_group) + self._add_global_args(parser.add_argument_group(Color.s('{C}SETTINGS{W}'))) + self._add_wep_args(parser.add_argument_group(Color.s('{C}WEP{W}'))) + self._add_wpa_args(parser.add_argument_group(Color.s('{C}WPA{W}'))) + self._add_wps_args(parser.add_argument_group(Color.s('{C}WPS{W}'))) + self._add_eviltwin_args(parser.add_argument_group(Color.s('{C}EVIL TWIN{W}'))) + self._add_command_args(parser.add_argument_group(Color.s('{C}COMMANDS{W}'))) return parser.parse_args() @@ -53,14 +43,16 @@ class Arguments(object): action='count', default=0, dest='verbose', - help=Color.s('Shows more options ({C}-h -v{W}). Prints commands and outputs. (default: {G}quiet{W})')) + help=Color.s('Shows more options ({C}-h -v{W}). Prints commands and ' + + 'outputs. (default: {G}quiet{W})')) glob.add_argument('-i', action='store', dest='interface', metavar='[interface]', type=str, - help=Color.s('Wireless interface to use (default: {G}choose first or ask{W})')) + help=Color.s('Wireless interface to use (default: {G}choose first ' + + 'or ask{W})')) glob.add_argument('-c', action='store', @@ -68,7 +60,8 @@ class Arguments(object): metavar='[channel]', type=int, help=Color.s('Wireless channel to scan (default: {G}all channels{W})')) - glob.add_argument('--channel', help=argparse.SUPPRESS, action='store', dest='channel', type=int) + glob.add_argument('--channel', help=argparse.SUPPRESS, action='store', + dest='channel', type=int) glob.add_argument('-mac', '--random-mac', @@ -81,15 +74,18 @@ class Arguments(object): dest='scan_time', nargs='?', const=10, - metavar='scantime', + metavar='scan_time', type=int, - help=Color.s('{G}Pillage{W}: Attack all targets after {C}scantime{W} seconds')) - glob.add_argument('--pillage', help=argparse.SUPPRESS, action='store', dest='scan_time', nargs='?', const=10, type=int) + help=Color.s('{G}Pillage{W}: Attack all targets after ' + + '{C}scan_time{W} (seconds)')) + glob.add_argument('--pillage', help=argparse.SUPPRESS, action='store', + dest='scan_time', nargs='?', const=10, type=int) glob.add_argument('--kill', action='store_true', dest='kill_conflicting_processes', - help=Color.s('Kill processes that conflict with Airmon/Airodump (default: {G}off{W})')) + help=Color.s('Kill processes that conflict with Airmon/Airodump ' + + '(default: {G}off{W})')) glob.add_argument('-5', '--5ghz', @@ -102,8 +98,10 @@ class Arguments(object): dest='target_bssid', metavar='[bssid]', type=str, - help=self._verbose('BSSID (e.g. {GR}AA:BB:CC:DD:EE:FF{W}) of access point to attack')) - glob.add_argument('--bssid', help=argparse.SUPPRESS, action='store', dest='target_bssid', type=str) + help=self._verbose('BSSID (e.g. {GR}AA:BB:CC:DD:EE:FF{W}) of access ' + + 'point to attack')) + glob.add_argument('--bssid', help=argparse.SUPPRESS, action='store', + dest='target_bssid', type=str) glob.add_argument('-e', action='store', @@ -111,7 +109,8 @@ class Arguments(object): metavar='[essid]', type=str, help=self._verbose('ESSID (e.g. {GR}NETGEAR07{W}) of access point to attack')) - glob.add_argument('--essid', help=argparse.SUPPRESS, action='store', dest='target_essid', type=str) + glob.add_argument('--essid', help=argparse.SUPPRESS, action='store', + dest='target_essid', type=str) glob.add_argument('-E', action='store', @@ -120,12 +119,14 @@ class Arguments(object): type=str, default=None, help=self._verbose('Hides targets with ESSIDs that match the given text')) - glob.add_argument('--ignore-essid', help=argparse.SUPPRESS, action='store', dest='ignore_essid', type=str) + glob.add_argument('--ignore-essid', help=argparse.SUPPRESS, action='store', + dest='ignore_essid', type=str) glob.add_argument('--clients-only', '-co', action='store_true', dest='clients_only', - help=Color.s('Only show targets that have associated clients (default: {G}off{W})')) + help=Color.s('Only show targets that have associated clients ' + + '(default: {G}off{W})')) glob.add_argument('--showb', action='store_true', @@ -135,9 +136,12 @@ class Arguments(object): glob.add_argument('--nodeauths', action='store_true', dest='no_deauth', - help=Color.s('Passive mode: Never deauthenticates clients (default: {G}deauth targets{W})')) - glob.add_argument('--no-deauths', action='store_true', dest='no_deauth', help=argparse.SUPPRESS) - glob.add_argument('-nd', action='store_true', dest='no_deauth', help=argparse.SUPPRESS) + help=Color.s('Passive mode: Never deauthenticates clients ' + + '(default: {G}deauth targets{W})')) + glob.add_argument('--no-deauths', action='store_true', dest='no_deauth', + help=argparse.SUPPRESS) + glob.add_argument('-nd', action='store_true', dest='no_deauth', + help=argparse.SUPPRESS) glob.add_argument('--num-deauths', action='store', @@ -145,7 +149,8 @@ class Arguments(object): dest='num_deauths', metavar='[num]', default=None, - help=self._verbose('Number of deauth packets to send (default: {G}%d{W})' % self.config.num_deauths)) + help=self._verbose('Number of deauth packets to send (default: ' + + '{G}%d{W})' % self.config.num_deauths)) def _add_eviltwin_args(self, group): @@ -154,7 +159,8 @@ class Arguments(object): group.add_argument('--eviltwin', action='store_true', dest='use_eviltwin', - help=Color.s('Use the "Evil Twin" attack against all targets (default: {G}off{W})')) + help=Color.s('Use the "Evil Twin" attack against all targets ' + + '(default: {G}off{W})')) # TODO: Args to specify deauth interface, server port, etc. ''' @@ -164,97 +170,118 @@ class Arguments(object): wep.add_argument('--wep', action='store_true', dest='wep_filter', - 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') + 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('--require-fakeauth', action='store_true', dest='require_fakeauth', help=Color.s('Fails attacks if fake-auth fails (default: {G}off{W})')) - wep.add_argument('--nofakeauth', help=argparse.SUPPRESS, action='store_true', dest='require_fakeauth') - wep.add_argument('-nofakeauth', help=argparse.SUPPRESS, action='store_true', dest='require_fakeauth') + wep.add_argument('--nofakeauth', help=argparse.SUPPRESS, action='store_true', + dest='require_fakeauth') + wep.add_argument('-nofakeauth', help=argparse.SUPPRESS, action='store_true', + dest='require_fakeauth') wep.add_argument('--keep-ivs', action='store_true', dest='wep_keep_ivs', default=False, - help=Color.s('Retain .IVS files and reuse when cracking (default: {G}off{W})')) + help=Color.s('Retain .IVS files and reuse when cracking ' + + '(default: {G}off{W})')) wep.add_argument('--pps', action='store', dest='wep_pps', metavar='[pps]', type=int, - help=self._verbose('Packets Per Second to replay (default: {G}%d pps{W})' % self.config.wep_pps)) - wep.add_argument('-pps', help=argparse.SUPPRESS, action='store', dest='wep_pps', type=int) + help=self._verbose('Packets Per Second to replay (default: ' + + '{G}%d pps{W})' % self.config.wep_pps)) + wep.add_argument('-pps', help=argparse.SUPPRESS, action='store', + dest='wep_pps', type=int) wep.add_argument('--wept', action='store', dest='wep_timeout', metavar='[seconds]', type=int, - help=self._verbose('Seconds to wait before failing (default: {G}%d sec{W})' % self.config.wep_timeout)) - wep.add_argument('-wept', help=argparse.SUPPRESS, action='store', dest='wep_timeout', type=int) + help=self._verbose('Seconds to wait before failing (default: ' + + '{G}%d sec{W})' % self.config.wep_timeout)) + wep.add_argument('-wept', help=argparse.SUPPRESS, action='store', + dest='wep_timeout', type=int) wep.add_argument('--wepca', action='store', dest='wep_crack_at_ivs', metavar='[ivs]', type=int, - help=self._verbose('Start cracking at this many IVs (default: {G}%d ivs{W})' % self.config.wep_crack_at_ivs)) - wep.add_argument('-wepca', help=argparse.SUPPRESS, action='store', dest='wep_crack_at_ivs', type=int) + help=self._verbose('Start cracking at this many IVs (default: ' + + '{G}%d ivs{W})' % self.config.wep_crack_at_ivs)) + wep.add_argument('-wepca', help=argparse.SUPPRESS, action='store', + dest='wep_crack_at_ivs', type=int) wep.add_argument('--weprs', action='store', dest='wep_restart_stale_ivs', metavar='[seconds]', type=int, - help=self._verbose('Restart aireplay if no new IVs appear (default: {G}%d sec{W})' % self.config.wep_restart_stale_ivs)) - wep.add_argument('-weprs', help=argparse.SUPPRESS, action='store', dest='wep_restart_stale_ivs', type=int) + help=self._verbose('Restart aireplay if no new IVs appear (default: ' + + '{G}%d sec{W})' % self.config.wep_restart_stale_ivs)) + wep.add_argument('-weprs', help=argparse.SUPPRESS, action='store', + dest='wep_restart_stale_ivs', type=int) wep.add_argument('--weprc', action='store', dest='wep_restart_aircrack', metavar='[seconds]', type=int, - help=self._verbose('Restart aircrack after this delay (default: {G}%d sec{W})' % self.config.wep_restart_aircrack)) - wep.add_argument('-weprc', help=argparse.SUPPRESS, action='store', dest='wep_restart_aircrack', type=int) + help=self._verbose('Restart aircrack after this delay (default: ' + + '{G}%d sec{W})' % self.config.wep_restart_aircrack)) + wep.add_argument('-weprc', help=argparse.SUPPRESS, action='store', + dest='wep_restart_aircrack', type=int) wep.add_argument('--arpreplay', action='store_true', dest='wep_attack_replay', help=self._verbose('Use ARP-replay WEP attack (default: {G}on{W})')) - wep.add_argument('-arpreplay', help=argparse.SUPPRESS, action='store_true', dest='wep_attack_replay') + wep.add_argument('-arpreplay', help=argparse.SUPPRESS, action='store_true', + dest='wep_attack_replay') wep.add_argument('--fragment', action='store_true', dest='wep_attack_fragment', help=self._verbose('Use fragmentation WEP attack (default: {G}on{W})')) - wep.add_argument('-fragment', help=argparse.SUPPRESS, action='store_true', dest='wep_attack_fragment') + wep.add_argument('-fragment', help=argparse.SUPPRESS, action='store_true', + dest='wep_attack_fragment') wep.add_argument('--chopchop', action='store_true', dest='wep_attack_chopchop', help=self._verbose('Use chop-chop WEP attack (default: {G}on{W})')) - wep.add_argument('-chopchop', help=argparse.SUPPRESS, action='store_true', dest='wep_attack_chopchop') + wep.add_argument('-chopchop', help=argparse.SUPPRESS, action='store_true', + dest='wep_attack_chopchop') wep.add_argument('--caffelatte', action='store_true', dest='wep_attack_caffe', help=self._verbose('Use caffe-latte WEP attack (default: {G}on{W})')) - wep.add_argument('-caffelatte', help=argparse.SUPPRESS, action='store_true', dest='wep_attack_caffelatte') + wep.add_argument('-caffelatte', help=argparse.SUPPRESS, action='store_true', + dest='wep_attack_caffelatte') wep.add_argument('--p0841', action='store_true', dest='wep_attack_p0841', help=self._verbose('Use p0841 WEP attack (default: {G}on{W})')) - wep.add_argument('-p0841', help=argparse.SUPPRESS, action='store_true', dest='wep_attack_p0841') + wep.add_argument('-p0841', help=argparse.SUPPRESS, action='store_true', + dest='wep_attack_p0841') wep.add_argument('--hirte', action='store_true', dest='wep_attack_hirte', help=self._verbose('Use ARP-replay WEP attack (default: {G}on{W})')) - wep.add_argument('-hirte', help=argparse.SUPPRESS, action='store_true', dest='wep_attack_hirte') + wep.add_argument('-hirte', help=argparse.SUPPRESS, action='store_true', + dest='wep_attack_hirte') def _add_wpa_args(self, wpa): @@ -262,42 +289,53 @@ class Arguments(object): action='store_true', dest='wpa_filter', 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', action='store', dest='wpa_deauth_timeout', metavar='[seconds]', type=int, - help=self._verbose('Time to wait between sending Deauths (default: {G}%d sec{W})' % self.config.wpa_deauth_timeout)) - wpa.add_argument('-wpadt', help=argparse.SUPPRESS, action='store', dest='wpa_deauth_timeout', type=int) + help=self._verbose('Time to wait between sending Deauths ' + + '(default: {G}%d sec{W})' % self.config.wpa_deauth_timeout)) + wpa.add_argument('-wpadt', help=argparse.SUPPRESS, action='store', + dest='wpa_deauth_timeout', type=int) wpa.add_argument('--wpat', action='store', dest='wpa_attack_timeout', metavar='[seconds]', type=int, - help=self._verbose('Time to wait before failing WPA attack (default: {G}%d sec{W})' % self.config.wpa_attack_timeout)) - wpa.add_argument('-wpat', help=argparse.SUPPRESS, action='store', dest='wpa_attack_timeout', type=int) + help=self._verbose('Time to wait before failing WPA attack ' + + '(default: {G}%d sec{W})' % self.config.wpa_attack_timeout)) + wpa.add_argument('-wpat', help=argparse.SUPPRESS, action='store', + dest='wpa_attack_timeout', type=int) wpa.add_argument('--pmkid', - '-pmkid', action='store_true', dest='use_pmkid_only', - help=Color.s('ONLY use PMKID capture on WPA endpoints (default: {G}off{W})')) + help=Color.s('ONLY use PMKID capture on non-WEP networks ' + + '(default: {G}off{W})')) + # Alias + wpa.add_argument('-pmkid', action='store_true', dest='use_pmkid_only', + help=argparse.SUPPRESS) wpa.add_argument('--new-hs', action='store_true', dest='ignore_old_handshakes', - help=Color.s('Captures new handshakes, ignores existing handshakes in ./hs (default: {G}off{W})')) + help=Color.s('Captures new handshakes, ignores existing handshakes ' + + 'in ./hs (default: {G}off{W})')) wpa.add_argument('--hs-dir', action='store', dest='wpa_handshake_dir', metavar='[dir]', type=str, - help=self._verbose('Directory to store handshake files (default: {G}%s{W})' % self.config.wpa_handshake_dir)) - wpa.add_argument('-hs-dir', help=argparse.SUPPRESS, action='store', dest='wpa_handshake_dir', type=str) + help=self._verbose('Directory to store handshake files ' + + '(default: {G}%s{W})' % self.config.wpa_handshake_dir)) + wpa.add_argument('-hs-dir', help=argparse.SUPPRESS, action='store', + dest='wpa_handshake_dir', type=str) wpa.add_argument('--dict', action='store', @@ -315,7 +353,8 @@ class Arguments(object): default=False, help=Color.s('Strip unnecessary packets from handshake capture using tshark')) ''' - wpa.add_argument('-strip', help=argparse.SUPPRESS, action='store_true', dest='wpa_strip_handshake') + wpa.add_argument('-strip', help=argparse.SUPPRESS, action='store_true', + dest='wpa_strip_handshake') def _add_wps_args(self, wps): @@ -323,26 +362,37 @@ class Arguments(object): action='store_true', dest='wps_filter', 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('--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})')) - # Alias - wps.add_argument('-bully', help=argparse.SUPPRESS, action='store_true', dest='use_bully') + wps.add_argument('-wps', help=argparse.SUPPRESS, action='store_true', + dest='wps_filter') wps.add_argument('--no-wps', action='store_true', dest='no_wps', - help=Color.s('{O}NEVER{W} use WPS attacks (Pixie-Dust) on non-WEP networks (default: {G}off{W})')) + help=Color.s('{O}NEVER{W} use WPS {O}PIN{W} & {O}Pixie-Dust{W} attacks ' + + 'on targets (default: {G}off{W})')) wps.add_argument('--wps-only', action='store_true', dest='wps_only', - help=Color.s('{G}ALWAYS{W} use WPS attacks (Pixie-Dust) on non-WEP networks (default: {G}off{W})')) + help=Color.s('{G}ONLY{W} use WPS {C}PIN{W} & {C}Pixie-Dust{W} ' + + 'attacks (default: {G}off{W})')) + + wps.add_argument('--pixie', action='store_true', dest='wps_pixie', + help=self._verbose('{G}ONLY{W} use WPS {C}Pixie-Dust{W} attack ' + + '(do not use {O}PIN attack{W})')) + + wps.add_argument('--no-pixie', action='store_true', dest='wps_no_pixie', + help=self._verbose('{O}NEVER{W} use WPS {O}Pixie-Dust{W} attack ' + + '(use {G}PIN attack{W})')) + + wps.add_argument('--bully', + action='store_true', + dest='use_bully', + help=Color.s('Use {G}bully{W} for WPS PIN & Pixie-Dust attacks ' + + '(default: {G}reaver{W})')) # Alias - wps.add_argument('--pixie', help=argparse.SUPPRESS, action='store_true', dest='wps_only') + wps.add_argument('-bully', help=argparse.SUPPRESS, action='store_true', + dest='use_bully') # Time limit on entire attack. wps.add_argument('--wps-time', @@ -350,9 +400,11 @@ class Arguments(object): dest='wps_pixie_timeout', metavar='[sec]', type=int, - help=self._verbose('Total time to wait before failing PixieDust attack (default: {G}%d sec{W})' % self.config.wps_pixie_timeout)) + help=self._verbose('Total time to wait before failing PixieDust attack ' + + '(default: {G}%d sec{W})' % self.config.wps_pixie_timeout)) # Alias - wps.add_argument('-wpst', help=argparse.SUPPRESS, action='store', dest='wps_pixie_timeout', type=int) + wps.add_argument('-wpst', help=argparse.SUPPRESS, action='store', + dest='wps_pixie_timeout', type=int) # Maximum number of 'failures' (WPSFail) wps.add_argument('--wps-fails', @@ -360,9 +412,11 @@ class Arguments(object): dest='wps_fail_threshold', metavar='[num]', type=int, - help=self._verbose('Maximum number of WPSFail/NoAssoc errors before failing (default: {G}%d{W})' % self.config.wps_fail_threshold)) + help=self._verbose('Maximum number of WPSFail/NoAssoc errors before ' + + 'failing (default: {G}%d{W})' % self.config.wps_fail_threshold)) # Alias - wps.add_argument('-wpsf', help=argparse.SUPPRESS, action='store', dest='wps_fail_threshold', type=int) + wps.add_argument('-wpsf', help=argparse.SUPPRESS, action='store', + dest='wps_fail_threshold', type=int) # Maximum number of 'timeouts' wps.add_argument('--wps-timeouts', @@ -370,9 +424,11 @@ class Arguments(object): dest='wps_timeout_threshold', metavar='[num]', type=int, - help=self._verbose('Maximum number of Timeouts before failing (default: {G}%d{W})' % self.config.wps_timeout_threshold)) + help=self._verbose('Maximum number of Timeouts before failing ' + + '(default: {G}%d{W})' % self.config.wps_timeout_threshold)) # Alias - wps.add_argument('-wpsto', help=argparse.SUPPRESS, action='store', dest='wps_timeout_threshold', type=int) + wps.add_argument('-wpsto', help=argparse.SUPPRESS, action='store', + dest='wps_timeout_threshold', type=int) def _add_command_args(self, commands): @@ -380,7 +436,8 @@ class Arguments(object): action='store_true', dest='cracked', help=Color.s('Display previously-cracked access points')) - commands.add_argument('-cracked', help=argparse.SUPPRESS, action='store_true', dest='cracked') + commands.add_argument('-cracked', help=argparse.SUPPRESS, action='store_true', + dest='cracked') commands.add_argument('--check', action='store', @@ -389,7 +446,8 @@ class Arguments(object): const='', dest='check_handshake', help=Color.s('Check a .cap file (or all hs/*.cap files) for WPA handshakes')) - commands.add_argument('-check', help=argparse.SUPPRESS, action='store', nargs='?', const='', dest='check_handshake') + commands.add_argument('-check', help=argparse.SUPPRESS, action='store', + nargs='?', const='', dest='check_handshake') commands.add_argument('--crack', action='store_true', diff --git a/wifite/config.py b/wifite/config.py index e5e5524..e33fe2d 100755 --- a/wifite/config.py +++ b/wifite/config.py @@ -35,7 +35,6 @@ class Configuration(object): cls.kill_conflicting_processes = False cls.scan_time = 0 # Time to wait before attacking all targets - cls.all_targets = False # Run attacks against all targets automatically cls.tx_power = 0 # Wifi transmit power (0 is default) cls.interface = None @@ -102,6 +101,8 @@ class Configuration(object): cls.no_wps = False # Do not use WPS attacks (Pixie-Dust & PIN attacks) cls.wps_only = False # ONLY use WPS attacks on non-WEP networks cls.use_bully = False # Use bully instead of reaver + cls.wps_pixie = True + cls.wps_pin = True cls.wps_pixie_timeout = 300 # Seconds to wait for PIN before WPS Pixie attack fails cls.wps_fail_threshold = 100 # Max number of failures cls.wps_timeout_threshold = 100 # Max number of timeouts @@ -127,58 +128,17 @@ class Configuration(object): if cls.random_mac: Macchanger.random() - @staticmethod - def get_wireless_interface(): - pass - @classmethod def load_from_arguments(cls): ''' Sets configuration values based on Argument.args object ''' from .args import Arguments args = Arguments(cls).args - if args.random_mac: - cls.random_mac = True - Color.pl('{+} {C}option:{W} using {G}random mac address{W} when scanning & attacking') - if args.channel: - cls.target_channel = args.channel - Color.pl('{+} {C}option:{W} scanning for targets on channel {G}%s{W}' % args.channel) - if args.interface: - cls.interface = args.interface - Color.pl('{+} {C}option:{W} using wireless interface {G}%s{W}' % args.interface) - if args.target_bssid: - cls.target_bssid = args.target_bssid - Color.pl('{+} {C}option:{W} targeting BSSID {G}%s{W}' % args.target_bssid) - if args.five_ghz == True: - cls.five_ghz = True - Color.pl('{+} {C}option:{W} including {G}5Ghz networks{W} in scans') - if args.show_bssids == True: - cls.show_bssids = True - Color.pl('{+} {C}option:{W} showing {G}bssids{W} of targets during scan') - if args.no_deauth == True: - cls.no_deauth = True - Color.pl('{+} {C}option:{W} will {R}not{W} {O}deauth{W} clients during scans or captures') - if args.num_deauths and args.num_deauths > 0: - cls.num_deauths = args.num_deauths - Color.pl('{+} {C}option:{W} will send {G}%d{W} deauth packets when deauthing' % cls.num_deauths) - if args.target_essid: - cls.target_essid = args.target_essid - Color.pl('{+} {C}option:{W} targeting ESSID {G}%s{W}' % args.target_essid) - if args.ignore_essid is not None: - cls.ignore_essid = args.ignore_essid - Color.pl('{+} {C}option:{W} {O}ignoring ESSIDs that include {R}%s{W}' % args.ignore_essid) - if args.clients_only == True: - cls.clients_only = True - Color.pl('{+} {C}option:{W} {O}ignoring targets that do not have associated clients') - if args.scan_time: - cls.scan_time = args.scan_time - Color.pl('{+} {C}option:{W} ({G}pillage{W}) attack all targets after {G}%d{W}s' % args.scan_time) - if args.verbose: - cls.verbose = args.verbose - Color.pl('{+} {C}option:{W} verbosity level {G}%d{W}' % args.verbose) - if args.kill_conflicting_processes: - cls.kill_conflicting_processes = True - Color.pl('{+} {C}option:{W} kill conflicting processes {G}enabled{W}') + cls.parse_settings_args(args) + cls.parse_wep_args(args) + cls.parse_wpa_args(args) + cls.parse_wps_args(args) + cls.parse_encryption() # EvilTwin ''' @@ -187,34 +147,130 @@ class Configuration(object): Color.pl('{+} {C}option:{W} using {G}eviltwin attacks{W} against all targets') ''' - # WEP + # Adjust WEP attack list + cls.parse_wep_attacks() + + # Commands + if args.cracked: cls.show_cracked = True + if args.check_handshake: cls.check_handshake = args.check_handshake + if args.crack_handshake: cls.crack_handshake = True + + + @classmethod + def parse_settings_args(cls, args): + '''Parses basic settings/configurations from arguments.''' + if args.random_mac: + cls.random_mac = True + Color.pl('{+} {C}option:{W} using {G}random mac address{W} ' + + 'when scanning & attacking') + + if args.channel: + cls.target_channel = args.channel + Color.pl('{+} {C}option:{W} scanning for targets on channel ' + + '{G}%s{W}' % args.channel) + + if args.interface: + cls.interface = args.interface + Color.pl('{+} {C}option:{W} using wireless interface ' + + '{G}%s{W}' % args.interface) + + if args.target_bssid: + cls.target_bssid = args.target_bssid + Color.pl('{+} {C}option:{W} targeting BSSID ' + + '{G}%s{W}' % args.target_bssid) + + if args.five_ghz == True: + cls.five_ghz = True + Color.pl('{+} {C}option:{W} including {G}5Ghz networks{W} in scans') + + if args.show_bssids == True: + cls.show_bssids = True + Color.pl('{+} {C}option:{W} showing {G}bssids{W} of targets during scan') + + if args.no_deauth == True: + cls.no_deauth = True + Color.pl('{+} {C}option:{W} will {R}not{W} {O}deauth{W} clients ' + + 'during scans or captures') + + if args.num_deauths and args.num_deauths > 0: + cls.num_deauths = args.num_deauths + Color.pl('{+} {C}option:{W} send {G}%d{W} deauth packets when deauthing' % ( + cls.num_deauths)) + + if args.target_essid: + cls.target_essid = args.target_essid + Color.pl('{+} {C}option:{W} targeting ESSID {G}%s{W}' % args.target_essid) + + if args.ignore_essid is not None: + cls.ignore_essid = args.ignore_essid + Color.pl('{+} {C}option:{W} {O}ignoring ESSIDs that include {R}%s{W}' % ( + args.ignore_essid)) + + if args.clients_only == True: + cls.clients_only = True + Color.pl('{+} {C}option:{W} {O}ignoring targets that do not have ' + + 'associated clients') + + if args.scan_time: + cls.scan_time = args.scan_time + Color.pl('{+} {C}option:{W} ({G}pillage{W}) attack all targets ' + + 'after {G}%d{W}s' % args.scan_time) + + if args.verbose: + cls.verbose = args.verbose + Color.pl('{+} {C}option:{W} verbosity level {G}%d{W}' % args.verbose) + + if args.kill_conflicting_processes: + cls.kill_conflicting_processes = True + Color.pl('{+} {C}option:{W} kill conflicting processes {G}enabled{W}') + + + @classmethod + def parse_wep_args(cls, args): + '''Parses WEP-specific arguments''' if args.wep_filter: cls.wep_filter = args.wep_filter + if args.wep_pps: cls.wep_pps = args.wep_pps - Color.pl('{+} {C}option:{W} using {G}%d{W} packets-per-second on WEP attacks' % args.wep_pps) + Color.pl('{+} {C}option:{W} using {G}%d{W} packets/sec on WEP attacks' % ( + args.wep_pps)) + if args.wep_timeout: cls.wep_timeout = args.wep_timeout - Color.pl('{+} {C}option:{W} WEP attack timeout set to {G}%d seconds{W}' % args.wep_timeout) + Color.pl('{+} {C}option:{W} WEP attack timeout set to ' + + '{G}%d seconds{W}' % args.wep_timeout) + if args.require_fakeauth: cls.require_fakeauth = True - Color.pl('{+} {C}option:{W} fake-authentication is {G}required{W} for WEP attacks') + Color.pl('{+} {C}option:{W} fake-authentication is ' + + '{G}required{W} for WEP attacks') + if args.wep_crack_at_ivs: cls.wep_crack_at_ivs = args.wep_crack_at_ivs - Color.pl('{+} {C}option:{W} will start cracking WEP keys at {G}%d IVs{W}' % args.wep_crack_at_ivs) + Color.pl('{+} {C}option:{W} will start cracking WEP keys at ' + + '{G}%d IVs{W}' % args.wep_crack_at_ivs) + if args.wep_restart_stale_ivs: cls.wep_restart_stale_ivs = args.wep_restart_stale_ivs - Color.pl('{+} {C}option:{W} will restart aireplay after {G}%d seconds{W} of no new IVs' % args.wep_restart_stale_ivs) + Color.pl('{+} {C}option:{W} will restart aireplay after ' + + '{G}%d seconds{W} of no new IVs' % args.wep_restart_stale_ivs) + if args.wep_restart_aircrack: cls.wep_restart_aircrack = args.wep_restart_aircrack - Color.pl('{+} {C}option:{W} will restart aircrack every {G}%d seconds{W}' % args.wep_restart_aircrack) + Color.pl('{+} {C}option:{W} will restart aircrack every ' + + '{G}%d seconds{W}' % args.wep_restart_aircrack) + if args.wep_keep_ivs: cls.wep_keep_ivs = args.wep_keep_ivs Color.pl('{+} {C}option:{W} keep .ivs files across multiple WEP attacks') - # WPA + @classmethod + def parse_wpa_args(cls, args): + '''Parses WPA-specific arguments''' if args.wpa_filter: cls.wpa_filter = args.wpa_filter + if args.wordlist: if os.path.exists(args.wordlist): cls.wordlist = args.wordlist @@ -222,48 +278,91 @@ class Configuration(object): else: cls.wordlist = None Color.pl('{+} {C}option:{O} wordlist {R}%s{O} was not found, wifite will NOT attempt to crack handshakes' % args.wordlist) + if args.wpa_deauth_timeout: cls.wpa_deauth_timeout = args.wpa_deauth_timeout - Color.pl('{+} {C}option:{W} will deauth WPA clients every {G}%d seconds{W}' % args.wpa_deauth_timeout) + Color.pl('{+} {C}option:{W} will deauth WPA clients every ' + + '{G}%d seconds{W}' % args.wpa_deauth_timeout) + if args.wpa_attack_timeout: cls.wpa_attack_timeout = args.wpa_attack_timeout - Color.pl('{+} {C}option:{W} will stop WPA handshake capture after {G}%d seconds{W}' % args.wpa_attack_timeout) + Color.pl('{+} {C}option:{W} will stop WPA handshake capture after ' + + '{G}%d seconds{W}' % args.wpa_attack_timeout) + if args.ignore_old_handshakes: cls.ignore_old_handshakes = True - Color.pl('{+} {C}option:{W} will {O}ignore{W} existing handshakes (force capture)') + Color.pl('{+} {C}option:{W} will {O}ignore{W} existing handshakes ' + + '(force capture)') + if args.use_pmkid_only: cls.use_pmkid_only = True Color.pl('{+} {C}option:{W} will ONLY use {C}PMKID{W} attack on WPA networks') + if args.wpa_handshake_dir: cls.wpa_handshake_dir = args.wpa_handshake_dir - Color.pl('{+} {C}option:{W} will store handshakes to {G}%s{W}' % args.wpa_handshake_dir) + Color.pl('{+} {C}option:{W} will store handshakes to ' + + '{G}%s{W}' % args.wpa_handshake_dir) + if args.wpa_strip_handshake: cls.wpa_strip_handshake = True Color.pl('{+} {C}option:{W} will {G}strip{W} non-handshake packets') - # WPS + @classmethod + def parse_wps_args(cls, args): + '''Parses WPS-specific arguments''' if args.wps_filter: cls.wps_filter = args.wps_filter + if args.wps_only: cls.wps_only = True - Color.pl('{+} {C}option:{W} will *only* attack non-WEP networks with {G}WPS attacks{W} (no handshake capture)') + Color.pl('{+} {C}option:{W} will *only* attack non-WEP networks with ' + + '{G}WPS attacks{W} (avoids handshake and PMKID)') + if args.no_wps: + # No WPS attacks at all cls.no_wps = args.no_wps - Color.pl('{+} {C}option:{W} will {O}never{W} use {C}WPS attacks{W} (Pixie-Dust/PIN) on targets') + cls.wps_pixie = False + cls.wps_pin = False + Color.pl('{+} {C}option:{W} will {O}never{W} use {C}WPS attacks{W} ' + + '(Pixie-Dust/PIN) on targets') + + elif args.wps_pixie: + # WPS Pixie-Dust only + cls.wps_pixie = True + cls.wps_pin = False + Color.pl('{+} {C}option:{W} will {G}only{W} use {C}WPS Pixie-Dust ' + + 'attack{W} (no {O}PIN{W}) on targets') + + elif args.wps_no_pixie: + # WPS PIN only + cls.wps_pixie = False + cls.wps_pin = True + Color.pl('{+} {C}option:{W} will {G}only{W} use {C}WPS PIN attack{W} ' + + '(no {O}Pixie-Dust{W}) on targets') + if args.use_bully: cls.use_bully = args.use_bully - Color.pl('{+} {C}option:{W} use {C}bully{W} instead of {C}reaver{W} for WPS Attacks') + Color.pl('{+} {C}option:{W} use {C}bully{W} instead of {C}reaver{W} ' + + 'for WPS Attacks') + if args.wps_pixie_timeout: cls.wps_pixie_timeout = args.wps_pixie_timeout - Color.pl('{+} {C}option:{W} WPS pixie-dust attack will fail after {O}%d seconds{W}' % args.wps_pixie_timeout) + Color.pl('{+} {C}option:{W} WPS pixie-dust attack will fail after ' + + '{O}%d seconds{W}' % args.wps_pixie_timeout) + if args.wps_fail_threshold: cls.wps_fail_threshold = args.wps_fail_threshold - Color.pl('{+} {C}option:{W} will stop WPS attack after {O}%d failures{W}' % args.wps_fail_threshold) + Color.pl('{+} {C}option:{W} will stop WPS attack after ' + + '{O}%d failures{W}' % args.wps_fail_threshold) + if args.wps_timeout_threshold: cls.wps_timeout_threshold = args.wps_timeout_threshold - Color.pl('{+} {C}option:{W} will stop WPS attack after {O}%d timeouts{W}' % args.wps_timeout_threshold) + Color.pl('{+} {C}option:{W} will stop WPS attack after ' + + '{O}%d timeouts{W}' % args.wps_timeout_threshold) - # Adjust encryption filter + @classmethod + def parse_encryption(cls): + '''Adjusts encryption filter (WEP and/or WPA and/or WPS)''' cls.encryption_filter = [] if cls.wep_filter: cls.encryption_filter.append('WEP') if cls.wpa_filter: cls.encryption_filter.append('WPA') @@ -279,7 +378,9 @@ class Configuration(object): 'targeting {G}%s-encrypted{W} networks' % '/'.join(cls.encryption_filter)) - # Adjust WEP attack list + @classmethod + def parse_wep_attacks(cls): + '''Parses and sets WEP-specific args (-chopchop, -fragment, etc)''' cls.wep_attacks = [] import sys seen = set() @@ -296,20 +397,16 @@ class Configuration(object): if len(cls.wep_attacks) == 0: # Use all attacks cls.wep_attacks = ['replay', - 'fragment', - 'chopchop', - 'caffelatte', - 'p0841', - 'hirte'] + 'fragment', + 'chopchop', + 'caffelatte', + 'p0841', + 'hirte' + ] elif len(cls.wep_attacks) > 0: Color.pl('{+} {C}option:{W} using {G}%s{W} WEP attacks' % '{W}, {G}'.join(cls.wep_attacks)) - # Commands - if args.cracked: cls.show_cracked = True - if args.check_handshake: cls.check_handshake = args.check_handshake - if args.crack_handshake: cls.crack_handshake = True - @classmethod def temp(cls, subfile=''): @@ -371,7 +468,7 @@ class Configuration(object): result += Color.s('{W}%s------------------{W}\n' % ('-' * max_len)) for (key,val) in sorted(cls.__dict__.items()): - if key.startswith('__') or type(val) == staticmethod or val is None: + if key.startswith('__') or type(val) in [classmethod, staticmethod] or val is None: continue result += Color.s('{G}%s {W} {C}%s{W}\n' % (key.ljust(max_len),val)) return result