在本文中,筆者重點解析了TCP/IP協(xié)議棧面臨的五大網(wǎng)絡(luò)安全問題,也介紹到企業(yè)網(wǎng)絡(luò)安全管理人員在面臨問題時所能采取的應(yīng)對措施。
1. IP欺騙
IP Spoof即IP 電子欺騙,可以理解為一臺主機設(shè)備冒充另外一臺主機的IP地址與其他設(shè)備通信,從而達到某種目的技術(shù)。早在1985年,貝爾實驗室的一名工程師Robbert Morris在他的一篇文章“A weakness in the 4.2bsdUNIXTCP/IP software”中提出了IP Spoof的概念,有興趣的讀者可參見原文:http://www.coast.net/~emv/tubed/archives/Morris_weakness_in_ TCPIP.txt 。
但要注意:單純憑借IP Spoof技術(shù)不可能很好地完成一次完整的攻擊,因為現(xiàn)有IP Spoof技術(shù)是屬于一種“盲人”式的入侵手段。
一般來說,IP欺騙攻擊有6個步驟:
(1)首先使被信任主機的網(wǎng)絡(luò)暫時癱瘓,以免對攻擊造成干擾;
(2)然后連接到目標機的某個端口來猜測ISN基值和增加規(guī)律;
(3)接下來把源地址偽裝成被信任主機,發(fā)送帶有SYN標志的數(shù)據(jù)段請求連接;
(4)然后等待目標機發(fā)送SYN+ACK包給已經(jīng)癱瘓的主機;
(5)最后再次偽裝成被信任主機向目標機發(fā)送的ACK,此時發(fā)送的數(shù)據(jù)段帶有預(yù)測的目標機的ISN+1;
(6)連接建立,發(fā)送命令請求。
下面是它的兩個關(guān)鍵步驟:
(1)使被信任主機失去工作能力
為了偽裝成被信任主機而不露餡,需要使其完全失去工作能力。由于攻擊者將要代替真正的被信任主機,他必須確保真正的被信任主機不能收到任何有效的網(wǎng)絡(luò)數(shù)據(jù),否則將會被揭穿。有許多方法可以達到這個目的(如SYN洪水攻擊、Land等攻擊)。
(2)序列號取樣和猜測
對目標主機進行攻擊,必須知道目標主機的數(shù)據(jù)包序列號。通常如何進行預(yù)測呢?往往先與被攻擊主機的一個端口(如25端口)建立起正常連接。通常,這個過程被重復(fù)N次,并將目標主機最后所發(fā)送的ISN存儲起來。然后還需要估計他的主機與被信任主機之間的往返時間,這個時間是通過多次統(tǒng)計平均計算出來的。如果往返連接增加64,000,則現(xiàn)就可以估計出ISN的大小是128,000乘以往返時間的一半,如果此時目標主機剛剛建立過一個連接,那么再加上64,00。一旦估計出ISN的大小,就開始著手進行攻擊,當然你的虛假TCP數(shù)據(jù)包進入目標主機時,如果剛才估計的序列號是準確的,進入的數(shù)據(jù)將被放置在目標機的緩沖區(qū)中。但是在實際攻擊過程中往往沒這么幸運,如果估計的序列號小于正確值,那么將被放棄。而如果估計的序列號大于正確值,并且在緩沖區(qū)的大小之內(nèi),那么該數(shù)據(jù)被認為是一個未來的數(shù)據(jù),TCP模塊將等待其他缺少的數(shù)據(jù)。如果估計序列號大于期待的數(shù)字且不在緩沖區(qū)之內(nèi),TCP將會放棄它并返回一個期望獲得的數(shù)據(jù)序列號。偽裝成被信任的主機IP后,此時該主機仍然處在癱瘓狀態(tài),然后向目標主機的被攻擊端口(如25)發(fā)送連接請求。目標主機立刻對連接請求作出反應(yīng),發(fā)更新SYN+ACK確認包給被信任主機,因為此時被信任主機仍然處于癱瘓狀態(tài),它當然無法收到這個包,緊接著攻擊者向目標主機發(fā)送ACK數(shù)據(jù)包,該數(shù)據(jù)包使用前面估計的序列號加1。如果攻擊者估計正確的話,目標主機將會接收該ACK。連接就正式建立起了,可以開始數(shù)據(jù)傳輸了。
對于來自網(wǎng)絡(luò)外部的欺騙,防范的方法很簡單,只需要在局域網(wǎng)的對外路由器上加一個限制設(shè)置就可以實現(xiàn)了,在路由器的設(shè)置里面禁止運行聲稱來自于網(wǎng)絡(luò)內(nèi)部的信息包。
對于來自局域網(wǎng)外部的IP欺騙攻擊的防范則可以使用防火墻進行防范,但是對于來自內(nèi)部的攻擊通過設(shè)置防火墻則起不到什么作用,這個時候應(yīng)該注意內(nèi)部網(wǎng)的路由器是否支持內(nèi)部接口。如果路由器支持內(nèi)部網(wǎng)絡(luò)子網(wǎng)的兩個接口,則必須提高警惕,因為它很容易受到IP欺騙。
通過對信息包的監(jiān)控來檢查IP欺騙攻擊將是非常有效的方法,使用netlog等信息包檢查工具對信息的源地址和目的地址進行驗證,如果發(fā)現(xiàn)了信息包來自兩個以上的不同地址,則說明系統(tǒng)有可能受到了IP欺騙攻擊,防火墻外面正有黑客試圖入侵系統(tǒng)。
2. SYN Flooding
SYN Flooding是最為有效和流行的一種DoS攻擊形式。它利用TCP三次握手協(xié)議的缺陷,向目標主機發(fā)送大量的偽造源地址的SYN連接請求,消耗目標主機的資源,從而不能夠為正常用戶提供服務(wù)。
在TCP會話初期,有所謂的“三次握手”過程:對每次發(fā)送的數(shù)據(jù)量是怎樣跟蹤進行協(xié)商使數(shù)據(jù)段的發(fā)送和接收同步,根據(jù)所接收到的數(shù)據(jù)量而確定的數(shù)據(jù)確認數(shù)及數(shù)據(jù)發(fā)送、接收完畢后何時撤消聯(lián)系,并建立虛連接。為了提供可靠的傳送,TCP在發(fā)送新的數(shù)據(jù)之前,以特定的順序?qū)?shù)據(jù)包進行編號,并需要等待這些包傳送給目標機之后的確認消息。TCP總是用來發(fā)送大批量的數(shù)據(jù)。當應(yīng)用程序在收到數(shù)據(jù)后要做出確認時也要用到TCP。由于TCP要時刻跟蹤,這需要額外開銷,使得TCP的格式有些顯得復(fù)雜。
TCP三次握手的步驟如下:
(1)設(shè)主機A要與主機B通信,要建立一個TCP連接。首先,主機B(在這兒是服務(wù)器),必須先運行一個服務(wù)器進程,發(fā)出一個“被動找開”命令給TCP。之后服務(wù)器進程便不斷探測端口,看是否有客戶進程有連接請求。并處于“聽”狀態(tài)。客戶端主機A的應(yīng)用進程,向其TCP發(fā)“主動打開”命令,指明要與某個IP地址的某個端口建立TCP連接。第一次主機A的TCP便向主機B的TCP發(fā)出連接請求報文。TCP報文中指明了要連接的IP地址(隱含TP數(shù)據(jù)報指明)和端口號,設(shè)置能夠接受的TCP數(shù)據(jù)段最大值,以及一些用戶數(shù)據(jù),SYN=1,ACK=0。這稱為“第一次握手”。
(2)主機A的連接請求到達主機B后,主機B的TCP查看是否有進程在偵聽該端口,如沒有,就發(fā)送一個RST=1的應(yīng)答,拒絕連接,否則將到達TCP數(shù)據(jù)段留給“偵聽”進程。“偵聽”進程將發(fā)回一個應(yīng)答TCP報文段,其中SYN=1,ACK=1,確認序號ACKSEQ=X+1,同時自己選一個發(fā)送序號SEQ=Y。這是“第二次握手”。
(3)主機A收到主機B的確認報文后,再向主機B發(fā)出一個確認TCP報文段,其中SYN=1,ACK=1,SEQ=X+1,ACKSEQ=Y+1,這就完成了“第三次握手”。
在SYN Flooding攻擊中,黑客機器向受害主機發(fā)送大量偽造源地址的TCP SYN報文,受害主機分配必要的資源,然后向源地址返回SYN+ACK包,并等待源端返回ACK包,如圖1所示。由于源地址是偽造的,所以源端永遠都不會返回ACK報文,受害主機繼續(xù)發(fā)送SYN+ACK包,并將半連接放入端口的積壓隊列中,雖然一般的主機都有超時機制和默認的重傳次數(shù),但是由于端口的半連接隊列的長度是有限的,如果不斷地向受害主機發(fā)送大量的TCP SYN報文,半連接隊列就會很快填滿,服務(wù)器拒絕新的連接,將導(dǎo)致該端口無法響應(yīng)其他機器進行的連接請求,最終使受害主機的資源耗盡。
圖1 SYN Flooding攻擊示意圖
目前在防御SYN Flooding攻擊方面有2種比較有效的技術(shù)。
(1)SYN-cookie技術(shù)
一般情況下,當服務(wù)器收到一個TCP SYN報文后,馬上為該連接請求分配緩沖區(qū),然后返回一個SYN+ACK報文,這時形成一個半連接。SYN Flooding正是利用了這一點,發(fā)送大量的偽造源地址的SYN連接請求,而不完成連接。這樣就大量地消耗服務(wù)器的資源。
SYN-cookie技術(shù)針對標準TCP連接建立過程資源分配上的這一缺陷,改變了資源分配的策略。當服務(wù)器收到一個SYN報文后,不立即分配緩沖區(qū),而是利用連接的信息生成一個cookie,并將這個cookie作為將要返回的SYN+ACK報文的初始序列號。當客戶端返回一個ACK報文時,根據(jù)包頭信息計算cookie,與返回的確認序列號(初始的序列號+1)的前24位進行對比,如果相同,則是一個正常連接,然后,分配資源,建立連接。
該技術(shù)的巧妙之點在于避免了在連接信息未完全到達前進行資源分配,使SYN Flooding攻擊的資源消耗失效。實現(xiàn)的關(guān)鍵之處在于cookie的計算。cookie的計算應(yīng)該做到包含本次連接的狀態(tài)信息,使攻擊者不能偽造cookie。cookie的計算過程如下。
① 服務(wù)器收到一個SYN包后,計算一個消息摘要mac:
mac = MAC(A,k)
MAC是密碼學(xué)中的一個消息認證碼函數(shù),也就是滿足某種安全性質(zhì)的帶密鑰的hash函數(shù),它能夠提供cookie計算中需要的安全性。A為客戶和服務(wù)器雙方的IP地址和端口號以及參數(shù)t的串聯(lián)組合:A = SOURCE_IP || SOURCE_PORT || DST_IP || DST_PORT || t;K為服務(wù)器獨有的密鑰;時間參數(shù)t為32比特長的時間計數(shù)器,每64秒加1;
② 生成cookie:
cookie = mac(0:24):表示取mac值的第0到24比特位;
③ 設(shè)置將要返回的SYN+ACK報文的初始序列號,設(shè)置過程如下:
· 高24位用cookie代替;
· 接下來的3比特位用客戶要求的最大報文長度MMS代替;
· 最后5比特位為t mod 32。
客戶端收到來自服務(wù)器SYN+ACK報文后,返回一個ACK報文,這個ACK報文將帶一個cookie(確認號為服務(wù)器發(fā)送過來的SYN ACK報文的初始序列號加1,所以不影響高24位),在服務(wù)器端重新計算cookie,與確認號的前24位比較,如果相同,則說明未被修改,連接合法,然后,服務(wù)器完成連接的建立過程。
SYN-cookie技術(shù)由于在連接建立過程中不需要在服務(wù)器端保存任何信息,實現(xiàn)了無狀態(tài)的三次握手,從而有效地防御了SYN Flooding攻擊。但是該方法也存在一些弱點。由于cookie的計算只涉及了包頭的部分信息,在連接建立過程中不在服務(wù)器端保存任何信息,所以失去了協(xié)議的許多功能,比如超時重傳。此外,由于計算cookie有一定的運算量,增加了連接建立的延遲時間,因此,SYN-cookie技術(shù)不能作為高性能服務(wù)器的防御手段。通常采用動態(tài)資源分配機制,即分配了一定的資源后再采用cookie技術(shù),Linux系統(tǒng)中的SYN-cookie就是這樣實現(xiàn)的。還有一個問題是,當我們避免了SYN Flooding攻擊的同時,也提供了另一種拒絕服務(wù)攻擊方式,攻擊者發(fā)送大量的ACK報文,使服務(wù)器忙于計算驗證。盡管如此,在預(yù)防SYN Flooding攻擊方面,SYN-cookie技術(shù)仍然是一種有效的技術(shù)。
(2)地址狀態(tài)監(jiān)控的解決方法
地址狀態(tài)監(jiān)控的解決方法是利用監(jiān)控工具對網(wǎng)絡(luò)中的有關(guān)TCP連接的數(shù)據(jù)包進行監(jiān)控,并對監(jiān)聽到的數(shù)據(jù)包進行處理。處理的主要依據(jù)是連接請求的源地址。
每個源地址都有一個狀態(tài)與之對應(yīng),總共有四種狀態(tài):
· 初態(tài):任何源地址剛開始的狀態(tài);
· NEW狀態(tài):第一次出現(xiàn)或出現(xiàn)多次也不能斷定存在的源地址的狀態(tài);
· GOOD狀態(tài):斷定存在的源地址所處的狀態(tài);
· BAD狀態(tài):源地址不存在或不可達時所處的狀態(tài)。