1.5.0.1本系列教程說明
本系列教程,采用的大綱母本為《Understanding Network Hacks Attack and Defense with Python》一書,為了解決很多同學(xué)對英文書的恐懼,解決看書之后實(shí)戰(zhàn)過程中遇到的問題而作。由于原書很多地方過于簡略,筆者根據(jù)實(shí)際測試情況和最新的技術(shù)發(fā)展對內(nèi)容做了大量的變更,當(dāng)然最重要的是個人偏好。
1.5.0.2本節(jié)前言
在上一節(jié),筆者羅列的學(xué)習(xí)網(wǎng)絡(luò)編程應(yīng)該了解或掌握的網(wǎng)絡(luò)基礎(chǔ)知識,這其中直接和編程相關(guān)的是網(wǎng)絡(luò)協(xié)議。抓包分析,一直都是學(xué)習(xí)網(wǎng)絡(luò)協(xié)議過程中,理論聯(lián)系實(shí)踐的最好方式,而目前最常用的抓包工具就是Wireshark。
隨著我們教程的深入,我們也會使用Wireshark來準(zhǔn)備測試用的數(shù)據(jù)包,校驗(yàn)程序的準(zhǔn)確性,編寫程序之前做人工分析以提供準(zhǔn)確的解決問題思路或算法。
Wireshark的詳細(xì)使用和高級功能,建議有精力的同學(xué)去閱讀《Wireshark網(wǎng)絡(luò)分析實(shí)戰(zhàn)》一書,本節(jié)內(nèi)容以基礎(chǔ)和暫時夠用為原則。
1.5.1 WIRESHARK簡介
Wireshark是當(dāng)今世界上被應(yīng)用最廣泛的網(wǎng)絡(luò)協(xié)議分析工具。用戶通常使用Wireshark來學(xué)習(xí)網(wǎng)絡(luò)協(xié)議,分析網(wǎng)絡(luò)問題,檢測攻擊和木馬等。
Wireshark官網(wǎng)為https://www.wireshark.org/。
圖1 Wireshark官網(wǎng)
進(jìn)入下載頁面,我們可以看到Wireshark提供windows和Mac OS X的安裝文件,同時提供了源碼供在Linux環(huán)境中進(jìn)行安裝。
圖2
下載和安裝,這里就不詳細(xì)說明了,安裝程序還是源碼安裝1.2、1.4節(jié)課程中,有詳細(xì)的演示,各位同學(xué)依樣畫葫蘆即可。
在Kali Linux中,已經(jīng)預(yù)裝了Wireshark,只需要在終端輸入Wireshark,即可啟動程序。
root@kali:~# wireshark
啟動之后,由于Kali默認(rèn)是root賬號,會引發(fā)Lua加載錯誤,直接忽略即可。
圖3
1.5.2抓包
啟動Wireshark后,在主界面會列出當(dāng)前系統(tǒng)中所有的網(wǎng)卡信息。
圖4
在此處選擇要監(jiān)聽的網(wǎng)卡,雙擊就會進(jìn)入監(jiān)聽模式。還有另一個入口就是上方的配置按鈕。
圖5
打開配置界面,可以對網(wǎng)卡和數(shù)據(jù)包捕獲做一些配置。
圖6
選中網(wǎng)卡,點(diǎn)擊開始。
圖7
抓包的過程中,我們可以看到數(shù)據(jù)的變化。點(diǎn)擊停止按鈕,停止捕獲數(shù)據(jù)包。
圖8
在軟件的核心界面就是數(shù)據(jù)包列表,顯示的列有序號、時間、源IP、目標(biāo)IP、協(xié)議、長度、基本信息。Wireshark使用不同的顏色對不同的協(xié)議做了區(qū)分。在視圖菜單,我們可以找到和著色相關(guān)的命令。
圖9
在圖9所示的命令中,對話著色用來選擇指定顏色對應(yīng)的協(xié)議,著色分組列表用來隱藏非選中著色分組中的數(shù)據(jù)包,著色規(guī)則用來定義著色外觀和包含的協(xié)議,如圖10所示。
圖10
1.5.3包過濾
捕獲的數(shù)據(jù)包通常都是比較龐大的,如果沒有過濾篩選機(jī)制,對任何人來說,都將是一個災(zāi)難。Wireshark提供了兩種過濾器:捕捉過濾器和顯示過濾器。
1.5.3.1捕獲過濾器
捕捉過濾器是用來配置應(yīng)該捕獲什么樣的數(shù)據(jù)包,在啟動數(shù)據(jù)包捕捉之前就應(yīng)該配置好。打開主界面“捕獲”——>“捕獲過濾器”。
圖11
在捕獲過濾器界面,我們可以看到已有的過濾器,可以修改刪除它們,同時我們可以增加自己的過濾器。
圖12
捕獲過濾器語法:
圖13
Protocol(協(xié)議):
可能的值: ether, fddi, ip, arp, rarp, decnet, lat, sca, moprc, mopdl, tcp and udp.
如果沒有特別指明是什么協(xié)議,則默認(rèn)使用所有支持的協(xié)議。
Direction(方向):
可能的值: src, dst, src and dst, src or dst
如果沒有特別指明來源或目的地,則默認(rèn)使用"src or dst"作為關(guān)鍵字。
Host(s):
可能的值:net, port, host, portrange.
如果沒有指定此值,則默認(rèn)使用"host"關(guān)鍵字。
Logical Operations(邏輯運(yùn)算):
可能的值:not, and, or.
否("not")具有最高的優(yōu)先級?;?"or")和與("and")具有相同的優(yōu)先級,運(yùn)算時從左至右進(jìn)行。
下面我們具體看幾個示例:
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范圍內(nèi)的封包。
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
當(dāng)使用關(guān)鍵字作為值時,需使用反斜杠“\”。"ether proto \ip" (與關(guān)鍵字"ip"相同)。這樣寫將會以IP協(xié)議作為目標(biāo)。"ip proto \icmp" (與關(guān)鍵字"icmp"相同).這樣寫將會以ping工具常用的icmp作為目標(biāo)??梢栽?ip"或"ether"后面使用"multicast"及"broadcast"關(guān)鍵字。當(dāng)您想排除廣播請求時,"no broadcast"就會非常有用。
1.5.3.2顯示過濾器
顯示過濾器用來過濾已經(jīng)捕獲的數(shù)據(jù)包。在數(shù)據(jù)包列表的上方,有一個顯示過濾器輸入框,可以直接輸入過濾表達(dá)式,點(diǎn)擊輸入框右側(cè)的表達(dá)式按鈕,可以打開表達(dá)式編輯器,左側(cè)框內(nèi)是可供選擇的字段。
圖14
顯示過濾器的語法如圖15所示。
圖15
下面我們對各個字段做介紹:
1)Protocol,協(xié)議字段。支持的協(xié)議可以從圖14的編輯器中看到,從OSI 7層模型的2到7層都支持。
2)String1, String2 (可選項(xiàng))。協(xié)議的子類,展開圖14中的協(xié)議的三角,可以看到。
圖16
3) Comparison operators,比較運(yùn)算符。可以使用6種比較運(yùn)算符如圖17所示,邏輯運(yùn)算符如圖18所示。
圖17比較運(yùn)算符
圖18邏輯運(yùn)算符
被程序員們熟知的邏輯異或是一種排除性的或。當(dāng)其被用在過濾器的兩個條件之間時,只有當(dāng)且僅當(dāng)其中的一個條件滿足時,這樣的結(jié)果才會被顯示在屏幕上。
讓我們舉個例子:
"tcp.dstport 80 xor tcp.dstport 1025"
只有當(dāng)目的TCP端口為80或者來源于端口1025(但又不能同時滿足這兩點(diǎn))時,這樣的封包才會被顯示。
下面再通過一些實(shí)例來加深了解。
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標(biāo)志的封包。
tcp.flags.syn == 0x02
顯示包含TCP SYN標(biāo)志的封包。
在使用過濾器表達(dá)式編輯器的時候,如果過濾器的語法是正確的,表達(dá)式的背景呈綠色。如果呈紅色,說明表達(dá)式有誤。
生成表達(dá)式,點(diǎn)擊Ok按鈕,回到數(shù)據(jù)包列表界面。
圖19
此時表達(dá)式會輸入到表達(dá)式欄中。
圖20
回車之后,就會看到過濾效果。
此外我們也可以通過選中數(shù)據(jù)包來生成過濾器,右鍵——>作為過慮器應(yīng)用。
圖21
如圖21所示,不同的選項(xiàng),大家都可以嘗試下,都是基本邏輯謂詞的組合。比如我選擇“或選中”,可以組合多個數(shù)據(jù)包的條件,如圖22所示。
圖22
圖22中,選擇了兩個數(shù)據(jù)包,協(xié)議不同,自動生成的過濾表達(dá)式會按照你鼠標(biāo)點(diǎn)擊的位置所在的列字典作為條件來生成。圖中我兩次的位置都在Destination列上,所以生成的表達(dá)式是一樣的。
1.5.4數(shù)據(jù)分析
選中某一條數(shù)據(jù)項(xiàng),會在如圖23所示的兩個區(qū)域,顯示該數(shù)據(jù)包的詳細(xì)信息。
圖23
在圖23中,1區(qū)為詳細(xì)信息顯示區(qū)域,這個區(qū)域內(nèi)對數(shù)據(jù)包按照協(xié)議字段做了較為詳細(xì)的分析。2區(qū)為16進(jìn)制數(shù)據(jù)區(qū)。結(jié)合1區(qū)和2區(qū),再結(jié)合書本上的知識,我們就可以進(jìn)行協(xié)議分析的研究和學(xué)習(xí)了。圖23中,顯示的詳細(xì)信息分別為:
1)Frame:物理層的數(shù)據(jù)幀概況
2)Ethernet?II:數(shù)據(jù)鏈路層以太網(wǎng)幀頭部信息
3)Internet Protocol Version 4:互聯(lián)網(wǎng)層IP包頭部信息
4)Transmission Control Protocol:傳輸層T的數(shù)據(jù)段頭部信息,此處是TCP
5)Hypertext Transfer Protocol:應(yīng)用層的信息,此處是HTTP協(xié)議
當(dāng)我們點(diǎn)擊1區(qū)的字段的時候,可以看到在2區(qū)對應(yīng)的數(shù)據(jù)項(xiàng),如圖24。
圖24
是時候把教科書搬出來了,在圖25中,看到OSI七層模型和Wireshark數(shù)據(jù)包分析的對應(yīng)情況。
圖25(來源于網(wǎng)絡(luò))
再拿TCP數(shù)據(jù)包來舉例,如圖26。
圖26(來源于網(wǎng)絡(luò))
用這樣的方法來學(xué)習(xí)網(wǎng)絡(luò)協(xié)議,是不是既簡單又直觀呢?還等什么,開始動手吧。
1.5.5實(shí)例:分析TCP三次握手過程
(以下內(nèi)容,部分來自http://www.cnblogs.com/TankXiao/archive/2012/10/10/2711777.html,做了一些修改,作者感謝原作者。)
圖27(來源于網(wǎng)絡(luò))
圖27就是經(jīng)典的TCP三次握手,看它千百遍也不許厭煩,這是我大學(xué)時的必考題。
下面我們具體分析下實(shí)際三次握手的過程,打開Wireshark啟動抓包,然后在瀏覽器打開我的博客http://www.cnblogs.com/xuanhun。
停止抓包后輸入過濾表達(dá)式
ip.src == 192.168.1.38
過濾出連接到www.cnblogs.com的所有數(shù)據(jù)包。
圖28
選中一個,右鍵然后點(diǎn)擊"追蹤流"——>TCP流。
圖29
點(diǎn)擊TCP流之后,會根據(jù)tcp.stream字段生成過濾表達(dá)式,我們可以看到這次HTTP請求基于的TCP三次握手的數(shù)據(jù)包,如圖30所示。
圖30
下面我們依次分析下序號為69、79、80的三個數(shù)據(jù)包。
圖31
69號數(shù)據(jù)的TCP數(shù)據(jù)字段如圖31所示,我們可以看到序列號為0,標(biāo)志位為SYN。
圖32
79號數(shù)據(jù)包的TCP字段如圖32所示,序列號為0,Ack序號加1為1,標(biāo)志位為(SYN,ACK)。
圖33
80號數(shù)據(jù)包TCP字段如圖32所示,客戶端再次發(fā)送確認(rèn)包(ACK) SYN標(biāo)志位為0,ACK標(biāo)志位為1.并且把服務(wù)器發(fā)來ACK的序號字段+1,放在確定字段中發(fā)送給對方。
這樣就完成了TCP的三次握手。
1.5.6小結(jié)
網(wǎng)絡(luò)分析是網(wǎng)絡(luò)編程的前置基本技能,本節(jié)課對網(wǎng)絡(luò)協(xié)議分析工具Wireshark做了一個快速入門,希望同學(xué)們多多練習(xí),增強(qiáng)這方面的能力。
Wireshark在數(shù)據(jù)包捕獲和分析方面具有超強(qiáng)的能力,但是它不能修改和發(fā)送數(shù)據(jù)包,在Python里很容易實(shí)現(xiàn)數(shù)據(jù)包的修改和發(fā)送。從下一節(jié)開始,我們正式進(jìn)入第二章——Python編程基礎(chǔ)。