没有回复原始套接字的 ARP 请求 python

ARP request without reply raw sockets python

我试图在发送 ARP 请求后得到一个 arp 回复,但没有收到回复。

我查看了 wireshark 的结果,我认为他向网络广播,但没有回复显示...

在 wireshark 的结果中,发送方和接收方的 MAC 地址与真实的 MAC 地址不对应,我相信我没有正确打包,但我不明白为什么。

需要帮助...

#!/usr/bin/env python3

import struct
import socket



raw = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(0x0806))
raw.bind(("wlp3s0", socket.htons(0x0806)))


mac_local = b"ff:ff:ff:ff:ff:ff"   # mac de quem envia request
ip_local = "192.168.1.7"           # ip de quem envia request
mac_dest = b"00:00:00:00:00:00"    # mac de quem recebe request
ip_dest = "192.168.1.2"            # ip de quem recebe request




# Ethernet Header
protocol = 0x0806             # 0x0806 protocol to ARP
ethernet_header = struct.pack("!6s6sH", mac_dest, mac_local, protocol)


# ARP header

type_hardware = 1
type_protocol = 0x0800       # IPV4
size_addr_hardware = 6   # Refere ao tamanho do endereço do MAC que é 
48 bits  == 6 bytes 
size_addr_protocol = 4  # Refere ao tamanho do endereço do ipv4 que é 
32 bits == 4 bytes
operation = 1                  # 1 = request / 2 = Reply 

source_ip = socket.inet_aton(ip_local)
dest_ip = socket.inet_aton(ip_dest)


arp_addr = struct.pack("!HHBBH6s4s6s4s", type_hardware, type_protocol,
                       size_addr_hardware, size_addr_protocol, operation,
                       mac_local, source_ip, mac_dest, dest_ip)
pkt = ethernet_header + arp_addr

cont = 0
while cont < 6:
    raw.send(pkt)
    cont +=1

enter image description here

enter image description here

mac_destmac_local肯定是不对的。您刚刚创建了一个具有 ASCII 值的字节字符串。每个都是 17 个字节长。您只需为每个地址获取这 17 个字节中的前 6 个。

它们应该是这样的:

mac_dest = b'\x00\x00\x00\x00\x00\x00'
mac_local = b'\xff\xff\xff\xff\xff\xff'

检查 struct.pack 调用之前字节串的长度是否恰好是六个字节。

此外,不确定您要做什么,但我怀疑将全零硬件地址用作 目标 地址是否有意义。很确定没有人会收到它,因为它将是一个单播到一个没有人拥有的地址。相反可能会有帮助(发送到广播地址 from 全零)——我认为这是 ARP 探测的标准。

我对已接受的答案有些困惑。

MAC 00:00:00: 00:00:00 不是 XEROX 的有效 MAC 吗?

https://hwaddress.com/company/xerox-corporation/

当我看到 ARP-request 被 wireshark 捕获时

然后mac请求中的地址总是

MAC_DST: FF:FF:FF:FF:FF:FF  //mac broadcast
MAC_SRC: MAC-address of requester

回复的mac地址将是

MAC_DST: MAC-adress of requester
MAC_SRC: MAC-address of replier