原文地址:https://www.cnblogs.com/davidwang456/p/3590846.htmlhtml
DoS究竟是什麼?接觸PC機較早的同志會直接想到微軟磁盤操做系統的DOS--DiskOperationSystem?不,此DoS非彼DOS也,DoS即DenialOfService,拒絕服務的縮寫。安全
DoS是Denial of Service的簡稱,即拒絕服務,形成DoS的***行爲被稱爲DoS***,其目的是使計算機或網絡沒法提供正常的服務。最多見的DoS***有計算機網絡帶寬***和連通性***。
1、概念理解:服務器
做個形象的比喻來理解DoS。街頭的餐館是爲大衆提供餐飲服務,若是一羣地痞流氓要DoS餐館的話,手段會不少,好比霸佔着餐桌不結帳,堵住餐館的大門不讓路,騷擾餐館的服務員或廚子不能幹活,甚至更惡劣……相應的計算機和網絡系統則是爲Internet用戶提供互聯網資源的,若是有***要進行DoS***的話,能夠想象一樣有好多手段!今天最多見的DoS***有對計算機網絡的帶寬***和連通性***。帶寬***指以極大的通訊量衝擊網絡,使得全部可用網絡資源都被消耗殆盡,最後致使合法的用戶請求沒法經過。連通性***指用大量的鏈接請求衝擊計算機,使得全部可用的操做系統資源都被消耗殆盡,最終計算機沒法再處理合法用戶的請求。 傳統上,***者所面臨的主要問題是網絡帶寬,因爲較小的網絡規模和較慢的網絡速度的限制,***者沒法發出過多的請求。雖然相似「thepingofdeath」的***類型只須要較少許的包就能夠摧毀一個沒有打過補丁的UNIX系統,但大多數的DoS***仍是須要至關大的帶寬的,而以我的爲單位的***們很難使用高帶寬的資源。爲了克服這個缺點,DoS***者開發了分佈式的***。***者簡單利用工具集合許多的網絡帶寬來同時對同一個目標發動大量的***請求,這就是DDoS***。
不管是DoS仍是DDoS,簡單的看,都只是一種破壞網絡服務的***方式,雖然具體的實現方式變幻無窮,但都有一個共同點,就是其根本目的是使受害主機或網絡沒法及時接收並處理外界請求,或沒法及時迴應外界請求。其具體表現方式有如下幾種:網絡
利用被主機所提供服務程序或傳輸協議的自己實現缺陷,反覆發送畸形的數據引起系統錯誤的分配大量系統資源,使主機處於掛起狀態甚至死機。
2、***流程:併發
要理解dos***,首先要理解TCP鏈接的三次握手過程(Three-wayhandshake)。在TCP/IP協議中,TCP協議提供可靠的鏈接服務,採用三次握手創建一個鏈接。
1.第一次握手:創建鏈接時,客戶端發送SYN包((SYN=i)到服務器,並進入SYN SEND狀態,等待服務器確認;
2.第二次握手:服務器收到SYN包,必須確認客戶的SYN (ACK=i+1 ),同時本身也發送一個SYN包((SYN=j)}即SYN+ACK包,此時服務器進入SYN_RECV狀態;
3.第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ACK=j+1),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手,客戶端與服務器開始傳送數據。tcp
在上述過程當中,還有一些重要的概念:分佈式
上面三個參數對系統的TCP鏈接情況有很大影響。ide
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')-----大量SYN包---->被***主機 C'<-------SYN/ACK包----被***主機
因爲C’地址不可達,被主機等待SYN包超時。主機經過發大量SYN包填滿未鏈接隊列,致使正常SYN包被拒絕服務。另外,SYN洪水還能夠經過發大量ACK包進行DoS。
3、***手段:工具
拒絕服務***是一種對網絡危害巨大的惡意***。今天,DoS具備表明性的***手段包括PingofDeath、TearDrop、UDPflood、SYNflood、LandAttack、IPSpoofingDoS等。看看它們又是怎麼實現的。
淚滴 (teardrop)
淚滴利用在TCP/IP協議棧實現中信任IP碎片中的包的標題頭所包含的信息來實現本身的。IP分段含有指示該分段所包含的是原包的哪一段的信息,某些TCP/IP協議棧(例如NT在servicepack4之前)在收到含有重疊偏移的僞造分段時將崩潰。測試
UDP泛洪(UDPflood)
UDPflood:現在在Internet上UDP(用戶數據包協議)的應用比較普遍,不少提供WWW和Mail等服務設備一般是使用Unix的服務器,它們默認打開一些被惡意利用的UDP服務。如echo服務會顯示接收到的每個數據包,而本來做爲測試功能的chargen服務會在收到每個數據包時隨機反饋一些字符。UDPflood假冒就是利用這兩個簡單的TCP/IP服務的漏洞進行惡意,經過僞造與某一主機的Chargen服務之間的一次的UDP鏈接,回覆地址指向開着Echo服務的一臺主機,經過將Chargen和Echo服務互指,來回傳送毫無用處且佔滿帶寬的垃圾數據,在兩臺主機之間生成足夠多的無用數據流,這一拒絕服務***飛快地致使網絡可用帶寬耗盡。
SYN泛洪(SYNflood)
SYNflood:咱們知道當用戶進行一次標準的 TCP(TransmissionControlProtocol)鏈接時,會有一個3次握手過程。首先是請求服務方發送一個 SYN(SynchronizeSequenceNumber)消息,服務方收到SYN後,會向請求方回送一個SYN-ACK表示確認,當請求方收到 SYN-ACK後,再次向服務方發送一個ACK消息,這樣一次TCP鏈接創建成功。「SYNFlooding」則專門針對TCP協議棧在兩臺主機間初始化鏈接握手的過程進行DoS,其在實現過程當中只進行前2個步驟:當服務方收到請求方的SYN-ACK確認消息後,請求方因爲採用源地址欺騙等手段使得服務方收不到ACK迴應,因而服務方會在必定時間處於等待接收請求方ACK消息的狀態。而對於某臺服務器來講,可用的TCP鏈接是有限的,由於他們只有有限的內存緩衝區用於建立鏈接,若是這一緩衝區充滿了虛假鏈接的初始信息,該服務器就會對接下來的鏈接中止響應,直至緩衝區裏的鏈接企圖超時。若是惡意***方快速連續地發送此類鏈接請求,該服務器可用的TCP鏈接隊列將很快被阻塞,系統可用資源急劇減小,網絡可用帶寬迅速縮小,長此下去,除了少數幸運用戶的請求能夠插在大量虛假請求間獲得應答外,服務器將沒法向用戶提供正常的合法服務。
Land(LandAttack)
在Land中,利用一個特別打造的SYN包--它的原地址和目標地址都被設置成某一個服務器地址進行。此舉將致使接受服務器向它本身的地址發送SYN-ACK消息,結果這個地址又發回ACK消息並建立一個空鏈接,每個這樣的鏈接都將保留直到超時,在Land***下,許多UNIX將崩潰,NT變得極其緩慢(大約持續五分鐘)。
IP欺騙dos
這種利用TCP協議棧的RST位來實現,使用IP欺騙,迫使服務器把合法用戶的鏈接復位,影響合法用戶的鏈接。假設如今有一個合法用戶(100.100.100.100)已經同服務器創建了正常的鏈接,者構造的TCP數據,假裝本身的IP爲100.100.100.100,並向服務器發送一個帶有RST位的TCP數據段。服務器接收到這樣的數據後,認爲從100.100.100.100發送的鏈接有錯誤,就會清空緩衝區中已創建好的鏈接。這時,合法用戶100.100.100.100再發送合法數據,服務器就已經沒有這樣的鏈接了,該用戶就被拒絕服務而只能從新開始創建新的鏈接。
Smurf是一種簡單但有效的DDoS技術,它利用了ICMP(Internet控制信息協議)。ICMP在Internet上用於錯誤處理和傳遞控制信息。它的功能之一是與主機聯繫,經過發送一個「迴音請求」(echorequest)信息包看看主機是否「活着」。最普通的ping程序就使用了這個功能。Smurf是用一個偷來的賬號安裝到一個計算機上的,而後用一個僞造的源地址連續ping一個或多個計算機網絡,這就致使全部計算機所響應的那個計算機並非實際發送這個信息包的那個計算機。這個僞造的源地址,實際上就是的目標,它將被極大數量的響應信息量所淹沒。對這個僞造信息包作出響應的計算機網絡就成爲***的不知情的同謀。
4、常見的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 of death"就是咱們常說的"死亡Ping"
這種經過發送大於65536字節的ICMP包使操做系統崩潰;一般不可能發送大於65536個字節的ICMP包,但能夠把報文分割成片斷,而後在目標主機上重組;最終會致使被目標緩衝區溢出,引發拒絕服務。有些時候致使telnet和http服務中止,有些時候路由器重啓。
淚滴
原理:
對於一些大的IP數據包,每每須要對其進行拆分傳送,這是爲了迎合鏈路層的MTU(最大傳輸單元)的要求。好比,一個6000字節的IP包,在MTU爲2000的鏈路上傳輸的時候,就須要分紅3個IP 包。在IP報頭中有一個偏移字段和一個拆分標誌(MF)。若是MF標誌設置爲1,則表示這個IP包是一個大IP包的片斷,其中偏移字段指出了這個片斷在整 個IP包中的位置。例如,對一個6000字 節的IP包進行拆分(MTU爲2 000),則3個片斷中偏移字段的值依次爲0,2000,4000。這樣接收端在所有接收完IP數據包後,就能夠根據這些信息從新組裝這幾個分次接收的拆分IP包。在這 裏就有一個安全漏洞能夠利用了,就是若是們在截取IP數據包後,把偏移字段設置成不正確的值,這樣接收端在收到這些分拆的數據包後,就不能按數據包中 的偏移字段值正確組合這些拆 分的數據包,但接收端會不斷嘗試,這樣就可能導致目標計算機操做系統因資源耗盡而崩潰。