我正在尝试用python发送ARP请求。我使用了AF_-PACKED,所以我还必须构造一个以太网报头
问题是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))
提前感谢你的帮助
目前没有回答
相关问题 更多 >
编程相关推荐