在上一節,筆者羅列的學習網絡編程應該瞭解或掌握的網絡基礎知識,這其中直接和編程相關的是網絡協議。抓包分析,一直都是學習網絡協議過程當中,理論聯繫實踐的最好方式,而目前最經常使用的抓包工具就是Wireshark。html
隨着咱們教程的深刻,咱們也會使用Wireshark來準備測試用的數據包,校驗程序的準確性,編寫程序以前作人工分析以提供準確的解決問題思路或算法。程序員
Wireshark的詳細使用和高級功能,建議有精力的同窗去閱讀《Wireshark網絡分析實戰》一書,本節內容以基礎和暫時夠用爲原則。算法
Wireshark 是當今世界上被應用最普遍的網絡協議分析工具。用戶一般使用Wireshark來學習網絡協議,分析網絡問題,檢測攻擊和木馬等。編程
Wireshark官網爲www.wireshark.org/。windows
進入下載頁面,咱們能夠看到Wireshark提供windows和Mac OS X的安裝文件,同時提供了源碼供在Linux環境中進行安裝。瀏覽器
下載和安裝,這裏就不詳細說明了,安裝程序仍是源碼安裝1.二、1.4節課程中,有詳細的演示,各位同窗依樣畫葫蘆便可。安全
在Kali Linux中,已經預裝了Wireshark,只須要在終端輸入Wireshark,便可啓動程序。服務器
root@kali:~# wireshark複製代碼
啓動以後,因爲Kali默認是root帳號,會引起Lua加載錯誤,直接忽略便可。微信
啓動Wireshark後,在主界面會列出當前系統中全部的網卡信息。網絡
在此處選擇要監聽的網卡,雙擊就會進入監聽模式。還有另外一個入口就是上方的配置按鈕。
打開配置界面,能夠對網卡和數據包捕獲作一些配置。
選中網卡,點擊開始。
抓包的過程當中,咱們能夠看到數據的變化。點擊中止按鈕,中止捕獲數據包。
在軟件的核心界面就是數據包列表,顯示的列有序號、時間、源IP、目標IP、協議、長度、基本信息。Wireshark使用不一樣的顏色對不一樣的協議作了區分。在視圖菜單,咱們能夠找到和着色相關的命令。
在圖9所示的命令中,對話着色用來選擇指定顏色對應的協議,着色分組列表用來隱藏非選中着色分組中的數據包,着色規則用來定義着色外觀和包含的協議,如圖10所示。
捕獲的數據包一般都是比較龐大的,若是沒有過濾篩選機制,對任何人來講,都將是一個災難。Wireshark提供了兩種過濾器:捕捉過濾器和顯示過濾器。
捕捉過濾器是用來配置應該捕獲什麼樣的數據包,在啓動數據包捕捉以前就應該配置好。打開主界面「捕獲」——>「捕獲過濾器」。
在捕獲過濾器界面,咱們能夠看到已有的過濾器,能夠修改刪除它們,同時咱們能夠增長本身的過濾器。
捕獲過濾器語法:
Protocol(協議):
可能的值: ether, fddi, ip, arp, rarp, decnet, lat, sca, moprc, mopdl, tcp and udp.
若是沒有特別指明是什麼協議,則默認使用全部支持的協議。
openmaniak.com/image/droit… Direction(方向):
可能的值: src, dst, src and dst, src or dst
若是沒有特別指明來源或目的地,則默認使用 "src or dst" 做爲關鍵字。
openmaniak.com/image/droit… Host(s):
可能的值: net, port, host, portrange.
若是沒有指定此值,則默認使用"host"關鍵字。
openmaniak.com/image/droit… 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複製代碼
顯示來源爲UDP或TCP,而且端口號在2000至2500範圍內的封包。
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 顯示過濾器
顯示過濾器用來過濾已經捕獲的數據包。在數據包列表的上方,有一個顯示過濾器輸入框,能夠直接輸入過濾表達式,點擊輸入框右側的表達式按鈕,能夠打開表達式編輯器,左側框內是可供選擇的字段。
顯示過濾器的語法如圖15所示。
下面咱們對各個字段作介紹:
1) Protocol,協議字段。支持的協議能夠從圖14的編輯器中看到,從OSI 7層模型的2到7層都支持。
2) String1, String2 (可選項)。協議的子類,展開圖14中的協議的三角,能夠看到。
3) Comparison operators,比較運算符。可使用6種比較運算符如圖17所示,邏輯運算符如圖18所示。
被程序員們熟知的邏輯異或是一種排除性的或。當其被用在過濾器的兩個條件之間時,只有當且僅當其中的一個條件知足時,這樣的結果纔會被顯示在屏幕上。
讓咱們舉個例子:
"tcp.dstport 80 xor tcp.dstport 1025"複製代碼
只有當目的TCP端口爲80或者來源於端口1025(但又不能同時知足這兩點)時,這樣的封包纔會被顯示。
下面再經過一些實例來加深瞭解。
snmp || dns || icmp複製代碼
顯示SNMP或DNS或ICMP封包。
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所示,不一樣的選項,你們均可以嘗試下,都是基本邏輯謂詞的組合。好比我選擇「或選中」,能夠組合多個數據包的條件,如圖22所示。
圖22中,選擇了兩個數據包,協議不一樣,自動生成的過濾表達式會按照你鼠標點擊的位置所在的列字典做爲條件來生成。圖中我兩次的位置都在Destination列上,因此生成的表達式是同樣的。
1.5.4 數據分析
選中某一條數據項,會在如圖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。
是時候把教科書搬出來了,在圖25中,看到OSI七層模型和Wireshark數據包分析的對應狀況。
再拿TCP數據包來舉例,如圖26。
用這樣的方法來學習網絡協議,是否是既簡單又直觀呢?還等什麼,開始動手吧。
(如下內容,部分來自www.cnblogs.com/TankXiao/ar…
圖27就是經典的TCP三次握手,看它千百遍也不準厭煩,這是我大學時的必考題。
下面咱們具體分析下實際三次握手的過程,打開Wireshark啓動抓包,而後在瀏覽器打開個人博客www.cnblogs.com/xuanhun。
中止抓包後輸入過濾表達式
ip.src == 192.168.1.38複製代碼
過濾出鏈接到www.cnblogs.com的全部數據包。
選中一個,右鍵而後點擊"追蹤流"——>TCP流。
點擊TCP流以後,會根據tcp.stream字段生成過濾表達式,咱們能夠看到此次HTTP請求基於的TCP三次握手的數據包,如圖30所示。
下面咱們依次分析下序號爲6九、7九、80的三個數據包。
69號數據的TCP數據字段如圖31所示,咱們能夠看到序列號爲0,標誌位爲SYN。
79號數據包的TCP字段如圖32所示,序列號爲0,Ack 序號加1爲1,標誌位爲(SYN,ACK)。
80號數據包TCP字段如圖32所示,客戶端再次發送確認包(ACK) SYN標誌位爲0,ACK標誌位爲1.而且把服務器發來ACK的序號字段+1,放在肯定字段中發送給對方。
這樣就完成了TCP的三次握手。
網絡分析是網絡編程的前置基本技能,本節課對網絡協議分析工具Wireshark作了一個快速入門,但願同窗們多多練習,加強這方面的能力。
Wireshark在數據包捕獲和分析方面具備超強的能力,可是它不能修改和發送數據包,在Python裏很容易實現數據包的修改和發送。從下一節開始,咱們正式進入第二章——Python編程基礎。
在微信訂閱號(xuanhun521)依次打開「網絡安全」—>」Python黑客編程」,找到對應的本篇文章的1.5.7節,有具體獲取視頻教程的方法。
因爲教程仍在創做過程當中,在整套教程完結前,感興趣的同窗請關注個人微信訂閱號(xuanhun521,下方二維碼),我會第一時間在訂閱號推送圖文教程和視頻教程。問題討論請加qq羣:Hacking (1羣):303242737 Hacking (2羣):147098303。