前回の記事の中で、MacへのScapyのインストールについて触れました。
Mac + Python2 + Scapyで、DHCPサーバを探してみた - メモ的な思考的な
公開後、Twitterにて
Scapy works natively on macOS since 2.3.3. There is no need to install pcap and dnet modules.
— Guillaume Valadon (@guedou) 2018年1月8日
とのツイートをいただきました。
そこで、pcapやdnetモジュールが不要かどうかを試してみました。
目次
環境
- Mac OS X 10.11.6
- Python 2.7.14
- pyenv使用中
- Scapy
- バージョンについては以下にて記載
- 試しに実行するコード
- 前回作成した、
discover_dhcp_server.py
- https://github.com/thinkAmi-sandbox/scapy-sample/blob/master/dhcp/discover_dhcp_server.py
- 前回作成した、
NG: PyPIにあるScapy (v2.3.3)を使う場合
PyPIからpip installした場合です。
# Mac OS Xのバージョンを確認 $ sw_vers -productVersion 10.11.6 # Pythonのバージョン確認 $ python --version Python 2.7.14 # virtualenv環境を有効化 $ virtualenv envdev ... Installing setuptools, pip, wheel...done. $ source envdev/bin/activate # pipの状態を確認 (envdev) $ pip list pip (9.0.1) setuptools (38.4.0) wheel (0.30.0) # scapyをインストール (envdev) $ pip install scapy Collecting scapy Installing collected packages: scapy Successfully installed scapy-2.3.3 # インストール後の確認 (envdev) $ pip list pip (9.0.1) scapy (2.3.3) setuptools (38.4.0) wheel (0.30.0)
試しにコードを実行してみると、エラーになりました。
(envdev) $ python discover_dhcp_server.py Traceback (most recent call last): File "discover_dhcp_server.py", line 3, in <module> from scapy.layers.dhcp import DHCP, BOOTP File "/path/to/envdev/lib/python2.7/site-packages/scapy/layers/dhcp.py", line 14, in <module> from scapy.ansmachine import * File "/path/to/envdev/lib/python2.7/site-packages/scapy/ansmachine.py", line 14, in <module> from scapy.sendrecv import send,sendp,sniff File "/path/to/envdev/lib/python2.7/site-packages/scapy/sendrecv.py", line 14, in <module> from scapy.arch.consts import DARWIN, FREEBSD File "/path/to/envdev/lib/python2.7/site-packages/scapy/arch/__init__.py", line 79, in <module> from scapy.arch.pcapdnet import * File "/path/to/envdev/lib/python2.7/site-packages/scapy/arch/pcapdnet.py", line 328, in <module> import pcapy as pcap ImportError: No module named pcapy
NG: GitHubのタグ「v2.3.3」を使う場合
次にGitHubにあるソースコードからインストールしてみます。
まずは、タグ v2.3.3
を指定してインストールしてみます。
なお、タグやコミットなどを指定してpip installする方法は、以下に記載がありました。
Install specific git commit with pip - Stack Overflow
# virtualenvを抜ける $ deactivate # 別のvirtualenvを構築して、そちらにインストール $ virtualenv envdev2 $ source envdev2/bin/activate (envdev2) $ pip list pip (9.0.1) setuptools (38.4.0) wheel (0.30.0) # v2.3.3を指定してインストール (envdev2) $ pip install git+https://github.com/secdev/scapy.git@v2.3.3 Collecting git+https://github.com/secdev/scapy.git@v2.3.3 Cloning https://github.com/secdev/scapy.git (to v2.3.3) to /private/var/folders/h0/l5plp4zd3517r988jpm481g00000gn/T/pip-as1YTj-build Installing collected packages: scapy Running setup.py install for scapy ... done Successfully installed scapy-2.3.3 # インストールを確認 (envdev2) $ pip list pip (9.0.1) scapy (2.3.3) setuptools (38.4.0) wheel (0.30.0)
試しにコードを実行してみると、エラーになりました。
(envdev2) $ python discover_dhcp_server.py Traceback (most recent call last): File "dhcp/discover_dhcp_server.py", line 3, in <module> from scapy.layers.dhcp import DHCP, BOOTP File "/path/to/envdev2/lib/python2.7/site-packages/scapy/layers/dhcp.py", line 14, in <module> from scapy.ansmachine import * File "/path/to/envdev2/lib/python2.7/site-packages/scapy/ansmachine.py", line 14, in <module> from scapy.sendrecv import send,sendp,sniff File "/path/to/envdev2/lib/python2.7/site-packages/scapy/sendrecv.py", line 14, in <module> from scapy.arch.consts import DARWIN, FREEBSD File "/path/to/envdev2/lib/python2.7/site-packages/scapy/arch/__init__.py", line 79, in <module> from scapy.arch.pcapdnet import * File "/path/to/envdev2/lib/python2.7/site-packages/scapy/arch/pcapdnet.py", line 328, in <module> import pcapy as pcap ImportError: No module named pcapy
OK: GitHubの最新コミットを使う場合
最後に、現時点の最新コミット aa11c749d563c6b4a8cfa88182ae8cfaae2edbf7
のソースコードをインストールしてみます。
# 再度、別のvirtualenv環境を作る (envdev2) $ deactivate $ virtualenv envdev3 $ source envdev3/bin/activate (envdev3) $ pip list pip (9.0.1) setuptools (38.4.0) wheel (0.30.0) # インストール (envdev3) $ pip install git+https://github.com/secdev/scapy.git@aa11c749d563c6b4a8cfa88182ae8cfaae2edbf7 Collecting git+https://github.com/secdev/scapy.git@aa11c749d563c6b4a8cfa88182ae8cfaae2edbf7 Cloning https://github.com/secdev/scapy.git (to aa11c749d563c6b4a8cfa88182ae8cfaae2edbf7) to /private/var/folders/h0/l5plp4zd3517r988jpm481g00000gn/T/pip-3zebOf-build Could not find a tag or branch 'aa11c749d563c6b4a8cfa88182ae8cfaae2edbf7', assuming commit. Installing collected packages: scapy Running setup.py install for scapy ... done Successfully installed scapy-2.3.3.dev957 # インストール後の確認 (envdev3) $ pip list pip (9.0.1) scapy (2.3.3.dev957) setuptools (38.4.0) wheel (0.30.0)
試しにコードを実行すると、問題なく動作しました。
(envdev3) $ python discover_dhcp_server.py ###[ Ethernet ]### dst = FF:FF:FF:FF:FF:FF src = 00:00:00:00:00:04 type = 0x800 ###[ IP ]### version = 4 ihl = None tos = 0x0 len = None id = 1 flags = frag = 0 ttl = 64 proto = udp chksum = None src = 0.0.0.0 dst = 255.255.255.255 \options \ ###[ UDP ]### sport = bootpc dport = bootps len = None chksum = None ###[ BOOTP ]### op = BOOTREQUEST htype = 1 hlen = 6 hops = 0 xid = 0 secs = 0 flags = ciaddr = 0.0.0.0 yiaddr = 0.0.0.0 siaddr = 0.0.0.0 giaddr = 0.0.0.0 chaddr = '\x00\x00\x00\x00\x00\x04' sname = '' file = '' options = 'c\x82Sc' ###[ DHCP options ]### options = [message-type='discover' end] Begin emission: Finished to send 1 packets. ..........^C Received 10 packets, got 0 answers, remaining 1 packets
これより、GitHubの最新コミットから持ってくれば
- pcap
- dnet
モジュールは不要なようです。
guedouさん、教えていただきありがとうございました。