关于python:OSX连接共享和Scapy

OSX connection sharing and Scapy

我正在使用 Scapy 使用以下代码嗅探网络流量:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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())

如果我只是浏览一个网站,这段代码就可以正常工作。

问题是,当我打开连接共享并尝试运行此脚本时,我收到以下错误:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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 是一个有效的接口。

我也遵循了这里的建议,并将第 34 行的 arch/unix.py 从 "os.popen("netstat -rn")" 更改为 "os.popen("netstat -rn | grep -v vboxnet") "。这没有解决它。


我正在运行 OSX 10.5.9 - 一直在努力让 scapy 正常工作 - 在安装 dnet/pcap 库后,我也得到了"OSError:设备未配置"。尝试用

替换 unix.py 中的第 34 行

"netstat -rn | grep -v vboxnet"

仍然出现同样的错误。但是当我在 if 块的 "else" 部分更改第 37 行时:

1
2
3
4
5
6
7
8
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

像魅力一样工作!


我正在运行 OSX 10.10.3,并且一直在努力让 scapy 工作。我尝试在 scapy、scapy-real、dnet、dnet-real 上使用 pip install ,但我仍然遇到同样的错误。这真的很令人沮丧,所以我听从了上面 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 package器并且也无法导入 PyX。


似乎 scapy 在使用桥接接口时遇到了麻烦。我遇到了同样的问题并修复了它,只是过滤了 Internet 共享网桥接口。在这种情况下,正确的解决方法是将相同的字符串替换为 "netstat -rn | grep -v vboxnet | grep -v bridge"