like a top

This commit is contained in:
anoduck 2023-10-11 19:41:09 -04:00
parent 41b8671dc9
commit 61f48ed359

View file

@ -286,41 +286,27 @@ def stop_monitor(if_mon):
# ╚══════╝ ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝╚═╝ ╚═══╝╚══════╝╚═╝ ╚═╝
# ----------------------------------------------------------------
def strainer(pkt):
if pkt[Dot11].type == 2 and pkt[Dot11].subtype == 12:
if pkt[Dot11].type == 0 and pkt[Dot11].subtype == 4:
bssid = pkt[Dot11FCS].addr2
log.info('BSSID for sieve: ' + str(bssid))
new_pkt = RadioTap()/Dot11(proto=0, type=1, subtype=11,
addr1=bssid,
addr2=macaddr,
ID=65535)
log.debug('Sending CTS frame to ' + str(bssid) + ' with type 11')
sendp(new_pkt, iface=mon_if, verbose=0, count=2)
if pkt[Dot11].type == 1 and pkt[Dot11].subtype == 12:
try:
bssid = pkt[Dot11FCS].addr2
except:
bssid = pkt[Dot11].addr2
try:
ssid = pkt[Dot11Elt].getattr('info').decode()
except:
ssid = extract_essid(pkt[Dot11Elt])
if len(ssid) < 1:
ssid = 'N/A'
dbm_signal = pkt.dBm_AntSignal
if pkt.haslayer(Dot11Beacon):
stats = pkt[Dot11Beacon].network_stats()
channel = stats.get('channel')
crypto = stats.get('crypto')
else:
crypto = "N/A"
channel = extract_channel(pkt[Dot11Elt])
pkt_list = [bssid, ssid, dbm_signal, channel, crypto]
return pkt_list
if pkt.haslayer(Dot11):
try:
bssid = pkt[Dot11FCS].addr2
except:
bssid = pkt[Dot11].addr2
log.debug('BSSID: ' + str(bssid))
if bssid is not None:
if bssid == macaddr:
log.debug('Ooops, intercepted our own frame.')
pass
else:
log.debug('BSSID for shooter: ' + str(bssid))
shooter(mon_if, bssid)
scan_df.loc[bssid] = ['N/A', dbm_signal, channel, 'N/A']
# -----------------------------------------------------------------
@ -340,15 +326,13 @@ def shooter(mon_if, bssid):
sendp(new_pkt, iface=mon_if, verbose=0, inter=0.1, count=2, realtime=True)
async def df_writer(scan_df, valid_file):
def df_writer(scan_df, valid_file):
while True:
if scan_df.empty:
await asyncio.sleep(30)
pass
else:
scan_df.to_csv(valid_file)
print('results written to file ' + valid_file)
asyncio.sleep(30)
# ---------------------------------------------------------------------------
@ -392,13 +376,13 @@ def sieve(pkt):
new_pkt = RadioTap()/Dot11(proto=0, type=1, subtype=11,
addr1=bssid,
addr2=macaddr,
ID=65535)
ID=65535)/Dot11FCS()
log.debug('Sending CTS frame to ' + str(bssid) + ' with type 11')
sendp(new_pkt, iface=mon_if, verbose=0, count=2)
sendp(new_pkt, iface=mon_if, verbose=0, count=1)
# return bssid
def thud(pkt):
def thumper(pkt):
try:
bssid = pkt[Dot11FCS].addr2
except:
@ -416,37 +400,23 @@ def thud(pkt):
# ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝ ╚══════╝
# ----------------------------------------------------------------------------
async def mac_purge(mon_dev, mon_type, valid_file, channels, mac_targ):
""" Socket should probably be implemented to further filter out CTS frames
If they occur. One async sniffer is better than two.
"""
signal.signal(signal.SIGINT, signal_handler)
print('Enter Ctrl+C TWICE to fully stop the script.')
global mon_if
mon_if = start_monitor(mon_dev, mon_type, mac_targ)
log.info(f'You now have {mon_if}.')
scan_df = get_df()
log.info('Dataframe created')
chop = asyncio.to_thread(channel_runner, mon_dev, channels)
chopper = asyncio.create_task(chop)
log.info('Channel runner started.')
await asyncio.sleep(0)
while True:
r1 = AsyncSniffer(iface=mon_if, prn=sieve,
filter='type mgt && subtype probe-req', monitor=True,
store=False)
r1.start()
log.info('Sniffer one started')
# r2 = Asyncsniffer(iface=mon_if, prn=thud,
# filter='type ctl && subtype cts',
# store=False)
# r2.start()
# await asyncio.sleep(0.1)
# log.info('Sniffer two started')
# if r2.results():
# log.info(f'{r2.results()} returned response.')
# continue
# else:
# continue
log.info('starting sniffer')
asniff = AsyncSniffer(iface=mon_if, prn=strainer,
store=False, monitor=True)
asniff.start()
log.info('asniffer started')
nloop = asyncio.get_running_loop()
nloop.add_signal_handler(0, df_writer, scan_df, valid_file)
forever_wait = threading.Event()
forever_wait.wait()