要理解DoS攻擊的實現原理,必須要對TCP有一定了解。
1.何為DoS?
DoS(Denial of Service)的含義即讓目標機器停止提供服務或資源訪問。相當於在某家店客滿的時候,不再接受更多的客人,后來的客人只能在外面等着。
2.熟悉TCP
要理解DoS,首先要對TCP有足夠的了解。TCP是在不可靠的因特網中提供可靠的、端對端的字節流通訊協議。在常見的TCP/IP通信中,IP層不保證數據包正確傳送到目的地,TCP則從本地機器中接受數據流,然后將其分成不超過64K字節的數據片段,每個數據片段作為單獨的IP數據包發送出去。最后在目的機器中組合成完整的數據流,TCP協議必須保證可靠性。
TCP傳輸中,發送方和接收方以數據段的形式交換數據,一個數據段包含固定的20字節+可選部分+數據。當發送方將數據段發送出去后,將啟動一個定時器,接收方在接受到數據段后,將回傳一個數據段,其中包含一個確認序號,表示希望收到的下一個數據段的順序號。如果發送方在收到回傳數據前定時器超時了,將判斷為數據丟失,發送方將重新發送該數據段。在整個過程中,關鍵信息都在tcp數據頭中。
3.TCP數據頭
32位序號:是指發送數據包的第一個字節的序列號,
32位確認序號:確認序號是希望接收的字節號。以上兩者均是32位。
4位首部長度(Data offset):表明TCP頭包含多少個32位字,用來確定TCP頭的長度,因為頭中有可選字段長度是不固定的( ?)。
6位保留位:暫時沒用,目前均為0。
接下來是6個比較重要的標志,它們與DoS攻擊都非常相關:
URG:緊急指針使能位,要用到后面的緊急指針時置1。用來避免TCP流中斷。
ACK:確認序號使能位,置1時表示確認序號有用,為0時則忽略確認序號。
PSH:置1時請求的數據段在接收方得到之后即可送至應用程序,而無需等到緩沖區滿。
RST:用於復位由於某些原因導致的連接錯誤,也用於拒絕非法數據和請求。如果接收到RST位時,通常是發生了某些錯誤。
SYN (Synchronize Sequence Number):用於建立連接,在連接請求中,SYN=1,ACK=0,連接響應時,SYN=1,ACK=1。即兩者是用於區分請求和相應。
FIN (no more data from sender):用於釋放連接,表明發送方已經沒有數據要送了。
接下里繼續介紹16位的窗口指針:表示確認了字節后還可以發送多少字節。為0時,表示已經收到了包括確認號-1在內的所有數據段。
接下來的校驗和緊急指針就不介紹了。
4.TCP三次握手
了解了TCP數據頭,接下來就該看看三次握手過程是如何實現的,DoS攻擊就是利用握手過程中的漏洞來進行的。
-
客戶端發送SYN(SEQ=x)報文給服務器端,進入SYN_SEND狀態。
-
服務器端收到SYN報文,回應一個SYN (SEQ=y)ACK(ACK=x+1)報文,進入SYN_RECV狀態。
-
客戶端收到服務器端的SYN報文,回應一個ACK(ACK=y+1)報文,進入Established狀態。
1.客戶端發送一個帶SYN位的請求(此時SYN標志位為1,ACK標志位為0,因為請求不需要用到確認號),向服務器表明連接請求,假定請求序號為10,那么“32位序號”(SYN)=10,確認序號(ACK)=0 。發送之后,等待服務器的反應。
2.服務收到該請求報文后,檢查是否在LISTEN的指定端口,如果不是則拒絕,是的話就接受請求:假定服務器自身的SYN內碼為100,確認序號則是客戶端請求序號+1,即10+1=11,所以發送響應報文SYN=100,ACK=11(兩個使能位均為1)
3.客戶端接收到該消息后,將發送最后一個連接確認到服務器。SYN位是服務器發送的ACK位,而ACK位則是服務器發送的SYN位+1,即SYN=11,ACK=101。至此,連接建立,可以開始發送數據了。
理解難點:三次握手的宏觀過程很好理解,但是微觀細節有一點繞。需要把握兩點,SYN和ACK的標志位只能取0或1,它們只是使能標志,起輔助作用。上述過程的描述中更多指的是它們分別對應的序號內容,SYN對應於TCP頭中的“32位序號”,ACK對應於“32位確認序號”。另外一個把握的難點在於,客戶端與服務器端之間兩個序號內容的交叉交換,特別要體會ACK=對方SYN+1的這種處理方式的目的所在。
5.未連接隊列(服務器的緩沖區隊列Backlog Queue)
服務器不會在每次接收到SYN請求的時候立即與客戶端建立連接,而是為連接請求分配內存空間,建立會話,並放到一個等待隊列之中。如果這個隊列已滿,就不再接受新的請求,即新的請求將被直接丟棄,這就是拒絕服務。
如果服務器接收到一個RST置位的信息,就判斷這是一個有錯誤的數據段,會根據客戶端IP,把對應的連接從緩沖隊列中清除掉。這對IP欺騙有影響,也可以作為DoS攻擊。
通過了解TCP協議和連接過程,我們要對Server進行DoS攻擊,只需要抓住兩點:
a.讓服務器的緩沖區滿,不接受新的請求;
b.使用IP欺騙,使得正常連接被復位,從而影響合法用戶。
這兩點是DoS攻擊的基本思想,具體實現起來有如下方法:
SYN FLOOD
利用服務器的連接緩沖區,和特殊程序,設置TCP的Header,向服務器不斷成倍發送具有只有SYN標志的TCP連接請求。當服務器接收之后,判斷為均是沒有建立起來的連接請求,於是給這些請求建立會話,排到緩沖區隊列中。
直到你發送的SYN請求超過了服務器的緩沖區,服務器便不再接受其他的合法請求了。你可以持續的進行SYN請求,從而致使緩沖區里都是你發送的SYN請求。
IP欺騙DoS攻擊
這種攻擊利用RST位來實現。假設有一個合法用戶(1.1.1.1)與服務器建立了正常的連接,攻擊者構造攻擊TCP數據,偽裝自己的IP也是1.1.1.1,並向服務器發送一個帶有RST位的數據段。此時服務器收到該數據段后,便認為從1.1.1.1發送的請求連接有錯,便從緩沖區中將該連接清除,從而導致合法用戶與服務器斷開了連接。如果合法用戶要繼續傳輸數據,就得重新發送合法的連接請求。
在進行IP欺騙DoS攻擊時,通常偽造大量的合法用戶IP進行攻擊,向目標發送RST數據,使得服務器拒絕對合法用戶服務。
帶寬DoS攻擊
如果你的連接帶寬足夠大,而服務器的帶寬有限,你可以通過發送大量請求來攻擊,以消耗服務器的緩沖區和帶寬。若配合SYN進行,威力不小。這種屬於初級DoS攻擊,對攻擊者資源要求較高。
自身消耗的DoS攻擊
這種攻擊方法比較古老,只有老式的系統有這種bug,比如Win95,Cisco IOSv.10.x等過時的系統。
這種攻擊是將請求客戶端IP和端口弄成主機的IP端口相同,發送給主機。使得主機自己給自己發送TCP請求連接。這種自連接的行為將很快耗費資源導致當機。目前這種攻擊對於身份認證系統還是威脅巨大。( ?)
以上這些攻擊方法都是充分利用了TCP協議的漏洞,還有其他DoS攻擊手段:
塞滿服務器硬盤
如果服務器可以沒有限制的執行寫操作,那么都能成為塞滿硬盤造成DoS攻擊的主要途徑。
1.發送垃圾郵件:通常郵件服務器與WEB服務器都放在一起,破壞者通過發送大量的垃圾郵件,將郵件隊列塞滿,從而把郵箱撐爆或是硬盤塞滿。
2.填滿日志記錄:入侵者通過構造大量的錯誤信息,讓服務器記錄這些信息,甚至可能造成日志文件非常龐雜,塞滿硬盤。同時,讓管理員痛苦的面對大量的日志文件,極難發現其入侵的真正途徑。
3.合理利用策略:一般服務器都有關於賬戶鎖定的策略,如某賬戶連續3次登錄失敗,則會自動鎖定。這點也會被破壞者利用。他們偽裝一個合法賬號登錄多次,致使該賬戶被鎖定,然后合法用戶便無法登錄了。(這種攻擊方法真是無聊到爆!)