diff --git a/modules/wifi/wifi.go b/modules/wifi/wifi.go index f98a07b1..775dd870 100644 --- a/modules/wifi/wifi.go +++ b/modules/wifi/wifi.go @@ -59,6 +59,7 @@ type WiFiModule struct { apRunning bool showManuf bool apConfig packets.Dot11ApConfig + probeMac net.HardwareAddr writes *sync.WaitGroup reads *sync.WaitGroup chanLock *sync.Mutex @@ -203,12 +204,11 @@ func NewWiFiModule(s *session.Session) *WiFiModule { probe := session.NewModuleHandler("wifi.probe BSSID ESSID", `wifi\.probe\s+([a-fA-F0-9:]{11,})\s+([^\s].+)`, "Sends a fake client probe with the given station BSSID, searching for ESSID.", - func(args []string) error { - bssid, err := net.ParseMAC(args[0]) - if err != nil { + func(args []string) (err error) { + if mod.probeMac, err = net.ParseMAC(args[0]); err != nil { return err } - return mod.startProbing(bssid, args[1]) + return mod.startProbing(mod.probeMac, args[1]) }) probe.Complete("wifi.probe", s.WiFiCompleterFull) diff --git a/modules/wifi/wifi_recon.go b/modules/wifi/wifi_recon.go index 1c6ff0cb..2bc58343 100644 --- a/modules/wifi/wifi_recon.go +++ b/modules/wifi/wifi_recon.go @@ -50,30 +50,6 @@ func (mod *WiFiModule) stationPruner() { } } -func (mod *WiFiModule) startProbing(staMac net.HardwareAddr, ssid string) error { - // if not already running, temporarily enable the pcap handle - // for packet injection - if !mod.Running() { - if err := mod.Configure(); err != nil { - return err - } - defer mod.handle.Close() - } - - for seq := uint16(0); seq < 5 && mod.Running(); seq++ { - if err, pkt := packets.NewDot11ProbeRequest(staMac, seq, ssid, network.GetInterfaceChannel(mod.iface.Name())); err != nil { - mod.Error("could not create probe packet: %s", err) - continue - } else { - mod.injectPacket(pkt) - } - } - - mod.Info("sent probe frames") - - return nil -} - func (mod *WiFiModule) discoverAccessPoints(radiotap *layers.RadioTap, dot11 *layers.Dot11, packet gopacket.Packet) { // search for Dot11InformationElementIDSSID if ok, ssid := packets.Dot11ParseIDSSID(packet); ok { @@ -110,6 +86,30 @@ func (mod *WiFiModule) discoverAccessPoints(radiotap *layers.RadioTap, dot11 *la } } +func (mod *WiFiModule) startProbing(staMac net.HardwareAddr, ssid string) error { + // if not already running, temporarily enable the pcap handle + // for packet injection + if !mod.Running() { + if err := mod.Configure(); err != nil { + return err + } + defer mod.handle.Close() + } + + for seq := uint16(0); seq < 5 && mod.Running(); seq++ { + if err, pkt := packets.NewDot11ProbeRequest(staMac, seq, ssid, network.GetInterfaceChannel(mod.iface.Name())); err != nil { + mod.Error("could not create probe packet: %s", err) + continue + } else { + mod.injectPacket(pkt) + } + } + + mod.Info("sent probe frames") + + return nil +} + func (mod *WiFiModule) discoverProbes(radiotap *layers.RadioTap, dot11 *layers.Dot11, packet gopacket.Packet) { if dot11.Type != layers.Dot11TypeMgmtProbeReq { return @@ -125,6 +125,11 @@ func (mod *WiFiModule) discoverProbes(radiotap *layers.RadioTap, dot11 *layers.D return } + // skip stuff we're sending + if bytes.Equal(mod.probeMac, dot11.Address2) { + return + } + clientSTA := network.NormalizeMac(dot11.Address2.String()) if mod.filterProbeSTA != nil && !mod.filterProbeSTA.MatchString(clientSTA) { return