66 lines
No EOL
2 KiB
Python
66 lines
No EOL
2 KiB
Python
from collections import defaultdict
|
|
from enrichment.utils import get_channel_from_freq
|
|
|
|
def get_clients_on_ap(capture, ap_bssid):
|
|
clients = defaultdict(list)
|
|
ap_bssid = ap_bssid.lower()
|
|
|
|
for packet in capture:
|
|
try:
|
|
if not hasattr(packet, "wlan"):
|
|
continue
|
|
|
|
sa = getattr(packet.wlan, "sa", '').lower()
|
|
da = getattr(packet.wlan, "da", '').lower()
|
|
bssid = getattr(packet.wlan, "bssid", '').lower()
|
|
|
|
if bssid == ap_bssid or sa == ap_bssid or da == ap_bssid:
|
|
if sa == ap_bssid and da and da != ap_bssid and not da.startswith("ff:ff:ff:ff:ff:ff"):
|
|
clients[da] += 1
|
|
elif sa and sa != ap_bssid and not sa.startswith("ff:ff:ff:ff:ff:ff"):
|
|
clients[sa] += 1
|
|
except AttributeError:
|
|
continue
|
|
|
|
return len([mac for mac, count in clients.items() if count > 3])
|
|
|
|
def get_clients_on_channel(capture, ap_channel, ap_bssid):
|
|
try:
|
|
ap_channel = int(ap_channel)
|
|
except ValueError:
|
|
print(f"[!] Could not parse channel number: {ap_channel}")
|
|
return 0
|
|
|
|
clients = set()
|
|
|
|
for packet in capture:
|
|
try:
|
|
if 'radiotap' not in packet or 'wlan' not in packet:
|
|
continue
|
|
|
|
radio = packet.radiotap
|
|
wlan = packet.wlan
|
|
|
|
if not hasattr(radio, 'channel') or not hasattr(radio.channel, 'freq'):
|
|
continue
|
|
|
|
packet_freq = int(radio.channel.freq)
|
|
packet_channel = get_channel_from_freq(packet_freq)
|
|
|
|
if packet_channel != ap_channel:
|
|
continue
|
|
|
|
sa = getattr(wlan, 'sa', '').lower()
|
|
da = getattr(wlan, 'da', '').lower()
|
|
|
|
for mac in (sa, da):
|
|
if mac and mac != 'ff:ff:ff:ff:ff:ff' and mac != ap_bssid:
|
|
clients.add(mac)
|
|
|
|
except AttributeError:
|
|
continue
|
|
except Exception as e:
|
|
print(f"[!] Error parsing packet: {e}")
|
|
continue
|
|
|
|
return len(clients) |