以下是一个简单的基于Python的ARP攻击检测软件的实现,包含上述规则:

import os
import sys
import time
from scapy.all import *
from tkinter import *
from tkinter import messagebox

# 初始化
root = Tk()
root.title('ARP攻击检测软件')
root.geometry('500x500')
root.resizable(False, False)

# 全局变量
users_file = 'users.txt'
log_file = 'log.txt'
arp_requests = {}
arp_responses = {}

# 用户登录和注册功能
def register():
    username = username_entry.get()
    password = password_entry.get()
    if os.path.exists(users_file):
        with open(users_file, 'r') as f:
            for line in f.readlines():
                if line.strip().startswith(username):
                    messagebox.showerror('错误', '该用户已注册')
                    return
    with open(users_file, 'a') as f:
        f.write(username + ' ' + password + '\n')
    messagebox.showinfo('成功', '注册成功')

def login():
    username = username_entry.get()
    password = password_entry.get()
    if not os.path.exists(users_file):
        messagebox.showerror('错误', '查无该用户')
        return
    with open(users_file, 'r') as f:
        for line in f.readlines():
            if line.strip().startswith(username):
                if line.strip().endswith(password):
                    messagebox.showinfo('成功', '登录成功')
                    login_frame.pack_forget()
                    main_frame.pack()
                    return
                else:
                    messagebox.showerror('错误', '用户名或密码错误')
                    return
    messagebox.showerror('错误', '查无该用户')

# ARP攻击检测功能
def analyze_response_packet():
    global arp_responses
    for ip, macs in arp_responses.items():
        if len(macs) > 1:
            log('ARP响应报文', '同一IP地址对应不同的MAC地址: ' + ip + ' ' + str(macs))
            messagebox.showwarning('警告', '遭受ARP攻击')
            return
    messagebox.showinfo('成功', '未遭受ARP攻击')

def analyze_request_packet():
    global arp_requests
    for mac, ips in arp_requests.items():
        if len(ips) > 1:
            log('ARP请求报文', '不同IP地址对应同一个MAC地址: ' + mac + ' ' + str(ips))
            messagebox.showwarning('警告', '遭受ARP攻击')
            return
    messagebox.showinfo('成功', '未遭受ARP攻击')

def stop_detection():
    global arp_requests, arp_responses
    arp_requests = {}
    arp_responses = {}
    log('ARP攻击检测', '停止检测')

def count_responses():
    global arp_responses
    count = 0
    for ip, macs in arp_responses.items():
        if len(macs) > 1:
            count += 1
    if count > 100:
        log('ARP响应报文数量统计', '超过100个同一IP地址对应不同的MAC地址的情况: ' + str(count))
        messagebox.showwarning('警告', '遭受ARP攻击')
    else:
        log('ARP响应报文数量统计', '未遭受ARP攻击')
        messagebox.showinfo('成功', '未遭受ARP攻击')

def count_requests():
    global arp_requests
    count = 0
    for mac, ips in arp_requests.items():
        if len(ips) > 1:
            count += 1
    if count > 100:
        log('ARP请求报文数量统计', '超过100个不同IP地址对应同一个MAC地址的情况: ' + str(count))
        messagebox.showwarning('警告', '遭受ARP攻击')
    else:
        log('ARP请求报文数量统计', '未遭受ARP攻击')
        messagebox.showinfo('成功', '未遭受ARP攻击')

def detect_attack():
    analyze_response_packet()
    analyze_request_packet()

# 局域网扫描功能
def scan_hosts():
    hosts = []
    for i in range(1, 255):
        ip = '192.168.1.' + str(i)
        ans, unans = srp(Ether(dst='ff:ff:ff:ff:ff:ff')/ARP(pdst=ip), timeout=1, verbose=0)
        if ans:
            for snd, rcv in ans:
                mac = rcv.sprintf('%Ether.src%')
                hosts.append((ip, mac))
    for host in hosts:
        log('局域网扫描', '发现活动主机: ' + host[0] + ' ' + host[1])
        messagebox.showinfo('发现活动主机', host[0] + ' ' + host[1])

# 日志记录
def log(action, message):
    with open(log_file, 'a') as f:
        f.write(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()) + ' ' + action + ' ' + message + '\n')
    log_text.insert(END, action + ' ' + message + '\n')

# UI界面
login_frame = Frame(root)
Label(login_frame, text='用户名').grid(row=0, column=0)
username_entry = Entry(login_frame)
username_entry.grid(row=0, column=1)
Label(login_frame, text='密码').grid(row=1, column=0)
password_entry = Entry(login_frame, show='*')
password_entry.grid(row=1, column=1)
Button(login_frame, text='注册', command=register).grid(row=2, column=0)
Button(login_frame, text='登录', command=login).grid(row=2, column=1)
login_frame.pack()

main_frame = Frame(root)
Button(main_frame, text='开始攻击检测', command=detect_attack).grid(row=0, column=0)
Button(main_frame, text='扫描局域网主机活动', command=lambda:[scan_hosts(), main_frame.pack_forget(), main_frame.pack()]).grid(row=0, column=1)
Button(main_frame, text='退出', command=root.quit).grid(row=0, column=2)

detect_frame = Frame(main_frame)
Button(detect_frame, text='分析响应报文', command=analyze_response_packet).grid(row=0, column=0)
Button(detect_frame, text='分析请求报文', command=analyze_request_packet).grid(row=0, column=1)
Button(detect_frame, text='返回', command=lambda:[detect_frame.pack_forget(), main_frame.pack()]).grid(row=1, column=0)
Button(detect_frame, text='停止攻击检测', command=stop_detection).grid(row=1, column=1)
Button(detect_frame, text='统计ARP响应报文和请求报文的数量', command=lambda:[detect_frame.pack_forget(), count_frame.pack()]).grid(row=2, column=0, columnspan=2)
detect_frame.pack()

count_frame = Frame(main_frame)
Button(count_frame, text='计算ARP响应报文数量', command=count_responses).grid(row=0, column=0)
Button(count_frame, text='计算ARP请求报文数量', command=count_requests).grid(row=0, column=1)
Button(count_frame, text='返回', command=lambda:[count_frame.pack_forget(), main_frame.pack()]).grid(row=1, column=0, columnspan=2)

log_frame = Frame(root)
log_text = Text(log_frame, height=20, width=60)
log_text.pack()
log_frame.pack()

root.mainloop()

需要注意的是,这只是一个简单的实现,可能存在漏洞和不足之处,仅供参考。同时,需要在运行之前安装必要的库,比如scapy库。

使用说明:

  1. 安装必要的库:pip install scapy
  2. 运行代码:python arp_detection.py
  3. 注册或登录用户
  4. 使用软件的功能,进行攻击检测、局域网扫描等操作

主要功能:

  • 用户登录和注册功能
  • ARP攻击检测功能
    • 分析ARP响应报文:检测是否出现同一IP地址对应不同的MAC地址
    • 分析ARP请求报文:检测是否出现不同IP地址对应同一个MAC地址
    • 统计ARP响应报文和请求报文的数量:检测是否超过阈值
  • 局域网扫描功能:扫描活动主机并输出IP地址和MAC地址
  • 日志记录功能:记录所有操作和检测结果
基于Python的ARP攻击检测软件:原理、实现和规则

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

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