PYTHON黑帽編程1.5 使用WIRESHARK練習網絡協議分析


Python黑帽編程1.5  使用Wireshark練習網絡協議分析

 

1.5.0.1  本系列教程說明

本系列教程,采用的大綱母本為《Understanding Network Hacks Attack and Defense with Python》一書,為了解決很多同學對英文書的恐懼,解決看書之后實戰過程中遇到的問題而作。由於原書很多地方過於簡略,筆者根據實際測試情況和最新的技術發展對內容做了大量的變更,當然最重要的是個人偏好。教程同時提供圖文和視頻教程兩種方式,供不同喜好的同學選擇。

1.5.0.2 本節前言

在上一節,筆者羅列的學習網絡編程應該了解或掌握的網絡基礎知識,這其中直接和編程相關的是網絡協議。抓包分析,一直都是學習網絡協議過程中,理論聯系實踐的最好方式,而目前最常用的抓包工具就是Wireshark

隨着我們教程的深入,我們也會使用Wireshark來准備測試用的數據包,校驗程序的准確性,編寫程序之前做人工分析以提供准確的解決問題思路或算法。

Wireshark的詳細使用和高級功能,建議有精力的同學去閱讀《Wireshark網絡分析實戰》一書,本節內容以基礎和暫時夠用為原則。

1.5.1 Wireshark 簡介

Wireshark 是當今世界上被應用最廣泛的網絡協議分析工具。用戶通常使用Wireshark來學習網絡協議,分析網絡問題,檢測攻擊和木馬等。

Wireshark官網為https://www.wireshark.org/

1 Wireshark官網

進入下載頁面,我們可以看到Wireshark提供windowsMac OS X的安裝文件,同時提供了源碼供在Linux環境中進行安裝。

2

下載和安裝,這里就不詳細說明了,安裝程序還是源碼安裝1.21.4節課程中,有詳細的演示,各位同學依樣畫葫蘆即可。

Kali Linux中,已經預裝了Wireshark,只需要在終端輸入Wireshark,即可啟動程序。

root@kali:~# wireshark

啟動之后,由於Kali默認是root賬號,會引發Lua加載錯誤,直接忽略即可。

3

1.5.2 抓包

啟動Wireshark后,在主界面會列出當前系統中所有的網卡信息。

4

在此處選擇要監聽的網卡,雙擊就會進入監聽模式。還有另一個入口就是上方的配置按鈕。

5

打開配置界面,可以對網卡和數據包捕獲做一些配置。

6

選中網卡,點擊開始。

7

抓包的過程中,我們可以看到數據的變化。點擊停止按鈕,停止捕獲數據包。

8

在軟件的核心界面就是數據包列表,顯示的列有序號、時間、源IP、目標IP、協議、長度、基本信息。Wireshark使用不同的顏色對不同的協議做了區分。在視圖菜單,我們可以找到和着色相關的命令。

9

在圖9所示的命令中,對話着色用來選擇指定顏色對應的協議,着色分組列表用來隱藏非選中着色分組中的數據包,着色規則用來定義着色外觀和包含的協議,如圖10所示。

10

1.5.3  包過濾

捕獲的數據包通常都是比較龐大的,如果沒有過濾篩選機制,對任何人來說,都將是一個災難。Wireshark提供了兩種過濾器:捕捉過濾器和顯示過濾器。

1.5.3.1 捕獲過濾器

捕捉過濾器是用來配置應該捕獲什么樣的數據包,在啟動數據包捕捉之前就應該配置好。打開主界面捕獲”——>“捕獲過濾器

11

在捕獲過濾器界面,我們可以看到已有的過濾器,可以修改刪除它們,同時我們可以增加自己的過濾器。

12

 

捕獲過濾器語法:

13

Protocol(協議):
可能的值: ether, fddi, ip, arp, rarp, decnet, lat, sca, moprc, mopdl, tcp and udp.
如果沒有特別指明是什么協議,則默認使用所有支持的協議。
http://openmaniak.com/image/droite.gif Direction(方向):
可能的值: src, dst, src and dst, src or dst
如果沒有特別指明來源或目的地,則默認使用 "src or dst" 作為關鍵字。

http://openmaniak.com/image/droite.gif Host(s):
可能的值: net, port, host, portrange.
如果沒有指定此值,則默認使用"host"關鍵字。

http://openmaniak.com/image/droite.gif Logical Operations(邏輯運算):
可能的值:not, and, or.
("not")具有最高的優先級。或("or")和與("and")具有相同的優先級,運算時從左至右進行。

下面我們具體看幾個示例:

tcp dst port 3128

顯示目的TCP端口為3128的封包。

ip src host 10.1.1.1

顯示來源IP地址為10.1.1.1的封包。

host 10.1.2.3

顯示目的或來源IP地址為10.1.2.3的封包。

src portrange 2000-2500

顯示來源為UDPTCP,並且端口號在20002500范圍內的封包。

not imcp

顯示除了icmp以外的所有封包。(icmp通常被ping工具使用)

src host 10.7.2.12 and not dst net 10.200.0.0/16

顯示來源IP地址為10.7.2.12,但目的地不是10.200.0.0/16的封包。

(src host 10.4.1.12 or src net 10.6.0.0/16) and tcp dst portrange 200-10000 and dst net 10.0.0.0/8

 

當使用關鍵字作為值時,需使用反斜杠“\”。"ether proto \ip" (與關鍵字"ip"相同)。這樣寫將會以IP協議作為目標。"ip proto \icmp" (與關鍵字"icmp"相同).這樣寫將會以ping工具常用的icmp作為目標。可以在"ip""ether"后面使用"multicast""broadcast"關鍵字。當您想排除廣播請求時,"no broadcast"就會非常有用。

 

 如何使用定義好的捕獲過濾器呢?點擊下圖所示的展開過濾器按鈕。

 

 

 

在過濾器列表中選擇一個過濾器。

 

 

 

再雙擊啟動抓包,就會看到效果了。

 

 

 

1.5.3.2  顯示過濾器

顯示過濾器用來過濾已經捕獲的數據包。在數據包列表的上方,有一個顯示過濾器輸入框,可以直接輸入過濾表達式,點擊輸入框右側的表達式按鈕,可以打開表達式編輯器,左側框內是可供選擇的字段。

14

 

顯示過濾器的語法如圖15所示。

15

 下面我們對各個字段做介紹:

1)        Protocol,協議字段。支持的協議可以從圖14的編輯器中看到,從OSI 7層模型的27層都支持。

2)        String1, String2 (可選項)。協議的子類,展開圖14中的協議的三角,可以看到。

16

3) Comparison operators,比較運算符。可以使用6種比較運算符如圖17所示,邏輯運算符如圖18所示。

17 比較運算符

18 邏輯運算符

被程序員們熟知的邏輯異或是一種排除性的或。當其被用在過濾器的兩個條件之間時,只有當且僅當其中的一個條件滿足時,這樣的結果才會被顯示在屏幕上。

讓我們舉個例子:

"tcp.dstport 80 xor tcp.dstport 1025"

只有當目的TCP端口為80或者來源於端口1025(但又不能同時滿足這兩點)時,這樣的封包才會被顯示。

下面再通過一些實例來加深了解。

snmp || dns || icmp  

顯示SNMPDNSICMP封包。

ip.addr == 10.1.1.1

顯示來源或目的IP地址為10.1.1.1的封包。

ip.src != 10.1.2.3 or ip.dst != 10.4.5.6

顯示來源不為10.1.2.3或者目的不為10.4.5.6的封包。

ip.src != 10.1.2.3 and ip.dst != 10.4.5.6

顯示來源不為10.1.2.3並且目的IP不為10.4.5.6的封包。

tcp.port == 25       

顯示來源或目的TCP端口號為25的封包。

tcp.dstport == 25    

顯示目的TCP端口號為25的封包。

tcp.flags    

顯示包含TCP標志的封包。

tcp.flags.syn == 0x02

顯示包含TCP SYN標志的封包。

在使用過濾器表達式編輯器的時候,如果過濾器的語法是正確的,表達式的背景呈綠色。如果呈紅色,說明表達式有誤。

生成表達式,點擊Ok按鈕,回到數據包列表界面。

19

此時表達式會輸入到表達式欄中。

20

回車之后,就會看到過濾效果。

此外我們也可以通過選中數據包來生成過濾器,右鍵——>作為過慮器應用。

21

如圖21所示,不同的選項,大家都可以嘗試下,都是基本邏輯謂詞的組合。比如我選擇“或選中,可以組合多個數據包的條件,如圖22所示。

22

22中,選擇了兩個數據包,協議不同,自動生成的過濾表達式會按照你鼠標點擊的位置所在的列字典作為條件來生成。圖中我兩次的位置都在Destination列上,所以生成的表達式是一樣的。

1.5.4 數據分析

選中某一條數據項,會在如圖23所示的兩個區域,顯示該數據包的詳細信息。

23

在圖23中,1區為詳細信息顯示區域,這個區域內對數據包按照協議字段做了較為詳細的分析。2區為16進制數據區。結合1區和2區,再結合書本上的知識,我們就可以進行協議分析的研究和學習了。圖23中,顯示的詳細信息分別為:

1)        Frame:   物理層的數據幀概況

2)        Ethernet II: 數據鏈路層以太網幀頭部信息

3)        Internet Protocol Version 4: 互聯網層IP包頭部信息

4)        Transmission Control Protocol:  傳輸層T的數據段頭部信息,此處是TCP

5)        Hypertext Transfer Protocol:  應用層的信息,此處是HTTP協議

當我們點擊1區的字段的時候,可以看到在2區對應的數據項,如圖24

24

是時候把教科書搬出來了,在圖25中,看到OSI七層模型和Wireshark數據包分析的對應情況。

25(來源於網絡)

再拿TCP數據包來舉例,如圖26

26(來源於網絡)

用這樣的方法來學習網絡協議,是不是既簡單又直觀呢?還等什么,開始動手吧。

1.5.5  實例:分析TCP三次握手過程

(以下內容,部分來自http://www.cnblogs.com/TankXiao/archive/2012/10/10/2711777.html,做了一些修改,作者感謝原作者。)

27(來源於網絡)

27就是經典的TCP三次握手,看它千百遍也不許厭煩,這是我大學時的必考題。

下面我們具體分析下實際三次握手的過程,打開Wireshark啟動抓包,然后在瀏覽器打開我的博客http://www.cnblogs.com/xuanhun

停止抓包后輸入過濾表達式

ip.src == 192.168.1.38

過濾出連接到www.cnblogs.com的所有數據包。

28

選中一個,右鍵然后點擊"追蹤流"——>TCP流。

29

點擊TCP流之后,會根據tcp.stream字段生成過濾表達式,我們可以看到這次HTTP請求基於的TCP三次握手的數據包,如圖30所示。

30

下面我們依次分析下序號為697980的三個數據包。

31

69號數據的TCP數據字段如圖31所示,我們可以看到序列號為0,標志位為SYN

32

79號數據包的TCP字段如圖32所示,序列號為0Ack 序號加11,標志位為(SYN,ACK)。

33

80號數據包TCP字段如圖32所示,客戶端再次發送確認包(ACK) SYN標志位為0,ACK標志位為1.並且把服務器發來ACK的序號字段+1,放在確定字段中發送給對方。

這樣就完成了TCP的三次握手。

1.5.6 小結

  網絡分析是網絡編程的前置基本技能,本節課對網絡協議分析工具Wireshark做了一個快速入門,希望同學們多多練習,增強這方面的能力。

Wireshark在數據包捕獲和分析方面具有超強的能力,但是它不能修改和發送數據包,在Python里很容易實現數據包的修改和發送。從下一節開始,我們正式進入第二章——Python編程基礎。

 

1.5.7  本節對應視頻教程獲取方法

在微信訂閱號(xuanhun521)依次打開“網絡安全”—>”Python黑客編程,找到對應的本篇文章的1.5.7節,有具體獲取視頻教程的方法。

 

 

由於教程仍在創作過程中,在整套教程完結前,感興趣的同學請關注我的微信訂閱號(xuanhun521,下方二維碼),我會第一時間在訂閱號推送圖文教程和視頻教程。問題討論請加qq群:Hacking 1群):303242737   Hacking 2群):147098303

關注之后,回復請回復“Python”,獲取更多內容。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM