基于Linux的ARP攻击检测防护软件设计与实现

本文介绍基于Linux系统开发的ARP攻击检测防护软件的设计与实现,该软件能够检测常见的网络攻击,包括ICMP flood、TCP攻击和ARP欺骗攻击,并记录攻击源的IP地址和MAC地址。同时,软件还能够扫描局域网内活动主机,并记录其IP地址和MAC地址。软件使用Python语言编写,并通过Tkinter库实现可视化界面,所有记录将保存在本地文件中。

1. 软件模块设计

该软件主要包括以下模块:

  • 攻击检测模块: 负责检测ICMP flood、TCP攻击和ARP欺骗攻击。
  • 主机扫描模块: 负责扫描局域网内活动主机。
  • 记录模块: 负责记录攻击事件和扫描结果。
  • 可视化界面模块: 负责提供用户界面,方便用户查看记录和操作软件。

2. 软件实现细节

2.1 攻击检测模块

攻击检测模块使用Scapy库实现,该库提供了丰富的网络协议分析和构造功能。

2.1.1 ICMP flood攻击检测

from scapy.all import *

def icmp_flood_detect(pkt):
    if pkt.haslayer(ICMP):
        if pkt[ICMP].type == 8:
            src = pkt[IP].src
            count = 0
            for p in pkt_lst:
                if p[IP].src == src and p.haslayer(ICMP) and p[ICMP].type == 8:
                    count += 1
            if count > 10:
                print('ICMP flood attack detected from', src)

该函数会检测是否有ICMP echo request报文,并统计同一源IP地址的报文数量。如果超过10个,则判定为ICMP flood攻击,并输出攻击源IP地址。

2.1.2 TCP攻击检测

def tcp_attack_detect(pkt):
    if pkt.haslayer(TCP):
        src = pkt[IP].src
        dst = pkt[IP].dst
        sport = pkt[TCP].sport
        dport = pkt[TCP].dport
        flags = pkt[TCP].flags
        if flags == 0x02:
            count = 0
            for p in pkt_lst:
                if p[IP].src == src and p[IP].dst == dst and p[TCP].sport == sport and p[TCP].dport == dport and p[TCP].flags == 0x02:
                    count += 1
            if count > 10:
                print('TCP SYN flood attack detected from', src)
        elif flags == 0x03:
            count = 0
            for p in pkt_lst:
                if p[IP].src == src and p[IP].dst == dst and p[TCP].sport == sport and p[TCP].dport == dport and p[TCP].flags == 0x03:
                    count += 1
            if count > 10:
                print('TCP FIN flood attack detected from', src)

该函数会检测TCP报文的标志位,如果是SYN或FIN,则统计同一源IP地址、目的IP地址、源端口和目的端口的报文数量。如果超过10个,则判定为TCP SYN flood或TCP FIN flood攻击,并输出攻击源IP地址。

2.1.3 ARP欺骗攻击检测

def arp_spoof_detect(pkt):
    if pkt.haslayer(ARP):
        src = pkt[ARP].psrc
        mac = pkt[ARP].hwsrc
        if src in ip_mac_dict and ip_mac_dict[src] != mac:
            print('ARP spoofing attack detected from', src)
        else:
            ip_mac_dict[src] = mac

该函数会检测ARP报文,如果发现源IP地址已经在字典中存在,但对应的MAC地址不同,则判定为ARP欺骗攻击,并输出攻击源IP地址。

2.2 主机扫描模块

def scan_hosts():
    global ip_mac_dict
    ans, unans = srp(Ether(dst='ff:ff:ff:ff:ff:ff')/ARP(pdst='192.168.1.0/24'), timeout=5, verbose=False)
    for snd, rcv in ans:
        ip_mac_dict[rcv[ARP].psrc] = rcv[ARP].hwsrc

该函数使用Scapy库发送ARP广播报文,并接收响应报文,从而获取局域网内主机的IP地址和MAC地址。

2.3 记录模块

import pandas as pd
from datetime import datetime
def save_records():
    global pkt_lst
    global ip_mac_dict
    df = pd.DataFrame(columns=['Time', 'Source IP', 'Source MAC', 'Destination IP', 'Destination MAC', 'Protocol'])
    for pkt in pkt_lst:
        if pkt.haslayer(IP):
            src_ip = pkt[IP].src
            src_mac = ip_mac_dict[src_ip] if src_ip in ip_mac_dict else 'Unknown'
            dst_ip = pkt[IP].dst
            dst_mac = ip_mac_dict[dst_ip] if dst_ip in ip_mac_dict else 'Unknown'
            protocol = pkt[IP].proto
            df = df.append({'Time': datetime.now(), 'Source IP': src_ip, 'Source MAC': src_mac, 'Destination IP': dst_ip, 'Destination MAC': dst_mac, 'Protocol': protocol}, ignore_index=True)
    df.to_csv('records.csv', index=False)

该函数将所有捕获的网络数据包保存到一个CSV文件中,包括时间、源IP地址、源MAC地址、目的IP地址、目的MAC地址和协议类型。

2.4 可视化界面模块

import tkinter as tk

def update_display():
    global pkt_lst
    global ip_mac_dict
    text.delete('1.0', tk.END)
    for pkt in pkt_lst:
        if pkt.haslayer(IP):
            src_ip = pkt[IP].src
            src_mac = ip_mac_dict[src_ip] if src_ip in ip_mac_dict else 'Unknown'
            dst_ip = pkt[IP].dst
            dst_mac = ip_mac_dict[dst_ip] if dst_ip in ip_mac_dict else 'Unknown'
            protocol = pkt[IP].proto
            text.insert(tk.END, f'Time: {datetime.now()} Source IP: {src_ip} Source MAC: {src_mac} Destination IP: {dst_ip} Destination MAC: {dst_mac} Protocol: {protocol}
')
    root.after(1000, update_display)

def start_capture():
    global pkt_lst
    pkt_lst = []
    sniff(prn=lambda pkt: pkt_lst.append(pkt), filter='arp or icmp or tcp', store=False)

def stop_capture():
    global pkt_lst
    pkt_lst = []

root = tk.Tk()
root.title('ARP Attack Detection and Protection')

frame1 = tk.Frame(root)
frame1.pack(side=tk.TOP, padx=10, pady=10)

icmp_button = tk.Button(frame1, text='ICMP Flood Detection', command=lambda: print('ICMP Flood Detection'))
icmp_button.pack(side=tk.LEFT, padx=10)

tcp_button = tk.Button(frame1, text='TCP Attack Detection', command=lambda: print('TCP Attack Detection'))
tcp_button.pack(side=tk.LEFT, padx=10)

ar_button = tk.Button(frame1, text='ARP Spoof Detection', command=lambda: print('ARP Spoof Detection'))
ar_button.pack(side=tk.LEFT, padx=10)

frame2 = tk.Frame(root)
frame2.pack(side=tk.TOP, padx=10, pady=10)

start_button = tk.Button(frame2, text='Start Capture', command=start_capture)
start_button.pack(side=tk.LEFT, padx=10)

stop_button = tk.Button(frame2, text='Stop Capture', command=stop_capture)
stop_button.pack(side=tk.LEFT, padx=10)

scan_button = tk.Button(frame2, text='Scan Hosts', command=scan_hosts)
scan_button.pack(side=tk.LEFT, padx=10)

save_button = tk.Button(frame2, text='Save Records', command=save_records)
save_button.pack(side=tk.LEFT, padx=10)

frame3 = tk.Frame(root)
frame3.pack(side=tk.TOP, padx=10, pady=10)

text = tk.Text(frame3, height=20, width=80)
text.pack()

root.after(1000, update_display)
root.mainloop()

3. 软件使用说明

  1. 运行软件后,点击“Start Capture”按钮开始捕获网络数据包。
  2. 点击“Scan Hosts”按钮扫描局域网内活动主机。
  3. 点击“Save Records”按钮将所有记录保存到本地文件中。
  4. 点击“ICMP Flood Detection”、“TCP Attack Detection”和“ARP Spoof Detection”按钮分别开启对应攻击类型的检测。
  5. 软件会将所有捕获到的数据包和攻击事件记录在可视化界面中。

4. 总结

本文介绍了基于Linux系统的ARP攻击检测防护软件的设计与实现,该软件能够有效地检测常见的网络攻击,并记录攻击源信息,为网络安全管理提供参考。同时,软件还提供了友好的可视化界面,方便用户操作和查看记录。

基于Linux的ARP攻击检测防护软件设计与实现

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

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