From 7989425675f4609f0a2de43312d1fee47052271e Mon Sep 17 00:00:00 2001 From: anoduck <11767-anoduck@users.noreply.gitgud.io> Date: Sat, 9 Dec 2023 01:01:42 -0500 Subject: [PATCH] asyncio swapped for trio --- ctiger.gv | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ ctiger.py | 60 +++++++++++++++++-------------------- 2 files changed, 115 insertions(+), 33 deletions(-) create mode 100644 ctiger.gv diff --git a/ctiger.gv b/ctiger.gv new file mode 100644 index 0000000..2db2e72 --- /dev/null +++ b/ctiger.gv @@ -0,0 +1,88 @@ +digraph G { +concentrate=true; +splines="ortho"; +rankdir="LR"; +subgraph legend{ + rank = min; + label = "legend"; + Legend [shape=none, margin=0, label = < +
Code2flow Legend
+ + + + + +
Regular function
Trunk function (nothing calls this)
Leaf function (this calls nothing else)
Function call
+ >]; +}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]; + }; +}; +} diff --git a/ctiger.py b/ctiger.py index 6dd3360..1fb3319 100644 --- a/ctiger.py +++ b/ctiger.py @@ -23,18 +23,12 @@ from scapy.layers.dot11 import Dot11FCS from scapy.config import Conf as scapyconfig from scapy.layers.eap import EAPOL from scapy.utils import PcapWriter -# 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 dataclasses import dataclass import multiprocessing as mp -import asyncio +import trio import threading -from threading import Thread from random import choice from configobj import ConfigObj, validate from collections import Counter @@ -42,9 +36,7 @@ import pandas as pd import signal import logging 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')) -# from simple_parsing import ArgumentParser # _ _ _ ____ ___ _ ___ _ ___ ___ # \ ( ) / )_\ / _ \ )_ _( )_\ \ _) ) | ) __( ( _( @@ -310,7 +302,7 @@ class NetDev: Returns: str: The name of the created or switched monitor interface. - + """ global macaddr macaddr = fake.mac_address() @@ -416,6 +408,14 @@ class Purge(object): self.send_pkt(bssid) 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): log.info('mac revealer started') self.interface = interface @@ -431,32 +431,28 @@ class Purge(object): log.debug('return type: {0}'.format(type(mon_if))) self.mon_if = 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( iface=mon_if, prn=self.probe_prn, filter="type mgt subtype probe-req", monitor=True) - probe_sniff.start() - log.info('Probe sniffer started') - await asyncio.sleep(0) cts_sniff = AsyncSniffer(filter='type ctl subtype cts', iface=mon_if, prn=self.cts_prn, 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') - await asyncio.sleep(0) + await trio.sleep(0) def start_purge(self) -> None: signal.signal(signal.SIGINT, signal_handler) print('Enter Ctrl+C TWICE to fully stop the script.') - asyncio.run(self.mac_revealer(self.interface, - self.mon_type, - self.valid_file, - self.channels)) + trio.run(self.mac_revealer, self.interface, self.mon_type, + self.valid_file, self.channels) forever_wait = threading.Event() 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() log.debug('sending deauth to ', targ, ' with type 4') 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() log.debug('sending deauth to ', targ, ' with type 12') sendp(pkt, iface=mon_dev, verbose=0) - await asyncio.sleep(1) + await trio.sleep(1) def grab_macs(pkt): @@ -554,7 +550,7 @@ async def chan_hopper(mon_dev, channels): ichan = choice(chans) os.system('iw dev ', mon_dev, ' set channel ', str(ichan)) log.debug('Channel set to ', str(ichan)) - await asyncio.sleep(4.7) + await trio.sleep(4.7) # return ichan @@ -588,13 +584,13 @@ async def attack(mon_dev, scan_file): for row in ares: if row[1] in targets: log.info('Found target: ', row[1]) - asyncio.create_task(feed_gather(mon_dev, row)) - await asyncio.sleep(1) + await feed_gather(mon_dev, row) + await trio.sleep(1) def start_attack(mondev, scan_file): 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): 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') attack_daemon = mp.Process(target=start_attack, args=(mon_dev, scan_file), name='attack_daemon', daemon=True) @@ -619,7 +613,7 @@ def proc_attack(interface, scan_file, mon_type): attack_daemon.join() else: log.info('Running in foreground...') - asyncio.run(attack(mon_dev, scan_file)) + trio.run(attack, mon_dev, scan_file) # -------------------------------------------------------------