らくがきちょう

なんとなく

OS X に scapy をインストールする

scapy があれば対話的に、または Python スクリプトから任意のパケットを生成すること (等) が出来ます。OS X への scapy インストール手順をメモしておきます。検証には OS X El Captian (10.11.4) を、インストールには homebrew を使いました (homebrew はインストールされている前提です)。

homebrew で scapy をインストールする

scapy のインストールは brew install homebrew/python/scapy を実行するだけです。依存関係も homebrew が解決してくれ、一緒に libdnet もインストールされます。

brew install homebrew/python/scapy

現時点では 2.3.1 がインストールされました。これでインストールは完了です。

$ brew info homebrew/python/scapy
homebrew/python/scapy: stable 2.3.1, HEAD
Powerful interactive packet manipulation program
http://www.secdev.org/projects/scapy/
/usr/local/Cellar/scapy/2.3.1 (238 files, 3.6M) *
  Built from source on 2016-05-06 at 16:18:44
From: https://github.com/Homebrew/homebrew-python/blob/master/scapy.rb
==> Dependencies
Required: libdnet

scapy の対話的ツール/usr/local/bin/scapy にインストールされました。

$ file /usr/local/bin/scapy
/usr/local/bin/scapy: a /usr/bin/python script text executable

/usr/local/bin/scapy の中身は以下のような Python スクリプトになっています。

#!/usr/bin/python

#############################################################################
##                                                                         ##
## scapy.py --- Interactive packet manipulation tool                       ##
##              see http://www.secdev.org/projects/scapy/                  ##
##              for more informations                                      ##
##                                                                         ##
## Copyright (C) Philippe Biondi <phil@secdev.org>                         ##
##                                                                         ##
## This program is free software; you can redistribute it and/or modify it ##
## under the terms of the GNU General Public License version 2 as          ##
## published by the Free Software Foundation.                              ##
##                                                                         ##
## This program is distributed in the hope that it will be useful, but     ##
## WITHOUT ANY WARRANTY; without even the implied warranty of              ##
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU       ##
## General Public License for more details.                                ##
##                                                                         ##
#############################################################################


from scapy.main import interact

interact()

エラーの修正

しかし、このままでは scapy を実行すると scapy のライブラリが見つからず、エラーになってしまいます。

$ scapy
Traceback (most recent call last):
  File "send_icmp.py", line 1, in <module>
    from scapy.all import send, IP, ICMP
ImportError: No module named scapy.all

これを解消するには以下のように実行します。

mkdir -p $HOME/Library/Python/2.7/lib/python/site-packages
echo 'import site; site.addsitedir("/usr/local/lib/python2.7/site-packages")' \
  >> $HOME/Library/Python/2.7/lib/python/site-packages/homebrew.pth

これで scapy を実行出来るようになりました。

Hello, Scapy!

scapy を使った Python スクリプトを作成し、テストしてみます。今回は下記の内容で HelloScapy.py というファイルを作成しました。

#!/usr/bin/env python

from scapy.all import send, IP, ICMP
send(IP(src="172.16.10.100",dst="172.16.10.10")/ICMP()/"Hello, Scapy!")

早速、実行してみます。

$ python HelloScapy.py
WARNING: No route found for IPv6 destination :: (no default route?)
.
Sent 1 packets.

1 パケット送信出来たようです。実際にパケットをキャプチャしてみると「Hello, Scapy!」というデータの入った ICMP echo request と reply のやり取りがキャプチャ出来ました。

$ sudo tcpdump -i en3 -X icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on en3, link-type EN10MB (Ethernet), capture size 262144 bytes
17:05:50.990761 IP 172.16.10.100 > 172.16.10.10: ICMP echo request, id 0, seq 0, length 21
	0x0000:  4500 0029 0001 0000 4001 0e45 ac10 0a64  E..)....@..E...d
	0x0010:  ac10 0a0a 0800 bed3 0000 0000 4865 6c6c  ............Hell
	0x0020:  6f2c 2053 6361 7079 21                   o,.Scapy!
17:05:50.992212 IP 172.16.10.10 > 172.16.10.100: ICMP echo reply, id 0, seq 0, length 21
	0x0000:  4500 0029 0001 0000 ff01 4f44 ac10 0a0a  E..)......OD....
	0x0010:  ac10 0a64 0000 c6d3 0000 0000 4865 6c6c  ...d........Hell
	0x0020:  6f2c 2053 6361 7079 21                   o,.Scapy!