bettercap/modules/wifi/wifi_ap.go
2024-08-09 18:19:21 +02:00

73 lines
1.7 KiB
Go

package wifi
import (
"errors"
"net"
"time"
"github.com/bettercap/bettercap/v2/network"
"github.com/bettercap/bettercap/v2/packets"
"github.com/bettercap/bettercap/v2/session"
"github.com/evilsocket/islazy/tui"
)
var errNoRecon = errors.New("Module wifi.ap requires module wifi.recon to be activated.")
func (mod *WiFiModule) parseApConfig() (err error) {
var bssid string
if err, mod.apConfig.SSID = mod.StringParam("wifi.ap.ssid"); err != nil {
return
} else if err, bssid = mod.StringParam("wifi.ap.bssid"); err != nil {
return
} else if mod.apConfig.BSSID, err = net.ParseMAC(network.NormalizeMac(bssid)); err != nil {
return
} else if err, mod.apConfig.Channel = mod.IntParam("wifi.ap.channel"); err != nil {
return
} else if err, mod.apConfig.Encryption = mod.BoolParam("wifi.ap.encryption"); err != nil {
return
}
return
}
func (mod *WiFiModule) startAp() error {
// we need channel hopping and packet injection for this
if !mod.Running() {
return errNoRecon
} else if mod.apRunning {
return session.ErrAlreadyStarted(mod.Name())
}
go func() {
mod.apRunning = true
defer func() {
mod.apRunning = false
}()
enc := tui.Yellow("WPA2")
if !mod.apConfig.Encryption {
enc = tui.Green("Open")
}
mod.Info("sending beacons as SSID %s (%s) on channel %d (%s).",
tui.Bold(mod.apConfig.SSID),
mod.apConfig.BSSID.String(),
mod.apConfig.Channel,
enc)
for seqn := uint16(0); mod.Running(); seqn++ {
mod.writes.Add(1)
defer mod.writes.Done()
if err, pkt := packets.NewDot11Beacon(mod.apConfig, seqn); err != nil {
mod.Error("could not create beacon packet: %s", err)
} else {
mod.injectPacket(pkt)
}
time.Sleep(100 * time.Millisecond)
}
}()
return nil
}