Wiresharkで取得した情報を可視化
はじめに
localhostで発生するパケットだけならいいんですがポートフォワーディングしてるとWiresharkがごちゃごちゃしてきちゃってわかりづらいので可視化してみました。
今回はlocalhostで発生するパケットのみを扱うのですが、複数のパケットを取得している方のためにPageRank(ノードの重要度を可視化)を使用しています。
環境
Python 3.7.5
準備
Pythonのパッケージをインストール
pip install dpkt
pip install networkx
pip install matplotlib
Wiresharkでキャプチャしたデータをエクスポートする
Wiresharkでキャプチャーしたファイルを使用するので保存しておいてください。
保存するファイル形式はWireshark/tcpdump/...
の.pcap
を選択して保存してください。
完成形
一応IPアドレスは修正してあります。
使い方
どちらも同一階層にあることを前提としています。
python pcap_Visualization.py <ファイル名.pcap>
ソースコード
pcap_Visualization.py
import binascii
import dpkt
import matplotlib.pyplot as plt
import networkx as nx
import os
import socket
import string
import sys
def main(file_name):
packet_count = 0
pcr = dpkt.pcap.Reader(open(file_name,'rb'))
#パケット処理
for ts,buf in pcr:
packet_count += 1
try:
eth = dpkt.ethernet.Ethernet(buf)
except:
continue
#IPデータの場合
if type(eth.data) == dpkt.ip.IP:
ip = eth.data
src = socket.inet_ntoa(ip.src)
dst = socket.inet_ntoa(ip.dst)
with open('./edgelist.txt', 'a') as f:
print("{} {}".format(src, dst), file = f)
G = nx.read_edgelist('edgelist.txt', nodetype=str) # ファイル読み込み
plt.figure(figsize=(7, 7))
pos = nx.spring_layout(G)
#PageRankの追加
pr = nx.pagerank(G)
nx.draw_networkx_edges(G, pos, edge_color='y')
#node_sizeにPageRankの値を組み込む
nx.draw_networkx_nodes(
G,
pos,
node_color='r',
alpha=0.5,
node_size=[5000*v for v in pr.values()]
)
nx.draw_networkx_labels(
G,
pos,
font_size=10
)
plt.axis('off')
plt.show()
os.remove("edgelist.txt")
print("処理終了:{}".format(packet_count))
# メイン関数
if __name__ == '__main__':
if (len(sys.argv) != 2):
print("ファイルを指定して下さい")
exit()
#第2引数をファイル名にする
file_name = sys.argv[1]
main(file_name)
おまけ
他の機器で発生するパケットを追加するとこんな感じになりました!
PageRankの差がわかりづらいですね...
気が向いたら修正しようと思います!
まとめ
NetworkX面白いですね!!
ノードとエッジの繋がりを表現するパッケージなんですがこれならネットワーク以外にも応用できそうですね!!
ご指摘お待ちしております!!