如何使用Python嗅探发送至离线主机的ICMP请求?
如何使用Python嗅探发送至离线主机的ICMP请求?
我完全懂你现在的困扰——用Scapy抓ICMP包时,只能抓到有回复的echo-reply,发往离线主机的echo-request根本看不到,这对ping扫检测这类渗透测试场景来说太影响效率了。我来帮你解决这个问题。
问题根源
出现这个情况主要有两个核心原因:
- 网卡默认处于非混杂模式:普通模式下,网卡只会接收目标MAC地址指向自己的数据包,发往其他主机(哪怕离线)的包不会被转发到你的网卡(除非是广播泛洪场景,但大部分情况不会)。
- Scapy默认只监听接收方向的数据包:如果你是自己ping离线主机,你发出去的echo-request属于发送路径的流量,默认不会被Sniff捕获。
解决方案
只需要修改你的Scapy脚本,加上几个关键参数就能解决问题:
修改后的代码:
#!/usr/bin/python3 from scapy.all import * def print_pkt(pkt): print(pkt.summary()) # 关键修改:开启混杂模式+监听双向流量 pkts = sniff( iface='你的网卡名称', # 替换成实际的网卡名,比如eth0/ens33/wlan0 filter='icmp', prn=print_pkt, promisc=True, # 开启混杂模式,接收所有经过网卡的数据包 direction="both" # 同时监听发送和接收方向的流量 )
参数解释
promisc=True:强制网卡进入混杂模式,这样它会接收所有经过该网卡的数据包,而不仅仅是发给自己的。这个操作需要管理员权限,所以必须用sudo运行脚本。direction="both":默认Scapy只会捕获网卡接收的数据包,设置这个参数后会同时抓取发送出去的流量,这样你自己ping离线主机时,就能看到发出去的echo-request了。- 关于网卡名称:可以用
ip link show或ifconfig命令查看你的真实网卡名称,别填错了。
进阶优化(可选)
如果只想专注捕获ICMP echo请求(而不是所有ICMP包),可以把过滤规则改得更精确:
filter='icmp[icmptype] == icmp-echo'
这样输出只会显示echo-request包,避免echo-reply干扰你的检测。
验证方法
运行修改后的脚本(记得加sudo),然后在另一个终端执行ping 192.168.15.201,这时候你应该能看到类似这样的输出:
Ether / IP / ICMP 192.168.15.195 > 192.168.15.201 echo-request 0 / Raw
备注:内容来源于stack exchange,提问作者John Adams
相关产品推荐
相关产品推荐

