本文講的是<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>