基于Linux的ARP攻击检测软件功能及Python实现
基于Linux的ARP攻击检测软件功能及Python实现
本文将介绍基于Linux的ARP攻击检测软件的功能需求,并使用Python语言进行实现。该软件可以帮助用户识别和阻止ARP攻击,保护网络安全。
功能需求
- 捕获数据包并过滤出ARP包
- 分析ARP包,区分正常主机和疑似异常主机
- 标记疑似异常主机的IP地址和MAC地址为红色
- 检测应答报文,判断同一IP地址对应不同的MAC地址是否存在,判断是否遭受ARP攻击
- 检测请求报文,判断是否合法且是否出现不同IP地址对应同一个MAC地址,判断是否遭受ARP攻击
- 检测大量ARP请求或响应包,判断是否为同一IP或MAC地址发出,判断是否遭受ARP攻击
- 输出遭受或未遭受ARP攻击的信息
- 将所有信息保存在日志中
Python实现
- 使用Scapy库捕获数据包并过滤出ARP包
- 解析ARP包,判断是否为正常主机或疑似异常主机
- 使用ANSI Escape Code将疑似异常主机的IP地址和MAC地址标记为红色
- 维护一个字典,记录每个IP地址对应的MAC地址,检测应答报文时判断同一IP地址对应不同的MAC地址是否存在,判断是否遭受ARP攻击
- 维护一个字典,记录每个MAC地址对应的IP地址,检测请求报文时判断是否合法且是否出现不同IP地址对应同一个MAC地址,判断是否遭受ARP攻击
- 维护一个计数器,统计相同IP或MAC地址发出的ARP请求或响应包的数量,判断是否遭受ARP攻击
- 输出遭受或未遭受ARP攻击的信息
- 使用Python内置的logging模块将所有信息保存在日志中
代码示例
from scapy.all import *
import logging
# 初始化字典和计数器
ip_to_mac = {}
mac_to_ip = {}
ip_counter = {}
mac_counter = {}
# 初始化日志
logging.basicConfig(filename='arp_attack.log', level=logging.INFO)
def arp_packet_handler(packet):
# 过滤出ARP包
if packet.haslayer(ARP):
arp = packet[ARP]
# 判断是否为正常主机或疑似异常主机
if arp.psrc in ip_to_mac and arp.hwsrc != ip_to_mac[arp.psrc]:
logging.warning('ARP attack detected: same IP address with different MAC address')
print('�33[1;31m[!] ARP attack detected: same IP address with different MAC address�33[0m')
print(f'IP address: {arp.psrc}, MAC address: {arp.hwsrc}')
elif arp.hwsrc in mac_to_ip and arp.psrc != mac_to_ip[arp.hwsrc]:
logging.warning('ARP attack detected: same MAC address with different IP address')
print('�33[1;31m[!] ARP attack detected: same MAC address with different IP address�33[0m')
print(f'IP address: {arp.psrc}, MAC address: {arp.hwsrc}')
else:
# 更新字典和计数器
ip_to_mac[arp.psrc] = arp.hwsrc
mac_to_ip[arp.hwsrc] = arp.psrc
ip_counter[arp.psrc] = ip_counter.get(arp.psrc, 0) + 1
mac_counter[arp.hwsrc] = mac_counter.get(arp.hwsrc, 0) + 1
# 判断是否遭受ARP攻击
if ip_counter[arp.psrc] >= 10 or mac_counter[arp.hwsrc] >= 10:
logging.warning('ARP attack detected: large amount of ARP requests or responses')
print('�33[1;31m[!] ARP attack detected: large amount of ARP requests or responses�33[0m')
print(f'IP address: {arp.psrc}, MAC address: {arp.hwsrc}')
# 捕获数据包并调用处理函数
sniff(filter='arp', prn=arp_packet_handler)
注意: 代码示例仅供参考,实际使用中需要根据具体需求进行调整。
原文地址: https://www.cveoy.top/t/topic/jo2K 著作权归作者所有。请勿转载和采集!