
パッシブサービスロケーター。サーバー、クライアント、名前など多くの情報を識別するPython製スニファーです。
パッシブサービスロケーター。サーバー、クライアント、名前などを識別するPythonスニファー
パッシブサービススニファーであるpasserを使い始めるための簡単なメモです。スニッフィングの許可を得るのはあなたの責任です。
Passerは、ライブのパケットキャプチャからも、pcapファイルからも動作できます(コマンドラインパラメータ。以下の例を参照)。LAN上のイーサネットカード、DNSエントリ、オペレーティングシステム、ルーターなど、ライブのサービスとクライアントをすべてパッシブに報告します!
Windowsを使用している場合、または何らかの理由でサポートファイルへのパスが私のものと一致しない場合は、それらがどこにあるかを教えてください。喜んでスクリプトを更新します。
# Install system dependencies
sudo apt-get install arp-scan ettercap-text-only nmap wireshark
# Install python dependencies
sudo pip install -r requirements.txt
# Prevent Scapy from performing DNS lookups
echo 'noenum = [ Resolve(), TCP_SERVICES, UDP_SERVICES ]' >> ~/.scapy_startup.py
# Install system dependencies
sudo yum install arp-scan ettercap nmap wireshark
# Install python dependencies
sudo pip install -r requirements.txt
# Prevent Scapy from performing DNS lookups
echo 'noenum = [ Resolve(), TCP_SERVICES, UDP_SERVICES ]' >> ~/.scapy_startup.py
scapy をインストールするには、インストールガイドを参照してください。
Passer は Docker イメージとしてもパッケージ化されています。まだ Docker をインストールしていない場合、Linux にインストールする簡単な方法は次のとおりです:
curl -fsSL https://get.docker.com | sh -
それ以外の場合は、お使いのオペレーティングシステム向けのインストール手順に従ってください。
ほとんどの用途では、このリポジトリに含まれるpasserスクリプトの使用を推奨します。このスクリプトは、Docker固有の処理をすべて行います。
wget https://raw.githubusercontent.com/activecm/passer/master/passer
chmod +x passer
その後、このスクリプトは以下の例のいずれかと同様に使用できます。例えば:
./passer -i eth0
# The equivalent without using the included script would be:
docker run --rm --name=passer -i --init --net=host --cap-add=net_raw activecm/passer -i eth0
passer の実行を停止するには、次のようにします:
docker stop passer
/path/to/passer.py
これはすべてのネットワークインターフェースからスニッフし、すべての出力行をコンソールに送信します。
sudo /path/to/passer.py
または
su - -c '/path/to/passer.py'
/path/to/passer.py -i IfaceName
route を実行すると、使用可能なライブインターフェースがいくつか表示されます。
❕
-iは-rと互換性がありません。
/path/to/passer.py -r /path/to/packets.pcap
❕
-rは-iと互換性がありません。
cat packetdata.pcap | ./passer.py -r /proc/self/fd/0
zcat packetdata.pcap.gz | ./passer.py -r /proc/self/fd/0
bzcat packetdata.pcap.bz2 | ./passer.py -r /proc/self/fd/0
tcpdump -i eth0 -qtnp -w - | ./passer.py -r /proc/self/fd/0
# etc...
これにより、パケットを pcap ファイルに保存できる任意のツールでパケットをキャプチャし、後で別のシステム上で passer を使って処理できます。
/path/to/passer.py -l /path/to/networkinfo.txt
/path/to/passer.py 2>/dev/null
/path/to/passer.py -h
/path/to/passer.py -u /path/to/oddpackets.pcap
これは一般に開発プロセス向けのものであり、このファイルに保存されるパケットは署名を書き込む必要があるものです。風変わりなパケットの提供、サービスの説明、プログラムへのパッチは喜んで受け付けます。
これは、コマンドラインの末尾にBPFフィルタを一重引用符で囲んで配置するだけで済む_はず_です。バージョン1.16の時点では、基盤となるライブラリが提供されたフィルタを正常に使用できていないようですが、回避策があります。tcpdumpを使ってフィルタリングを行い、絞り込まれたパケットのセットを上記のように標準入力経由でpasserに渡します:
tcpdump -r packets.pcap -w - 'icmp or arp' | ./passer.py -r /proc/self/fd/0
パケットを事前にキャプチャする場合でもライブスニッフィングを行う場合でも、使用するフィルタの提案については、以下の「サンプルフィルタ」セクションを参照してください。
socket.error: (1, 'Operation not permitted')
おそらく、非rootユーザーとしてライブでスニッフィングしようとしているのでしょう。rootでログインするか、sudo/suを使うか、pcapファイルを扱ってください。
passerがクラッシュする場合やお使いのシステムで動作しない場合は、エラーメッセージ(あれば)とオペレーティングシステムの詳細を含むissueを作成してください。
Passerの出力は標準出力に送られ、コマンドラインパラメータ -l /path/to/logfile を指定した場合はそのファイルにも書き込まれます。形式は次のとおりです:
| Type | IPAddr | Proto | State | Optional description (may be empty) |
|---|---|---|---|---|
| 'IP' | IPaddr | 'IP' | dead or live | p0f OS description |
| 'MA' | IPaddr | 'Ethernet' | MacAddr | ManufDescription |
| 'TC' | IPaddr | 'TCP_'Port | closed or open | client description |
| 'TS' | IPaddr | 'TCP_'Port | closed or listening | server description |
| 'UC' | IPaddr | 'UDP_'Port | open or closed | udp client port description |
| 'US' | IPaddr | 'UDP_'Port | open or closed | udp server port description |
| 'DN' | IPaddr | 'A' or 'PTR' | hostname | possible extra info |
| 'RO' | IPaddr | 'TTLEx' | router | possible extra info |
各行はカンマ区切りになっているため、スプレッドシートへの読み込みやSQLインポートが容易です。どのフィールドにもカンマを含めるべきではありません。サンプル出力ファイルは http://www.stearns.org/passer/passer-sample-log.txt にあります。
これらの行から目的のデータを取得する方法の例をいくつか示します:
cat /var/tmp/passer-log | sort -u | less
cat /var/tmp/passer-log | sort -t, -k2 -u | less
cat /var/tmp/passer-log | sort -u | egrep '(^DN|^RO)' | less
cat /var/tmp/passer-log | sort -u | grep ',192\.168\.0\.17,' | less
cat /var/tmp/passer-log | sort -u | grep ',192\.168\.' | less
cat /var/tmp/passer-log | sort -u | grep ',TCP_25,listening,' | less
cat /var/tmp/passer-log | sort -u | grep -v ',closed,' | less
cat /var/tmp/passer-log | sort -u | grep ',closed,' | less
cat /var/tmp/passer-log | sort -u | grep -i 'google\.com\.,' | less
/path/to/make-hosts /var/tmp/passer-log | /path/to/mergehosts.pl >/var/tmp/passer-hosts
"make-hosts" と merge-hosts は、http://www.stearns.org/passer/make-hosts にある 別々のシェルスクリプトと perl スクリプトです。
これはほんの始まりにすぎません! 興味深い項目を抽出するお気に入りの方法を 送ってください。追加して、あなたの名前をクレジットします。
個々のレコードタイプは、生データを得るために特定の種類のパケットを必要とします。 これらを含めたり除外したりしたい場合は、付属のフィルターを使用してください。
'IP', IPaddr, 'IP', dead or live, p0f OS description
これには TCP SYN パケットが必要です:
'tcp[13] & 0x12 = 0x02'
'MA', IPaddr, 'Ethernet', MacAddr, ManufDescription
これらは ARP 応答から取得されます(*1):
'arp'
'TC', IPaddr, 'TCP_'Port, closed or open, client description
これらには TCP SYN/ACK、FIN、RST(*2) が必要です:
'tcp[13] & 0x07 != 0'
'TS', IPaddr, 'TCP_'Port, closed or listening, server description
ポートが開いているか閉じているかを確認するには、TCP SYN、SYN/ACK、RST が必要です:
'tcp[13] & 0x06 != 0'
サーバー記述文字列を生成するには、ネットワーク上でトラフィックの大部分を占めるACKパケットも確認する必要があります:
'tcp[13] & 0x17 = 0x10'
両方が必要な場合は、TCP トラフィックをすべて取得するだけです:
'tcp'
'UC', IPaddr, 'UDP_'Port, open or closed, udp client port description
すべての UDP ポートと ICMP ポート到達不能をそのまま渡すのが最も簡単です:
'udp or icmp[0:2] = 0x0303'
'US', IPaddr, 'UDP_'Port, open or closed, udp server port description
上記と同じ:
'udp or icmp[0:2] = 0x0303'
'DN', IPaddr, A,AAAA,PTR,CNAME hostname, 追加情報の可能性あり
UDP または TCP ポート 53 (*3):
'udp src port 53 or tcp src port 53'
'RO', IPaddr, 'TTLEx', router, possible extra info
ルーターを識別するのは、ルーターが Time-To-Live-Exceeded または unreachable メッセージを送信しているためです:
'icmp[0:2] = 0x0B00 or icmp[0] = 0x03'
*1 これは arp リクエストも取得しますが、これらは無視されます。
*2 このフィルタは技術的には SYN も含みますが、それは少量の 追加データにすぎません