基于Linux的ARP攻击检测软件功能实现及Python代码示例
基于Linux的ARP攻击检测软件功能实现及Python代码示例
本文介绍了基于Linux的ARP攻击检测软件的功能需求,并提供了一个使用Python实现的代码示例。该软件能够捕获ARP数据包,分析ARP请求和应答报文,检测ARP攻击,并输出检测结果和日志信息。
软件功能需求
基于Linux的ARP攻击检测软件需要具备以下功能:
- 捕获数据包并过滤出ARP包,其他数据包丢弃
- 分析ARP包,区分正常主机和疑似异常主机,将疑似异常主机的IP地址和MAC地址标为红色
- 用户注册和登录功能,可以查询文件中是否已经存在同名用户,避免重复注册。注册成功后将用户名和密码添加到文件中,登录成功后跳转到功能页面
- 功能页面有三个按钮:'开始攻击检测'、'停止攻击检测'和'扫描局域网主机'
- 开始攻击检测后,输出源IP地址和源MAC地址信息一次,并保存在文件中。同时,检测应答报文和请求报文,判断是否遭受ARP攻击
- 停止攻击检测后,清空信息
- 扫描局域网主机,输出活动主机的IP地址和MAC地址信息,并保存在文件中
Python代码示例
import os
import sys
import time
from scapy.all import *
from tkinter import *
from tkinter import messagebox
# 定义全局变量
root = None
canvas = None
text = None
log_file = None
attack_flag = False
scan_flag = False
ip_mac_dict = {}
ip_dict = {}
mac_dict = {}
# 初始化GUI界面
def init_gui():
global root, canvas, text
root = Tk()
root.title('ARP Attack Detection Tool')
root.geometry('800x600')
canvas = Canvas(root, bg='white', width=800, height=600)
canvas.pack()
text = Text(canvas, width=100, height=30)
text.pack(side=LEFT)
scrollbar = Scrollbar(canvas)
scrollbar.pack(side=RIGHT, fill=Y)
scrollbar.config(command=text.yview)
text.config(yscrollcommand=scrollbar.set)
# 捕获ARP包并进行分析
def capture_arp_packet(pkt):
global attack_flag, ip_mac_dict, ip_dict, mac_dict
if pkt.haslayer(ARP):
arp_pkt = pkt[ARP]
if arp_pkt.op == 1:
# ARP请求包
if arp_pkt.psrc in ip_mac_dict and ip_mac_dict[arp_pkt.psrc] != arp_pkt.hwsrc:
# 出现不同IP地址对应同一个MAC地址,可能遭受ARP攻击
log('ARP Attack Detected: Different IP Address with Same MAC Address')
attack_flag = True
else:
ip_mac_dict[arp_pkt.psrc] = arp_pkt.hwsrc
if arp_pkt.psrc not in ip_dict:
ip_dict[arp_pkt.psrc] = 1
else:
ip_dict[arp_pkt.psrc] += 1
if arp_pkt.hwsrc not in mac_dict:
mac_dict[arp_pkt.hwsrc] = 1
else:
mac_dict[arp_pkt.hwsrc] += 1
elif arp_pkt.op == 2:
# ARP响应包
if arp_pkt.pdst in ip_mac_dict and ip_mac_dict[arp_pkt.pdst] != arp_pkt.hwdst:
# 出现同一IP地址对应不同的MAC地址,可能遭受ARP攻击
log('ARP Attack Detected: Same IP Address with Different MAC Address')
attack_flag = True
else:
ip_mac_dict[arp_pkt.pdst] = arp_pkt.hwdst
if arp_pkt.pdst not in ip_dict:
ip_dict[arp_pkt.pdst] = 1
else:
ip_dict[arp_pkt.pdst] += 1
if arp_pkt.hwdst not in mac_dict:
mac_dict[arp_pkt.hwdst] = 1
else:
mac_dict[arp_pkt.hwdst] += 1
# 开始攻击检测
def start_attack_detection():
global attack_flag, log_file
attack_flag = False
log('Start Attack Detection')
sniff(filter='arp', prn=capture_arp_packet, timeout=60)
if not attack_flag:
log('No ARP Attack Detected')
log_file.flush()
# 停止攻击检测
def stop_attack_detection():
global attack_flag, ip_mac_dict, ip_dict, mac_dict
attack_flag = False
ip_mac_dict = {}
ip_dict = {}
mac_dict = {}
log('Stop Attack Detection')
# 扫描局域网主机
def scan_local_hosts():
global scan_flag, log_file
log('Start Scanning Local Hosts')
scan_flag = True
ans, unans = srp(Ether(dst='ff:ff:ff:ff:ff:ff')/ARP(pdst='192.168.1.0/24'), timeout=2, verbose=False)
for snd, rcv in ans:
log(rcv.sprintf('%ARP.psrc% %Ether.src%'))
log('Finish Scanning Local Hosts')
log_file.flush()
scan_flag = False
# 输出日志信息
def log(msg):
global text, log_file
text.insert(END, msg + '\n')
log_file.write(msg + '\n')
# 用户登录
def login():
global root, log_file
username = username_entry.get()
password = password_entry.get()
if not username or not password:
messagebox.showerror('Error', 'Username and Password cannot be empty')
return
with open('users.txt', 'r') as f:
for line in f:
line = line.strip()
if line:
fields = line.split(',')
if fields[0] == username:
if fields[1] == password:
messagebox.showinfo('Success', 'Login Success')
root.title('ARP Attack Detection Tool - Welcome, ' + username)
login_frame.pack_forget()
main_frame.pack()
log('User ' + username + ' logged in')
log_file.flush()
return
else:
messagebox.showerror('Error', 'Incorrect Password')
return
messagebox.showerror('Error', 'User not found')
# 用户注册
def register():
global root, log_file
username = username_entry.get()
password = password_entry.get()
if not username or not password:
messagebox.showerror('Error', 'Username and Password cannot be empty')
return
with open('users.txt', 'r') as f:
for line in f:
line = line.strip()
if line:
fields = line.split(',')
if fields[0] == username:
messagebox.showerror('Error', 'User already exists')
return
with open('users.txt', 'a') as f:
f.write(username + ',' + password + '\n')
messagebox.showinfo('Success', 'Register Success')
log('User ' + username + ' registered')
log_file.flush()
# 初始化登录界面
def init_login_frame():
global root, username_entry, password_entry, login_frame
login_frame = Frame(canvas)
login_frame.pack()
username_label = Label(login_frame, text='Username:')
username_label.pack()
username_entry = Entry(login_frame)
username_entry.pack()
password_label = Label(login_frame, text='Password:')
password_label.pack()
password_entry = Entry(login_frame, show='*')
password_entry.pack()
login_button = Button(login_frame, text='Login', command=login)
login_button.pack()
register_button = Button(login_frame, text='Register', command=register)
register_button.pack()
# 初始化主界面
def init_main_frame():
global root, main_frame
main_frame = Frame(canvas)
start_button = Button(main_frame, text='Start Attack Detection', command=start_attack_detection)
start_button.pack()
stop_button = Button(main_frame, text='Stop Attack Detection', command=stop_attack_detection)
stop_button.pack()
scan_button = Button(main_frame, text='Scan Local Hosts', command=scan_local_hosts)
scan_button.pack()
# 初始化日志文件
def init_log_file():
global log_file
if not os.path.exists('logs'):
os.makedirs('logs')
log_file = open('logs/' + time.strftime('%Y%m%d%H%M%S', time.localtime()) + '.log', 'w')
# 主函数
def main():
init_gui()
init_login_frame()
init_main_frame()
init_log_file()
root.mainloop()
if __name__ == '__main__':
main()
代码说明
- 代码使用了Scapy库进行ARP数据包的捕获和分析。
- 代码使用Tkinter库创建了GUI界面,包括登录界面和功能页面。
- 代码使用字典存储IP地址和MAC地址的对应关系,以及每个IP地址和MAC地址出现的次数。
- 代码实现了攻击检测、停止攻击检测和扫描局域网主机的功能。
- 代码将检测结果和日志信息输出到文本框和日志文件中。
注意事项
- 代码示例仅供参考,实际应用中可能需要根据具体情况进行调整。
- 使用该软件进行ARP攻击检测时,需要确保运行环境的安全性,避免被恶意攻击者利用。
- 该软件仅供学习交流使用,请勿用于非法目的。
原文地址: https://www.cveoy.top/t/topic/jplz 著作权归作者所有。请勿转载和采集!