From 95b7296444f56b704b5d4f2433307300e4ccc50f Mon Sep 17 00:00:00 2001 From: derv82 Date: Tue, 4 Aug 2015 22:05:16 -0700 Subject: [PATCH] Verbose mode, colored help, highlighted error trace --- Wifite.py | 24 +++++++------ py/Airmon.py | 17 +++++---- py/Arguments.py | 88 +++++++++++++++++++++++---------------------- py/Configuration.py | 5 +++ 4 files changed, 75 insertions(+), 59 deletions(-) diff --git a/Wifite.py b/Wifite.py index 6a3b7f6..07a1cfc 100755 --- a/Wifite.py +++ b/Wifite.py @@ -131,16 +131,13 @@ class Wifite(object): """ Displays ASCII art of the highest caliber. """ Color.pl("") Color.pl("{G} .;' `;, ") - Color.pl("{G} .;' ,;' `;, `;, " + - "{W}WiFite v%.2f" % Configuration.version) + Color.pl("{G} .;' ,;' `;, `;, {W}WiFite v%.2f" % Configuration.version) Color.pl("{G}.;' ,;' ,;' `;, `;, `;, ") - Color.pl("{G}:: :: : {GR}( ){G} : :: :: " + - "{W}automated wireless auditor") + Color.pl("{G}:: :: : {GR}( ){G} : :: :: {W}Automated Wireless Auditor") Color.pl("{G}':. ':. ':. {GR}/_\\{G} ,:' ,:' ,:' ") - Color.pl("{G} ':. ':. {GR}/___\\{G} ,:' ,:' " + - "{W}designed for Linux") + Color.pl("{G} ':. ':. {GR}/___\\{G} ,:' ,:' {C}https://github.com/derv82/wifite2{W}") Color.pl("{G} ':. {GR}/_____\\{G} ,:' ") - Color.pl("{G} {GR}/ \\{G} ") + Color.pl("{G} {GR}/ \\{G} ") Color.pl("{W}") @@ -175,9 +172,16 @@ if __name__ == '__main__': w.main() except Exception, e: Color.pl('\n{!} {R}Error:{O} %s{W}' % str(e)) - from traceback import format_exc - print '\n ' - print format_exc().replace('\n', '\n ') + if Configuration.verbose > 0: + Color.pl('\n{!} {O}Full stack trace below') + from traceback import format_exc + Color.p('\n{!} ') + err = format_exc().strip() + err = err.replace('\n', '\n{!} {C} ') + err = err.replace(' File', '{W}File') + err = err.replace(' Exception: ', '{R}Exception: {O}') + Color.pl(err) + Color.pl('\n{!} {R}Exiting{W}\n') except KeyboardInterrupt: Color.pl('\n{!} {O}interrupted{W}') Configuration.exit_gracefully(0) diff --git a/py/Airmon.py b/py/Airmon.py index b222de1..b462e5d 100644 --- a/py/Airmon.py +++ b/py/Airmon.py @@ -179,19 +179,22 @@ class Airmon(object): % iface); return iface + a = Airmon() + count = len(a.interfaces) + if count == 0: + # No interfaces found + Color.pl('\n{!} {O}airmon-ng did not find {R}any{O} wireless interfaces') + Color.pl('{!} {O}make sure your wireless device is connected') + Color.pl('{!} {O}see {C}http://www.aircrack-ng.org/doku.php?id=airmon-ng{O} for more info{W}') + raise Exception('airmon-ng did not find any wireless interfaces') + Color.pl('') - a = Airmon() a.print_menu() Color.pl('') - count = len(a.interfaces) - if count == 0: - # No interfaces found - Color.pl('{!} {O}airmon-ng did not find {R}any{O} wireless interfaces') - raise Exception('airmon-ng did not find any wireless interfaces') - elif count == 1: + if count == 1: # Only one interface, assume this is the one to use choice = 1 else: diff --git a/py/Arguments.py b/py/Arguments.py index 16beb35..789c432 100644 --- a/py/Arguments.py +++ b/py/Arguments.py @@ -1,6 +1,7 @@ #!/usr/bin/python import argparse +from Color import Color class Arguments(object): ''' Holds arguments used by the Wifite ''' @@ -10,11 +11,8 @@ class Arguments(object): def get_arguments(self, Configuration): ''' Returns parser.args() containing all program arguments ''' - description = 'Wrapper script around aircrack-ng and reaver' - description += ' https://github.com/derv82/wifite2' - parser = argparse.ArgumentParser( - description=description, - usage=argparse.SUPPRESS) + parser = argparse.ArgumentParser(usage=argparse.SUPPRESS, + formatter_class=lambda prog: argparse.HelpFormatter(prog, max_help_position=80, width=130)) # Global variables glob = parser.add_argument_group('SETTINGS') @@ -23,129 +21,135 @@ class Arguments(object): dest='interface', metavar='[interface]', type=str, - help='Wireless interface to use (default: ask)') + help=Color.s('Wireless interface to use (default: {G}ask{W})')) glob.add_argument('-c', action='store', dest='channel', metavar='[channel]', type=int, - help='Wireless channel to scan (default: all channels)') + help=Color.s('Wireless channel to scan (default: {G}all channels{W})')) glob.add_argument('-b', action='store', dest='target_bssid', metavar='[bssid]', type=str, - help='BSSID (e.g. AA:BB:CC:DD:EE:FF) of access point to attack') + help=Color.s('BSSID (e.g. {GR}AA:BB:CC:DD:EE:FF{W}) of access point to attack')) glob.add_argument('-e', action='store', dest='target_essid', metavar='[essid]', type=str, - help='ESSID (name) of access point to attack') + help=Color.s('ESSID (name) of access point to attack')) + glob.add_argument('-v', + '--verbose', + action='count', + default=0, + dest='verbose', + help=Color.s('Verbose mode, prints more lines (default: {G}quiet{W})')) # WEP wep = parser.add_argument_group('WEP-RELATED') wep.add_argument('--wep', action='store_true', dest='wep_filter', - help='Filter to display WEP-encrypted networks (default: off)') + help=Color.s('Filter to display WEP-encrypted networks (default: {G}off{W})')) wep.add_argument('--require-fakeauth', action='store_true', dest='require_fakeauth', - help='Fails attacks if fake-auth fails (default: off)') + help=Color.s('Fails attacks if fake-auth fails (default: {G}off{W})')) wep.add_argument('-pps', action='store', dest='wep_pps', metavar='[pps]', type=int, - help='Packets Per Second to replay (default: %d pps)' + help=Color.s('Packets Per Second to replay (default: {G}%d pps{W})') % Configuration.wep_pps) wep.add_argument('-wept', action='store', dest='wep_timeout', metavar='[seconds]', type=int, - help='Seconds to wait before failing (default: %d ivs)' + help=Color.s('Seconds to wait before failing (default: {G}%d ivs{W})') % Configuration.wep_timeout) wep.add_argument('-wepc', action='store', dest='wep_crack_at_ivs', metavar='[ivs]', type=int, - help='Start cracking at this many IVs (default: %d ivs)' + help=Color.s('Start cracking at this many IVs (default: {G}%d ivs{W})') % Configuration.wep_crack_at_ivs) wep.add_argument('-weprs', action='store', dest='wep_restart_stale_ivs', metavar='[seconds]', type=int, - help='Restart aireplay if no new IVs appear (default: %ds)' + help=Color.s('Restart aireplay if no new IVs appear (default: {G}%d sec{W})') % Configuration.wep_restart_stale_ivs) wep.add_argument('-weprc', action='store', dest='wep_restart_aircrack', metavar='[seconds]', type=int, - help='Restart aircrack after this delay (default: %ds)' + help=Color.s('Restart aircrack after this delay (default: {G}%d sec{W})') % Configuration.wep_restart_aircrack) wep.add_argument('-arpreplay', action='store_true', dest='wep_attack_replay', - help='use ARP-replay WEP attack (default: on)') + help=Color.s('Use ARP-replay WEP attack (default: {G}on{W})')) wep.add_argument('-fragment', action='store_true', dest='wep_attack_fragment', - help='use fragmentation WEP attack (default: on)') + help=Color.s('Use fragmentation WEP attack (default: {G}on{W})')) wep.add_argument('-chopchop', action='store_true', dest='wep_attack_chopchop', - help='use chop-chop WEP attack (default: on)') + help=Color.s('Use chop-chop WEP attack (default: {G}on{W})')) wep.add_argument('-caffelatte', action='store_true', dest='wep_attack_caffe', - help='use caffe-latte WEP attack (default: on)') + help=Color.s('Use caffe-latte WEP attack (default: {G}on{W})')) wep.add_argument('-p0841', action='store_true', dest='wep_attack_p0841', - help='use p0841 WEP attack (default: on)') + help=Color.s('Use p0841 WEP attack (default: {G}on{W})')) wep.add_argument('-hirte', action='store_true', dest='wep_attack_hirte', - help='use ARP-replay WEP attack (default: on)') + help=Color.s('Use ARP-replay WEP attack (default: {G}on{W})')) # WPA wpa = parser.add_argument_group('WPA-RELATED') wpa.add_argument('--wpa', action='store_true', dest='wpa_filter', - help='Filter to display WPA-encrypted networks (includes WPS)') + help=Color.s('Filter to display WPA-encrypted networks (includes WPS)')) wpa.add_argument('-wpadt', action='store', dest='wpa_deauth_timeout', metavar='[seconds]', type=int, - help='Time to wait before failing a Deauth (default: %ds)' + help=Color.s('Time to wait before failing a Deauth (default: {G}%d sec{W})') % Configuration.wpa_deauth_timeout) wpa.add_argument('-wpat', action='store', dest='wpa_attack_timeout', metavar='[seconds]', type=int, - help='Time to wait before failing WPA attack (default: %ds)' + help=Color.s('Time to wait before failing WPA attack (default: {G}%d sec{W})') % Configuration.wpa_attack_timeout) wpa.add_argument('-hs', action='store', dest='wpa_handshake_dir', metavar='[dir]', type=str, - help='Directory to store handshake files (default: %s)' + help=Color.s('Directory to store handshake files (default: {G}%s{W})') % Configuration.wpa_handshake_dir) wpa.add_argument('--dict', action='store', dest='wordlist', metavar='[file]', type=str, - help='File containing passwords for cracking (default: %s)' + help=Color.s('File containing passwords for cracking (default: {G}%s{W})') % Configuration.wordlist) # WPS @@ -153,86 +157,86 @@ class Arguments(object): wps.add_argument('--wps', action='store_true', dest='wps_filter', - help='Filter to display WPS-enabled networks') + help=Color.s('Filter to display WPS-enabled networks')) wps.add_argument('--reaver', action='store_true', dest='reaver_only', - help='ONLY use Reaver on WPS networks (default: off)') + help=Color.s('ONLY use Reaver on WPS networks (default: {G}off{W})')) wps.add_argument('--no-reaver', action='store_true', dest='no_reaver', - help='Do NOT use Reaver on WPS networks (default: off)') + help=Color.s('Do NOT use Reaver on WPS networks (default: {G}off{W})')) wps.add_argument('--pixie', action='store_true', dest='pixie_only', - help='Only use the WPS Pixie-Dust attack (default: off)') + help=Color.s('Only use the WPS Pixie-Dust attack (default: {G}off{W})')) wps.add_argument('--pixiet', action='store', dest='wps_pixie_timeout', metavar='[seconds]', type=int, - help='Time to wait before stopping PixieDust (default: %ds)' + help=Color.s('Time to wait before stopping PixieDust (default: {G}%d sec{W})') % Configuration.wps_pixie_timeout) wps.add_argument('-wpst', action='store', dest='wps_pin_timeout', metavar='[seconds]', type=int, - help='Time to wait before stopping PIN attack (default: %ds)' + help=Color.s('Time to wait before stopping PIN attack (default: {G}%d sec{W})') % Configuration.wps_pin_timeout) wps.add_argument('-wpsmr', action='store', dest='wps_max_retries', metavar='[retries]', type=int, - help='Maximum number of Retries before stopping (default: %d)' + help=Color.s('Maximum number of Retries before stopping (default: {G}%d{W})') % Configuration.wps_max_retries) wps.add_argument('-wpsmf', action='store', dest='wps_fail_threshold', metavar='[fails]', type=int, - help='Maximum number of Failures before stopping (default: %d)' + help=Color.s('Maximum number of Failures before stopping (default: {G}%d{W})') % Configuration.wps_fail_threshold) wps.add_argument('-wpsmt', action='store', dest='wps_timeout_threshold', metavar='[timeouts]', type=int, - help='Maximum number of Timeouts before stopping (default: %d)' + help=Color.s('Maximum number of Timeouts before stopping (default: {G}%d{W})') % Configuration.wps_timeout_threshold) wps.add_argument('--ignore-ratelimit', action='store_false', dest='wps_ignore_rate_limit', - help='Continues attack if WPS is rate-limited (default: off)') + help=Color.s('Continues attack if WPS is rate-limited (default: {G}off{W})')) # Commands commands = parser.add_argument_group('COMMANDS') commands.add_argument('--cracked', action='store_true', dest='cracked', - help='Display previously-cracked access points') + help=Color.s('Display previously-cracked access points')) commands.add_argument('--check-hs', action='store', metavar='[file]', dest='check_handshake', - help='Check a .cap file for WPA handshakes') + help=Color.s('Check a .cap file for WPA handshakes')) commands.add_argument('--crack-wpa', action='store', type=str, dest='crack_wpa', metavar='[file]', - help='Crack a .cap file containing a WPA handshake') + help=Color.s('Crack a .cap file containing a WPA handshake')) commands.add_argument('--crack-wep', action='store', type=str, dest='crack_wep', metavar='[file]', - help='Crack a .cap file containing WEP IVS') + help=Color.s('Crack a .cap file containing WEP IVS')) commands.add_argument('--update', action='store_true', dest='update', - help='Update to latest version of Wifite (on github)') + help=Color.s('Update to latest version of Wifite (on github)')) return parser.parse_args() diff --git a/py/Configuration.py b/py/Configuration.py index d04332c..97b36c4 100644 --- a/py/Configuration.py +++ b/py/Configuration.py @@ -23,6 +23,8 @@ class Configuration(object): return Configuration.initialized = True + Configuration.verbose = 0 # Verbosity level. + Configuration.tx_power = 0 # Wifi transmit power (0 is default) Configuration.interface = None Configuration.target_channel = None # User-defined channel to scan @@ -114,6 +116,9 @@ class Configuration(object): if args.target_essid: Configuration.target_essid = args.target_essid Color.pl('{+} {C}option:{W} targeting ESSID {G}%s{W}' % args.target_essid) + if args.verbose: + Configuration.verbose = args.verbose + Color.pl('{+} {C}option:{W} verbosity level {G}%d{W}' % args.verbose) # WEP