The solution to my problem where a couple of libraries. PyLorcon2 to inject and Impacket to craft the packets.
Using this two libraries with Python is a really easy and clean way of doing what I need.
#!/usr/bin/env pythonimport sys import random import PyLorcon2 from impacket import dot11 from impacket.dot11 import Dot11 from impacket.dot11 import Dot11Types from impacket.dot11 import Dot11ManagementFrame from impacket.dot11 import Dot11ManagementProbeRequest def getProbeRequest(src, ssid): "Return 802.11 Probe Request Frame." # Frame Control frameCtrl = Dot11(FCS_at_end = False) frameCtrl.set_version(0) frameCtrl.set_type_n_subtype( Dot11Types.DOT11_TYPE_MANAGEMENT_SUBTYPE_PROBE_REQUEST) # Frame Control Flags frameCtrl.set_fromDS(0) frameCtrl.set_toDS(0) frameCtrl.set_moreFrag(0) frameCtrl.set_retry(0) frameCtrl.set_powerManagement(0) frameCtrl.set_moreData(0) frameCtrl.set_protectedFrame(0) frameCtrl.set_order(0) # Management Frame sequence = random.randint(0, 4096) broadcast = [0xff, 0xff, 0xff, 0xff, 0xff, 0xff] mngtFrame = Dot11ManagementFrame() mngtFrame.set_duration(0) mngtFrame.set_destination_address(broadcast) mngtFrame.set_source_address(src) mngtFrame.set_bssid(broadcast) mngtFrame.set_fragment_number(0) mngtFrame.set_sequence_number(sequence) # Probe Request Frame probeRequestFrame = Dot11ManagementProbeRequest() probeRequestFrame.set_ssid(ssid) rates = [0x82, 0x84, 0x8b, 0x96, 0x0c, 0x18, 0x30, 0x48] probeRequestFrame.set_supported_rates(rates) idType = dot11.DOT11_MANAGEMENT_ELEMENTS.EXT_SUPPORTED_RATES value = "\x12\x24\x60\x6c" probeRequestFrame._set_element(idType, value) mngtFrame.contains(probeRequestFrame) frameCtrl.contains(mngtFrame) return frameCtrl.get_packet() if __name__ == "__main__": if len(sys.argv) != 3: print "Usage" print " %s " % sys.argv[0] sys.exit() iface = sys.argv[1] essid = sys.argv[2] context = PyLorcon2.Context(iface) context.open_injmon() moniface = context.get_capiface() src = [0x00, 0x00, 0x00, 0x11, 0x22, 0x33] probeRequest = getProbeRequest(src, essid) if essid == "": essid = "broadcast" print "Using interface %s" % iface print "Injecting Probe Requests for '%s'." % essid context.send_bytes(probeRequest)
The download link to the complete code is below:
probeRequestTest.zip
Is there any simialr example for Dot11DataFrame?
ReplyDeleteIf you are going to inject data frames without encryption the code should n't change too much.
Delete