2012-04-18 56 views
3

我想分析一個包含使用tcpdump捕獲的數據包的文件。我首先想要使用5元組將數據包分類爲流。然後,我需要獲取每個流中每個數據包的大小和到達間隔時間。我嘗試了wireshark中的Conversation列表,但它僅給出流中的數據包數量,而不是有關流中每個數據包的信息。任何可以完成這項工作的代碼(C++或shell腳本)的建議?謝謝分析pcap文件的代碼

+0

您可能想看看[Bro](http://www.bro-ids.org)強大的網絡腳本語言。它是「用於網絡分析的Python/Ruby」。具體來說,你可以編寫一個腳本來鉤住['new_packet'事件](http://www.bro-ids.org/documentation/scripts/base/event.bif.html#id-new_packet)來獲取你的號碼提及。 – mavam 2012-04-23 17:14:26

回答

1

我在圖書館工作,分析tcp轉儲,但它是一個企業,所以我不能只給你。如果你沒有找到你正在尋找的東西,那麼我的答案可以提供幫助。 tcpdump只是嵌套的網絡數據,如Matryoshka dolls,其中pcap層由tcpdump添加。

如果您只想處理捕獲,轉儲格式在Libpcap File Format中指定。要獲得每個數據包到達的大小和時間,您需要使用此規範處理轉儲。

如果你不得不更深入的分析,這些都是以下幾層爲了

  1. 鏈路層
  2. 網絡層
  3. 傳輸層
  4. 應用層

每個圖層都有一個標題定義。所以你需要找到你的pcap數據包含哪個協議棧,並解析頭部以獲取信息。

+1

使用該規範處理轉儲的最簡單方法是使用libpcap讀取它 - 使用'pcap_open_offline()'打開它。編寫自己的代碼來處理它通常是浪費時間;使用libpcap也意味着,在更新版本的libpcap中,許多pcap-ng文件也可以被讀取。 – 2012-04-18 19:46:59

0

五元組的成員是什麼?如果流是TCP或UDP,則源和目標IP地址和端口號,以及可能用於區分兩個端點之間的多個流隨時間流逝的數字;對於SCTP來說,它是相似的,但如果流是一個流,你可能需要更多。

如果五元組的成員都是Wireshark中的「命名字段」,則可以使用TShark和-T fields選項,並使用-e選項指定要打印的字段,並選擇帶時間戳的字段(frame.time_epoch會給你從UN * X紀元開始秒和小數秒的時間),一個適當大小的字段(frame.len給你鏈接層數據包的原始字節數PLUS任何元數據作爲802.11無線電信息的無線電標頭)以及其他字段,然後將TShark的輸出提供給執行您想要執行的處理的腳本或程序。這讓TShark可以處理協議層,這樣你的程序只需要處理結果數據。

2

UmNyobe,

如果你還沒有聽說過Scapy的的但我beleive你正在嘗試做的將是一個近乎完美的契合。例如,我寫了這個小片段來解析一個pcap字段,並給我一些你正在談論的使用Scapy的東西。

#!/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++的機會,這對你來說已經很有意義了。

獲取Scapy的這裏

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

有噸的此頁有用的教程鏈接,牢記Scapy的確實很多,但更多的磨練對談PCAP解析領域..

我希望這有助於!

dc