[MACOS][Yosemite] python import scapy, No module named dumbnet error

因為工作需要要用到一個blacknurse的python script,但是發現macos上執行遇到No module named dumbnet的error,網路上的解法眾說紛紜,所以記錄一下後來成功的過程。

1. No module named dumbnet

一開始遇到的error,是因為from scapy.all import * ,然後找不到dumbnet可以import

Traceback (most recent call last):
File "exploit.py", line 8, in <module>
from scapy.all import *
File "/usr/local/lib/python2.7/site-packages/scapy/all.py", line 16, in <module>
from scapy.arch import *
File "/usr/local/lib/python2.7/site-packages/scapy/arch/__init__.py", line 79, in <module>
from scapy.arch.pcapdnet import *
File "/usr/local/lib/python2.7/site-packages/scapy/arch/pcapdnet.py", line 471, in <module>
import dumbnet as dnet
ImportError: No module named dumbnet

所以找到網路上的方法安裝libdnet install libdnet from source

安裝libdnet

cd
git clone https://github.com/dugsong/libdnet.git
cd libdnet
./configure && make
cd python
python setup.py install

裝完之後發現還是一樣的error,但是python package路徑,/usr/local/lib/python2.7/site-packages內已經有dnet,但是error message是找不到dumbnet

如果將最後error的pcapdnet.py打開來看,發現他是先import dnet,出現error才import dumbnet,所以實際上是import dnet有error

if conf.use_dnet:
try:
try:
# First try to import dnet
import dnet
except ImportError:
# Then, try to import dumbnet as dnet
import dumbnet as dnet
except ImportError,e:
if conf.interactive:
log_loading.error("Unable to import dnet module: %s" % e)
conf.use_dnet = False

打開python interactive mode,然後import dnet,看是什麼error

2. No module named graphillion

>>> import dnet
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/site-packages/dnet/__init__.py", line 28, in <module>
from dnet.network import Network
File "/usr/local/lib/python2.7/site-packages/dnet/network.py", line 23, in <module>
from dnet.configset import ConfigSet
File "/usr/local/lib/python2.7/site-packages/dnet/configset.py", line 23, in <module>
from graphillion import GraphSet
ImportError: No module named graphillion

所以用pip安裝 pip install graphillion

結果又出現error

3. No module named networkx

>>> import dnet;
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/site-packages/dnet/__init__.py", line 28, in <module>
from dnet.network import Network
File "/usr/local/lib/python2.7/site-packages/dnet/network.py", line 29, in <module>
import networkx as nx
ImportError: No module named networkx

再用pip安裝

pip install networkx

4. AttributeError: ‘module’ object has no attribute ‘intf’

安裝完之後,用python interactive mode已經可以import dnet了,再回過頭來執行程式,又出現error

Traceback (most recent call last):
File "exploit.py", line 8, in <module>
from scapy.all import *
File "/usr/local/lib/python2.7/site-packages/scapy/all.py", line 25, in <module>
from scapy.route import *
File "/usr/local/lib/python2.7/site-packages/scapy/route.py", line 163, in <module>
conf.route=Route()
File "/usr/local/lib/python2.7/site-packages/scapy/route.py", line 22, in __init__
self.resync()
File "/usr/local/lib/python2.7/site-packages/scapy/route.py", line 31, in resync
self.routes = read_routes()
File "/usr/local/lib/python2.7/site-packages/scapy/arch/unix.py", line 102, in read_routes
ifaddr = scapy.arch.get_if_addr(netif)
File "/usr/local/lib/python2.7/site-packages/scapy/arch/__init__.py", line 48, in get_if_addr
return socket.inet_ntoa(get_if_raw_addr(iff))
File "/usr/local/lib/python2.7/site-packages/scapy/arch/pcapdnet.py", line 518, in get_if_raw_addr
i = dnet.intf()
AttributeError: 'module' object has no attribute 'intf'

找到下面這篇 Scapy Fails with AttributeError: ‘module’ object has no attribute ‘intf’

只要移除pydnet

pip uninstall pydnet

做了這些步驟之後總算可以正確執行了。

發佈留言