1. 程式人生 > >常見Dos攻擊原理及防護(死亡之Ping、Smurf、Teardown、LandAttack、SYN Flood)

常見Dos攻擊原理及防護(死亡之Ping、Smurf、Teardown、LandAttack、SYN Flood)

    DoS是Denial of Service的簡稱,即拒絕服務,造成DoS的攻擊行為被稱為DoS攻擊,其目的是使計算機或網路無法提供正常的服務。最常見的DoS攻擊有計算機網路頻寬攻擊和連通性攻擊。

    DoS攻擊是指故意的攻擊網路協議實現的缺陷或直接通過野蠻手段殘忍地耗盡被攻擊物件的資源,目的是讓目標計算機或網路無法提供正常的服務或資源訪問,使目標系統服務系統停止響應甚至崩潰,而在此攻擊中並不包括侵入目標伺服器或目標網路裝置。這些服務資源包括網路頻寬,檔案系統空間容量,開放的程序或者允許的連線。這種攻擊會導致資源的匱乏,無論計算機的處理速度多快、記憶體容量多大、網路頻寬的速度多快都無法避免這種攻擊帶來的後果。

    DoS到底是什麼?接觸PC機較早的同志會直接想到微軟磁碟作業系統的DOS--DiskOperationSystem?不,此DoS非彼DOS也,DoS即DenialOfService,拒絕服務的縮寫。

    作個形象的比喻來理解DoS。街頭的餐館是為大眾提供餐飲服務,如果一群地痞流氓要DoS餐館的話,手段會很多,比如霸佔著餐桌不結賬,堵住餐館的大門不讓路,騷擾餐館的服務員或廚子不能幹活,甚至更惡劣……相應的計算機和網路系統則是為Internet使用者提供網際網路資源的,如果有黑客要進行DoS攻擊的話,可以想象同樣有好多手段!今天最常見的DoS攻擊有對計算機網路的頻寬攻擊和連通性攻擊。頻寬攻擊指以極大的通訊量衝擊網路,使得所有可用網路資源都被消耗殆盡,最後導致合法的使用者請求無法通過。連通性攻擊指用大量的連線請求衝擊計算機,使得所有可用的作業系統資源都被消耗殆盡,最終計算機無法再處理合法使用者的請求。

    傳統上,攻擊者所面臨的主要問題是網路頻寬,由於較小的網路規模和較慢的網路速度限制,攻擊者無法發出過多的請求。雖然類似“the ping of death”的攻擊型別只需要較少量的包就可以摧毀一個沒有打過補丁的UNIX系統,但大多數的DoS攻擊還是需要相當大的頻寬的,而以個人為單位的黑客們很難使用高頻寬的資源。為了克服這個缺點,DoS攻擊者開發了分散式的攻擊。攻擊者簡單利用工具集合許多的網路頻寬來同時對同一個目標發動大量的攻擊請求,這就是DDoS(Distributed Denial of Service)攻擊。 

無論是DoS攻擊還是DDoS攻擊,簡單的看,都只是一種破壞網路服務的

黑客方式,雖然具體的實現方式千變萬化,但都有一個共同點,就是其根本目的是使受害主機或網路無法及時接收並處理外界請求,或無法及時迴應外界請求。其具體表現方式有以下幾種:

1,製造大流量無用資料,造成通往被攻擊主機網路擁塞,使被攻擊主機無法正常和外界通訊。

2,利用被攻擊主機提供服務或傳輸協議上處理重複連線的缺陷,反覆高頻的發出攻擊性的重複服務請求,使被攻擊主機無法及時處理其它正常的請求。 

3,利用被攻擊主機所提供服務程式傳輸協議的本身實現缺陷,反覆傳送畸形的攻擊資料引發系統錯誤的分配大量系統資源,使主機處於掛起狀態甚至宕機。

使用殭屍電腦進行DOS攻擊

    殭屍電腦(Zombiecomputer),簡稱“殭屍(zombie)”,有些人稱之為“肉雞”,接入網際網路的電腦被病毒感染後,受控於黑客,可以隨時按照黑客的指令展開拒絕服務(DoS)攻擊或傳送垃圾資訊。通常,一部被侵佔的電腦只是僵屍網路裡面眾多中的一環,而且會被用來去執行一連串的或遠端控制的惡意程式。很多“殭屍電腦的擁有者”都沒有察覺到自己的系統已經被“殭屍化”,就彷彿是沒有自主意識的殭屍一般。

   攻擊流程

    要理解dos攻擊,首先要理解TCP連線的三次握手過程(Three-wayhandshake)。在TCP/IP協議中,TCP協議提供可靠的連線服務,採用三次握手建立一個連線。 

    第一次握手:建立連線時,客戶端傳送SYN包((SYN=i)到伺服器,並進入SYNSEND狀態,等待伺服器確認;

    第二次握手:伺服器收到SYN包,必須確認客戶的SYN (ACK=i+1 ),同時自己也傳送一個SYN包((SYN=j)}即SYN+ACK包,此時伺服器進入SYN_RECV狀態;[1] 

    第三次握手:客戶端收到伺服器的SYN+ACK包,向伺服器傳送確認包ACK(ACK=j+1),此包傳送完畢,客戶端和伺服器進入ESTABLISHED狀態,完成三次握手,客戶端與伺服器開始傳送資料。 

    在上述過程中,還有一些重要的概念: 

    半連線:收到SYN包而還未收到ACK包時的連線狀態稱為半連線,即尚未完全完成三次握手的TCP連線。

    半連線佇列:在三次握手協議中,伺服器維護一個半連線佇列,該佇列為每個客戶端的SYN包(SYN=i )開設一個條目,該條目表明伺服器已收到SYN包,並向客戶發出確認,正在等待客戶的確認包。這些條目所標識的連線在伺服器處於SYN_RECV狀態,當伺服器收到客戶的確認包時,刪除該條目,伺服器進入ESTABLISHED狀態。

Backlog引數:表示半連線佇列的最大容納數目。 

    SYN-ACK重傳次數:伺服器傳送完SYN-ACK包,如果未收到客戶確認包,伺服器進行首次重傳,等待一段時間仍未收到客戶確認包,進行第二次重傳,如果重傳次數超過系統規定的最大重傳次數,系統將該連線資訊、從半連線佇列中刪除。注意,每次重傳等待的時間不一定相同。 

    半連線存活時間:是指半連線佇列的條目存活的最長時間,也即服務從收到SYN包到確認這個報文無效的最長時間,該時間值是所有重傳請求包的最長等待時間總和。有時也稱半連線存活時間為Timeout時間、SYN_RECV存活時間。[1] 

上面三個引數對系統的TCP連線狀況有很大影響。 

    SYN洪水攻擊屬於DoS攻擊的一種,它利用TCP協議缺陷,通過傳送大量的半連線請求,耗費CPU和記憶體資源。SYN攻擊除了能影響主機外,還可以危害路由器、防火牆等網路系統,事實上SYN攻擊並不管目標是什麼系統,只要這些系統開啟TCP服務就可以實施。從圖4-3可看到,伺服器接收到連線請求(SYN=i )將此資訊加入未連線佇列,併發送請求包給客戶端( SYN=j,ACK=i+1 ),此時進入SYN_RECV狀態。當伺服器未收到客戶端的確認包時,重發請求包,一直到超時,才將此條目從未連線佇列刪除。配合IP欺騙,SYN攻擊能達到很好的效果,通常,客戶端在短時間內偽造大量不存在的IP地址,向伺服器不斷地傳送SYN包,伺服器回覆確認包,並等待客戶的確認,由於源地址是不存在的,伺服器需要不斷的重發直至超時,這些偽造的SYN包將長時間佔用未連線佇列,正常的SYN 請求被丟棄,目標系統執行緩慢,嚴重者引起網路堵塞甚至系統癱瘓。過程如下:

攻擊主機C(地址偽裝後為C&apos)-----大量SYN包---->被攻擊主機 

C&apos<-------SYN/ACK包----被攻擊主機,由於C&apos地址不可達,被攻擊主機等待SYN包超時。攻擊主機通過發大量SYN包填滿未連線佇列,導致正常SYN包被拒絕服務。另外,SYN洪水攻擊還可以通過發大量ACK包進行DoS攻擊。

常見攻擊與防範

SYN Flood攻擊
  
問題就出在TCP連線的三次握手中,假設一個使用者向伺服器傳送了SYN報文後突然宕機或掉線,那麼伺服器在發出SYN+ACK應答報文後是無法收到客戶端的ACK報文的(第三次握手無法完成),這 種情況下伺服器端一般會重試(再次傳送SYN+ACK給客戶端)並等待一段時間後丟棄這個未完成的連線,這段時間的長度我們稱為SYN Timeout,一般來說這個時間是分鐘的數量級(大約為30秒 -2分鐘);一個使用者出現異常導致伺服器的一個執行緒等待1分鐘並不是什麼很大的問題,但如果有一個惡意的攻擊者大量模擬這種情況,伺服器端將為了維護一個非常大的半連線列表而消耗非常多的資源----數以萬計的半連線,即使是簡單的儲存並遍歷也會消耗非常多的CPU時間和記憶體,何況還要不斷對這個列表中的IP進行SYN+ACK的重試。實際上如果伺服器的TCP/IP棧不夠強大,最 後的結果往往是堆疊溢位崩潰---即使伺服器端的系統足夠強大,伺服器端也將忙於處理攻擊者偽造的TCP連線請求而無暇理睬客戶的正常請求(畢竟客戶端的正常請求比率非常之小),此時從 正常客戶的角度看來,伺服器失去響應,這種情況我們稱作:伺服器端受到了SYN Flood攻擊(SYN洪水攻擊)。
  防範:
  
第一種是縮短SYN Timeout時間
  第二種方法是設定SYN Cookie,就是給每一個請求連線的IP地址分配一個Cookie,如果短時間內連續受到某個IP的重複SYN報文,就認定是受到了攻擊,以後從這個IP地址來的包會被一概丟棄。
  >netstat -n -p tcp >result.txt

Smurf攻擊:
  
傳送偽裝的ICMP資料包,目的地址設為某個網路的廣播地址,源地址設為要攻擊的目的主機,使所有收到此ICMP資料包的主機都將對目的主機發出一個迴應,使被攻擊主機在某一段時間內收到 成千上萬的資料包
  防範:
  
在cisco路由器上配置如下可以防止將包傳遞到廣播地址上:
  Router(config-if)# no ip directed-broadcast

Ping of Death
  
"ping ofdeath"攻擊就是我們常說的"死亡Ping"
  這種攻擊通過傳送大於65536位元組的ICMP包使作業系統崩潰;通常不可能傳送大於65536個位元組的ICMP包,但可以把報文分割成片段,然後在目標主機上重組;最終會導致被攻擊目標緩衝區溢位,引起拒絕服務攻擊。有些時候導致telne和http服務停止,有些時候路由器重啟。

teardown攻擊
  
對於一些大的IP資料包,往往需要對其進行拆分傳送,這是為了迎合鏈路層的MTU(最大傳輸單元)的要求。比如,一個6 000位元組的IP包,在MTU為2 000的鏈路上傳輸的時候,就需要分成3個IP 包。在IP報頭中有一個偏移欄位和一個拆分標誌(MF)。如果MF標誌設定為1,則表示這個IP包是一個大IP包的片段,其中偏移欄位指出了這個片段在整個IP包中的位置。例如,對一個6 000字 節的IP包進行拆分(MTU為2 000),則3個片段中偏移欄位的值依次為0,2000,4 000。這樣接收端在全部接收完IP資料包後,就可以根據這些資訊重新組裝這幾個分次接收的拆分IP包。在這 裡就有一個安全漏洞可以利用了,就是如果黑客們在擷取IP資料包後,把偏移欄位設定成不正確的值,這樣接收端在收到這些分拆的資料包後,就不能按資料包中的偏移欄位值正確組合這些拆分的資料包,但接收端會不斷嘗試,這樣就可能致使目標計算機作業系統因資源耗盡而崩潰。

Land(LandAttack)攻擊

Land攻擊中,黑客利用一個特別打造的SYN包--它的原地址和目標地址都被設定成某一個伺服器地址進行攻擊。此舉將導致接受伺服器向它自己的地址傳送SYN-ACK訊息,結果這個地址又發回ACK訊息並建立一個空連線,每一個這樣的連線都將保留直到超時,在Land攻擊下,許多UNIX將崩潰,NT變得極其緩慢(大約持續五分鐘)。

IP欺騙

這種攻擊利用TCP協議棧的RST位來實現,使用IP欺騙,迫使伺服器把合法使用者的連線復位,影響合法使用者的連線。假設有一個合法使用者(100.100.100.100)已經同伺服器建了正常的連線,攻擊者構造攻擊的TCP資料,偽裝自己的IP為100.100.100.100,並向伺服器傳送一個帶有RST位的TCP資料段伺服器接收到這樣的資料後,認為從100.100.100.100傳送的連線有錯誤,就會清空緩衝區中已建立好的連線。這時,合法使用者100.100.100.100再發送合法資料,伺服器就已經沒有這樣的連線了,該使用者就被拒絕服務而只能重新開始建立新的連線。