首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python Scapy --arp请求和响应

Python Scapy --arp请求和响应
EN

Stack Overflow用户
提问于 2015-09-27 11:08:07
回答 2查看 30.9K关注 0票数 1

我用下面这行发送arp数据包广播:

代码语言:javascript
复制
send(ARP(op=ARP.who_has, psrc="192.168.5.51", pdst=the_ip))

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

代码语言:javascript
复制
pkt = sniff(filter=arp , count=10) 
print (pkt.summary()) 

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-27 14:51:06

's user manual建议使用sr()sr1()函数发送数据包和接收应答:

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

The official API documentation指定了它们的完整签名。这些似乎是这个用例的相关论据:

retry:如果为正,则重新发送未应答的数据包的次数。如果为负,则在放弃之前连续多少次未回答的探测。只有负值才是真正有用的。

timeout:发送最后一个数据包后需要等待多长时间。默认情况下,sr将永远等待,当用户不再需要回答时,他将不得不中断(Ctrl-C)。

inter:每个数据包之间等待的时间,单位为秒。

下面是一个使用sr()函数的执行示例:

代码语言:javascript
复制
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()函数的执行示例:

代码语言:javascript
复制
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'

注意: An another answer to this question演示了如何提取地址,并对此答案进行了编辑以反映该地址。

票数 5
EN

Stack Overflow用户

发布于 2020-07-21 11:51:56

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

如果你做了这样的事情:

代码语言:javascript
复制
pkt = Ether(dst='ff:ff:ff:ff:ff')/ARP(pdst='192.168.43.1')
ans,unans = sendp(pkt)

然后您可以使用以下命令提取远程ip的mac

代码语言:javascript
复制
ans[0][1][ARP].hwsrc

据我所知,你不能用正则表达式来提取它。上面的代码将以字符串格式为您提供mac地址。

类似地,您可以通过修改索引来通过反复试验来提取所有其他字段。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32804176

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档