Python如何检测ARP欺骗攻击?本文使用 Scapy 编写一个简单的 Python 脚本来识别和检测网络中的 ARP 欺骗攻击。
在之前的教程中,我们使用 Scapy 构建了一个 ARP 欺骗脚本,一旦它被正确建立,任何指向目标主机的流量都将被发送到攻击者的主机,现在你可能想知道,我们如何检测这种攻击? 嗯,这就是我们在本教程中要做的。
如何使用Scapy检测ARP欺骗攻击?我们将要构建的脚本背后的基本思想是在网络中不断嗅探数据包(被动监视或扫描),一旦收到 ARP 数据包,我们将分析两个组件:
- 源 MAC 地址(可以被欺骗)。
- 发送方的真实MAC地址(我们可以通过发起源IP地址的ARP请求轻松获取)。
然后我们比较两者。如果它们不一样,那么我们肯定处于ARP欺骗攻击之下!
Python检测ARP欺骗攻击示例:编写脚本
Python如何检测ARP欺骗攻击?首先让我们导入我们需要的东西(你需要先安装Scapy,前往本教程 或 官方 Scapy 文档进行安装):
from scapy.all import Ether, ARP, srp, sniff, conf
然后我们需要一个函数,给定一个 IP 地址,它发出一个 ARP 请求并检索该 IP 地址的真实 MAC 地址:
def get_mac(ip):
"""
Returns the MAC address of `ip`, if it is unable to find it
for some reason, throws `IndexError`
"""
p = Ether(dst='ff:ff:ff:ff:ff:ff')/ARP(pdst=ip)
result = srp(p, timeout=3, verbose=False)[0]
return result[0][1].hwsrc
之后,我们将使用的sniff()函数接受一个回调(或函数)来应用于每个嗅探到的数据包,让我们定义它,Python检测ARP欺骗攻击示例代码如下:
def process(packet):
# if the packet is an ARP packet
if packet.haslayer(ARP):
# if it is an ARP response (ARP reply)
if packet[ARP].op == 2:
try:
# get the real MAC address of the sender
real_mac = get_mac(packet[ARP].psrc)
# get the MAC address from the packet sent to us
response_mac = packet[ARP].hwsrc
# if they're different, definitely there is an attack
if real_mac != response_mac:
print(f"[!] You are under attack, REAL-MAC: {real_mac.upper()}, FAKE-MAC: {response_mac.upper()}")
except IndexError:
# unable to find the real mac
# may be a fake IP or firewall is blocking packets
pass
注意:Scapy 在名为“op”的字段中对 ARP 数据包的类型进行编码,该字段代表操作,默认情况下,“op”是 1 或“who-has”,这是一个 ARP 请求,2 或“is-at”是一个 ARP 回复。
如何使用Scapy检测ARP欺骗攻击?如你所见,上述函数会检查 ARP 数据包。更准确地说,ARP 回复,然后比较实际 MAC 地址和响应 MAC 地址(在数据包本身中发送)。
我们现在需要做的就是使用上面写的回调调用sniff()函数:
sniff(store=False, prn=process)
注意:store=False告诉sniff()函数丢弃嗅探的数据包而不是将它们存储在内存中,这在脚本运行很长时间时很有用。
Python如何检测ARP欺骗攻击?当你尝试运行该脚本时,显然什么都不会发生,但是当攻击者试图欺骗你的 ARP 缓存时,如下图所示:
ARP 欺骗检测器(显然在另一台机器上运行)会自动响应:
为防止此类中间人攻击,你需要使用动态 ARP 检测,这是一项安全功能,可自动拒绝我们刚刚检测到的恶意 ARP 数据包。