mirror of
https://github.com/bettercap/bettercap
synced 2025-08-19 21:13:18 -07:00
new: implemented traffic column for wifi.recon module (ref #53)
This commit is contained in:
parent
9470926388
commit
c0354120d8
2 changed files with 87 additions and 1 deletions
|
@ -19,6 +19,7 @@ import (
|
||||||
"github.com/google/gopacket/layers"
|
"github.com/google/gopacket/layers"
|
||||||
"github.com/google/gopacket/pcap"
|
"github.com/google/gopacket/pcap"
|
||||||
|
|
||||||
|
"github.com/dustin/go-humanize"
|
||||||
"github.com/olekukonko/tablewriter"
|
"github.com/olekukonko/tablewriter"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -26,6 +27,7 @@ type WDiscovery struct {
|
||||||
session.SessionModule
|
session.SessionModule
|
||||||
|
|
||||||
wifi *WiFi
|
wifi *WiFi
|
||||||
|
stats *WiFiStats
|
||||||
handle *pcap.Handle
|
handle *pcap.Handle
|
||||||
BroadcastMac []byte
|
BroadcastMac []byte
|
||||||
cliTarget net.HardwareAddr
|
cliTarget net.HardwareAddr
|
||||||
|
@ -35,6 +37,7 @@ type WDiscovery struct {
|
||||||
func NewWDiscovery(s *session.Session) *WDiscovery {
|
func NewWDiscovery(s *session.Session) *WDiscovery {
|
||||||
w := &WDiscovery{
|
w := &WDiscovery{
|
||||||
SessionModule: session.NewSessionModule("wifi.recon", s),
|
SessionModule: session.NewSessionModule("wifi.recon", s),
|
||||||
|
stats: NewWiFiStats(),
|
||||||
cliTarget: make([]byte, 0),
|
cliTarget: make([]byte, 0),
|
||||||
apTarget: make([]byte, 0),
|
apTarget: make([]byte, 0),
|
||||||
}
|
}
|
||||||
|
@ -134,11 +137,18 @@ func (w *WDiscovery) getRow(station *WiFiStation) []string {
|
||||||
seen = core.Dim(seen)
|
seen = core.Dim(seen)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
traffic := ""
|
||||||
|
bytes := w.stats.For(station.HW)
|
||||||
|
if bytes > 0 {
|
||||||
|
traffic = humanize.Bytes(bytes)
|
||||||
|
}
|
||||||
|
|
||||||
return []string{
|
return []string{
|
||||||
bssid,
|
bssid,
|
||||||
station.ESSID(),
|
station.ESSID(),
|
||||||
station.Vendor,
|
station.Vendor,
|
||||||
strconv.Itoa(station.Channel),
|
strconv.Itoa(station.Channel),
|
||||||
|
traffic,
|
||||||
seen,
|
seen,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -196,7 +206,7 @@ func (w *WDiscovery) Show(by string) error {
|
||||||
rows = append(rows, w.getRow(s))
|
rows = append(rows, w.getRow(s))
|
||||||
}
|
}
|
||||||
|
|
||||||
w.showTable([]string{"BSSID", "SSID", "Vendor", "Channel", "Last Seen"}, rows)
|
w.showTable([]string{"BSSID", "SSID", "Vendor", "Channel", "Traffic", "Last Seen"}, rows)
|
||||||
|
|
||||||
w.Session.Refresh()
|
w.Session.Refresh()
|
||||||
|
|
||||||
|
@ -360,6 +370,36 @@ func (w *WDiscovery) Configure() error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (w *WDiscovery) updateStats(packet gopacket.Packet) {
|
||||||
|
radiotapLayer := packet.Layer(layers.LayerTypeRadioTap)
|
||||||
|
if radiotapLayer == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
dot11infoLayer := packet.Layer(layers.LayerTypeDot11InformationElement)
|
||||||
|
if dot11infoLayer == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
dot11info, _ := dot11infoLayer.(*layers.Dot11InformationElement)
|
||||||
|
if dot11info.ID != layers.Dot11InformationElementIDSSID {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
dot11Layer := packet.Layer(layers.LayerTypeDot11)
|
||||||
|
if dot11Layer == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
dot11, _ := dot11Layer.(*layers.Dot11)
|
||||||
|
|
||||||
|
bytes := uint64(len(packet.Data()))
|
||||||
|
w.stats.Collect(dot11.Address1, bytes)
|
||||||
|
w.stats.Collect(dot11.Address2, bytes)
|
||||||
|
w.stats.Collect(dot11.Address3, bytes)
|
||||||
|
w.stats.Collect(dot11.Address4, bytes)
|
||||||
|
}
|
||||||
|
|
||||||
func (w *WDiscovery) Start() error {
|
func (w *WDiscovery) Start() error {
|
||||||
if w.Running() == true {
|
if w.Running() == true {
|
||||||
return session.ErrAlreadyStarted
|
return session.ErrAlreadyStarted
|
||||||
|
@ -375,6 +415,8 @@ func (w *WDiscovery) Start() error {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
|
w.updateStats(packet)
|
||||||
|
|
||||||
if len(w.apTarget) > 0 {
|
if len(w.apTarget) > 0 {
|
||||||
w.discoverClients(w.apTarget, packet)
|
w.discoverClients(w.apTarget, packet)
|
||||||
} else {
|
} else {
|
||||||
|
|
44
modules/wifi_stats.go
Normal file
44
modules/wifi_stats.go
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
package modules
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net"
|
||||||
|
"sync"
|
||||||
|
)
|
||||||
|
|
||||||
|
type WiFiStationStats struct {
|
||||||
|
Bytes uint64
|
||||||
|
}
|
||||||
|
|
||||||
|
type WiFiStats struct {
|
||||||
|
sync.Mutex
|
||||||
|
stats map[string]*WiFiStationStats
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewWiFiStats() *WiFiStats {
|
||||||
|
return &WiFiStats{
|
||||||
|
stats: make(map[string]*WiFiStationStats),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *WiFiStats) Collect(station net.HardwareAddr, bytes uint64) {
|
||||||
|
s.Lock()
|
||||||
|
defer s.Unlock()
|
||||||
|
|
||||||
|
bssid := station.String()
|
||||||
|
if sstats, found := s.stats[bssid]; found == true {
|
||||||
|
sstats.Bytes += bytes
|
||||||
|
} else {
|
||||||
|
s.stats[bssid] = &WiFiStationStats{Bytes: bytes}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *WiFiStats) For(station net.HardwareAddr) uint64 {
|
||||||
|
s.Lock()
|
||||||
|
defer s.Unlock()
|
||||||
|
|
||||||
|
bssid := station.String()
|
||||||
|
if sstats, found := s.stats[bssid]; found == true {
|
||||||
|
return sstats.Bytes
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue