因為工作需要要用到一個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
做了這些步驟之後總算可以正確執行了。