基于Linux的ARP攻击检测软件功能实现及Python代码示例

本文介绍了基于Linux的ARP攻击检测软件的功能需求,并提供了一个使用Python实现的代码示例。该软件能够捕获ARP数据包,分析ARP请求和应答报文,检测ARP攻击,并输出检测结果和日志信息。

软件功能需求

基于Linux的ARP攻击检测软件需要具备以下功能:

  1. 捕获数据包并过滤出ARP包,其他数据包丢弃
  2. 分析ARP包,区分正常主机和疑似异常主机,将疑似异常主机的IP地址和MAC地址标为红色
  3. 用户注册和登录功能,可以查询文件中是否已经存在同名用户,避免重复注册。注册成功后将用户名和密码添加到文件中,登录成功后跳转到功能页面
  4. 功能页面有三个按钮:'开始攻击检测'、'停止攻击检测'和'扫描局域网主机'
  5. 开始攻击检测后,输出源IP地址和源MAC地址信息一次,并保存在文件中。同时,检测应答报文和请求报文,判断是否遭受ARP攻击
  6. 停止攻击检测后,清空信息
  7. 扫描局域网主机,输出活动主机的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 著作权归作者所有。请勿转载和采集!

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