功能需求:

  1. 捕获数据包,过滤规则设置为ARP包
  2. 分析ARP包,区分正常主机和疑似异常主机
  3. 标记异常主机的IP地址为红色
  4. 检测应答报文时,是否出现同一IP地址对应不同的MAC地址
  5. 检测请求报文时,是否合法且是否出现不同IP地址对应同一个MAC地址
  6. 检测大量的ARP请求或响应包,是否为同一IP地址或同一MAC地址发出
  7. 输出遭受ARP攻击或未遭受ARP攻击的信息
  8. 将所有信息保存在日志中

Python实现:

  1. 使用Scapy库捕获数据包,过滤规则设置为ARP包
  2. 解析数据包,判断是否为ARP包,区分正常主机和疑似异常主机
  3. 使用颜色输出库将异常主机的IP地址标为红色
  4. 遍历数据包,检测应答报文时,是否出现同一IP地址对应不同的MAC地址
  5. 遍历数据包,检测请求报文时,是否合法且是否出现不同IP地址对应同一个MAC地址
  6. 统计ARP请求或响应包的数量,判断是否为同一IP地址或同一MAC地址发出
  7. 根据规则判断是否遭受ARP攻击,输出相应信息
  8. 将所有信息保存在日志中,使用Python自带的logging库

详细实现:

  1. 使用Scapy库捕获数据包
from scapy.all import *

def arp_sniffer(pkt):
    if pkt.haslayer(ARP):
        # 处理ARP包
  1. 解析数据包,判断是否为ARP包,区分正常主机和疑似异常主机
def arp_sniffer(pkt):
    if pkt.haslayer(ARP):
        arp_pkt = pkt[ARP]
        if arp_pkt.op == 1:  # ARP请求
            # 处理ARP请求
        elif arp_pkt.op == 2:  # ARP应答
            # 处理ARP应答
  1. 使用颜色输出库将异常主机的IP地址标为红色
from termcolor import colored

def arp_sniffer(pkt):
    if pkt.haslayer(ARP):
        arp_pkt = pkt[ARP]
        if arp_pkt.op == 1:  # ARP请求
            # 处理ARP请求
        elif arp_pkt.op == 2:  # ARP应答
            # 处理ARP应答
            if arp_pkt.psrc in suspicious_hosts:
                print(colored(arp_pkt.psrc, 'red'))
  1. 遍历数据包,检测应答报文时,是否出现同一IP地址对应不同的MAC地址
def arp_sniffer(pkt):
    if pkt.haslayer(ARP):
        arp_pkt = pkt[ARP]
        if arp_pkt.op == 1:  # ARP请求
            # 处理ARP请求
        elif arp_pkt.op == 2:  # ARP应答
            # 处理ARP应答
            if arp_pkt.psrc in suspicious_hosts:
                if arp_pkt.psrc in arp_cache and arp_cache[arp_pkt.psrc] != arp_pkt.hwsrc:
                    print(colored('ARP spoofing detected!', 'red'))
                arp_cache[arp_pkt.psrc] = arp_pkt.hwsrc
  1. 遍历数据包,检测请求报文时,是否合法且是否出现不同IP地址对应同一个MAC地址
def arp_sniffer(pkt):
    if pkt.haslayer(ARP):
        arp_pkt = pkt[ARP]
        if arp_pkt.op == 1:  # ARP请求
            # 处理ARP请求
            if arp_pkt.psrc in arp_cache and arp_cache[arp_pkt.psrc] != arp_pkt.hwsrc:
                print(colored('ARP spoofing detected!', 'red'))
            arp_cache[arp_pkt.psrc] = arp_pkt.hwsrc
        elif arp_pkt.op == 2:  # ARP应答
            # 处理ARP应答
            if arp_pkt.psrc in suspicious_hosts:
                if arp_pkt.psrc in arp_cache and arp_cache[arp_pkt.psrc] != arp_pkt.hwsrc:
                    print(colored('ARP spoofing detected!', 'red'))
                arp_cache[arp_pkt.psrc] = arp_pkt.hwsrc
            if arp_pkt.hwsrc in suspicious_macs:
                if arp_pkt.hwsrc in mac_cache and mac_cache[arp_pkt.hwsrc] != arp_pkt.psrc:
                    print(colored('ARP spoofing detected!', 'red'))
                mac_cache[arp_pkt.hwsrc] = arp_pkt.psrc
  1. 统计ARP请求或响应包的数量,判断是否为同一IP地址或同一MAC地址发出
def arp_sniffer(pkt):
    if pkt.haslayer(ARP):
        arp_pkt = pkt[ARP]
        if arp_pkt.op == 1:  # ARP请求
            # 处理ARP请求
            if arp_pkt.psrc in arp_cache and arp_cache[arp_pkt.psrc] != arp_pkt.hwsrc:
                print(colored('ARP spoofing detected!', 'red'))
            arp_cache[arp_pkt.psrc] = arp_pkt.hwsrc
            if arp_pkt.psrc in req_count:
                req_count[arp_pkt.psrc] += 1
                if req_count[arp_pkt.psrc] > 10:
                    print(colored('ARP flooding detected!', 'red'))
            else:
                req_count[arp_pkt.psrc] = 1
        elif arp_pkt.op == 2:  # ARP应答
            # 处理ARP应答
            if arp_pkt.psrc in suspicious_hosts:
                if arp_pkt.psrc in arp_cache and arp_cache[arp_pkt.psrc] != arp_pkt.hwsrc:
                    print(colored('ARP spoofing detected!', 'red'))
                arp_cache[arp_pkt.psrc] = arp_pkt.hwsrc
                if arp_pkt.psrc in resp_count:
                    resp_count[arp_pkt.psrc] += 1
                    if resp_count[arp_pkt.psrc] > 10:
                        print(colored('ARP poisoning detected!', 'red'))
                else:
                    resp_count[arp_pkt.psrc] = 1
            if arp_pkt.hwsrc in suspicious_macs:
                if arp_pkt.hwsrc in mac_cache and mac_cache[arp_pkt.hwsrc] != arp_pkt.psrc:
                    print(colored('ARP spoofing detected!', 'red'))
                mac_cache[arp_pkt.hwsrc] = arp_pkt.psrc
  1. 根据规则判断是否遭受ARP攻击,输出相应信息
def arp_sniffer(pkt):
    if pkt.haslayer(ARP):
        arp_pkt = pkt[ARP]
        if arp_pkt.op == 1:  # ARP请求
            # 处理ARP请求
            if arp_pkt.psrc in arp_cache and arp_cache[arp_pkt.psrc] != arp_pkt.hwsrc:
                print(colored('ARP spoofing detected!', 'red'))
            arp_cache[arp_pkt.psrc] = arp_pkt.hwsrc
            if arp_pkt.psrc in req_count:
                req_count[arp_pkt.psrc] += 1
                if req_count[arp_pkt.psrc] > 10:
                    print(colored('ARP flooding detected!', 'red'))
            else:
                req_count[arp_pkt.psrc] = 1
        elif arp_pkt.op == 2:  # ARP应答
            # 处理ARP应答
            if arp_pkt.psrc in suspicious_hosts:
                if arp_pkt.psrc in arp_cache and arp_cache[arp_pkt.psrc] != arp_pkt.hwsrc:
                    print(colored('ARP spoofing detected!', 'red'))
                arp_cache[arp_pkt.psrc] = arp_pkt.hwsrc
                if arp_pkt.psrc in resp_count:
                    resp_count[arp_pkt.psrc] += 1
                    if resp_count[arp_pkt.psrc] > 10:
                        print(colored('ARP poisoning detected!', 'red'))
                else:
                    resp_count[arp_pkt.psrc] = 1
            if arp_pkt.hwsrc in suspicious_macs:
                if arp_pkt.hwsrc in mac_cache and mac_cache[arp_pkt.hwsrc] != arp_pkt.psrc:
                    print(colored('ARP spoofing detected!', 'red'))
                mac_cache[arp_pkt.hwsrc] = arp_pkt.psrc
                if arp_pkt.hwsrc in mac_count:
                    mac_count[arp_pkt.hwsrc] += 1
                    if mac_count[arp_pkt.hwsrc] > 10:
                        print(colored('ARP flooding detected!', 'red'))
                else:
                    mac_count[arp_pkt.hwsrc] = 1
  1. 将所有信息保存在日志中,使用Python自带的logging库
import logging

logging.basicConfig(filename='arp_detection.log', level=logging.INFO)

def arp_sniffer(pkt):
    if pkt.haslayer(ARP):
        arp_pkt = pkt[ARP]
        if arp_pkt.op == 1:  # ARP请求
            # 处理ARP请求
            if arp_pkt.psrc in arp_cache and arp_cache[arp_pkt.psrc] != arp_pkt.hwsrc:
                logging.warning('ARP spoofing detected! IP: %s, MAC: %s' % (arp_pkt.psrc, arp_pkt.hwsrc))
                print(colored('ARP spoofing detected!', 'red'))
            arp_cache[arp_pkt.psrc] = arp_pkt.hwsrc
            if arp_pkt.psrc in req_count:
                req_count[arp_pkt.psrc] += 1
                if req_count[arp_pkt.psrc] > 10:
                    logging.warning('ARP flooding detected! IP: %s' % arp_pkt.psrc)
                    print(colored('ARP flooding detected!', 'red'))
            else:
                req_count[arp_pkt.psrc] = 1
        elif arp_pkt.op == 2:  # ARP应答
            # 处理ARP应答
            if arp_pkt.psrc in suspicious_hosts:
                if arp_pkt.psrc in arp_cache and arp_cache[arp_pkt.psrc] != arp_pkt.hwsrc:
                    logging.warning('ARP spoofing detected! IP: %s, MAC: %s' % (arp_pkt.psrc, arp_pkt.hwsrc))
                    print(colored('ARP spoofing detected!', 'red'))
                arp_cache[arp_pkt.psrc] = arp_pkt.hwsrc
                if arp_pkt.psrc in resp_count:
                    resp_count[arp_pkt.psrc] += 1
                    if resp_count[arp_pkt.psrc] > 10:
                        logging.warning('ARP poisoning detected! IP: %s' % arp_pkt.psrc)
                        print(colored('ARP poisoning detected!', 'red'))
                else:
                    resp_count[arp_pkt.psrc] = 1
            if arp_pkt.hwsrc in suspicious_macs:
                if arp_pkt.hwsrc in mac_cache and mac_cache[arp_pkt.hwsrc] != arp_pkt.psrc:
                    logging.warning('ARP spoofing detected! IP: %s, MAC: %s' % (arp_pkt.psrc, arp_pkt.hwsrc))
                    print(colored('ARP spoofing detected!', 'red'))
                mac_cache[arp_pkt.hwsrc] = arp_pkt.psrc
                if arp_pkt.hwsrc in mac_count:
                    mac_count[arp_pkt.hwsrc] += 1
                    if mac_count[arp_pkt.hwsrc] > 10:
                        logging.warning('ARP flooding detected! MAC: %s' % arp_pkt.hwsrc)
                        print(colored('ARP flooding detected!', 'red'))
                else:
                    mac_count[arp_pkt.hwsrc] = 1
``
基于Linux的ARP攻击检测软件的功能需要哪些 根据这几个规则用Python实现 首先捕获数据包将过滤规则设置为ARP包其他则丢弃接着进行分析ARP包分出正常主机和疑似异常主机异常主机的IP地址标为红色。 -检测应答报文时出现同一IP地址对应不同的MAC地址; - 检测请求报文时是否合法且是否出现不同IP地址对应同一个MAC地址; - 大量的ARP请求或响应包检测是否为同一IP发

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

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