So I've made a python program that creates a fake access point by sending lots of beacon frames using Scapy. The program works fine, but i wanted to expand it. I want the program to be able to make multiple fake access points. I tried simple threading but that didn't work out. I tried running the program on 3 different terminals and give each terminal another SSID. That worked fine, but i want my code to do that.
Here's my code:
from scapy.all import Dot11, Dot11Beacon, Dot11Elt, RadioTap, sendp, hexdump
import random, time, sys
class CreateBeacon:
def __init__(self, ssid, number, addr):
#info for frame
self.ssid = ssid
self.number = number
self.addr = addr
self.iface = 'wlan0mon'
#attribute test
#print('ssid: '+self.ssid+"\nnumber given: "+str(self.number)+"\naddress given: "+ self.addr)
#Dot11 layer
self.dot11 = Dot11(type=0, subtype=8,
addr1='ff:ff:ff:ff:ff:ff',
addr2 = addr,
addr3 = addr)
#Beacon layer
self.beacon = Dot11Beacon(cap='ESS+privacy')
#Information Element
self.essid = Dot11Elt(ID='SSID', info=self.ssid, len=len(self.ssid))
self.rsn = Dot11Elt(ID='RSNinfo', info=(
'\x01\x00'
'\x00\x0f\xac\x02'
'\x02\x00'
'\x00\x0f\xac\x04'
'\x00\x0f\xac\x02'
'\x01\x00'
'\x00\x0f\xac\x02'
'\x00\x00'))
#all layers stacked
self.frame = RadioTap()/self.dot11/self.beacon/self.essid/self.rsn
def sendBeacon(self):
self.frame.show()
time.sleep(.2)
print("\nHexDump of frame: ")
time.sleep(.2)
hexdump(self.frame)
enterStart = input("\nPress enter to start\n")
sendp(self.frame, inter=0.050, iface=self.iface, loop=1)
class Number:
def __init__(self, number):
self.number1 = number
try:
int(self.number1)
if type(self.number1) == int:
if self.number1 == 0:
print('well goodbye then....')
time.sleep(.2)
sys.exit()
except ValueError:
self.number1 = int(1)
class SSID:
def __init__(self, ssid):
self.ssid = ssid
if len(self.ssid) > 30:
self.ssid = self.ssid[:30]
class Randmac:
def __init__(self, number):
self.number = number
def generateMac(self):
for i in range(self.number):
random_mac = "%02x:%02x:%02x:%02x:%02x:%02x" % (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255), random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
return random_mac
#User Input
name_input = str(input('Enter the name of the fake AP(max 30 charachters): '))
num_input = int(input('Enter the how many fake APs u want: '))
num = Number(number=1)
name = SSID(ssid=name_input)
random_mac = Randmac(num.number1)
make_packet = CreateBeacon(name.ssid, num.number1, random_mac.generateMac())
send_packet = make_packet.sendBeacon()
Any help would be appreciated!
So since nobody wanted to help me with my problem, i figured it out myself with simple multiprocessing. Here's my new code
from scapy.all import Dot11, Dot11Beacon, Dot11Elt, RadioTap, sendp,
hexdump, RandMAC
import time, sys, multiprocessing
class CreateBeacon:
def __init__(self, ssid, number):
#info for frame
self.ssid = ssid
self.number = number
self.addr = RandMAC()
self.iface = 'wlan0mon'
self.dot11 = Dot11(type=0, subtype=8,
addr1='ff:ff:ff:ff:ff:ff',
addr2 = self.addr,
addr3 = self.addr)
#Beacon layer
self.beacon = Dot11Beacon(cap='ESS+privacy')
#Information Element
self.essid = Dot11Elt(ID='SSID', info=self.ssid, len=len(self.ssid))
self.rsn = Dot11Elt(ID='RSNinfo', info=(
'\x01\x00'
'\x00\x0f\xac\x02'
'\x02\x00'
'\x00\x0f\xac\x04'
'\x00\x0f\xac\x02'
'\x01\x00'
'\x00\x0f\xac\x02'
'\x00\x00'))
#all layers stacked
self.frame = RadioTap()/self.dot11/self.beacon/self.essid/self.rsn
def Send(self):
sendp(self.frame, inter=0.050, iface=self.iface, loop=1)
# class SendBeacon:
# def __init__(self, frame):
# self.frame = frame
# def Send(self):
# sendp(self.frame, inter=0.050, iface=self.iface, loop=1)
class MultiProcessBeacon:
def __init__(self, ssid, number):
self.ssid = ssid
self.number = number
def MultiProcessSend(self):
for i in range(self.number):
Beacon = CreateBeacon(ssid=self.ssid[i], number=self.number)
i += 1
str(i)
# i = multiprocessing.Process(target=SendBeacon.Send,
args=Beacon.frame)
for _ in range(3): #sending out the same beacon 3 times because
for some reason sending only 1 beacon does not always work
try:
i = multiprocessing.Process(target=Beacon.Send)
i.start()
except KeyboardInterrupt:
print('processes stopped')
time.sleep(1)
class InputMain():
def __init__(self):
input_number = input('Enter how many fake AP\'s do you want (In
intregers): ')#int(4)
#intreger input handeling
try:
int(input_number)
if int(input_number) == 0:
print('well goodbye then....')
time.sleep(1)
sys.exit()
except ValueError:
print("ValueError detected; number of fake AP(s) = 1")
time.sleep(1)
input_number = int(1)
input_ssid = []#('s-one', 's-two', 's-three', 's-fore') #we'll make
it first a list so we can append stuff to it
for n in range(int(input_number)):
n += 1 #because it starts with 0
ask_ssid = input('Name SSID for AP number ' + str(n)+': ')
if len(ask_ssid) > 32:
print('Maximum length of ssid exceeded.')
ask_ssid = ask_ssid[32]
input_ssid.append(ask_ssid)
tuple(input_ssid)
self.given_number = int(input_number)
self.given_ssid = input_ssid
passInfo_toMulti = MultiProcessBeacon(ssid=self.given_ssid,
number=self.given_number)
passInfo_toMulti.MultiProcessSend()
start = InputMain()