基于Linux的ARP攻击检测软件需要实现以下功能:

  1. 监听网络中的ARP请求和响应包,并对其进行分析。
  2. 维护一个ARP缓存表,记录网络中已知的IP地址和对应的MAC地址。
  3. 检测同一IP地址对应多个MAC地址的情况。
  4. 检测多个IP地址对应同一个MAC地址的情况。
  5. 检测大量的ARP请求或响应包的情况。
  6. 检测ARP包中的源MAC地址和目标MAC地址不匹配的情况。
  7. 输出遭受ARP攻击的信息,并将所有信息保存在日志中。

以下是根据规则用Python实现的代码:

import subprocess
import re
import time

# 定义全局变量
arp_cache = {}  # ARP缓存表
log_file = "arp_attack.log"  # 日志文件路径
attack_count = 0  # ARP攻击计数器

# 定义函数:获取本机IP地址和MAC地址
def get_local_ip_mac():
    ip_cmd = "ip addr | grep 'inet ' | awk '{print $2}' | cut -d'/' -f1"
    ip_process = subprocess.Popen(ip_cmd, shell=True, stdout=subprocess.PIPE)
    ip_output = ip_process.communicate()[0].decode().strip()
    local_ip = ip_output.split('\n')[0]

    mac_cmd = "ifconfig | grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}'"
    mac_process = subprocess.Popen(mac_cmd, shell=True, stdout=subprocess.PIPE)
    mac_output = mac_process.communicate()[0].decode().strip()
    local_mac = mac_output.split('\n')[0]

    return local_ip, local_mac

# 定义函数:将ARP请求或响应包添加到ARP缓存表中
def add_to_arp_cache(ip, mac):
    arp_cache[ip] = mac

# 定义函数:从ARP缓存表中删除指定IP地址的条目
def delete_from_arp_cache(ip):
    if ip in arp_cache:
        del arp_cache[ip]

# 定义函数:检测同一IP地址对应多个MAC地址的情况
def check_duplicate_mac(ip, mac):
    if ip in arp_cache and arp_cache[ip] != mac:
        return True
    else:
        return False

# 定义函数:检测多个IP地址对应同一个MAC地址的情况
def check_duplicate_ip(ip, mac):
    if mac in arp_cache.values() and ip not in arp_cache:
        return True
    else:
        return False

# 定义函数:检测大量的ARP请求或响应包的情况
def check_arp_flooding():
    if len(arp_cache) > 100:
        return True
    else:
        return False

# 定义函数:检测ARP包中的源MAC地址和目标MAC地址不匹配的情况
def check_mac_mismatch(src_mac, dst_mac):
    local_mac = get_local_ip_mac()[1]
    if src_mac != local_mac and dst_mac != local_mac:
        return True
    else:
        return False

# 定义函数:输出遭受ARP攻击的信息,并将所有信息保存在日志中
def log_arp_attack(ip, mac, reason):
    global attack_count
    attack_count += 1
    timestamp = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
    log_msg = f"{timestamp} ARP攻击:IP地址{ip}对应MAC地址{mac},原因:{reason}"
    print(log_msg)
    with open(log_file, "a") as f:
        f.write(log_msg + "\n")

# 定义函数:监听网络中的ARP请求和响应包,并对其进行分析
def listen_arp_packets():
    # 使用tcpdump命令监听ARP请求和响应包
    tcpdump_cmd = "tcpdump -i eth0 arp"
    tcpdump_process = subprocess.Popen(tcpdump_cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

    # 逐行读取tcpdump输出的内容
    for line in iter(tcpdump_process.stdout.readline, b''):
        line = line.decode().strip()
        # 使用正则表达式匹配ARP请求和响应包
        arp_request_pattern = r"arp who-has (\d+\.\d+\.\d+\.\d+) tell (\d+\.\d+\.\d+\.\d+)"
        arp_response_pattern = r"arp reply (\d+\.\d+\.\d+\.\d+) is-at ([a-fA-F0-9:]+)"

        arp_request_match = re.match(arp_request_pattern, line)
        arp_response_match = re.match(arp_response_pattern, line)

        # 如果匹配到ARP请求包
        if arp_request_match:
            src_ip = arp_request_match.group(2)
            dst_ip = arp_request_match.group(1)
            add_to_arp_cache(src_ip, "")
            # 检测ARP攻击情况
            if check_duplicate_mac(src_ip, ""):
                log_arp_attack(src_ip, "", "同一IP地址对应多个MAC地址")
            if check_duplicate_ip(src_ip, ""):
                log_arp_attack(src_ip, "", "多个IP地址对应同一个MAC地址")
            if check_arp_flooding():
                log_arp_attack(src_ip, "", "大量的ARP请求包")
        
        # 如果匹配到ARP响应包
        elif arp_response_match:
            src_ip = arp_response_match.group(1)
            src_mac = arp_response_match.group(2)
            add_to_arp_cache(src_ip, src_mac)
            # 检测ARP攻击情况
            if check_mac_mismatch(src_mac, arp_cache.get(src_ip, "")):
                log_arp_attack(src_ip, src_mac, "ARP包中的源MAC地址和目标MAC地址不匹配")
            if check_duplicate_mac(src_ip, src_mac):
                log_arp_attack(src_ip, src_mac, "同一IP地址对应多个MAC地址")
            if check_duplicate_ip(src_ip, src_mac):
                log_arp_attack(src_ip, src_mac, "多个IP地址对应同一个MAC地址")
            if check_arp_flooding():
                log_arp_attack(src_ip, src_mac, "大量的ARP响应包")
        
        # 如果既不是ARP请求包也不是ARP响应包,则忽略该行输出
        else:
            continue

# 主程序入口
if __name__ == "__main__":
    # 获取本机IP地址和MAC地址
    local_ip, local_mac = get_local_ip_mac()
    # 输出本机IP地址和MAC地址
    print(f"本机IP地址:{local_ip}")
    print(f"本机MAC地址:{local_mac}")
    # 监听网络中的ARP请求和响应包
    listen_arp_packets()
``
基于Linux的ARP攻击检测软件的功能需要哪些 根据这几个规则用Python实现 同一IP地址对应多个MAC地址; - 多个IP地址对应同一个MAC地址; - 大量的ARP请求或响应包; - ARP包中的源MAC地址和目标MAC地址不匹配;一旦满足两种规则或以上的就输出遭受ARP攻击不满足则输出未遭受ARP攻击并且将所有信息保存在日志中

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

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