在上一節,筆者羅列的學習網絡程式設計應該了解或掌握的網絡基礎知識,這其中直接和程式設計相關的是網絡協定。抓包分析,一直都是學習網絡協定過程中,理論聯系實踐的最好方式,而目前最常用的抓包工具就是Wireshark。
随着我們教程的深入,我們也會使用Wireshark來準備測試用的資料包,校驗程式的準确性,編寫程式之前做人工分析以提供準确的解決問題思路或算法。
Wireshark的詳細使用和進階功能,建議有精力的同學去閱讀《Wireshark網絡分析實戰》一書,本節内容以基礎和暫時夠用為原則。
Python黑帽程式設計1.5 使用Wireshark練習網絡協定分析
1.5.0.1 本系列教程說明
本系列教程,采用的大綱母本為《Understanding Network Hacks Attack and Defense with Python》一書,為了解決很多同學對英文書的恐懼,解決看書之後實戰過程中遇到的問題而作。由于原書很多地方過于簡略,筆者根據實際測試情況和最新的技術發展對内容做了大量的變更,當然最重要的是個人偏好。教程同時提供圖文和視訊教程兩種方式,供不同喜好的同學選擇。
1.5.0.2 本節前言
1.5.1 Wireshark 簡介
Wireshark 是當今世界上被應用最廣泛的網絡協定分析工具。使用者通常使用Wireshark來學習網絡協定,分析網絡問題,檢測攻擊和木馬等。
Wireshark官網為https://www.wireshark.org/。
圖1 Wireshark官網
進入下載下傳頁面,我們可以看到Wireshark提供windows和Mac OS X的安裝檔案,同時提供了源碼供在Linux環境中進行安裝。
圖2
下載下傳和安裝,這裡就不詳細說明了,安裝程式還是源碼安裝1.2、1.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.
如果沒有特别指明是什麼協定,則預設使用所有支援的協定。
Direction(方向):
可能的值: src, dst, src
and dst, src or dst
如果沒有特别指明來源或目的地,則預設使用 "src or dst" 作為關鍵字。
Host(s):
可能的值: net, port,
host, portrange.
如果沒有指定此值,則預設使用"host"關鍵字。
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 顯示過濾器
顯示過濾器用來過濾已經捕獲的資料包。在資料包清單的上方,有一個顯示過濾器輸入框,可以直接輸入過濾表達式,點選輸入框右側的表達式按鈕,可以打開表達式編輯器,左側框内是可供選擇的字段。
圖14
顯示過濾器的文法如圖15所示。
圖15
下面我們對各個字段做介紹:
1)
Protocol,協定字段。支援的協定可以從圖14的編輯器中看到,從OSI 7層模型的2到7層都支援。
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
顯示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
如圖21所示,不同的選項,大家都可以嘗試下,都是基本邏輯謂詞的組合。比如我選擇“或選中”,可以組合多個資料包的條件,如圖22所示。
圖22
圖22中,選擇了兩個資料包,協定不同,自動生成的過濾表達式會按照你滑鼠點選的位置所在的列字典作為條件來生成。圖中我兩次的位置都在Destination列上,是以生成的表達式是一樣的。
1.5.4 資料分析
選中某一條資料項,會在如圖23所示的兩個區域,顯示該資料包的詳細資訊。
圖23
在圖23中,1區為詳細資訊顯示區域,這個區域内對資料包按照協定字段做了較為詳細的分析。2區為16進制資料區。結合1區和2區,再結合書本上的知識,我們就可以進行協定分析的研究和學習了。圖23中,顯示的詳細資訊分别為:
Frame: 實體層的資料幀概況
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
下面我們依次分析下序号為69、79、80的三個資料包。
圖31
69号資料的TCP資料字段如圖31所示,我們可以看到序列号為0,标志位為SYN。
圖32
79号資料包的TCP字段如圖32所示,序列号為0,Ack 序号加1為1,标志位為(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”,擷取更多内容。
作者:玄魂
出處:http://www.cnblogs.com/xuanhun/
原文連結:http://www.cnblogs.com/xuanhun/
更多内容,請通路我的個人站點 對程式設計,安全感興趣的,加qq群:hacking-1群:303242737,hacking-2群:147098303,nw.js,electron交流群 313717550。
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。
關注我: