MAC Vendor Resolution (with local cache)
This commit is contained in:
parent
be2c674a2c
commit
d0a3561586
2 changed files with 29 additions and 1 deletions
3
.gitignore
vendored
3
.gitignore
vendored
|
@ -1,2 +1,3 @@
|
||||||
settings.env
|
settings.env
|
||||||
__pycache__/
|
__pycache__/
|
||||||
|
oui.txt
|
27
listener.py
27
listener.py
|
@ -29,6 +29,7 @@ include_probes = False
|
||||||
# deadpoint_candidates = set()
|
# deadpoint_candidates = set()
|
||||||
unlinked_candidates = set()
|
unlinked_candidates = set()
|
||||||
bssid_channels = {}
|
bssid_channels = {}
|
||||||
|
vendor_cache = {}
|
||||||
|
|
||||||
CHANNEL_LIST = [1, 6, 11, 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 149, 153, 157, 161, 165] # Channels to hop
|
CHANNEL_LIST = [1, 6, 11, 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 149, 153, 157, 161, 165] # Channels to hop
|
||||||
CHANNEL_HOP_INTERVAL = 5 # Seconds per channel
|
CHANNEL_HOP_INTERVAL = 5 # Seconds per channel
|
||||||
|
@ -312,7 +313,33 @@ def main():
|
||||||
print(f"[+] Total APsOnChannel: {len(aps)}")
|
print(f"[+] Total APsOnChannel: {len(aps)}")
|
||||||
print_suspect_aps()
|
print_suspect_aps()
|
||||||
|
|
||||||
|
print("\n[+] Vendor Summary (known APs):")
|
||||||
|
for bssid in sorted(aps):
|
||||||
|
vendor = get_mac_vendor(bssid)
|
||||||
|
print(f" {bssid} → {vendor}")
|
||||||
|
|
||||||
reset_interface(args.monitor_iface)
|
reset_interface(args.monitor_iface)
|
||||||
|
|
||||||
|
def get_mac_vendor(mac):
|
||||||
|
prefix = mac.upper()[0:8].replace(":", "-")
|
||||||
|
if prefix in vendor_cache:
|
||||||
|
return vendor_cache[prefix]
|
||||||
|
try:
|
||||||
|
if not os.path.exists("oui.txt"):
|
||||||
|
print("[~] Downloading IEEE OUI list...")
|
||||||
|
import urllib.request
|
||||||
|
url = "http://standards-oui.ieee.org/oui/oui.txt"
|
||||||
|
urllib.request.urlretrieve(url, "oui.txt")
|
||||||
|
with open("oui.txt", "r", encoding="utf-8", errors="ignore") as f:
|
||||||
|
for line in f:
|
||||||
|
if prefix in line:
|
||||||
|
vendor = line.strip().split("\t")[-1]
|
||||||
|
vendor_cache[prefix] = vendor
|
||||||
|
return vendor
|
||||||
|
except Exception as e:
|
||||||
|
pass
|
||||||
|
vendor_cache[prefix] = "Unknown"
|
||||||
|
return "Unknown"
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
main()
|
main()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue