我试图充当一台假机器,将ARP请求发送到我的主机(以及使用特定接口的特定网络上的其他机器)。下面是我的代码片段,用于在带有ARP请求的特定接口上,从假MAC地址/ IP地址垃圾发送特定的主机IP地址:
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发送第二层数据包的方式有什么问题吗?还是在我的主机中我需要做一些其他的事情来接受来自我的脚本的传入数据包?
编辑
在Windows 10主机上进行测试。在测试时,我已经禁用了所有防火墙(私有、公共和域)。
发布于 2020-02-24 03:54:41
我最初误解了这一点,认为这是虚拟机的一个问题。
主机根据发件人地址(本身)检测冲突,在这种情况下,显然没有响应ARP请求。我不太了解windows如何处理ARP冲突,但它应该是RFC 5227第2.4节中指定的选项之一。
在任何时候,如果主机收到一个ARP包(请求或答复),其中‘发送方IP地址’是(其中之一)主机自己的IP地址(Es)配置在该接口上,但‘发送硬件地址’不匹配任何主机自己的接口地址,那么这是一个冲突的ARP包,表明一些其他主机也认为它是有效地使用该地址。要解决地址冲突,主机必须响应(a)、(b)或(c)中描述的冲突ARP数据包:
我不知道为什么它不发送到vbox机器。您是否在尝试主机后立即将ARP请求发送到vbox机器?如果是这样的话,windows可能只是忽略了来自它检测到的冲突的mac和IP地址的任何ARP请求。
https://stackoverflow.com/questions/60369075
复制相似问题