Python Scapy——arp请求和响应



我用下面这行发送一个arp包广播:

send(ARP(op=ARP.who_has, psrc="192.168.5.51", pdst=the_ip))

我的问题是:我如何查看响应(在这种情况下:远程ip的mac)?我知道我能做到:

pkt = sniff(filter=arp , count=10) 
print (pkt.summary()) 

但是我不想计算包数,因为我不知道它何时会被打印(可能在接下来的10或100包中)

是否有一种方法可以在它嗅探的同时打印摘要,从而看到我正在寻找的mac地址?

编辑:我有一个想法,我可以嗅10个数据包,如果包中有ip打印mac地址,否则嗅10个更多的数据包…

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

sr()功能用于发送报文和接收应答。该函数返回两个数据包和答案,以及未回答的数据包。函数sr1()是一个变体,它只返回一个响应发送的包(或包集)的包。报文必须是三层报文(IPARP等)。srp()函数对第2层数据包(以太网802.3等)做同样的工作

官方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'

下面是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'

注:这个问题的另一个答案演示了如何提取MAC地址,这个答案也被编辑以反映它

我知道这是一个迟来的答案,但是对于其他人来说,根据scapy的最新版本,您可以通过索引从arp响应中提取mac,例如:

如果你做了这样的事情:

pkt = Ether(dst='ff:ff:ff:ff:ff')/ARP(pdst='192.168.43.1')
ans,unans = sendp(pkt)

则可以使用

提取远程IP的MAC
ans[0][1][ARP].hwsrc

据我所知,你不能用正则表达式提取它。以上代码将以字符串格式给出MAC地址。

同样,您可以通过尝试和错误地通过打乱索引来提取所有其他字段。

最新更新