關於使用Tshark提取IP欄位
寫在前面的話
在這篇文章中,我將討論如何使用tshark顯示特定的欄位。並且我還將深入探討如何提取和操縱這些欄位。我們就從下面的圖片開始吧!

用Tshark讀取檔案
預設情況下,tshark將偵聽本地介面,並從線路上抓取資料包。如果您有要處理的 pcap
檔案,則可以使用 “-r”
命令。也可以通過 “head”
(僅顯示指定數量的輸出行)或 “less”
(一次顯示一整頁輸出)來輸出到螢幕上,例如: tshark -r interesting-packets.pcap | head
預設情況下, “head”
只會顯示前10行,但您可以根據需要對其進行修改,例如上圖我使用 “head -20”
檢視前20行。
使用Tshark過濾流量
當我們在檢視一個 pcap
檔案時,通常我們會尋找某些特定特徵。例如,我們需要查詢與某些IP地址或服務相關的所有流量。我們可以使用捕獲過濾器。但如果我們使用Wireshark,Wireshark捕獲過濾器與tshark的工作方式略有不同。Tshark實際上使用Wireshark Display Filter語法進行捕獲和顯示。這非常酷,因為它提供了更多功能。tshark捕獲過濾器的語法是: <field><operator><value>
舉個栗子:
ip.dst==192.168.1.10 ip.proto==17 tcp.flags.reset!=0
請注意,在第二個栗子中,我使用協議號(17)而不是協議名稱(UDP)。這對於大多數過濾器來說都很常見。使用上面引用的Wireshark Display Filter語法頁面來確定要使用的正確格式。在前兩個示例中,我使用運算子 “==”
來匹配。請注意,在最後一個示例中,我使用 “!=”
表示不等於。您還可以使用大於 (>>)
,小於 (<<)
,等於或大於 (> =)
或小於或等於 (<=)
。這個學過程式設計應該都明白。但有一點,在最後一個示例中,我匹配單個位(TCP頭的位元組13中的復位位)。這意味著我需要確定我是否對正在開啟的位(由 “1”
表示)或關閉(由 “0”
表示)。因此,最後一個示例的另一種方式是: tcp.flags.reset == 1
如果你對與特定IP地址相關的流量感興趣,我可以在上面的 “-r”
命令上加上一些東西: tshark -r interesting-packets.pcap ip.dst==192.168.1.10 | head
將Tshark重定向到新檔案
有時,我們需要將現有的pcap檔案重定向到新檔案。例如,如果我想獲取與特定IP地址關聯的所有流量並將其放在不同的檔案中以進行進一步分析,該怎麼辦?這時我要檢視這個新檔案,並進一步優化我的過濾。我們可以使用 “-w”
來建立一個新的檔案。同樣舉個栗子: tshark -r interesting-packets.pcap -w interesting-host.pcap ip.dst==192.168.1.10 | head
選擇Tshark輸出哪些欄位
預設情況下,tshark將輸出每個資料包的簡短摘要,這其中包括各種欄位。還是一個栗子:

雖然這在執行快速解碼時很方便,但如果我們希望檢視的資訊不在預設輸出中呢?如果我們只想看到一個或兩個欄位而不是其他所有欄位怎麼辦?幸運的是,tshark可以讓我們指定我們希望看到的確切欄位。使用命令 “-T fields”
來標識我們希望指定要檢視的確切欄位,而不是顯示預設資訊。然後可以使用 “-e”
來標識要列印的特定欄位。我用 “-e”
的值是我之前提到的Wireshark顯示過濾器。下面一個只打印源和目標IP地址的栗子: tshark -r interesting-host.pcap -T fields -e ip.src -e ip.dst ip.dst==192.168.1.10 | head
這將產生類似於以下的輸出:

如果我想要把它組織起來,我可以新增 “-E header = y”
開關,如最最最上面的那張圖所示。這將打印出第一行列標題。雖然如果您要將資料匯入電子表格,這會超級好用,但如果您要用命令列操作資料,我建議不要這樣做。這是因為列標題可能與資料混合在一起。
Tshark進行額外處理
假設我們想從包中提取某些欄位,並將它們移動到一個檔案中進行進一步處理。我們應該做的第一件事是輸出感興趣的欄位,但使用一致的分隔符,以便更容易地將值傳遞給其他工具。為此,我們將使用 “separator”
開關並將其設定為使用逗號。下面還是一個栗子:
tshark -r interesting-host.pcap -T fields -E separator=, -e ip.src -e ip.dst ip.dst==192.168.1.10 | head
這將提供與上一個示例類似的輸出,但輸出值之間使用逗號而不是空格。最後,我們應該將輸出重定向到文字檔案,而不是輸到螢幕上。通過這種方式,我們可以將該檔案提供給其他工具進行處理。這裡有一個例子:
tshark -r interesting-host.pcap -T fields -E separator=, -e ip.src -e ip.dst ip.dst==192.168.1.10 > analyze.txt
這將生成一個文字檔案,其中每行包含從單個數據包中提取的資訊。該行將包含以逗號分隔的源和目標IP地址。
Tshark輸出
我應該使用哪些工具來操縱資料取決於我想要什麼樣的資料。Linux有各種各樣的文字處理工具,如 cut
, sort
, uniq
和 grep
。通過谷歌搜尋,您可以找到大量有關使用這些工具的文章。但在這篇部落格文章,我想介紹 “R”
命令,因為它支援我們進行一些統計分析。這是我用來生成類似於最最最上面的圖的資料輸出的命令,但在格式中,我可以用於信標分析:
tshark -r interesting.pcap -T fields -E separator=, -e ip.src -e ip.dst -e ip.proto -e udp.dstport -e ip.len -e frame.time_delta_displayed ip.dst==165.227.88.15 and udp.dstport==53> analyze.txt
這產生了一個名為 “analyze.txt”
的檔案,其中包含類似於以下內容的資料:
192.168.88.2,165.227.88.15,17,53,89,1.073288580 192.168.88.2,165.227.88.15,17,53,89,1.067193833 192.168.88.2,165.227.88.15,17,53,89,1.057524219 192.168.88.2,165.227 .88.15,17,53,89,1.085981806 192.168.88.2,165.227.88.15,17,53,89,1.072384382
接下來,我將使用 “cut”
來提取我感興趣分析的資料列,然後使用 R
來確定資料集的最小值,最大值,平均值,標準差和方差:
cut -d ',' -f 5 analyze.txt | Rscript -e 'y <-scan("stdin", quiet=TRUE)' -e 'cat(min(y), max(y), mean(y), sd(y), var(y), sep="\n")' 89 290 95.74 33.82236 1143.952
在上面的例子中, “cut”
提取了5列,它是在每個會話中傳輸的資料量。然後它將這些值傳遞給 “R”
,它計算該資料集的最小值,最大值,平均值,標準偏差和方差。請注意,我的標準偏差遠大於平均值和最小值之間的差異。這表示,我的大多數會話都接近最小89位元組大小。這有點令人感興趣,因為它表明這兩個系統之間交換的大部分流量都涉及少量資料的會話。但並不是決定性的。我可以對會話時間進行類似的分析:
cut -d ',' -f 6 analyze.txt | Rscript -e 'y <-scan("stdin", quiet=TRUE)' -e 'cat(min(y), max(y), mean(y), sd(y), var(y), sep="\n")' 0 2.088164 0.9999386 0.2973222 0.08840052
這是非常有趣的地方。請注意,會話之間的最大差距只有兩秒多一點。這非常頻繁。另請注意,與均值的方差僅為.08840052秒或約88毫秒。這告訴我們絕大多數的通訊會話幾乎完全相同。
最後的話
資料包分析有一個問題就是如何尋找到有用的資料位並忽略其他所有內容。但對於大多數資料包解碼器中都有預設檢視,但這也有不好的方面,因為您要麼獲得太多資訊,要麼資訊不足。此外,雖然圖形分析工具易於使用,但卻難以利用其他工具或自動化分析。通過利用tshark輸出特定欄位的能力,您可以根據需要操作資料以執行深入分析。
*參考來源: activecountermeasures ,由周大濤編譯,轉載請註明來自FreeBuf.COM