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