基于Linux的ARP攻击检测软件的功能需要哪些 根据这几个规则用Python实现 同一IP地址对应多个MAC地址; - 多个IP地址对应同一个MAC地址; - 大量的ARP请求或响应包; - ARP包中的源MAC地址和目标MAC地址不匹配;一旦满足两种规则或以上的就输出遭受ARP攻击不满足则输出未遭受ARP攻击并且将所有信息保存在日志中
基于Linux的ARP攻击检测软件需要实现以下功能:
- 监听网络中的ARP请求和响应包,并对其进行分析。
- 维护一个ARP缓存表,记录网络中已知的IP地址和对应的MAC地址。
- 检测同一IP地址对应多个MAC地址的情况。
- 检测多个IP地址对应同一个MAC地址的情况。
- 检测大量的ARP请求或响应包的情况。
- 检测ARP包中的源MAC地址和目标MAC地址不匹配的情况。
- 输出遭受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()
``
原文地址: https://www.cveoy.top/t/topic/fyF3 著作权归作者所有。请勿转载和采集!