misc: small fix or general refactoring i did not bother commenting

This commit is contained in:
evilsocket 2019-03-23 14:11:28 +01:00
commit b8056e2026
No known key found for this signature in database
GPG key ID: 1564D7F30393A456
3 changed files with 27 additions and 78 deletions

View file

@ -23,31 +23,22 @@ import (
"github.com/evilsocket/islazy/tui"
)
type parsedShake struct {
Radiotap *layers.RadioTap
Dot11 *layers.Dot11
Packet gopacket.Packet
}
type WiFiModule struct {
session.SessionModule
iface *network.Endpoint
handle *pcap.Handle
source string
region string
txPower int
minRSSI int
channel int
hopPeriod time.Duration
hopChanges chan bool
frequencies []int
ap *network.AccessPoint
stickChan int
shakesFile string
shakesHistory []parsedShake
iface *network.Endpoint
handle *pcap.Handle
source string
region string
txPower int
minRSSI int
channel int
hopPeriod time.Duration
hopChanges chan bool
frequencies []int
ap *network.AccessPoint
stickChan int
shakesFile string
skipBroken bool
pktSourceChan chan gopacket.Packet
pktSourceChanClosed bool
@ -75,7 +66,6 @@ func NewWiFiModule(s *session.Session) *WiFiModule {
stickChan: 0,
hopPeriod: 250 * time.Millisecond,
hopChanges: make(chan bool),
shakesHistory: make([]parsedShake, 0),
ap: nil,
skipBroken: true,
apRunning: false,
@ -520,41 +510,11 @@ func (mod *WiFiModule) updateStats(dot11 *layers.Dot11, packet gopacket.Packet)
}
}
func (mod *WiFiModule) loadHandshakes() {
mod.shakesHistory = make([]parsedShake, 0)
if !fs.Exists(mod.shakesFile) {
return
}
handle, err := pcap.OpenOffline(mod.shakesFile)
if err != nil {
mod.Debug("can't open handshakes file: %v", mod.shakesFile)
return
}
defer handle.Close()
mod.Info("loading handshakes from %s", mod.shakesFile)
src := gopacket.NewPacketSource(handle, handle.LinkType())
for packet := range src.Packets() {
if ok, radiotap, dot11 := packets.Dot11Parse(packet); ok {
mod.shakesHistory = append(mod.shakesHistory, parsedShake{
Radiotap: radiotap,
Dot11: dot11,
Packet: packet,
})
}
}
}
func (mod *WiFiModule) Start() error {
if err := mod.Configure(); err != nil {
return err
}
mod.loadHandshakes()
mod.SetRunning(true, func() {
// start channel hopper if needed
if mod.channel == 0 && mod.source == "" {
@ -591,7 +551,7 @@ func (mod *WiFiModule) Start() error {
mod.discoverProbes(radiotap, dot11, packet)
mod.discoverAccessPoints(radiotap, dot11, packet)
mod.discoverClients(radiotap, dot11, packet)
mod.discoverHandshakes(radiotap, dot11, packet, false)
mod.discoverHandshakes(radiotap, dot11, packet)
mod.updateInfo(dot11, packet)
mod.updateStats(dot11, packet)
}

View file

@ -70,12 +70,6 @@ func (mod *WiFiModule) discoverAccessPoints(radiotap *layers.RadioTap, dot11 *la
ap.EachClient(func(mac string, station *network.Station) {
station.Handshake.SetBeacon(packet)
})
} else {
// every time we detect a new ap, see if we have
// its handshakes in our pcap already
for _, h := range mod.shakesHistory {
mod.discoverHandshakes(h.Radiotap, h.Dot11, h.Packet, true)
}
}
} else {
mod.Debug("skipping %s with %d dBm", from.String(), radiotap.DBMAntennaSignal)

View file

@ -18,14 +18,12 @@ func allZeros(s []byte) bool {
return true
}
func (mod *WiFiModule) discoverHandshakes(radiotap *layers.RadioTap, dot11 *layers.Dot11, packet gopacket.Packet, readOnly bool) {
func (mod *WiFiModule) discoverHandshakes(radiotap *layers.RadioTap, dot11 *layers.Dot11, packet gopacket.Packet) {
if ok, key, apMac, staMac := packets.Dot11ParseEAPOL(packet, dot11); ok {
// first, locate the AP in our list by its BSSID
ap, found := mod.Session.WiFi.Get(apMac.String())
if !found {
if !readOnly {
mod.Warning("could not find AP with BSSID %s", apMac.String())
}
mod.Warning("could not find AP with BSSID %s", apMac.String())
return
}
@ -78,8 +76,8 @@ func (mod *WiFiModule) discoverHandshakes(radiotap *layers.RadioTap, dot11 *laye
// if we have unsaved packets as part of the handshake, save them.
numUnsaved := station.Handshake.NumUnsaved()
doSave := numUnsaved > 0
if !readOnly && doSave && mod.shakesFile != "" {
mod.Debug("saving handshake frames to %s", mod.shakesFile)
if doSave && mod.shakesFile != "" {
mod.Info("saving handshake frames to %s", mod.shakesFile)
if err := mod.Session.WiFi.SaveHandshakesTo(mod.shakesFile, mod.handle.LinkType()); err != nil {
mod.Error("error while saving handshake frames to %s: %s", mod.shakesFile, err)
}
@ -88,23 +86,20 @@ func (mod *WiFiModule) discoverHandshakes(radiotap *layers.RadioTap, dot11 *laye
// if we had unsaved packets and either the handshake is complete
// or it contains the PMKID, generate a new event.
if doSave && (rawPMKID != nil || station.Handshake.Complete()) {
if !readOnly {
mod.Session.Events.Add("wifi.client.handshake", HandshakeEvent{
File: mod.shakesFile,
NewPackets: numUnsaved,
AP: apMac.String(),
Station: staMac.String(),
PMKID: rawPMKID,
})
}
mod.Session.Events.Add("wifi.client.handshake", HandshakeEvent{
File: mod.shakesFile,
NewPackets: numUnsaved,
AP: apMac.String(),
Station: staMac.String(),
PMKID: rawPMKID,
})
// make sure the info that we have key material for this AP
// is persisted even after stations are pruned due to inactivity
ap.WithKeyMaterial(true)
}
// if we're only collecting handshakes from history or if we
// added ourselves as a client station but we didn't get any
// if we added ourselves as a client station but we didn't get any
// PMKID, just remove it from the list of clients of this AP.
if (readOnly && staAdded) || (staIsUs && rawPMKID == nil) {
if staAdded || (staIsUs && rawPMKID == nil) {
ap.RemoveClient(staMac.String())
}
}