基于Linux的Python ARP攻击检测软件
基于Linux的Python ARP攻击检测软件
本文将介绍如何使用Python编写一个基于Linux的ARP攻击检测软件。该软件利用网络嗅探工具Scapy捕获网络流量,并根据预设规则分析ARP数据包,以识别潜在的ARP攻击行为。
功能需求
该软件需要实现以下功能:
- 捕获ARP数据包: 设置网络接口和过滤器,仅捕获ARP数据包,丢弃其他类型的数据包。
- 识别可疑主机: 分析ARP数据包,识别出正常主机和疑似异常主机,例如同一IP地址对应多个MAC地址。
- 检测ARP欺骗:
- 检测ARP应答报文,判断是否出现同一IP地址对应不同的MAC地址。
- 检测ARP请求报文,判断是否合法且是否出现不同IP地址对应同一个MAC地址。
- 检测ARP泛洪: 检测大量的ARP请求或响应包,判断是否为同一IP地址或同一MAC地址发出。
- 记录日志: 将所有检测到的可疑行为和攻击事件记录到日志文件中,方便后续分析和追踪。
Python代码实现
以下是一个简单的Python代码示例,演示如何使用Scapy库实现上述功能:
import os
import sys
import time
from scapy.all import *
# 设置过滤规则为ARP包
filter_rule = 'arp'
# 存储疑似异常主机信息的字典
suspicious_hosts = {}
# 存储所有信息的日志文件
log_file = 'arp_attack_detection.log'
# 检测应答报文是否存在同一IP地址对应不同的MAC地址
def check_reply(packet):
if packet.op == 2: # ARP应答报文
if packet.psrc in suspicious_hosts and packet.hwsrc != suspicious_hosts[packet.psrc]:
return True
return False
# 检测请求报文是否合法且是否存在不同IP地址对应同一个MAC地址
def check_request(packet):
if packet.op == 1: # ARP请求报文
if packet.hwsrc == '00:00:00:00:00:00':
return False # 无效的MAC地址
if packet.psrc == packet.pdst:
return False # 请求报文中源IP地址和目的IP地址相同
if packet.psrc in suspicious_hosts and packet.hwsrc != suspicious_hosts[packet.psrc]:
return True
return False
# 检测大量的ARP请求或响应包是否为同一IP地址或同一MAC地址发出
def check_flood(packet_list):
src_ip = packet_list[0].psrc
src_mac = packet_list[0].hwsrc
for packet in packet_list:
if packet.psrc != src_ip or packet.hwsrc != src_mac:
return False
return True
# 处理ARP包
def handle_packet(packet):
if packet.haslayer(ARP):
if packet.op == 1: # ARP请求报文
if check_request(packet):
suspicious_hosts[packet.psrc] = packet.hwsrc
print(f'[!] Detected ARP attack (request): IP {packet.psrc} with MAC {packet.hwsrc}')
with open(log_file, 'a') as f:
f.write(f'[!] Detected ARP attack (request): IP {packet.psrc} with MAC {packet.hwsrc}
')
f.write(str(packet.summary()) + '
')
elif packet.op == 2: # ARP应答报文
if check_reply(packet):
print(f'[!] Detected ARP attack (reply): IP {packet.psrc} with MAC {packet.hwsrc}')
with open(log_file, 'a') as f:
f.write(f'[!] Detected ARP attack (reply): IP {packet.psrc} with MAC {packet.hwsrc}
')
f.write(str(packet.summary()) + '
')
# 检测大量的ARP请求或响应包
packet_list = [p for p in sniffed_packets if p.haslayer(ARP) and p.op == packet.op and p.psrc == packet.psrc]
if len(packet_list) > 10 and check_flood(packet_list):
print(f'[!] Detected ARP flood attack: IP {packet.psrc} with MAC {packet.hwsrc}')
with open(log_file, 'a') as f:
f.write(f'[!] Detected ARP flood attack: IP {packet.psrc} with MAC {packet.hwsrc}
')
f.write(str(packet.summary()) + '
')
# 开始捕获数据包并处理
sniffed_packets = sniff(filter=filter_rule, prn=handle_packet)
代码说明
- 代码首先定义了三个函数:
check_reply,check_request和check_flood,分别用于检测ARP欺骗和ARP泛洪攻击。 handle_packet函数是主要的处理逻辑,它接收捕获到的数据包,并根据数据包类型进行相应的处理。- 最后,使用
sniff函数开始捕获数据包,并将捕获到的数据包传递给handle_packet函数进行处理。
总结
通过以上代码,我们可以实现一个简单的ARP攻击检测软件。当然,这只是一个基础版本,你可以根据实际需求进行扩展和优化,例如添加邮件告警、自动防御等功能。
原文地址: https://www.cveoy.top/t/topic/jpj6 著作权归作者所有。请勿转载和采集!