基于 Linux 的 ARP 攻击检测与 Python 实现

ARP 攻击是一种常见的网络攻击手段,攻击者利用 ARP 协议的漏洞,伪造 ARP 报文,从而进行网络欺骗。本文将介绍如何使用 Python 和 Scapy 库开发一个基于 Linux 的 ARP 攻击检测软件,并详细解释代码实现。

软件功能

该软件的主要功能包括:

  1. 捕获数据包,过滤规则设置为 ARP 包: 使用 Scapy 库捕获网络中的数据包,并过滤出 ARP 数据包。
  2. 分析 ARP 包,区分正常主机和疑似异常主机: 分析 ARP 包的源 IP 地址、目的 IP 地址、源 MAC 地址等信息,识别可疑的 ARP 报文。
  3. 标记疑似异常主机为红色: 在终端输出中,使用 ANSI Escape Code 将疑似异常主机的 IP 地址标记为红色,方便用户识别。
  4. 检测应答报文: 判断是否存在同一 IP 地址对应不同 MAC 地址的情况,如果是,则可能遭受 ARP 攻击。
  5. 检测请求报文: 判断 ARP 请求报文是否合法,以及是否存在不同 IP 地址对应同一个 MAC 地址的情况,如果是,则可能遭受 ARP 攻击。
  6. 检测大量的 ARP 请求或响应包: 统计同一 IP 地址或 MAC 地址发送的 ARP 包数量,如果超过预设阈值,则可能遭受 ARP 攻击。
  7. 输出遭受 ARP 攻击或未遭受 ARP 攻击的信息: 根据检测结果,输出相应的提示信息,告知用户当前网络环境是否安全。
  8. 保存所有信息在日志中: 将所有检测到的 ARP 数据包信息和分析结果保存到日志文件中,方便后续分析和排查问题。

Python 实现

以下是用 Python 和 Scapy 库实现 ARP 攻击检测软件的示例代码:

from scapy.all import *
import logging

# 设置日志格式和级别
logging.basicConfig(filename='arp_attack.log', level=logging.INFO, format='%(asctime)s %(message)s')

# 存储 IP 地址和对应的 MAC 地址
ip_mac_dict = {}

# 存储疑似异常主机
suspicious_hosts = set()

# 统计 ARP 包数量
arp_count = {}

# 阈值
threshold = 10

# 检测应答报文
def check_response(pkt):
    if pkt[ARP].op == 2:
        if pkt[ARP].psrc in ip_mac_dict and pkt[ARP].hwsrc != ip_mac_dict[pkt[ARP].psrc]:
            suspicious_hosts.add(pkt[ARP].psrc)
            logging.warning('ARP attack detected: same IP address with different MAC address - %s', pkt[ARP].psrc)

# 检测请求报文
def check_request(pkt):
    if pkt[ARP].op == 1:
        if pkt[ARP].psrc != pkt[ARP].pdst and pkt[ARP].hwsrc in ip_mac_dict.values():
            suspicious_hosts.add(pkt[ARP].psrc)
            logging.warning('ARP attack detected: different IP addresses with same MAC address - %s', pkt[ARP].psrc)

# 检测大量的 ARP 请求或响应包
def check_arp_count(pkt):
    if pkt[ARP].psrc != pkt[ARP].pdst:
        if pkt[ARP].psrc in arp_count:
            arp_count[pkt[ARP].psrc] += 1
            if arp_count[pkt[ARP].psrc] > threshold:
                suspicious_hosts.add(pkt[ARP].psrc)
                logging.warning('ARP attack detected: large number of ARP requests from the same IP address - %s', pkt[ARP].psrc)
        else:
            arp_count[pkt[ARP].psrc] = 1

# 处理 ARP 包
def handle_arp(pkt):
    if pkt.haslayer(ARP):
        # 存储 IP 地址和对应的 MAC 地址
        ip_mac_dict[pkt[ARP].psrc] = pkt[ARP].hwsrc

        # 检测应答报文
        check_response(pkt)

        # 检测请求报文
        check_request(pkt)

        # 检测大量的 ARP 请求或响应包
        check_arp_count(pkt)

        # 输出疑似异常主机
        if pkt[ARP].psrc in suspicious_hosts:
            print('�33[91m' + pkt[ARP].psrc + ' is a suspicious host!' + '�33[0m')
        else:
            print(pkt[ARP].psrc + ' is a normal host.')

        # 保存信息到日志文件中
        logging.info('IP: %s, MAC: %s', pkt[ARP].psrc, pkt[ARP].hwsrc)

# 捕获 ARP 数据包
sniff(filter='arp', prn=handle_arp)

代码说明

  1. 导入必要的库: scapy 用于网络数据包处理,logging 用于日志记录。
  2. 设置日志: 配置日志文件名、级别和格式。
  3. 定义数据结构: 使用字典存储 IP 地址和 MAC 地址的对应关系,使用集合存储疑似异常主机,使用字典统计 ARP 包数量。
  4. 定义检测函数: 分别定义 check_responsecheck_requestcheck_arp_count 函数,用于检测不同类型的 ARP 攻击。
  5. 定义处理函数: 定义 handle_arp 函数,用于处理捕获到的 ARP 数据包,调用检测函数进行分析,并输出结果和记录日志。
  6. 启动捕获: 使用 sniff 函数捕获网络中的 ARP 数据包,并指定 handle_arp 函数作为回调函数处理捕获到的数据包。

总结

本文介绍了如何使用 Python 和 Scapy 库开发一个基于 Linux 的 ARP 攻击检测软件,并详细解释了代码实现。该软件可以有效地检测和防御 ARP 攻击,提高网络安全性。

基于 Linux 的 ARP 攻击检测与 Python 实现

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

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