標(biāo)題: 基于TCP半連接SYN Flooding攻擊原理及防范 [打印本頁(yè)]

作者: 51hei麗人    時(shí)間: 2016-6-21 01:16
標(biāo)題: 基于TCP半連接SYN Flooding攻擊原理及防范
      說(shuō)起安全,不得不說(shuō)一下當(dāng)前最為流行的一種 D.o.S 的攻擊方式,從目前看來(lái),這種攻擊仍然是危害性相當(dāng)大,并且沒(méi)有辦法徹底防范的一種攻擊方式。而且,凡是基于 TCP 的高層應(yīng)用,都有可能受到這種致命的攻擊。
  
      在“可靠的”傳輸層,在這里打上引號(hào),是因?yàn)閭鬏攲硬⒉皇钦嬲目煽康,而只是相?duì)的。為什么這么說(shuō)呢,因?yàn)樵?2 端的通信中,如果由于通信鏈路的故障,或者是某一端的故障,造成了通信的異常,那么另一端是不能主動(dòng)地了解到的。打個(gè)比方說(shuō),這就好比是我匯錢給張三,用的是中國(guó)郵政的普通匯款,由于種種的原因,他們把錢在路上搞丟了,但是這個(gè)時(shí)候我并不知道錢丟了,我還在一直等張三給我打電話,告訴我錢是否到了,如果 2 個(gè)月之后,張三還是沒(méi)有來(lái)電話,說(shuō)錢已經(jīng)收到了,按照常理來(lái)說(shuō),一個(gè)半月之前就應(yīng)該收到了,那沒(méi)辦法,我只得再給張三匯錢,如果這次又搞丟了,我還得再匯,直到張三打電話告訴我,錢已經(jīng)到了,那么可能對(duì)于張三來(lái)說(shuō),這個(gè)傳輸是可靠的,因?yàn)椴还軄G了多少次,終究他是收到了他想要的東西,但是對(duì)于我來(lái)說(shuō),我不能把丟的錢找回來(lái),也不能自己去監(jiān)視中國(guó)郵政到底是把我的錢搞丟了,還是被他們?nèi)M(jìn)自己的腰包了,我所知道的僅僅是“張三沒(méi)有收到錢”,我需要再給他寄一次。

      由此可以看出,TCP 的傳輸并不是可靠的,它存在一個(gè)等待和重傳的機(jī)制,一旦數(shù)據(jù)在網(wǎng)絡(luò)上發(fā)生丟失,它會(huì)依賴于 ACK / SYN 這些東西來(lái)進(jìn)行一個(gè)重傳,而且,TCP 處理程序中存在一個(gè)計(jì)時(shí)器,如果計(jì)時(shí)器發(fā)生超時(shí),那么它就認(rèn)為數(shù)據(jù)已經(jīng)丟了(當(dāng)然不會(huì)像上邊的例子中說(shuō)的是 2 個(gè)月),再去重傳,那么既然要去重傳,就要保證將來(lái)一旦發(fā)生超時(shí),TCP 處理程序還能把丟失的東西找回來(lái),那么,TCP 處理程序在收到連接請(qǐng)求的時(shí)候,就會(huì)要在內(nèi)存中開(kāi)辟一片區(qū)域來(lái),保存 SYN 以及數(shù)據(jù)著一系列的東西。

      好,現(xiàn)在了解到了 TCP 的可靠與不可靠的方面,現(xiàn)在來(lái)說(shuō)一下 TCP 的 3 次握手,這個(gè)在以前的文章中已經(jīng)寫過(guò)了,在這里就不再多說(shuō)了,在正常情況下,3 次握手的步驟如下:
         
            ISN
A -------------------> B
      SYN/ACK
A <------------------- B
          ACK
A -------------------> B

      在 A 向 B 發(fā)出 TCP 請(qǐng)求的時(shí)候,它發(fā)出一個(gè)隨機(jī)的 ISN (Initial Sequence Number),B 收到后給 A 回復(fù)一個(gè) ACK = ISN + 1,同時(shí)再回復(fù)一個(gè)自己的 SYN 號(hào),接著會(huì)保存 A 發(fā)來(lái)的這些信息,同時(shí)再內(nèi)存中開(kāi)辟緩沖區(qū)進(jìn)行保存,然后 A 再給 B 回復(fù)一個(gè) ACK。經(jīng)歷過(guò)這三次之后,一個(gè)端到端的 TCP 連接已經(jīng)建立起來(lái)了,這是正常的情況。但是,考慮這種情況,如果在 A 向 B 發(fā)出請(qǐng)求,B 給 A 回復(fù)并且開(kāi)辟了資源之后,A 不再進(jìn)行第三次的回復(fù),會(huì)怎么辦?這就好比說(shuō),張三收到錢了,也不給我打電話,我一等 2 個(gè)月,按照常理的話張三早該收到錢了,但是他還沒(méi)來(lái)電話,沒(méi)辦法,我只有再去匯錢了,那么如果每一次都這樣,我這里的錢是不是很快就匯完了?TCP 中也是這樣,如果 A 一直在向B 發(fā)起 TCP 請(qǐng)求,B 也按照正常情況進(jìn)行響應(yīng)了,但是 A 不進(jìn)行第三次的握手,造成半連接,那么 B 分配出去的內(nèi)存資源就一直這么耗著,直到資源耗盡。

      對(duì)于這種攻擊,似乎是沒(méi)有辦法防范的,因?yàn)?TCP 的三次握手是協(xié)議規(guī)定死的,所有使用 TCP 協(xié)議的軟件都必須遵循其規(guī)定,否則無(wú)法通信。但是,有一種辦法,似乎可以防范,那就是限制通信源的 TCP 并發(fā)連接數(shù),例如:如果 A 在 1 秒鐘之內(nèi)連續(xù)產(chǎn)生 100 個(gè) TCP 半連接,那么 B 就丟棄 A 所有的 TCP 信息,并且在一定時(shí)間內(nèi)不再響應(yīng)攻擊者的釋放內(nèi)存資源。這看起來(lái)似乎似乎一種行之有效的辦法,可是實(shí)際并非這么簡(jiǎn)單,因?yàn)樵诘谌龑拥?IP 協(xié)議是一個(gè)不可靠的協(xié)議,它的源地址可以被偽造,如果一個(gè)攻擊者制造大量的偽造源地址來(lái)對(duì)受害者進(jìn)行攻擊,而每一個(gè) IP 地址的 TCP 半連接只建立 3~5 次,這個(gè)時(shí)候如何防范?

      基于此,一種新型的防御方式產(chǎn)生了—— TCP Cookie,TCP Cookie 技術(shù)針對(duì) TCP 協(xié)議的軟肋,做出了一些改進(jìn)。仍以上面的通信過(guò)程為例,在 A 向 B 發(fā)出一個(gè) TCP 請(qǐng)求之后,B 并不立即為 A 的 TCP 請(qǐng)求分配資源,而是利用 A 發(fā)來(lái)的連接信息計(jì)算出一個(gè) Cookie 值——取 Client 端的 IP、端口,以及 Server 端的 IP、端口,再進(jìn)行一種散列算法,得到一個(gè) Cookie,取該 Cookie 的前 24 位作為 SYN 值對(duì)對(duì)方進(jìn)行回復(fù)。當(dāng)對(duì)方對(duì)這個(gè) SYN/ACK 再次進(jìn)行 ACK (ACK=SYN+1)回復(fù)的時(shí)候,利用某種算法和這個(gè) ACK 來(lái)倒推回原來(lái)的 Cookie,如果在一定范圍內(nèi)符合,即認(rèn)為是合法的 TCP 請(qǐng)求,對(duì)它進(jìn)行響應(yīng),如果不符合,則認(rèn)為其是非法的 TCP 請(qǐng)求,丟棄。為什么說(shuō)是一定范圍內(nèi)呢,因?yàn)?Cookie 的變化和時(shí)間有關(guān),那么在 TCP 超時(shí)之內(nèi)的所有的 ACK 都應(yīng)該是合法的,那么在倒推回去的時(shí)候,只要得到的 Cookie 和原來(lái)的 Cookie 在一個(gè)合法的時(shí)間段內(nèi)相符,就認(rèn)為是合法的。

      這種 TCP Cookie 技術(shù)并不是無(wú)懈可擊的,首先,如果攻擊者大量地偽造 IP 地址進(jìn)行半連接攻擊,受害者會(huì)忙于計(jì)算原來(lái)的 Cookie 值而造成資源耗盡,另外,由于并發(fā)連接數(shù)太多,會(huì)造成受害者的帶寬耗盡,同樣也會(huì)造成拒絕服務(wù)攻擊(D.o.S 可不管是耗盡資源還是耗盡帶寬,它只要讓受害者的服務(wù)不能正常提供即可),帶寬總是有限的,所以不管怎么防范,只要 D.o.S 攻擊威力足夠大,任何的防范方法都不能奏效。所以想要防范 D.o.S,還是厚道些做人,不要惹火黑客,否則在遭到攻擊的時(shí)候,除了拔網(wǎng)線,恐怕再?zèng)]有別的辦法了:-)






歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1