基于Linux的ARP攻击检测软件功能实现及Python代码
基于Linux的ARP攻击检测软件功能实现及Python代码
本文介绍了基于Linux的ARP攻击检测软件的功能需求,并用Python代码实现了这些功能。该软件可以捕获ARP包并进行分析,识别可能遭受攻击的主机,并输出结果到日志文件中。
软件功能需求
- 捕获数据包并过滤规则设置为ARP包:使用网络抓包工具,例如Scapy,捕获网络数据包并过滤掉非ARP包。
- 分析ARP包,区分正常主机和疑似异常主机:根据ARP协议的规则,分析ARP包,识别可能存在攻击行为的异常主机。
- 标记疑似异常主机的IP地址和MAC地址为红色:将识别出的疑似异常主机信息以红色标记显示,方便用户直观识别。
- 检测应答报文,判断是否出现同一IP地址对应不同的MAC地址:ARP攻击中,攻击者会伪造ARP应答报文,使目标主机将攻击者的MAC地址与目标主机的IP地址关联,从而导致网络流量被劫持。该功能用于检测此类攻击。
- 检测请求报文,判断是否合法且是否出现不同IP地址对应同一个MAC地址:ARP攻击也可能通过伪造ARP请求报文来实现,攻击者会将自己的MAC地址与目标主机的IP地址关联,从而窃取网络流量。该功能用于检测此类攻击。
- 检测大量的ARP请求或响应包,判断是否为同一IP发出或同一MAC地址发出:ARP攻击者可能会发送大量的ARP请求或响应包,造成网络拥塞或资源耗尽,从而影响网络正常运行。该功能用于检测此类攻击。
- 输出遭受ARP攻击或未遭受ARP攻击的结果:根据上述检测结果,判断是否发生了ARP攻击,并输出相应的信息。
- 保存所有信息到日志中:将所有检测信息详细记录到日志文件中,方便用户后续查看分析。
Python代码实现
import os
import sys
import logging
from scapy.all import *
# 设置日志格式
logging.basicConfig(level=logging.INFO,
format='%(asctime)s [%(levelname)s] %(message)s',
handlers=[logging.FileHandler('arp_attack.log'),
logging.StreamHandler()])
# 捕获数据包并过滤规则设置为ARP包
def arp_filter(pkt):
return ARP in pkt
# 分析ARP包,区分正常主机和疑似异常主机
def arp_analysis(pkt_list):
normal_hosts = []
suspicious_hosts = []
for pkt in pkt_list:
if pkt[ARP].op == 1: # ARP请求
if pkt[ARP].psrc == pkt[ARP].pdst: # ARP请求源和目的IP地址相同
normal_hosts.append(pkt)
else:
suspicious_hosts.append(pkt)
elif pkt[ARP].op == 2: # ARP应答
normal_hosts.append(pkt)
return normal_hosts, suspicious_hosts
# 标记疑似异常主机的IP地址和MAC地址为红色
def mark_suspicious_hosts(pkt_list):
for pkt in pkt_list:
if pkt[ARP].op == 1: # ARP请求
if pkt[ARP].psrc == pkt[ARP].pdst: # ARP请求源和目的IP地址相同
pkt.show()
else:
pkt.show()
print('\033[1;31;40m[!] Suspicious ARP packet detected!\033[0m')
elif pkt[ARP].op == 2: # ARP应答
pkt.show()
# 检测应答报文,判断是否出现同一IP地址对应不同的MAC地址
def check_reply(pkt_list):
attack_count = 0
for pkt in pkt_list:
if pkt[ARP].op == 2: # ARP应答
src_ip = pkt[ARP].psrc
src_mac = pkt[ARP].hwsrc
for pkt2 in pkt_list:
if pkt2[ARP].op == 2 and pkt2 != pkt and pkt2[ARP].psrc == src_ip and pkt2[ARP].hwsrc != src_mac:
print('\033[1;31;40m[!] Possible ARP attack detected!\033[0m')
logging.warning('[ARP Attack] Same IP address with different MAC address: %s' % src_ip)
attack_count += 1
break
return attack_count
# 检测请求报文,判断是否合法且是否出现不同IP地址对应同一个MAC地址
def check_request(pkt_list):
attack_count = 0
for pkt in pkt_list:
if pkt[ARP].op == 1: # ARP请求
src_ip = pkt[ARP].psrc
src_mac = pkt[ARP].hwsrc
dst_ip = pkt[ARP].pdst
dst_mac = pkt[ARP].hwdst
# 合法的ARP请求应该是目的MAC地址为广播地址或目的MAC地址为自己的MAC地址
if dst_mac != 'ff:ff:ff:ff:ff:ff' and dst_mac != get_if_hwaddr(conf.iface):
print('\033[1;31;40m[!] Possible ARP attack detected!\033[0m')
logging.warning('[ARP Attack] Invalid ARP request: %s -> %s' % (src_ip, dst_ip))
attack_count += 1
# 检测是否出现不同IP地址对应同一个MAC地址
for pkt2 in pkt_list:
if pkt2[ARP].op == 2 and pkt2[ARP].hwsrc == src_mac and pkt2[ARP].psrc != src_ip:
print('\033[1;31;40m[!] Possible ARP attack detected!\033[0m')
logging.warning('[ARP Attack] Same MAC address with different IP address: %s' % src_mac)
attack_count += 1
break
return attack_count
# 检测大量的ARP请求或响应包,判断是否为同一IP发出或同一MAC地址发出
def check_flood(pkt_list):
src_ip_dict = {}
src_mac_dict = {}
for pkt in pkt_list:
if pkt[ARP].op == 1: # ARP请求
src_ip = pkt[ARP].psrc
if src_ip in src_ip_dict:
src_ip_dict[src_ip] += 1
else:
src_ip_dict[src_ip] = 1
if src_ip_dict[src_ip] > 10:
print('\033[1;31;40m[!] Possible ARP attack detected!\033[0m')
logging.warning('[ARP Attack] ARP flood from the same IP address: %s' % src_ip)
return True
elif pkt[ARP].op == 2: # ARP应答
src_mac = pkt[ARP].hwsrc
if src_mac in src_mac_dict:
src_mac_dict[src_mac] += 1
else:
src_mac_dict[src_mac] = 1
if src_mac_dict[src_mac] > 10:
print('\033[1;31;40m[!] Possible ARP attack detected!\033[0m')
logging.warning('[ARP Attack] ARP flood from the same MAC address: %s' % src_mac)
return True
return False
if __name__ == '__main__':
pkt_list = sniff(filter='arp', prn=lambda x: x.summary(), count=100)
normal_hosts, suspicious_hosts = arp_analysis(pkt_list)
mark_suspicious_hosts(suspicious_hosts)
attack_count = 0
attack_count += check_reply(normal_hosts)
attack_count += check_request(normal_hosts)
if not check_flood(normal_hosts):
print('\033[1;32;40m[+] No ARP attack detected.\033[0m')
logging.info('[ARP Attack] No ARP attack detected.')
else:
attack_count += 1
if attack_count > 0:
print('\033[1;31;40m[!] ARP attack detected!\033[0m')
else:
print('\033[1;32;40m[+] No ARP attack detected.\033[0m')
logging.info('[ARP Attack] Total attack count: %d' % attack_count)
日志格式
2022-01-01 00:00:00,000 [WARNING] [ARP Attack] Same IP address with different MAC address: 192.168.1.100
2022-01-01 00:00:00,000 [WARNING] [ARP Attack] Invalid ARP request: 192.168.1.100 -> 192.168.1.200
2022-01-01 00:00:00,000 [WARNING] [ARP Attack] Same MAC address with different IP address: 00:11:22:33:44:55
2022-01-01 00:00:00,000 [WARNING] [ARP Attack] ARP flood from the same IP address: 192.168.1.100
2022-01-01 00:00:00,000 [INFO] [ARP Attack] No ARP attack detected.
该代码使用了Scapy库进行数据包捕获和分析。代码中定义了多个函数,分别用于捕获ARP包、分析ARP包、标记疑似异常主机、检测ARP攻击等。代码最后将检测结果输出到控制台和日志文件中。
注意: 该代码仅供参考,实际使用时需要根据具体情况进行修改和完善。
原文地址: https://www.cveoy.top/t/topic/jo2Q 著作权归作者所有。请勿转载和采集!