天天看點

Sharkpy:NSA使用的基于wireshark和libpcap分析流量工具

本文講的是<b>Sharkpy:NSA使用的基于wireshark和libpcap分析流量工具</b>,Sharkpy中包含了搜尋,建立,修改資料,發送資料,将資料包寫入到新的pcap檔案中這五個子產品。這些會在一個python程式或者一個python會話中全部完成。

sharkPy是使用的NSA原版,不确定是否存在後門,是以請謹慎使用。

設計目标

什麼是sharkPy?

SharkPy目标是成為一個将wireshark的功能進行更細,更子產品化,更容易使用到其餘項目當中的庫檔案。從這個目标可以看出,SharkPy不隻是将wireshark和python結合起來,而是進行極大的優化。

第一步實作的是可以在wireshark環境之外将wireshark提供的功能編譯成python子產品,提供給使用者調用。這一功能已經在衆多linux發行版實作。第二步就是繼續拓展到更多linux版本以及windows版本中,并且提高工具的穩定性。功能完成之後,sharkPy就可以使用wrieshark的全部功能,并且功能子產品按上述六個子產品進行劃分。

安裝

Linux中進行安裝

隻需要安裝了wireshark2.0.1以上版本的就可以使用以下指令進行安裝:

在docker中安裝

1.初始化

第一步,建立SharkPy目錄,然後将dockerfile放到目錄中.cd到這個目錄。

然後使用下面指令:

注意:

2.作為docker容器運作

使用下面指令可以進行互動式使用:

使用下面指令會允許工具捕獲網絡流量:

SharPy的API

從檔案中解析資料包:

dissect_file(file_path,options=[],timeout=10):當使用get_next_from_file函數時,從資料封包件中選取資料包。

參數以及使用說明:

注意:使用者不應該直接使用這些傳回值,而是這些傳回值作為get_next_from_file以及close_file函數的參數進行使用。

get_next_from_file(dissect_process,timeout=None):得到下一組可用的資料包。

參數及使用說明:

close_file(dissect_process):停止,清除痕迹

參數以及使用說明

注意,close_file函數必須在每個會話中都是使用。

從網卡中解析資料包

dissect_wire(interface,options=[],timeout=None):當使用get_next函數時,會從網卡中獲得資料包。

注意,在使用過程中同樣不能直接使用這個函數的傳回值,而是同上,這些傳回值會作為參數傳入到get_next_from_wire以及close_wire函數中。

get_next_from_wire(dissect_process,timeout=None):從存活的資料包中解析下一個可用的資料包。

close_wire(dissect_process):停止以及清理存活的資料包

注意:close_wire必須在每個會話中調用。

将資料或者資料包寫入到網卡或檔案中

wire_writer(write_interface_list):wire_writer對象構造器。将任意資料寫入到網卡當中。

file_writer():建立一個新的file_writer對象,将資料包寫入到pcap檔案當中。

make_pcap_error_buffer():建立一個正确大小,以及初始化的錯誤緩沖區,傳回值為錯誤緩沖區。

pcap_write_file(output_file_path,error_buffer):建立以及打開一個新的pcap檔案。

參數說明:

pcap_write_packet(context,upper_time_val,lower_time_val,num_bytes_to_write,data_to_write,error_buffer):将資料寫入打開的pcap檔案當中

pcap_close(context):必須在每個會話中被調用,用于寫入緩沖區中,關閉寫入檔案,以及釋放記憶體。

通用子產品

do_funct_walk(root_node,funct,aux=None):将資料包中的通信樹通過遞歸傳遞給函數中。采用深度周遊。

get_node_by_name(root_node,name):查找并且傳回具有你要查找内容的節點。

get_node_data_details(node):傳回給定節點的資料元組。

get_pkt_times(pkt=input_packet): 傳回資料包所包含的時間戳資訊。

find_replace_data(pkt, field_name, test_val, replace_with=None,

condition_funct=condition_data_equals, enforce_bounds=True,

quiet=True):進行搜尋,比對,并且将資料包中的内容進行替換。

condition_data_equals(node_val, test_val, pkt_dissection_tree=None):一個比對函數,可以傳遞給find_replace_data().

condition_always_true(node_val=None, test_val=None,

pkt_dissection_tree=None):一個比對函數,可以傳遞給find_replace_data().這一函數總會傳回真,這一函數的唯一作用就是判斷目标字段是否在解析資料包中。

協定選擇

ipv4_find_replace(pkt_dissection, src_match_value=None,

dst_match_value=None, new_srcaddr=None, new_dstaddr=None,

update_checksum=True,

condition_funct=sharkPy.condition_data_equals),修改特定的ipv4協定中的字段。

tcp_find_replace(pkt_dissection, src_match_value=None,

dst_match_value=None, new_srcport=None, new_dstport=None,

condition_funct=sharkPy.condition_data_equals):通過ipv4修改tcp選擇的字段。

用法執行個體

捕獲檔案中的資料包:

目前支援的選項是DECODE_AS和NAME_RESOLUTION

開始檔案讀取以及資料包解析

使用sharkPy.get_next_from_file擷取讀取的資料包:

在最後關閉會話:

取一個資料包樹,并且将他們的名字作為其索引。

以下就是檢索該資料包中所有的key:

請注意,pkt_dict是全部列出的,是以每個字段并不是唯一的。

發現tcp清單中隻有一個元素,如下所示:

使用以下指令進行快捷查找節點:

資料包中每一個節點都包含屬性以及子孩子清單:

以下是通路屬性的方式:

這是pkt的子孩子清單:

擷取有關解析的節點資料中有用的資訊:

從網絡中擷取資料包,以及解析資料包

在SharkPy的wire_dissector中提供了額外的 NOT_PROMISCUOUS選項。

開始捕獲和解析。注意調用者必須有執行權限。但是如果以root權限可能會有危險:

使用sharkPy.get_next_from_wire得到資料包并且對他們進行解析:

一定要關閉捕捉會話:

将資料或者資料包寫入到網絡中

使用網卡名字建立寫入對象

将timeout設定為2,并且向網絡中發送資料:

檢查是否發生錯誤。如果成功,那麼傳回資料:

将資料包寫入到pcap檔案當中。

建立寫入檔案對象:

産生錯誤緩沖區:

打開或者生成新的pcap檔案,準備下一步寫入:

在現有的資料包解析資料:

将第一個資料包寫入到pcap檔案當中:

得到第一個解析資料:

擷取寫操作所需要的資料包資訊:

将資料包寫入到檔案中:

關閉輸出檔案,并且清理資料:

下面程式就是在寫新的資料包之前比對和替換資料,然後輸出pcap檔案

原文釋出時間為:2017年6月29日

本文作者:xnianq

本文來自雲栖社群合作夥伴嘶吼,了解相關資訊可以關注嘶吼網站。

<a href="http://www.4hou.com/tools/5792.html" target="_blank">原文連結</a>