尝试使用Python发送arp请求

2024-05-15 12:39:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试用python发送ARP请求。我使用了AF_-PACKED,所以我还必须构造一个以太网报头

以下是来自Wireshark的arp请求示例: enter image description here

问题是Wireshark没有识别我的请求,该请求的输出是:

(b'\x00\x15]\xa0\x8cJ', b'\x00\x15]\x96\x94<', 2048, 17664, 40, 216, 159, 16384, b'@\x06y\xcb\xc0\xa8', b'0\x01\xc0\xa8', b'7\x13\n\xaf\x91M', b'\x01\xacu\x8b')

标题编号不正确应为1800、6、4、2(2是回复的操作码)

这是我的代码,我用默认参数运行它。(192.168.16.0/24是我的网络)

def arp_request(interface: str = 'eth0', dst: str ='ff:ff:ff:ff:ff:ff', dest_ip: str = '192.168.16.21') -> str:
    split_char: str = ':'

    with socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(3)) as __sock:
        __sock.bind((interface, 0))

        source_mac: bytes = pack(
            '!BBBBBB', *[int(oc, 16) for oc in get_mac(interface).split(split_char)])
        dest_mac: bytes = pack(
            '!BBBBBB', *[int(oc, 16) for oc in dst.split(split_char)])

        ethernet_header: bytes = pack('!6s6sH',
                                      dest_mac,
                                      source_mac,
                                      0x0806    #  0x0806 = ARP
                                      )

        source_ip = popen(
            'ip addr show eth0 | grep "\<inet\>" | awk \'{ print $2 }\' | awk -F "/" \'{ print $1 }\'').read().strip()

        # ARP Request header, see RFC 826
        arp_header: bytes = pack('!HHBBH6s4s6s4s',
                                 0x0001,          # Hardware_type  ethernet
                                 0x0320,          # Protocol_type  TCP
                                 0x0006,          # Hardware addr len
                                 0x0004,          # Protocol addr len
                                 0x0001,          # Operation 1=request/2=reply
                                 source_mac,
                                 # Source address
                                 socket.inet_aton(source_ip),
                                 dest_mac,
                                 # Destination adress
                                 socket.inet_aton(dest_ip)
                                 )

        packet: bytes = ethernet_header + arp_header
        print(unpack('!6s6sH HHBBH6s4s6s4s', packet))
        __sock.send(packet)

        raw_data: bytes = __sock.recv(42)
        print(unpack('!6s6sH HHBBH6s4s6s4s', raw_data))

提前感谢你的帮助


Tags: ipsourcebytesmacsocketpackdestheader