基于Python的ARP攻击检测软件:原理、实现和规则
以下是一个简单的基于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库。
使用说明:
- 安装必要的库:
pip install scapy - 运行代码:
python arp_detection.py - 注册或登录用户
- 使用软件的功能,进行攻击检测、局域网扫描等操作
主要功能:
- 用户登录和注册功能
- ARP攻击检测功能
- 分析ARP响应报文:检测是否出现同一IP地址对应不同的MAC地址
- 分析ARP请求报文:检测是否出现不同IP地址对应同一个MAC地址
- 统计ARP响应报文和请求报文的数量:检测是否超过阈值
- 局域网扫描功能:扫描活动主机并输出IP地址和MAC地址
- 日志记录功能:记录所有操作和检测结果
原文地址: https://www.cveoy.top/t/topic/jpx7 著作权归作者所有。请勿转载和采集!