實驗 Attacks on TCP/IP Protocols


 

-------

轉載請注明出處,博客園-lasgalen-http://www.cnblogs.com/lasgalen/p/4555648.html 

-------

1 實驗目的

進行這個實驗的目的是獲得TCP/IP協議缺陷和基於這些缺陷的攻擊的經驗。在TCP/IP協議上的缺陷是一種在協議設計和實現出現的漏洞。這給我們上了很寶貴的一課,關於為什么安全應當在一開始的時候就被考慮設計,而不是在事后加入。此外,學習這些缺陷,幫助學生理解在網絡安全上的挑戰和為什么許多網絡安全測評是必須的。TCP/IP協議的缺陷在幾個不同的層次發生。

2 實驗環境

三台機器的操作系統為 Ubuntu,版本號12.04。

因為實驗中間虛擬機的虛擬網絡連接出現問題,重新加載了網絡模塊,因此在任務一中使用的是表1的IP和MAC地址。任務二、三中由於改變了拓撲結構,使用的是表3的IP地址。

表1 任務一中的IP和MAC地址

 

A

B

C

IP

*.*.65.132

*.*.65.133

*.*.65.134

MAC

*:*:*:*:11:11

*:*:*:*:01:aa

*:*:*:*:fc:0e

 

表2 任務三、四中的IP和MAC地址

 

A

B

C

IP

*.*.47.128

*.*.47.129

*.*.47.130

MAC

*:*:*:*:11:11

*:*:*:*:01:aa

*:*:*:*:fc:0e

 

表3 任務二、五中的IP和MAC地址

 

A

B

C

IP

Eth0:*.*.220.128

Eth1:*.*.205.129

Eth0:*.*.220.129

Eth0:*.*.205.128

MAC

*:*:*:*:11:11

*:*:*:*:01:aa

*:*:*:*:fc:0e

 

    首先安裝偽造、發送數據包需要的工具netwox,語句

sudo apt-get install netwox

    然后安裝用於抓取查看數據包的軟件wireshark,仍然使用終端安裝

sudo apt-get install wireshark

    Wireshark也可以在軟件中心通過圖形界面進行下載安裝。

    打開wireshark之后,在左上角出現找不到網卡的情況,如圖2.1。

 

圖2.1

    為了解決這個問題,我在網絡上進行搜索,參考了下面網頁的步驟,詳細過程如圖2.2、圖2.3。

http://www.dickson.me.uk/2012/09/17/installing-wireshark-on-ubuntu-12-04-lts/

把下圖的YOUR_USER_NAME 改為 ***(用戶賬號)。

 

圖2.2

 

圖2.3

    重啟系統之后,再打開wireshark,發現可以找到網卡。

    繼續安裝vsftpd和openbsd-inetd。

    根據實驗指導書中的步驟,首先開啟vsftpd,出現問題

vsftpd:unrecongnized service

    Vsftpd服務沒有找到,說明系統中並沒有安裝相應的軟件包。因此,我使用如下命令來安裝vsftpd服務。

sudo apt-get install vsftpd

    安裝到最后出現提示“vsftpd start/running, process 3283”,說明安裝完成后服務已經自動啟動,運行端口號3283。

    繼續安裝openbsd-inetd,出現了安裝vsftpd出現的同樣的問題。解決方法與上面相同,安裝openbsd-inetd服務

sudo apt-get install openbsd-inetd

    安裝到最后出現提示,網絡超級服務沒有打開。

Setting up openbsd-inetd (0.20091229-1ubuntu1) ...
 * Stopping internet superserver inetd                                  [OK]      
 * Not starting internet superserver : no services enabled    

    抱着僥幸的心理再次嘗試開啟openbsd-inetd服務,發現仍然找不到服務。網上查閱相關資料后得知,還需要安裝一個telnetd軟件包。

sudo apt-get install telnetd

    安裝完成之后還需要一些操作來打開這個服務。

sudo gedit /etc/inetd.conf
//添加
//telnet stream tcp nowait root /usr/sbin/tcpd /usr/sbin/in.telnetd

sudo /etc/init.d/openbsd-inetd restart
//出現
//* Restarting internet superserver inetd

netstat -a | grep telnet
//出現
//tcp 0 0 *:telnet *:* LISTEN

    到此為止,所有需要的實驗環境配置已經完成,可以開始實驗。

 

3 實驗原理

 

實驗是七選五,因此我選擇了下面五個任務。

-------

轉載請注明出處,博客園-lasgalen-http://www.cnblogs.com/lasgalen/p/4555648.html 

-------

 

3.1 ARP欺騙

 

ARP緩存是ARP協議的重要的一部分。作為一個ARP協議執行結果,一旦一個在MAC地址和IP地址之間的映射被決定,這個映射就被緩存。因此,如果影射已經存在在緩存中,就沒有必要再重復ARP協議。然而,因為ARP協議是無狀態的,緩存可以被輕易的通過惡意的ARP信息修改。這樣的一種攻擊叫做ARP欺騙。

 

在這樣一個攻擊中,攻擊者使用欺騙ARP信息來哄騙受害者接受一個無效的MAC-IP映射,並且在緩存中保存這個映射。取決於攻擊者的目的不同,這里可能出現各種類型的后果。例如,攻擊者將一個不存在的MAC地址關聯受害者的默認網關的IP地址,通過此來啟動一個Dos攻擊。

 

3.2 ICMP重定向攻擊

 

ICMP重定向被路由器用來向更新主機的路由信息,最開始只有最少的路由信息。當一台主機接收到一個ICMP重定向信息,他將會根據接收到的信息來修改路由表。因為缺少確認,如果攻擊者希望受害者設置它的路由信息為一個特別形式,他們可以發送欺騙ICMP重定向信息給受害者,並且欺騙受害者修改它的路由表。

 

3.3 SYN洪流攻擊

 

SYN洪流攻擊是Dos攻擊的一種形式,攻擊者發送許多SYN請求給受害者的TCP端口,但是攻擊者沒有完成三次握手的意向。攻擊者或者使用虛假的IP地址,或者不繼續過程。在這個攻擊中,攻擊者可以使受害者的用於半開連接的隊列溢出,例如,一個完成SYN,SYN-ACK但沒有收到最后的ACK回復的連接。當這個隊列滿了的時候,受害者不能夠在進行更多的連接。

 

SYN 緩存策略:SYN緩存是是對抗SYN洪流攻擊的一種防御機制。如果機器檢測到它正在被SYN洪流攻擊,這種機制將會kick in。

 

3.4 在telnet和ssh連接上的TCP RST攻擊

 

    TCP RST攻擊可以終止一個在兩個受害者之間已經建立的TCP連接。例如,如果這里有一個在A和B之間已經建立的telnet連接,攻擊者可以偽造一個A發向B的RST包,打破這個存在的連接。

 

3.5 ICMP盲目連接重置和源端關閉攻擊

 

ICMP信息同樣可以被用於達成連接重置攻擊。為了達到這個目的,攻擊者發送一條顯示“硬錯誤”的ICMP的錯誤信息給TCP連接兩端的任意一方。連接將會被立即中斷,因為在RFC1122中主機在接收到這樣一個TCMP錯誤包時,應當立即中斷相關的連接。RFC1122定義“硬錯誤”為一個目的不可達且協議無效、端口無效、標志位缺失和DF位設置的ICMP錯誤信息

 

ICMP源端關閉信息被擁塞路由器用於告知TCP發送者減緩發送包的速度。攻擊者可以制定這樣的信息來實施對TCP發送者的拒絕服務攻擊。

4 實驗內容

4.1 ARP欺騙

ARP。當發送方B需要向接收方C發送一個數據時,B會從自己的ARP表中通過C的IP地址來查找相應的C的MAC地址。如果C的MAC地址不在B的ARP表中,B就向全網發廣播包,要求C主機返回它的MAC地址。當B接收到C返回的MAC地址時,B就將更新它的ARP表。同時,C主機也將B主機和它對應的MAC地址記錄到C的ARP表中。ARP表的更新采用牛奶原則,也就是說,ARP表將無條件接受最后一次收到的ARP包作為ARP更新的數據。鑒於此,攻擊者A可以利用一些工具偽造一個ARP包,將C的IP對應的MAC地址修改為自己的MAC地址,並將這個數據包發送給B。B在更新了ARP表之后,新的發往C的數據包就會被發送到A。其流程示意如表4.1.1。

表4.1.1 ARP包的信息

 

源IP

源MAC

目的IP

目的MAC

正常情況

B主機廣播包,請求C的MAC信息

*.*.65.133

*:*:*:*:01:aa

*.*.65.255

ff:ff:ff:ff:ff:ff

C向B返回自己的MAC信息

*.*.65.134

*:*:*:*:fc:0e

*.*.65.133

*:*:*:*:01:aa

A作為攻擊機,對B和C進行ARP欺騙

B主機廣播包,請求C的MAC信息

*.*.65.133

*:*:*:*:01:aa

*.*.65.255

ff:ff:ff:ff:ff:ff

C向B返回自己的MAC信息

*.*.65.134

*:*:*:*:fc:0e

*.*.65.133

*:*:*:*:01:aa

A向B返回ARP欺騙信息

*.*.65.134

*:*:*:*:11:11

*.*.65.133

*:*:*:*:01:aa

A向C返回ARP欺騙信息

*.*.65.133

*:*:*:*:11:11

*.*.65.134

*:*:*:*:fc:0e

注意,在欺騙過程中,ARP欺騙信息的包要多次重復發送,因為要保證ARP欺騙信息在正確的ARP信息之后被發送到被攻擊機。

詳細的實驗過程如下:

查詢netwox說明后得知,33號工具用於偽造ARP包。使用命令查看該工具的詳細使用方法。

netwox 33 --help2
//之后的不同號的工具都可以用這個命令來查看使用方法及參數信息

在進行攻擊之前,先在三台主機上互相ping。然后使用arp –a命令查看ARP表,圖4.1.1是A的ARP表,圖4.1.2是B的ARP表,圖4.1.3是C的ARP表。

 

圖4.1.1 攻擊機A的ARP表

 

圖4.1.2 被攻擊機B的ARP表

 

圖4.1.3 被攻擊機C的ARP表

    之后,在三台主機全部開啟的情況下,攻擊機A發動攻擊如圖4.1.4。

 

圖4.1.4

    之后在B主機上查看ARP表,發現C主機對應的MAC地址已經被更改。如圖4.1.5。

 

圖4.1.5

    之后,使用同樣的方法,給C主機發送ARP欺騙包。

    這樣,B發送給C的數據將會被鏈路層轉發到A,而C發送給B的數據也將會被鏈路層轉發到A。但是這種情況下,A如果想插入到BC的通信間,必須要再次將收到的包進行轉發,並偽裝源地址。

    而且,A如果想持續這種攻擊,就必須保證ARP欺騙包的發送頻率大於正確的ARP包的發送頻率,否則被攻擊機的ARP表將會被更新,且在下一個ARP欺騙信息到來之前一直保持正確的MAC--IP映射關系,在這期間,A將不能收到想得到的包。

4.2 ICMP重定向攻擊

    在這個任務及第五個任務中,我在虛擬機上搭建了如下網絡拓撲結構,如圖4.2.1。

 

圖4.2.1

    在三台機器上搭建的路由指令

  A的路由配置指令

sudo ifconfig eth0 *.*.220.128 netmask 225.225.225.0

sudo ifconfig eth1 *.*.205.129 netmask 255.255.255.0

sudo route add -net *.*.220.0/24 gw *.*.220.128

sudo route add -net *.*.205.0/24 gw *.*.205.129

sudo sysctl -w net.ipv4,ip_forward=1

  B的路由配置指令

sudo ifconfig eth0 *.*.205.128 netmask 255.255.255.0

sudo route add default gw *.*.220.128

sudo sysctl -w net.ipv4.ip_forward=1

  C的路由配置指令

sudo ifconfig eth0 *.*.205.128 netmask 255.255.255.0

sudo route add default gw *.*.205.129

sudo sysctl -w net.ipv4.ip_forward=1

  B的網關是*.*.220.128,C的網關是*.*.205.129。通過traceroute指令可以跟蹤包經過的主機和路由器,看到詳細的轉發過程,這能夠更好的看出網關的作用。

    在我設計的ICMP重定向攻擊中,我想讓主機B無法聯網,即B連接任何主機時,都將失敗。

    因此,我需要將B的網關地址改為*.*.220.0/24網段中一個未被使用的IP地址,這樣,B向網絡中發送的所有包,都將被發送到這個“黑洞”中,得不到回復,相當於不能連接網絡。這個IP地址我選擇了*.*.220.130。同時,為了不讓B發現此次攻擊是A發起的,要將源地址改為*.*.220.131。

    使用netwox86號工具可以完成這個攻擊。攻擊機A指令

sudo netwox 86 -f "host *.*.220.129" -g *.*.220.130 -c 1 -i *.*.220.131

    -f “host 被攻擊機的IP” –g 希望對方網關修改后的IP –c 類型 –i 源IP

    這個指令只有在按下ctrl+c時才會結束,否則一直發送ICMP包。

此時,在被攻擊機B中使用WIRESHRK監聽eth0,發現不斷收到ICMP包,如圖4.2.2。

 

圖4.2.2

    從上圖可以看出發送包的類型是ICMP,源IP地址是*.*.220.131,目標IP地址是*.*.220.129,網關地址是*.*.220.130。

4.3 SYN洪泛攻擊

如果一個TCP連接沒有完成三次握手,它將被放入半開連接隊列,而半開連接隊列有最大長度,如果連接數量達到最大容量時,新的連接就不能夠被建立。SYN洪泛攻擊就是通過未完成的TCP請求來試圖充滿半開連接隊列,使得正常的連接不能夠被建立,達到攻擊的效果。

在這個實驗中,使用telnet服務作為攻擊目標,在23號端口發起SYN洪泛攻擊。

首先,嘗試在主機B和C之間建立telnet連接,說明網絡聯通。主機B遠程登錄主機C的賬戶,如圖4.3.1。

 

圖4.3.1

    在主機C上,通過命令netstat –na | grep tcp 命令查看當前的TCP相關端口的狀態,發現23號端口處於聯通狀態,如圖4.3.2標黃部分。

 

圖4.3.2

    在主機C上查看C的半開連接隊列的最大長度為128,緩沖保護開啟。如圖4.3.3。

 

圖4.3.3

    在主機B中使用exit命令斷開與C的telnet連接。之后在主機A中使用netwox76號工具發動針對主機C23號端口的SYN攻擊。

sudo netwox 76 -i "*.*.47.130" -p "23"

    注意,這個命令會一直執行直到按ctrl+C停止。

    回到主機B中,嘗試與主機C進行telnet遠程連接,如圖4.3.4。

 

圖4.3.4

    從上圖及實驗過程可以看出,雖然連接的速度很慢,但是是可以連接上的。我在主機B上開啟了兩個終端,同時試圖進行telnet連接。

    到主機C中查看端口連接情況,如圖4.3.5和圖4.3.6。發現,隊列中充斥着大量半開連接,目的端口號都是C機的23號端口,但是源主機IP和端口卻不一致,而且端口號都是不常用端口,可以判斷出,這極有可能是一次SYN攻擊。

 

圖4.3.5

 

圖4.3.6

    從第二張圖可以看出,大部分的連接都是SYN半開連接,但是在最后有一個B主機的成功完成的telnet連接,圖中黃色部分。

    然后,在主機C中關閉緩沖保護,如圖4.3.7。

 

圖4.3.7

    在主機A上重復SYN洪泛攻擊。在主機B上嘗試連接主機C。如圖4.3.8。

 

圖4.3.8

    發現一直停留在嘗試連接這一步,說明此時已經不能夠訪問主機C的23號端口了。

    在主機C中查看端口連接情況,如圖4.3.9。

 

圖4.3.9

發現全部是未知主機和不常用端口建立的SYN半開連接,沒有B主機的任何連接存在。

4.4在telnet和ssh連接上的TCP RST攻擊

    首先完成主機B與主機C的telnet連接,如圖4.4.1。

 

圖4.4.1

在C上查看端口連接情況,如圖4.4.2,已經完成主機B與主機C23端口的連接。

 

圖4.4.2

    這時,在主機A中通過netwox78號工具發起針對B主機的RST攻擊。

sudo netwox 78 -i "*.*.47.129"

    回到B主機中,發現沒有什么變化,但是當回車之后,出現連接已經被其他主機斷開,並退回到主機B的賬戶下(我的主機B和主機C中的賬戶都是chengli*,因此在圖片中分不大清)。如圖4.4.3。

 

圖4.4.3

    在主機C中查看此時的連接情況,如圖4.4.4。可以看出BC主機的23端口的連接已經被斷開,處於監聽狀態。

 

圖4.4.4

    注意,此時主機A的攻擊並沒有停止。

    回到主機B中,再次嘗試連接主機C,發現最開始是連接上了,但是還沒來得及顯示后續內容,連接就被中斷。如圖4.4.5。

 

圖4.4.5

 

4.5 ICMP盲目連接重置和源端關閉攻擊

    實驗中使用的是任務4.2中的拓撲結構及IP地址。

    首先在B和C見建立telnet連接

    A是攻擊機,A試圖偽造一個ICMP錯誤信息的包,發送給B或C(實驗中發送給了B),來終止BC見的連接。

sudo netwox 82 -f "host *.*.220.129 and tcp port 23" -i *.*.205.128

    接下來,在C主機中查看端口連接信息,如圖4.5.1,發現連接並沒有終止。

 

圖4.5.1

    在B機中查看wireshark抓取的eth0的流量,如圖4.5.2,發現ICMP錯誤信息包B收到了。

 

圖4.5.2

    出現這種情況的原因可能是在高版本的ubuntu中已經制訂了一些策略來防止這些攻擊。

 

-------

轉載請注明出處,博客園-lasgalen-http://www.cnblogs.com/lasgalen/p/4555648.html 

-------

 

5 實驗思考問題

5.1 ISN 初始序列號

    當TCP連接正在建立時,服務器用一個唯一的32位初始序列號的應答報文來確認用戶請求,TCP協議規范要求美妙更換序列號25萬次,但大多數實際系統更換頻率遠小於此,而且下一次更換的數字往往是可預測的[1]。這個增加值在許多版本比較舊的操作系統中都是一個常量,在FreeBSD4.3中是125000次每秒[2],PacketShaper的序列號每秒增加128000,每次連接增加64000[3]。還能夠找到很多相似的例子。

    所以初始序列號的可預測性是其增加值固定、更新頻率固定所導致的。

現在有很多ISN的生成算法,試圖通過增加ISN的隨機性來解決這個問題。RFC1948中提出了一個較好的初始化序列號ISN隨機生成算法:ISN = M + F(localhost, localport, remotehost, remoteport)。M是一個計時器,這個計時器每隔4毫秒加1。F是一個Hash算法,根據源IP、目的IP、源端口、目的端口生成一個隨機數值。

    但是,嚴格符合RFC1948的ISN生成方法有一個潛在的危機:一個攻擊者如果以前合法擁有過一個IP地址,他通過對ISN進行大量的采樣,可以估計到隨后的ISN的變化規律。在以后,盡管這個IP地址已經不屬於此攻擊者,但他仍然可以通過猜測ISN來進行IP欺騙。ISN自身的值是按照一個常數值穩定增加的,所以F()需要保持相對的穩定性。而根據Bellovin 所提出的,這是一個系統特定的值,這些值並不會經常變。

    如果Hash函數在實現上存在漏洞,攻擊者就可以通過大量的采樣,來分析,其中,源IP地址,源端口,目的IP地址,目的端口都是不變的,這減少了攻擊者分析的難度。

    Linux TCP的ISN生成器避免了這一點。它每5分鍾計算一次值,把泄漏的風險降到了最低。

有一個方法可以做得更好,取M = M + R(t),ISN = M + F(sip, sport, dip, dport, )。其中,R(t) 是一個關於時間的隨機函數。很有必要這樣做,因為它使攻擊者猜測ISN的難度更大了(弱點在理論上還是存在的)。

構造TCP ISN生成器的一些更直接的方法是:簡單地選取一些隨機數作為ISN。這就是給定一個32位的空間,指定ISN = R(t)。(假設R()是完全的非偽隨機數生成函數)。固然,對於完全隨機的ISN值,攻擊者猜測到的可能性是1/232,隨之帶來的一個問題是ISN空間里面的值的互相重復。這違反了許多RFC(RFC 793, RFC 1185, RFC 1323, RFC1948等)的假設----ISN單調增加。這將對TCP協議的穩定性和可靠性帶來不可預計的問題。

其它一些由Niels Provos(來自OpenBSD 組織)結合完全隨機方法和RFC 1948解決方案:ISN = ((PRNG(t)) << 16) + R(t)。其中,PRNG(t) 是一組隨機指定的連續的16位數字  0x00000000 -- 0xffff0000,R(t) 是16位隨機數生成器(它的高位msb設成0)0x00000000 -- 0x0000ffff。上面的公式被用於設計OpenBsd的ISN生成器,相關的源代碼可以從下面的網址獲得http://www.openbsd.org/cgi-bin/cvsweb/src/sys/netinet/tcp_subr.c。

Provos的實現方法有效地生成了一組在給定時間內的不會重復的ISN的值,每兩個ISN值都至少相差32K,這不但避免了隨機方法造成的ISN的值的沖突,而且避免了因為哈希函數計算帶來的性能上的下降,但是,它太依賴於系統時鍾,一旦系統時鍾狀態給攻擊者知道了,就存在着系統的全局ISN狀態泄密的危機。[4]

5.2 TCP窗口長度

    為了限制任一時刻可發送的數據量,並為接收端提供流量控制,TCP 對等方使用窗口實現這些目的。該窗口是接收端允許發送端發送的字節流的數據范圍。發送端只能發送位於窗口內的字節流中的字節。該窗口隨着發送端的出站字節流和接收端的入站字節流而滑動。為了表示接收窗口的大小,TCP 報頭包含了一個 16 位的“窗口”字段。接收窗口是用於控制可從發送端傳送給接收端的未確認數據數量的窗口。

為了提供可適應高速傳輸路徑的更大窗口尺寸,RFC 1323定義了允許接收端通告大於 65,535 字節的窗口大小的窗口縮放。“TCP 窗口縮放”選項包括一個窗口縮放因子,該因子與 TCP 報頭中的 16 位窗口字段結合時,可以將接收窗口大小最大增加到 1GB。

5.3 源端口號

       在網上,這方面的資料不是很多。從我閱讀的資料的信息來看,源端口可預測與不可預測是這樣的:

       A試圖通過X連接到B。則當連接到B時,A必須使用可預測可知的端口來確保A繼續按照X能預測的方式來分配端口。AX之間建立兩個連接,如果X收到的A的端口號是連續的,或者有一定的規律,則源端口是可預測的。否則,不可預測。同樣X要用同樣的方法對B進行檢測。如果嘗試了兩種端口預測方法后,X不能可靠地預測A分配的端口,這時X必須假定A是隨機的分配端口。之后就可以用協議進行AXB的連接了。這一點在NAT上被使用。[5]

6 實驗總結

    這個實驗讓我學會了netwox工具的使用方法,加深了對Dos等類型的攻擊的理解,對linux系統中的一些防御這類攻擊的策略有了一定的認識。

    除此之外,我對ubuntu的網絡路由配置,進行學習,,並選擇搭建了一個合適的網絡拓撲結構。

    這次實驗的大部分任務都完成的比較順利,但是在幾個攻擊上始終沒有出現理想的效果。開始時以為是自己的指令有問題,或者是環境哪里沒配置對。后來通過反復的學習、比較,查找相關資料,發現是ubuntu已經有預防這類攻擊的策略,因此我能夠收到包,但是相關內容並沒有被改變。

    和上一個實驗一樣,我會把報告修改之后放在博客中,因為我覺得里面的一些小問題我還是不太明白,需要保留下來,以后研究學習一下。



[1] 呂艷麗,李肖堅.初始序列號生成算法的安全性研究.計算機研究與發展,2005,42(11);1940-1945

[2] 黃兆勤. 關於TCP/IP序列號生成方法的研究.http://blog.sina.com.cn/s/blog_4b5039210100gku7.html.

[3] 連天科技.Packeteer PacketShaper TCP協議棧可預測初始序列號漏洞.http://www.ltsec.com/show.aspx?id=745&cid=37.

[4] 滲透與攻擊.http://www.cnblogs.com/justwannaloveyou/archive/2010/12/03/1895097.html.

[5] 參考學習文章:P2P 之 TCP穿透NAT的原理,P2P穿透UDP/TCP原理

 

-------

轉載請注明出處,博客園-lasgalen-http://www.cnblogs.com/lasgalen/p/4555648.html 

-------


免責聲明!

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



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