13
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Python】Wiresharkで取得した情報を可視化する

Last updated at Posted at 2020-01-18

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アドレスは修正してあります。

Screen Shot 2020-01-19 at 4.17.45.png

使い方

どちらも同一階層にあることを前提としています。

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の差がわかりづらいですね...
気が向いたら修正しようと思います!

Screen Shot 2020-01-19 at 4.09.29.png

まとめ

NetworkX面白いですね!!
ノードとエッジの繋がりを表現するパッケージなんですがこれならネットワーク以外にも応用できそうですね!!
ご指摘お待ちしております!!

13
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?