OSX 连接共享与 Scapy

2 投票
3 回答
2045 浏览
提问于 2025-04-18 03:54

我正在使用Scapy这个工具来监听网络流量,代码如下:

from scapy.all import *

import sys

filter = sys.argv[1]

def Responder():

    def getPacket(pkt):
        if Raw in pkt:  print pkt[Raw]

    return getPacket

sniff(filter=filter, prn=Responder())

这段代码在我浏览网页的时候运行得很好。

但是,当我开启连接共享后,运行这个脚本时就出现了以下错误:

bash-3.2# sudo python sniffy.py "tcp port 80"
Traceback (most recent call last):
  File "sniffy.py", line 1, in <module>
    from scapy.all import *
  File "/Library/Python/2.7/site-packages/scapy/all.py", line 25, in <module>
    from route import *
  File "/Library/Python/2.7/site-packages/scapy/route.py", line 162, in <module>
    conf.route=Route()
  File "/Library/Python/2.7/site-packages/scapy/route.py", line 22, in __init__
    self.resync()
  File "/Library/Python/2.7/site-packages/scapy/route.py", line 31, in resync
    self.routes = read_routes()
  File "/Library/Python/2.7/site-packages/scapy/arch/unix.py", line 87, in read_routes
    ifaddr = scapy.arch.get_if_addr(netif)
  File "/Library/Python/2.7/site-packages/scapy/arch/__init__.py", line 36, in get_if_addr
    return socket.inet_ntoa(get_if_raw_addr(iff))
  File "/Library/Python/2.7/site-packages/scapy/arch/pcapdnet.py", line 188, in get_if_raw_addr
    return i.get(ifname)["addr"].data
  File "dnet.pyx", line 990, in dnet.intf.get
OSError: Device not configured

我尝试在脚本的开头加上 "conf.iface=en1",但还是出现同样的错误。en1是一个有效的网络接口。

我还按照这里的建议,把arch/unix.py文件第34行的代码从 "os.popen("netstat -rn")" 改成了 "os.popen("netstat -rn | grep -v vboxnet")",但问题依然没有解决。

3 个回答

2

看起来scapy在处理桥接接口时遇到了一些问题。我也遇到了同样的问题,最后通过过滤掉互联网共享的桥接接口解决了。在这种情况下,正确的解决办法是用 "netstat -rn | grep -v vboxnet | grep -v bridge" 这个命令来替换掉原来的字符串。

5

我在用OSX 10.10.3,花了很长时间想让scapy正常工作。我尝试用pip安装scapy、scapy-real、dnet和dnet-real,但还是遇到同样的错误。这让我非常沮丧,所以我听从了上面Adam B的建议,决定添加一个需要修改的unix.py文件所在的文件夹。

在/usr/local/lib/python2.7/site-packages/scapy/arch/目录下,用vim、nano或其他文本编辑器打开unix.py文件。

把第37行改成:

fs=os.popen("netstat -rn | grep -v vboxnet") # -f inet

这样应该就能正常工作了。不过我还是遇到了一个错误,提示说无法导入python gnuplot wrapper,也无法导入PyX。

7

我在用OSX 10.5.9,花了很长时间想让scapy正常工作。在安装了dnet和pcap库之后,我也遇到了“OSError: Device not configured”的错误。我尝试把unix.py文件中的第34行替换成:

"netstat -rn | grep -v vboxnet"

但还是出现了同样的错误。不过,当我在if语句的“else”部分改动第37行时:

def read_routes():
    if scapy.arch.SOLARIS:
        f=os.popen("netstat -rvn") # -f inet
    elif scapy.arch.FREEBSD:
        f=os.popen("netstat -rnW") # -W to handle long interface names
    else:
        # f=os.popen("netstat -rn") # -f inet
        f=os.popen("netstat -rn | grep -v vboxnet") # -f inet

结果就正常了!

撰写回答