如何在Python中使用Scapy检测ARP欺骗攻击?

2021年11月16日16:33:22 发表评论 1,195 次浏览

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 缓存时,如下图所示:

如何在Python中使用Scapy检测ARP欺骗攻击?

ARP 欺骗检测器(显然在另一台机器上运行)会自动响应:

如何在Python中使用Scapy检测ARP欺骗攻击?

好的就是这样!

为防止此类中间人攻击,你需要使用动态 ARP 检测,这是一项安全功能,可自动拒绝我们刚刚检测到的恶意 ARP 数据包。

木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: