2012-04-18 12 views
3

私はtcpdumpを使ってキャプチャされたパケットを含むファイルを解析しようとしています。最初に、5タプルを使用してパケットをフローに分類したいと考えています。次に、各フローの各パケットのサイズと到着時間を取得する必要があります。私はwiresharkでConversation listを試しましたが、フロー内の各パケットについての情報ではなく、フロー内のパケット数だけを示します。仕事をすることができるコード(C++やシェルスクリプト)の提案?ありがとうございましたpcapファイルを解析するコード

+0

[Bro](http://www.bro-ids.org)の強力なネットワークスクリプト言語が必要です。それは「Python/Ruby for network analysis」です。具体的には、[new_packet'イベント](http://www.bro-ids.org/documentation/scripts/base/event.bif.html#id-new_packet)をフックしてと述べた。 – mavam

答えて

1

私はライブラリを使ってtcp dumpを分析しましたが、それはビジネス向けのものでしたので、私はあなたに与えることはできません。あなたが探しているものが見つからなければ、私の答えが助けになるでしょう。 tcpdumpは、Matryoshka dollsのようなネストされたネットワークデータです。pcap層はtcpdumpによって追加されます。

キャプチャのみで作業する場合は、ダンプの形式はLibpcap File Formatで指定します。各パケットの到着のサイズと時間を取得するには、この仕様を使用してダンプを処理する必要があります。

あなたが分析に深く行かなければならない場合、これらは、以下の層であるトランスポート層

  • アプリケーション層
  • インターネット層
  • リンク層
    1. ために

      各レイヤにはヘッダ定義があります。したがって、あなたのpcapデータに含まれているプロトコルスタックを見つけて、ヘッダーを解析して情報を得る必要があります。

  • +1

    その仕様を使ってダンプを処理する最も簡単な方法は、libpcapで読み込むことです。 'pcap_open_offline()'を使って開きます。それを処理する独自のコードを書くことは、ほとんどの場合、時間の無駄です。 libpcapを使用すると、新しいバージョンのlibpcapでは多くのpcap-ngファイルも読み込むことができます。 –

    0

    5タプルのメンバーは何ですか?フローがTCPまたはUDPの場合は、送信元IPアドレスと宛先IPアドレスとポート番号、おそらく2つのエンドポイント間で複数のフローを時間の経過とともに区別するための番号が機能します。 SCTPの場合も同様ですが、ストリームがストリームの場合はさらに必要になる可能性があります。

    5タプルのメンバーがすべてWiresharkの「名前付きフィールド」である場合は、-T fieldsオプションを使用してTSharkを使用し、-eオプションを使用して、印刷するフィールドを指定し、タイムスタンプ(frame.time_epochは、UN * Xエポックからの秒数と分数としての時間を与えます)、適切なフィールドのフィールド(frame.lenは、リンクレイヤパケットPLUSのようなメタデータの生のバイト数を与えます。 802.11無線情報のためのラジオタップヘッダーとして)、および他のフィールドを入力し、TSharkの出力を、実行したい処理を行うスクリプトまたはプログラムに送ります。これにより、TSharkはプロトコル層の処理を行うので、プログラムは結果のデータを処理するだけです。あなたはScapyのことを聞いていない場合は

    2

    UmNyobe、

    は、まだ私はあなたが近くぴったりでしょうやろうとしているものを信じて。たとえば、私はこの小さなスニペットを書いてpcapフィールドを解析し、S​​capyを使って話しているようなものを私に与えます。

    #!/usr/bin/python -tt 
    
    from scapy import * 
    import sys 
    from datetime import datetime 
    
    '''Parse PCAP files into easy to read NETFLOW like output\n 
        Usage:\n 
        python cap2netflow.py <[ pcap filename or -l ]>\n 
        -l is live capture switch\n 
        ICMP packets print as source ip, type --> dest ip, code''' 
    
    
    def parse_netflow(pkt): 
        # grabs 'netflow-esqe' fields from packets in a PCAP file 
        try: 
         type = pkt.getlayer(IP).proto 
        except: 
         pass 
    
        snifftime = datetime.fromtimestamp(pkt.time).strftime('%Y-%m-%d %H:%M:%S').split(' ')[1] 
    
        if type == 6: 
         type = 'TCP' 
        if type == 17: 
         type = 'UDP' 
        if type == 1: 
         type = 'ICMP' 
    
        if type == 'TCP' or type == 'UDP': 
         print(' '.join([snifftime, type.rjust(4, ' '), str(pkt.getlayer(IP).src).rjust(15, ' ') , str(pkt.getlayer(type).sport).rjust(5, ' ') , '-->' , str(pkt.getlayer(IP).dst).rjust(15, ' ') , str(pkt.getlayer(type).dport).rjust(5, ' ')])) 
    
        elif type == 'ICMP': 
         print(' '.join([snifftime, 'ICMP'.rjust(4, ' '), str(pkt.getlayer(IP).src).rjust(15, ' ') , ('t: '+ str(pkt.getlayer(ICMP).type)).rjust(5, ' '), '-->' , str(pkt.getlayer(IP).dst).rjust(15, ' '), ('c: ' + str(pkt.getlayer(ICMP).code)).rjust(5, ' ')])) 
    
        else: 
         pass 
    if '-l' in sys.argv: 
        sniff(prn=parse_netflow) 
    else: 
        pkts = rdpcap(sys.argv[1]) 
        print(' '.join(['Date: ',datetime.fromtimestamp(pkts[0].time).strftime('%Y-%m-%d %H:%M:%S').split(' ')[0]])) 
        for pkt in pkts: 
         parse_netflow(pkt) 
    

    PythonとScapyをインストールして起動します。もしあなたがC++のチャンスを知っていれば、これはすでにあなたに多くの意味があると思っています。

    たくさんより行いますがPCAPの解析について話分野にで磨く心のScapyに保つ、役立つチュートリアルへこのページ上のリンクのトンがありますが、ここで

    http://www.secdev.org/projects/scapy/

    をScapyを取得します。..

    私はこれが助けてくれることを願っています!

    dc

    関連する問題