import tkinter as tk
import os
import sys
import time
import threading
import netifaces
from scapy.all import *
from scapy.layers.l2 import ARP
from tkinter import messagebox
from scapy.layers.l2 import getmacbyip
from scapy.layers.inet import IP, ICMP
from scapy.layers.inet import TCP

class DetectionPage:
    def __init__(self, master, timeout, detection_type):
        self.master = master
        self.timeout = timeout
        self.detection_type = detection_type
        self.interface = 'ens33'
        self.target_ip = '192.168.197.1'  # 默认目标IP,可根据实际情况修改
        self.thread = None
        self.stop_event = threading.Event()
        self.timer = 0

        self.frame = tk.Frame(self.master)
        self.frame.pack()

        self.status_label = tk.Label(self.frame, text='Idle')
        self.status_label.pack()

        self.start_button = tk.Button(self.frame, text='Start', command=self.start_detection)
        self.start_button.pack()

        self.stop_button = tk.Button(self.frame, text='Stop', command=self.stop_detection, state=tk.DISABLED)
        self.stop_button.pack()

    def start_detection(self):
        self.status_label.config(text='Running')
        self.start_button.config(state=tk.DISABLED)
        self.stop_button.config(state=tk.NORMAL)
        self.timer = 0
        self.stop_event.clear()
        self.thread = threading.Thread(target=self.run)
        self.thread.start()

    def stop_detection(self):
        self.status_label.config(text='Idle')
        self.start_button.config(state=tk.NORMAL)
        self.stop_button.config(state=tk.DISABLED)
        self.stop_event.set()
        self.thread.join()

    def run(self):
        while not self.stop_event.is_set():
            if self.detection_type == 'ARP':
                self.detect_arp_spoofing()
            elif self.detection_type == 'ICMP':
                self.detect_icmp_flood()
            elif self.detection_type == 'TCP':
                self.detect_tcp_attack()
            time.sleep(5)
            self.timer += 5
            if self.timer >= self.timeout:
                print(f'No {self.detection_type} attack detected')
                self.stop_event.set()

    def detect_arp_spoofing(self):
        attacker_ip = netifaces.ifaddresses(self.interface)[netifaces.AF_INET][0]['addr']
        attacker_mac = getmacbyip(attacker_ip)
        print(f'Attacker IP: {attacker_ip}, MAC: {attacker_mac}')
        ip_mac_map = {}
        for ip in netifaces.ifaddresses(self.interface)[netifaces.AF_INET][0]['addr'].split('.')[:-1]:
            for i in range(1, 255):
                target_ip = f'{ip}.{i}'
                if target_ip != attacker_ip:
                    arp_request = ARP(pdst=target_ip)
                    arp_reply = sr1(arp_request, timeout=1, verbose=0)
                    if arp_reply and arp_reply.hwsrc not in ('00:00:00:00:00:00', attacker_mac):
                        ip_mac_map[target_ip] = arp_reply.hwsrc
        for target_ip, target_mac in ip_mac_map.items():
            arp_request = ARP(op=1, pdst=target_ip, hwdst=target_mac, psrc=attacker_ip, hwsrc=attacker_mac)
            arp_reply = sr1(arp_request, timeout=1, verbose=0)
            if arp_reply and arp_reply.hwsrc != target_mac:
                print(f'ARP spoofing detected: {target_ip} ({target_mac}) -> {arp_reply.hwsrc}')

    def detect_icmp_flood(self):
        icmp_request = IP(dst=self.target_ip)/ICMP()
        icmp_reply = sr1(icmp_request, timeout=1, verbose=0)
        if icmp_reply:
            print(f'ICMP flood detected: {icmp_reply.src} -> {icmp_reply.dst}')

    def detect_tcp_attack(self):
        tcp_request = IP(dst=self.target_ip)/TCP(flags='S')  # 发送SYN包
        tcp_reply = sr1(tcp_request, timeout=1, verbose=0)
        if tcp_reply and tcp_reply.haslayer(TCP) and tcp_reply[TCP].flags == 'SA':  # 判断是否收到SYN/ACK包
            print(f'TCP SYN scan detected: {tcp_reply.src} -> {tcp_reply.dst}')

class NetworkScannerPage:
    def __init__(self, master):
        self.master = master
        self.interface = 'ens33'
        self.ip_mac_map = {}

        self.frame = tk.Frame(self.master)
        self.frame.pack()

        self.scan_button = tk.Button(self.frame, text='Scan', command=self.scan_network)
        self.scan_button.pack()

        self.result_label = tk.Label(self.frame, text='')
        self.result_label.pack()

    def scan_network(self):
        self.ip_mac_map = {}
        for ip in netifaces.ifaddresses(self.interface)[netifaces.AF_INET][0]['addr'].split('.')[:-1]:
            for i in range(1, 255):
                target_ip = f'{ip}.{i}'
                arp_request = ARP(pdst=target_ip)
                arp_reply = sr1(arp_request, timeout=1, verbose=0)
                if arp_reply and arp_reply.hwsrc not in ('00:00:00:00:00:00', get_if_hwaddr(self.interface)):
                    self.ip_mac_map[target_ip] = arp_reply.hwsrc

        result = ''
        for ip, mac in self.ip_mac_map.items():
            result += f'{ip} ({mac})
'
        self.result_label.config(text=result)

class MainWindow:
    def __init__(self):
        self.root = tk.Tk()
        self.root.title('网络安全检测工具')
        self.root.geometry('400x350')

        self.timeout_label = tk.Label(self.root, text='检测时间 (秒):')
        self.timeout_label.pack()

        self.timeout_entry = tk.Entry(self.root)
        self.timeout_entry.insert(0, '60')  # 默认检测时间为60秒
        self.timeout_entry.pack()

        self.arp_button = tk.Button(self.root, text='ARP 欺骗检测', command=self.show_arp_page)
        self.arp_button.pack()

        self.icmp_button = tk.Button(self.root, text='ICMP 泛洪检测', command=self.show_icmp_page)
        self.icmp_button.pack()

        self.tcp_button = tk.Button(self.root, text='TCP 攻击检测', command=self.show_tcp_page)
        self.tcp_button.pack()

        self.network_button = tk.Button(self.root, text='网络扫描', command=self.show_network_page)
        self.network_button.pack()

        self.root.mainloop()

    def show_arp_page(self):
        timeout = int(self.timeout_entry.get())
        arp_page = tk.Toplevel(self.root)
        arp_page.title('ARP 欺骗检测')
        DetectionPage(arp_page, timeout, 'ARP')

    def show_icmp_page(self):
        timeout = int(self.timeout_entry.get())
        icmp_page = tk.Toplevel(self.root)
        icmp_page.title('ICMP 泛洪检测')
        DetectionPage(icmp_page, timeout, 'ICMP')

    def show_tcp_page(self):
        timeout = int(self.timeout_entry.get())
        tcp_page = tk.Toplevel(self.root)
        tcp_page.title('TCP 攻击检测')
        DetectionPage(tcp_page, timeout, 'TCP')

    def show_network_page(self):
        network_page = tk.Toplevel(self.root)
        network_page.title('网络扫描')
        NetworkScannerPage(network_page)

if __name__ == '__main__':
    MainWindow()
网络安全检测工具:ARP欺骗、ICMP泛洪、TCP攻击和网络扫描

原文地址: https://www.cveoy.top/t/topic/jnW5 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录