15

Python を使用してネットワーク パケットを盗聴する最良の方法は何ですか?

これに最適なモジュールは Scapy と呼ばれるモジュールであるといくつかの場所から聞いたことがありますが、残念ながら、システムで python.exe がクラッシュします。インストール方法に問題があるだけだと思いますが、他の多くの人が Windows では特にうまく動作しないと言っていました。(誰かが興味を持っているなら、私は Windows Vista を実行しているので、影響があるかもしれません)。

誰もがより良い解決策を知っていますか?

更新:

PyPcap をインストールするようにという回答を読んだ後、少しいじってみたところ、使用しようとしていた Scapy が PyPcap もインストールするように指示していることがわかりました。回答の例でもハングが発生したため、問題を引き起こしたのはこの変更された PyPcap だったようです。

PyPcap の元のバージョンを (Google のサイトから) インストールしたところ、Scapy は正常に動作し始めました (多くのことを試したわけではありませんが、少なくともスニッフィングを開始するとすぐにクラッシュしませんでした)。Scapy 開発者に新しい欠陥チケットを送信しました: http://trac.secdev.org/scapy/ticket/166、彼らがそれで何かできることを願っています。

とにかく、皆さんにお知らせしようと思いました。

4

6 に答える 6

19

難しい方法

raw ソケットを使用して、すべての IP パケットを盗聴できます。
raw ソケットは、データをバイナリで送受信するソケットです。
Pythonのバイナリは、次のような文字列で表されます\x00\xff...すべて\x..がバイトです。
IP パケットを読み取るには、受信したパケットを IP プロトコルに従ってバイナリで分析する必要があります。

これは、各ヘッダーのビット単位のサイズを持つ IP プロトコルのフォーマットのイメージです。

IP プロトコル形式

このチュートリアルは、生のパケットを理解し、ヘッダーに分割するプロセスを理解するのに役立ちます: http://www.binarytides.com/python-packet-sniffer-code-linux/

簡単な方法

IP パケットを非常に簡単にスニッフィングする別の方法は、scapy モジュールを使用することです。

from scapy.all import *
sniff(filter="ip", prn=lambda x:x.sprintf("{IP:%IP.src% -> %IP.dst%\n}"))

このコードは、すべての IP パケットの送信元 IP と宛先 IP を表示します。ここにあるドキュメントを読むことで、scapy でさらに多くのことができます: http://www.secdev.org/projects/scapy/doc/usage.html

達成しようとしている目標によって異なりますが、プロジェクトを構築する必要がある場合、その機能が IP パケットをスニッフィングする場合は、より安定したスクリプトに scapy を使用することをお勧めします。

于 2015-08-30T21:19:05.897 に答える
15

pypcap の使用:

import dpkt, pcap
pc = pcap.pcap()     # construct pcap object
pc.setfilter('icmp') # filter out unwanted packets
for timestamp, packet in pc:
    print dpkt.ethernet.Ethernet(packet)

出力サンプル:

Ethernet(src='\x00\x03G\xb2M\xe4', dst='\x00\x03G\x06h\x18', data=IP(src='\n\x00\x01\x1c',
dst='\n\x00\x01\x10', sum=39799, len=60, p=1, ttl=128, id=35102, data=ICMP(sum=24667,
type=8, data=Echo(id=512, seq=60160, data='abcdefghijklmnopqrstuvwabcdefghi'))))

Ethernet(src='\x00\x03G\x06h\x18', dst='\x00\x03G\xb2M\xe4', data=IP(src='\n\x00\x01\x10',
dst='\n\x00\x01\x1c', sum=43697, len=60, p=1, ttl=255, id=64227, data=ICMP(sum=26715,
data=Echo(id=512, seq=60160, data='abcdefghijklmnopqrstuvwabcdefghi'))))
于 2009-01-20T18:31:15.303 に答える
8

python-libpcapを使用します。

import pcap

p = pcap.pcapObject()
dev = pcap.lookupdev()
p.open_live(dev, 1600, 0, 100)
#p.setnonblock(1)
try:
    for pktlen, data, timestamp in p:
        print "[%s] Got data: %s" % (time.strftime('%H:%M', 
                                                   time.localtime(timestamp)),
                                     data)
except KeyboardInterrupt:
    print '%s' % sys.exc_type
    print 'shutting down'
    print ('%d packets received, %d packets dropped'
           ' %d packets dropped by interface') % p.stats()
于 2009-01-20T18:20:59.787 に答える
1

別のオプションはpypcapです。

結果を解析するために、Constructは非常に巧妙です。

于 2009-01-20T18:26:40.367 に答える