Python Scapy --arp 请求和响应

Bob*_*ert 3 python scapy arp

我使用以下行发送 arp 数据包广播:

send(ARP(op=ARP.who_has, psrc="192.168.5.51", pdst=the_ip))
Run Code Online (Sandbox Code Playgroud)

我的问题是:如何查看响应(在本例中:远程 ip 的 mac)?我知道我能做到:

pkt = sniff(filter=arp , count=10) 
print (pkt.summary()) 
Run Code Online (Sandbox Code Playgroud)

但我不想计算数据包,因为我不知道什么时候会打印它(可能在接下来的 10 个或 100 个数据包中)

有没有办法在嗅探时打印摘要,从而看到我正在寻找的 mac 地址?

编辑:我有一个想法,我可以嗅探10个数据包吗,如果数据包中有ip,则打印mac地址,否则再嗅探10个数据包...这项技术似乎不是一个好的技术...

Yoe*_*oel 9

Scapy的用户手册建议使用sr()sr1()函数来发送数据包和接收答案:

sr()功能用于发送数据包和接收应答。该函数返回几个数据包和答案,以及未应答的数据包。该函数sr1()是一种变体,仅返回一个应答所发送的数据包(或数据包集)的数据包。数据包必须是第 3 层数据包(IPARP等)。该函数对第 2 层数据包(以太网802.3等)srp()执行相同的操作

官方API文档指定了他们的完整签名。这些似乎是该用例的相关论点:

retry:如果是肯定的,则重新发送未应答的数据包多少次。如果是否定的,则在放弃之前连续进行了多少次未应答的探测。只有负值才是真正有用的。
timeout:发送最后一个数据包后等待多长时间。默认情况下,将永远等待,当用户不需要更多答案时,他sr必须中断(Ctrl-C )它。
inter:发送每个数据包之间等待的时间(以秒为单位)。

这是该函数的执行示例sr()

In [1]: from scapy.all import *
WARNING: No route found for IPv6 destination :: (no default route?)

In [2]: results, unanswered = sr(ARP(op=ARP.who_has, psrc='192.168.1.2', pdst='192.168.1.1'))
Begin emission:
.....*Finished to send 1 packets.

Received 6 packets, got 1 answers, remaining 0 packets

In [3]: results
Out[3]: <Results: TCP:0 UDP:0 ICMP:0 Other:1>

In [4]: result = results[0]

In [5]: result
Out[5]: 
(<ARP  op=who-has psrc=192.168.1.2 pdst=192.168.1.1 |>,
 <ARP  hwtype=0x1 ptype=0x800 hwlen=6 plen=4 op=is-at hwsrc=XX:XX:XX:XX:XX:XX psrc=192.168.1.1 hwdst=XX:XX:XX:XX:XX:XX pdst=192.168.1.2 |>)

In [6]: original_packet, answer = result

In [7]: original_packet
Out[7]: <ARP  op=who-has psrc=192.168.1.2 pdst=192.168.1.1 |>

In [8]: answer
Out[8]: <ARP  hwtype=0x1 ptype=0x800 hwlen=6 plen=4 op=is-at hwsrc=XX:XX:XX:XX:XX:XX psrc=192.168.1.1 hwdst=XX:XX:XX:XX:XX:XX pdst=192.168.1.2 |>

In [9]: answer.hwsrc
Out[9]: 'XX:XX:XX:XX:XX:XX'
Run Code Online (Sandbox Code Playgroud)

这是该函数的执行示例sr1()

In [10]: result = sr1(ARP(op=ARP.who_has, psrc='192.168.1.2', pdst='192.168.1.1'))
Begin emission:
.....Finished to send 1 packets.
*
Received 6 packets, got 1 answers, remaining 0 packets

In [11]: result
Out[11]: <ARP  hwtype=0x1 ptype=0x800 hwlen=6 plen=4 op=is-at hwsrc=XX:XX:XX:XX:XX:XX psrc=192.168.1.1 hwdst=XX:XX:XX:XX:XX:XX pdst=192.168.1.2 |>

In [12]: result.hwsrc
Out[12]: 'XX:XX:XX:XX:XX:XX'
Run Code Online (Sandbox Code Playgroud)

注意: 此问题的另一个答案演示了如何提取 MAC 地址,并且该答案也经过编辑以反映它。