基于Linux的Python ARP攻击检测软件

本文将介绍如何使用Python编写一个基于Linux的ARP攻击检测软件。该软件利用网络嗅探工具Scapy捕获网络流量,并根据预设规则分析ARP数据包,以识别潜在的ARP攻击行为。

功能需求

该软件需要实现以下功能:

  1. 捕获ARP数据包: 设置网络接口和过滤器,仅捕获ARP数据包,丢弃其他类型的数据包。
  2. 识别可疑主机: 分析ARP数据包,识别出正常主机和疑似异常主机,例如同一IP地址对应多个MAC地址。
  3. 检测ARP欺骗:
    • 检测ARP应答报文,判断是否出现同一IP地址对应不同的MAC地址。
    • 检测ARP请求报文,判断是否合法且是否出现不同IP地址对应同一个MAC地址。
  4. 检测ARP泛洪: 检测大量的ARP请求或响应包,判断是否为同一IP地址或同一MAC地址发出。
  5. 记录日志: 将所有检测到的可疑行为和攻击事件记录到日志文件中,方便后续分析和追踪。

Python代码实现

以下是一个简单的Python代码示例,演示如何使用Scapy库实现上述功能:

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

# 设置过滤规则为ARP包
filter_rule = 'arp'

# 存储疑似异常主机信息的字典
suspicious_hosts = {}

# 存储所有信息的日志文件
log_file = 'arp_attack_detection.log'

# 检测应答报文是否存在同一IP地址对应不同的MAC地址
def check_reply(packet):
    if packet.op == 2:  # ARP应答报文
        if packet.psrc in suspicious_hosts and packet.hwsrc != suspicious_hosts[packet.psrc]:
            return True
    return False

# 检测请求报文是否合法且是否存在不同IP地址对应同一个MAC地址
def check_request(packet):
    if packet.op == 1:  # ARP请求报文
        if packet.hwsrc == '00:00:00:00:00:00':
            return False  # 无效的MAC地址
        if packet.psrc == packet.pdst:
            return False  # 请求报文中源IP地址和目的IP地址相同
        if packet.psrc in suspicious_hosts and packet.hwsrc != suspicious_hosts[packet.psrc]:
            return True
    return False

# 检测大量的ARP请求或响应包是否为同一IP地址或同一MAC地址发出
def check_flood(packet_list):
    src_ip = packet_list[0].psrc
    src_mac = packet_list[0].hwsrc
    for packet in packet_list:
        if packet.psrc != src_ip or packet.hwsrc != src_mac:
            return False
    return True

# 处理ARP包
def handle_packet(packet):
    if packet.haslayer(ARP):
        if packet.op == 1:  # ARP请求报文
            if check_request(packet):
                suspicious_hosts[packet.psrc] = packet.hwsrc
                print(f'[!] Detected ARP attack (request): IP {packet.psrc} with MAC {packet.hwsrc}')
                with open(log_file, 'a') as f:
                    f.write(f'[!] Detected ARP attack (request): IP {packet.psrc} with MAC {packet.hwsrc}
')
                    f.write(str(packet.summary()) + '
')
        elif packet.op == 2:  # ARP应答报文
            if check_reply(packet):
                print(f'[!] Detected ARP attack (reply): IP {packet.psrc} with MAC {packet.hwsrc}')
                with open(log_file, 'a') as f:
                    f.write(f'[!] Detected ARP attack (reply): IP {packet.psrc} with MAC {packet.hwsrc}
')
                    f.write(str(packet.summary()) + '
')
        # 检测大量的ARP请求或响应包
        packet_list = [p for p in sniffed_packets if p.haslayer(ARP) and p.op == packet.op and p.psrc == packet.psrc]
        if len(packet_list) > 10 and check_flood(packet_list):
            print(f'[!] Detected ARP flood attack: IP {packet.psrc} with MAC {packet.hwsrc}')
            with open(log_file, 'a') as f:
                f.write(f'[!] Detected ARP flood attack: IP {packet.psrc} with MAC {packet.hwsrc}
')
                f.write(str(packet.summary()) + '
')

# 开始捕获数据包并处理
sniffed_packets = sniff(filter=filter_rule, prn=handle_packet)

代码说明

  • 代码首先定义了三个函数:check_replycheck_requestcheck_flood,分别用于检测ARP欺骗和ARP泛洪攻击。
  • handle_packet函数是主要的处理逻辑,它接收捕获到的数据包,并根据数据包类型进行相应的处理。
  • 最后,使用sniff函数开始捕获数据包,并将捕获到的数据包传递给handle_packet函数进行处理。

总结

通过以上代码,我们可以实现一个简单的ARP攻击检测软件。当然,这只是一个基础版本,你可以根据实际需求进行扩展和优化,例如添加邮件告警、自动防御等功能。

基于Linux的Python ARP攻击检测软件

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

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