Search code examples
pythonpython-multithreadingscapy

How to use threading in python to make multiple fake access points with Scapy?


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!


Solution

  • 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()