以下是一个基于Python实现的ARP攻击检测软件的示例代码,其中包含了上述规则的实现:

import os
import sys
import time
import logging
import tkinter as tk
from tkinter import messagebox
from scapy.all import *
from collections import defaultdict

# 全局变量
ar_requests = defaultdict(set)
ar_responses = defaultdict(set)
active_hosts = defaultdict(str)
logfile = 'arp_attack.log'

# 初始化日志记录
logging.basicConfig(filename=logfile, level=logging.INFO)

# 捕获ARP包并进行分析
def capture_arp():
    def arp_capture_callback(packet):
        if packet[ARP].op == ARP.who_has:
            arp_requests[packet[ARP].psrc].add(packet[ARP].hwsrc)
        elif packet[ARP].op == ARP.is_at:
            arp_responses[packet[ARP].psrc].add(packet[ARP].hwsrc)
        else:
            pass

    sniff(prn=arp_capture_callback, filter='arp', store=0)

# 判断是否遭受ARP攻击
def detect_arp_attack():
    arp_attack = False

    # 检测应答报文
    for ip, macs in arp_responses.items():
        if len(macs) > 1:
            logging.info('IP地址 {} 对应不同的MAC地址 {}'.format(ip, macs))
            messagebox.showerror('ARP攻击检测', 'IP地址 {} 可能遭受ARP攻击'.format(ip))
            arp_attack = True

    # 检测请求报文
    for ip, macs in arp_requests.items():
        if len(macs) > 1:
            logging.info('不同IP地址 {} 对应同一个MAC地址 {}'.format(ip, macs))
            messagebox.showerror('ARP攻击检测', 'IP地址 {} 可能遭受ARP攻击'.format(ip))
            arp_attack = True

    # 检测ARP请求或响应包
    for mac, ips in active_hosts.items():
        if len(ips) > 100:
            logging.info('MAC地址 {} 发出大量数据包'.format(mac))
            messagebox.showerror('ARP攻击检测', 'IP地址 {} 可能遭受ARP攻击'.format(ip))
            arp_attack = True

    if not arp_attack:
        logging.info('未遭受ARP攻击')
        messagebox.showinfo('ARP攻击检测', '未遭受ARP攻击')

# 统计ARP响应报文数量
def count_arp_responses():
    arp_responses_count = defaultdict(int)
    for ip, macs in arp_responses.items():
        arp_responses_count[len(macs)] += 1

    result = 'ARP响应报文数量统计结果:\n'
    for count, num in arp_responses_count.items():
        result += '{} 个IP地址对应 {} 个MAC地址,数量为 {} 个\n'.format(num, count, num*count)

    messagebox.showinfo('ARP响应报文数量统计', result)
    logging.info(result)

# 统计ARP请求报文数量
def count_arp_requests():
    arp_requests_count = defaultdict(int)
    for ip, macs in arp_requests.items():
        arp_requests_count[len(macs)] += 1

    result = 'ARP请求报文数量统计结果:\n'
    for count, num in arp_requests_count.items():
        result += '{} 个IP地址请求 {} 个MAC地址,数量为 {} 个\n'.format(num, count, num*count)

    messagebox.showinfo('ARP请求报文数量统计', result)
    logging.info(result)

# 扫描局域网内的活动主机
def scan_active_hosts():
    active_hosts.clear()
    ans, unans = srp(Ether(dst='ff:ff:ff:ff:ff:ff')/ARP(pdst='192.168.1.0/24'), timeout=2, verbose=False)
    for send, recv in ans:
        active_hosts[recv[Ether].src].add(recv[ARP].psrc)

    result = '局域网内活动主机:\n'
    for mac, ips in active_hosts.items():
        result += 'MAC地址 {} 对应的IP地址有:{}\n'.format(mac, ', '.join(ips))

    messagebox.showinfo('扫描局域网活动主机', result)
    logging.info(result)

# 用户登录
def login():
    username = username_entry.get()
    password = password_entry.get()
    with open('users.txt', 'r') as f:
        for line in f:
            user, pwd = line.strip().split(',')
            if user == username:
                if pwd == password:
                    login_window.destroy()
                    main_window.deiconify()
                    return
                else:
                    messagebox.showerror('登录失败', '用户名或密码错误')
                    return
    messagebox.showerror('登录失败', '查无该用户')

# 用户注册
def register():
    username = username_entry.get()
    password = password_entry.get()
    with open('users.txt', 'r') as f:
        for line in f:
            user, pwd = line.strip().split(',')
            if user == username:
                messagebox.showerror('注册失败', '该用户已注册')
                return
    with open('users.txt', 'a') as f:
        f.write('{},{}
'.format(username, password))
    messagebox.showinfo('注册成功', '注册成功,请登录')

# 创建登录窗口
login_window = tk.Tk()
login_window.title('ARP攻击检测软件 - 登录')
login_window.geometry('300x150')
login_window.resizable(False, False)

username_label = tk.Label(login_window, text='用户名:')
username_label.grid(row=0, column=0, padx=10, pady=10)
username_entry = tk.Entry(login_window)
username_entry.grid(row=0, column=1, padx=10, pady=10)

password_label = tk.Label(login_window, text='密码:')
password_label.grid(row=1, column=0, padx=10, pady=10)
password_entry = tk.Entry(login_window, show='*')
password_entry.grid(row=1, column=1, padx=10, pady=10)

login_button = tk.Button(login_window, text='登录', command=login)
login_button.grid(row=2, column=0, padx=10, pady=10)

register_button = tk.Button(login_window, text='注册', command=register)
register_button.grid(row=2, column=1, padx=10, pady=10)

# 创建主窗口
main_window = tk.Tk()
main_window.title('ARP攻击检测软件')
main_window.geometry('600x400')
main_window.resizable(False, False)
main_window.withdraw()

# 创建攻击检测界面
def attack_detection():
    def analyze_responses():
        result = '同一IP地址对应不同的MAC地址:\n'
        for ip, macs in arp_responses.items():
            if len(macs) > 1:
                result += 'IP地址 {} 对应的MAC地址有:{}\n'.format(ip, ', '.join(macs))
        messagebox.showinfo('分析响应报文', result)
        logging.info(result)

    def analyze_requests():
        result = '不同IP地址对应同一个MAC地址:\n'
        for ip, macs in arp_requests.items():
            if len(macs) > 1:
                result += 'MAC地址 {} 对应的IP地址有:{}\n'.format(', '.join(macs), ip)
        messagebox.showinfo('分析请求报文', result)
        logging.info(result)

    def stop_detection():
        arp_requests.clear()
        arp_responses.clear()
        messagebox.showinfo('停止攻击检测', '攻击检测已停止')

    def count_packets():
        count_window = tk.Toplevel(attack_window)
        count_window.title('统计ARP报文数量')
        count_window.geometry('400x200')
        count_window.resizable(False, False)

        arp_responses_button = tk.Button(count_window, text='计算ARP响应报文数量', command=count_arp_responses)
        arp_responses_button.pack(padx=10, pady=10)

        arp_requests_button = tk.Button(count_window, text='计算ARP请求报文数量', command=count_arp_requests)
        arp_requests_button.pack(padx=10, pady=10)

        back_button = tk.Button(count_window, text='返回功能界面', command=count_window.destroy)
        back_button.pack(padx=10, pady=10)

    attack_window = tk.Toplevel(main_window)
    attack_window.title('ARP攻击检测 - 攻击检测')
    attack_window.geometry('600x400')
    attack_window.resizable(False, False)

    analyze_responses_button = tk.Button(attack_window, text='分析响应报文', command=analyze_responses)
    analyze_responses_button.pack(padx=10, pady=10)

    analyze_requests_button = tk.Button(attack_window, text='分析请求报文', command=analyze_requests)
    analyze_requests_button.pack(padx=10, pady=10)

    back_button = tk.Button(attack_window, text='返回功能界面', command=attack_window.destroy)
    back_button.pack(padx=10, pady=10)

    stop_button = tk.Button(attack_window, text='停止攻击检测', command=stop_detection)
    stop_button.pack(padx=10, pady=10)

    count_button = tk.Button(attack_window, text='统计ARP报文数量', command=count_packets)
    count_button.pack(padx=10, pady=10)

    capture_thread = threading.Thread(target=capture_arp)
    capture_thread.start()

    detect_thread = threading.Thread(target=detect_arp_attack)
    detect_thread.start()

# 创建扫描局域网活动主机界面
def scan_active_hosts_window():
    scan_window = tk.Toplevel(main_window)
    scan_window.title('ARP攻击检测 - 扫描局域网主机活动')
    scan_window.geometry('600x400')
    scan_window.resizable(False, False)

    scan_button = tk.Button(scan_window, text='扫描活动主机', command=scan_active_hosts)
    scan_button.pack(padx=10, pady=10)

    back_button = tk.Button(scan_window, text='返回功能界面', command=scan_window.destroy)
    back_button.pack(padx=10, pady=10)

    result_text = tk.Text(scan_window)
    result_text.pack(padx=10, pady=10)

    def update_result():
        result_text.delete(1.0, tk.END)
        for mac, ips in active_hosts.items():
            result_text.insert(tk.END, 'MAC地址 {} 对应的IP地址有:{}\n'.format(mac, ', '.join(ips)))
        result_text.after(1000, update_result)

    update_result()

# 创建功能界面
attack_detection_button = tk.Button(main_window, text='开始攻击检测', command=attack_detection)
attack_detection_button.pack(padx=10, pady=10)

scan_active_hosts_button = tk.Button(main_window, text='扫描局域网主机活动', command=scan_active_hosts_window)
scan_active_hosts_button.pack(padx=10, pady=10)

# 运行主程序
login_window.mainloop()
Python ARP攻击检测软件 - 实时监控局域网安全

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

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