diff --git a/wifite/attack/all.py b/wifite/attack/all.py index 6fab55a..e1b3e3e 100755 --- a/wifite/attack/all.py +++ b/wifite/attack/all.py @@ -1,6 +1,10 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- +from .wep import AttackWEP +from .wpa import AttackWPA +from .wps import AttackWPS +from .pmkid import AttackPMKID from ..config import Configuration from ..util.color import Color @@ -12,6 +16,10 @@ class AttackAll(object): Attacks all given `targets` (list[wifite.model.target]) until user interruption. Returns: Number of targets that were attacked (int) ''' + if any(t.wps for t in targets) and not AttackWPS.can_attack_wps(): + # Warn that WPS attacks are not available. + Color.pl('{!} {O}Note: WPS attacks are not possible because you do not have {C}reaver{O} nor {C}bully{W}') + attacked_targets = 0 targets_remaining = len(targets) for index, target in enumerate(targets, start=1): @@ -36,10 +44,6 @@ class AttackAll(object): Attacks a single `target` (wifite.model.target). Returns: True if attacks should continue, False otherwise. ''' - from .wep import AttackWEP - from .wpa import AttackWPA - from .wps import AttackWPS - from .pmkid import AttackPMKID attacks = [] @@ -54,7 +58,7 @@ class AttackAll(object): # WPA can have multiple attack vectors: # WPS - if target.wps != False: + if target.wps != False and AttackWPS.can_attack_wps(): if Configuration.wps_pixie: attacks.append(AttackWPS(target, pixie_dust=True)) if Configuration.wps_pin: diff --git a/wifite/attack/wps.py b/wifite/attack/wps.py index 151f81c..7a76061 100755 --- a/wifite/attack/wps.py +++ b/wifite/attack/wps.py @@ -3,9 +3,17 @@ from ..model.attack import Attack from ..util.color import Color +from ..util.process import Process from ..config import Configuration +from ..tools.bully import Bully +from ..tools.reaver import Reaver class AttackWPS(Attack): + + @staticmethod + def can_attack_wps(): + return Reaver.exists() or Bully.exists() + def __init__(self, target, pixie_dust=False): super(AttackWPS, self).__init__(target) self.success = False @@ -36,16 +44,17 @@ class AttackWPS(Attack): self.success = False return False - if Configuration.use_bully: + if Configuration.use_bully and Bully.exists() or not Reaver.exists(): return self.run_bully() - else: + + elif Reaver.exists(): return self.run_reaver() - return False + else: + return False def run_bully(self): - from ..tools.bully import Bully bully = Bully(self.target, pixie_dust=self.pixie_dust) bully.run() bully.stop() @@ -55,8 +64,6 @@ class AttackWPS(Attack): def run_reaver(self): - from ..tools.reaver import Reaver - reaver = Reaver(self.target, pixie_dust=self.pixie_dust) reaver.run() self.crack_result = reaver.crack_result diff --git a/wifite/tools/dependency.py b/wifite/tools/dependency.py index 556a109..c1a11b2 100755 --- a/wifite/tools/dependency.py +++ b/wifite/tools/dependency.py @@ -14,6 +14,12 @@ class Dependency(object): ) + @classmethod + def exists(cls): + from ..util.process import Process + return Process.exists(cls.dependency_name) + + @classmethod def run_dependency_check(cls): from ..util.color import Color diff --git a/wifite/tools/iwconfig.py b/wifite/tools/iwconfig.py index 78103be..e82f56d 100755 --- a/wifite/tools/iwconfig.py +++ b/wifite/tools/iwconfig.py @@ -8,11 +8,6 @@ class Iwconfig(Dependency): dependency_name = 'iwconfig' dependency_url = 'apt-get install wireless-tools' - @classmethod - def exists(cls): - from ..util.process import Process - return Process.exists('iwconfig') - @classmethod def mode(cls, iface, mode_name): diff --git a/wifite/tools/pyrit.py b/wifite/tools/pyrit.py index 9b1531f..90e1692 100755 --- a/wifite/tools/pyrit.py +++ b/wifite/tools/pyrit.py @@ -14,9 +14,6 @@ class Pyrit(Dependency): def __init__(self): pass - @staticmethod - def exists(): - return Process.exists('pyrit') @staticmethod def bssid_essid_with_handshakes(capfile, bssid=None, essid=None): diff --git a/wifite/tools/tshark.py b/wifite/tools/tshark.py index 6ef39a9..867570f 100755 --- a/wifite/tools/tshark.py +++ b/wifite/tools/tshark.py @@ -14,9 +14,6 @@ class Tshark(Dependency): def __init__(self): pass - @staticmethod - def exists(): - return Process.exists('tshark') @staticmethod def _extract_src_dst_index_total(line): @@ -29,6 +26,7 @@ class Tshark(Dependency): (src, dst, index, total) = match.groups() return src, dst, index, total + @staticmethod def _build_target_client_handshake_map(output, bssid=None): # Map of target_ssid,client_ssid -> handshake #s diff --git a/wifite/tools/wash.py b/wifite/tools/wash.py index 743e85e..beac694 100755 --- a/wifite/tools/wash.py +++ b/wifite/tools/wash.py @@ -14,9 +14,6 @@ class Wash(Dependency): def __init__(self): pass - @staticmethod - def exists(): - return Process.exists('wash') @staticmethod def check_for_wps_and_update_targets(capfile, targets): @@ -62,6 +59,7 @@ class Wash(Dependency): else: t.wps = False + if __name__ == '__main__': test_file = './tests/files/contains_wps_network.cap'