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

本文介绍了基于Linux的ARP攻击检测软件的功能需求,并用Python代码实现了这些功能。该软件可以捕获ARP包并进行分析,识别可能遭受攻击的主机,并输出结果到日志文件中。

软件功能需求

  1. 捕获数据包并过滤规则设置为ARP包:使用网络抓包工具,例如Scapy,捕获网络数据包并过滤掉非ARP包。
  2. 分析ARP包,区分正常主机和疑似异常主机:根据ARP协议的规则,分析ARP包,识别可能存在攻击行为的异常主机。
  3. 标记疑似异常主机的IP地址和MAC地址为红色:将识别出的疑似异常主机信息以红色标记显示,方便用户直观识别。
  4. 检测应答报文,判断是否出现同一IP地址对应不同的MAC地址:ARP攻击中,攻击者会伪造ARP应答报文,使目标主机将攻击者的MAC地址与目标主机的IP地址关联,从而导致网络流量被劫持。该功能用于检测此类攻击。
  5. 检测请求报文,判断是否合法且是否出现不同IP地址对应同一个MAC地址:ARP攻击也可能通过伪造ARP请求报文来实现,攻击者会将自己的MAC地址与目标主机的IP地址关联,从而窃取网络流量。该功能用于检测此类攻击。
  6. 检测大量的ARP请求或响应包,判断是否为同一IP发出或同一MAC地址发出:ARP攻击者可能会发送大量的ARP请求或响应包,造成网络拥塞或资源耗尽,从而影响网络正常运行。该功能用于检测此类攻击。
  7. 输出遭受ARP攻击或未遭受ARP攻击的结果:根据上述检测结果,判断是否发生了ARP攻击,并输出相应的信息。
  8. 保存所有信息到日志中:将所有检测信息详细记录到日志文件中,方便用户后续查看分析。

Python代码实现

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

# 设置日志格式
logging.basicConfig(level=logging.INFO,
                    format='%(asctime)s [%(levelname)s] %(message)s',
                    handlers=[logging.FileHandler('arp_attack.log'),
                              logging.StreamHandler()])

# 捕获数据包并过滤规则设置为ARP包
def arp_filter(pkt):
    return ARP in pkt

# 分析ARP包,区分正常主机和疑似异常主机
def arp_analysis(pkt_list):
    normal_hosts = []
    suspicious_hosts = []
    for pkt in pkt_list:
        if pkt[ARP].op == 1:  # ARP请求
            if pkt[ARP].psrc == pkt[ARP].pdst:  # ARP请求源和目的IP地址相同
                normal_hosts.append(pkt)
            else:
                suspicious_hosts.append(pkt)
        elif pkt[ARP].op == 2:  # ARP应答
            normal_hosts.append(pkt)
    return normal_hosts, suspicious_hosts

# 标记疑似异常主机的IP地址和MAC地址为红色
def mark_suspicious_hosts(pkt_list):
    for pkt in pkt_list:
        if pkt[ARP].op == 1:  # ARP请求
            if pkt[ARP].psrc == pkt[ARP].pdst:  # ARP请求源和目的IP地址相同
                pkt.show()
            else:
                pkt.show()
                print('\033[1;31;40m[!] Suspicious ARP packet detected!\033[0m')
        elif pkt[ARP].op == 2:  # ARP应答
            pkt.show()

# 检测应答报文,判断是否出现同一IP地址对应不同的MAC地址
def check_reply(pkt_list):
    attack_count = 0
    for pkt in pkt_list:
        if pkt[ARP].op == 2:  # ARP应答
            src_ip = pkt[ARP].psrc
            src_mac = pkt[ARP].hwsrc
            for pkt2 in pkt_list:
                if pkt2[ARP].op == 2 and pkt2 != pkt and pkt2[ARP].psrc == src_ip and pkt2[ARP].hwsrc != src_mac:
                    print('\033[1;31;40m[!] Possible ARP attack detected!\033[0m')
                    logging.warning('[ARP Attack] Same IP address with different MAC address: %s' % src_ip)
                    attack_count += 1
                    break
    return attack_count

# 检测请求报文,判断是否合法且是否出现不同IP地址对应同一个MAC地址
def check_request(pkt_list):
    attack_count = 0
    for pkt in pkt_list:
        if pkt[ARP].op == 1:  # ARP请求
            src_ip = pkt[ARP].psrc
            src_mac = pkt[ARP].hwsrc
            dst_ip = pkt[ARP].pdst
            dst_mac = pkt[ARP].hwdst
            # 合法的ARP请求应该是目的MAC地址为广播地址或目的MAC地址为自己的MAC地址
            if dst_mac != 'ff:ff:ff:ff:ff:ff' and dst_mac != get_if_hwaddr(conf.iface):
                print('\033[1;31;40m[!] Possible ARP attack detected!\033[0m')
                logging.warning('[ARP Attack] Invalid ARP request: %s -> %s' % (src_ip, dst_ip))
                attack_count += 1
            # 检测是否出现不同IP地址对应同一个MAC地址
            for pkt2 in pkt_list:
                if pkt2[ARP].op == 2 and pkt2[ARP].hwsrc == src_mac and pkt2[ARP].psrc != src_ip:
                    print('\033[1;31;40m[!] Possible ARP attack detected!\033[0m')
                    logging.warning('[ARP Attack] Same MAC address with different IP address: %s' % src_mac)
                    attack_count += 1
                    break
    return attack_count

# 检测大量的ARP请求或响应包,判断是否为同一IP发出或同一MAC地址发出
def check_flood(pkt_list):
    src_ip_dict = {}
    src_mac_dict = {}
    for pkt in pkt_list:
        if pkt[ARP].op == 1:  # ARP请求
            src_ip = pkt[ARP].psrc
            if src_ip in src_ip_dict:
                src_ip_dict[src_ip] += 1
            else:
                src_ip_dict[src_ip] = 1
            if src_ip_dict[src_ip] > 10:
                print('\033[1;31;40m[!] Possible ARP attack detected!\033[0m')
                logging.warning('[ARP Attack] ARP flood from the same IP address: %s' % src_ip)
                return True
        elif pkt[ARP].op == 2:  # ARP应答
            src_mac = pkt[ARP].hwsrc
            if src_mac in src_mac_dict:
                src_mac_dict[src_mac] += 1
            else:
                src_mac_dict[src_mac] = 1
            if src_mac_dict[src_mac] > 10:
                print('\033[1;31;40m[!] Possible ARP attack detected!\033[0m')
                logging.warning('[ARP Attack] ARP flood from the same MAC address: %s' % src_mac)
                return True
    return False

if __name__ == '__main__':
    pkt_list = sniff(filter='arp', prn=lambda x: x.summary(), count=100)
    normal_hosts, suspicious_hosts = arp_analysis(pkt_list)
    mark_suspicious_hosts(suspicious_hosts)
    attack_count = 0
    attack_count += check_reply(normal_hosts)
    attack_count += check_request(normal_hosts)
    if not check_flood(normal_hosts):
        print('\033[1;32;40m[+] No ARP attack detected.\033[0m')
        logging.info('[ARP Attack] No ARP attack detected.')
    else:
        attack_count += 1
    if attack_count > 0:
        print('\033[1;31;40m[!] ARP attack detected!\033[0m')
    else:
        print('\033[1;32;40m[+] No ARP attack detected.\033[0m')
    logging.info('[ARP Attack] Total attack count: %d' % attack_count)

日志格式

2022-01-01 00:00:00,000 [WARNING] [ARP Attack] Same IP address with different MAC address: 192.168.1.100
2022-01-01 00:00:00,000 [WARNING] [ARP Attack] Invalid ARP request: 192.168.1.100 -> 192.168.1.200
2022-01-01 00:00:00,000 [WARNING] [ARP Attack] Same MAC address with different IP address: 00:11:22:33:44:55
2022-01-01 00:00:00,000 [WARNING] [ARP Attack] ARP flood from the same IP address: 192.168.1.100
2022-01-01 00:00:00,000 [INFO] [ARP Attack] No ARP attack detected.

该代码使用了Scapy库进行数据包捕获和分析。代码中定义了多个函数,分别用于捕获ARP包、分析ARP包、标记疑似异常主机、检测ARP攻击等。代码最后将检测结果输出到控制台和日志文件中。

注意: 该代码仅供参考,实际使用时需要根据具体情况进行修改和完善。

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

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

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