0

我试图充当一台假机器,将 ARP 请求发送到我的主机(以及使用特定接口的特定网络上的其他机器)。这是我的代码片段,用于从伪造的 MAC 地址/IP 地址向特定接口上的特定主机 IP 地址发送 ARP 请求垃圾邮件:

import scapy.all
import threading
import time
import argparse


def arp_sender(iface, host_ip, guest_ip, guest_mac):
    arp_req = scapy.layers.l2.ARP(psrc=guest_ip, pdst=host_ip)
    bcast = scapy.layers.l2.Ether(
        src=guest_mac, dst='ff:ff:ff:ff:ff:ff')
    arp_req_bcast = bcast / arp_req
    while True:
        time.sleep(2)
        scapy.all.sendp(arp_req_bcast, iface=iface)


if __name__ == "__main__":
    pasrer = argparse.ArgumentParser()
    pasrer.add_argument('--iface', '-i', required=True)
    pasrer.add_argument('--host-ip', required=True)
    pasrer.add_argument('--guest-ip', required=True)
    pasrer.add_argument('--guest-mac', required=True)
    args = pasrer.parse_args()
    th = threading.Thread(target=arp_sender, args=(
        args.iface, args.host_ip, args.guest_ip, args.guest_mac
    ))
    th.start()
    th.join()

在嗅探 Wireshark 上的响应时,同一网络上的其他主机确实响应 ARP 请求,但不是发送 ARP 请求的假机器所在的我的主机。我还尝试将 ARP 请求发送到我主机中的 Virtualbox 机器和也没有回应。我使用 Scapy 发送第 2 层数据包的方式是否有问题,或者我需要在主机中执行其他操作以接受来自脚本的传入数据包?

编辑

在 Windows 10 主机上测试。在测试时,我禁用了所有防火墙(私有、公共和域)。

4

1 回答 1

0

本来我是误会了,还以为是虚拟机的问题。

主机正在根据发件人地址(本身)检测冲突,在这种情况下显然没有响应 ARP 请求。我不太了解 windows 如何处理 ARP 冲突,但它应该是RFC 5227第 2.4 节中指定的选项之一

在任何时候,如果主机收到一个 ARP 数据包(请求回复),其中“发送方 IP 地址”是在该接口上配置的主机自己的 IP 地址(其中之一),但“发送方硬件地址”不匹配任何主机自己的接口地址,则这是一个冲突的 ARP 数据包,表明其他主机也认为它正在有效地使用该地址。为了解决地址冲突,主机必须响应以下 (a)、(b) 或 (c) 中描述的冲突 ARP 数据包:

我不确定为什么它不发送到 vbox 机器。您是否在尝试主机后立即向 vbox 机器发送 ARP 请求?如果是这样,Windows 可能只是忽略来自它检测到冲突的 mac 和 IP 地址的任何 ARP 请求。

于 2020-02-24T03:54:41.240 回答