本文主要介紹DOS的機理和常見的實施方法。因前段時間仔細了解了TCP/IP協議以及RFC文檔,有點心得。同時,文中有部分內容參考了Shaft的文章翻譯而得。要想了解DOS攻擊得實現機理,必須對TCP有一定的了解。所以,本文分為兩部分,第一部分介紹一些實現DOS攻擊相關的協議,第二部分則介紹DOS的常見方式。
什麼是DOS攻擊
DOS:即Denial Of Service,拒絕服務的縮寫,可不能認為是微軟的dos操作系統了。好象在5?1的時候鬧過這樣的笑話。拒絕服務,就相當於必勝客在客滿的時候不再讓人進去一樣,呵呵,你想吃餡餅,就必須在門口等吧。DOS攻擊即攻擊者想辦法讓目標機器停止提供服務或資源訪問,這些資源包括磁盤空間、內存、進程甚至網絡帶寬,從而阻止正常用戶的訪問。比如:
* 試圖FLOOD服務器,阻止合法的網絡通訊
* 破壞兩個機器間的連接,阻止訪問服務
* 阻止特殊用戶訪問服務
* 破壞服務器的服務或者導致服務器死機
不過,只有那些比較陰險的攻擊者才單獨使用DOS攻擊,破壞服務器。通常,DOS攻擊會被作為一次入侵的一部分,比如,繞過入侵檢測系統的時候,通常從用大量的攻擊出發,導致入侵檢測系統日志過多或者反應遲鈍,這樣,入侵者就可以在潮水般的攻擊中混騙過入侵檢測系統。
有關TCP協議的東西
TCP(transmission control protocol,傳輸控制協議),是用來在不可靠的因特網上提供可靠的、端到端的字節流通訊協議,在RFC793中有正式定義,還有一些解決錯誤的東西在RFC 1122中有記錄,RFC 1323則有TCP的功能擴展。
我們常見到的TCP/IP協議中,IP層不保證將數據報正確傳送到目的地,TCP則從本地機器接受用戶的數據流,將其分成不超過64K字節的數據片段,將每個數據片段作為單獨的IP數據包發送出去,最後在目的地機器中再組合成完整的字節流,TCP協議必須保證可靠性。
發送和接收方的TCP傳輸以數據段的形式交換數據,一個數據段包括一個固定的20字節頭,加上可選部分,後面再跟上數據,TCP協議從發送方傳送一個數據段的時候,還要啟動計時器,當數據段到達目的地後,接收方還要發送回一個數據段,其中有一個確認序號,它等於希望收到的下一個數據段的順序號,如果計時器在確認信息到達前超時了,發送方會重新發送這個數據段。
上面,我們總體上了解一點TCP協議,重要的是要熟悉TCP的數據頭(header)。因為數據流的傳輸最重要的就是header裡面的東西,至於發送的數據,只是header附帶上的。客戶端和服務端的服務響應就是同header裡面的數據相關,兩端的信息交流和交換是根據header中的內容實施的,因此,要實現DOS,就必須對header中的內容非常熟悉。
下面是TCP數據段頭格式。
Source Port和 Destination Port :是本地端口和目標端口
Sequence Number 和 Acknowledgment Number :是順序號和確認號,確認號是希望接收的字節號。這都是32位的,在TCP流中,每個數據字節都被編號。
Data offset :表明TCP頭包含多少個32位字,用來確定頭的長度,因為頭中可選字段長度是不定的。
Reserved : 保留的6位,現在沒用,都是0 接下來是6個1位的標志,這是兩個計算機數據交流的信息標志。接收和發送斷根據這些標志來確定信息流的種類。下面是一些介紹:
URG:(Urgent Pointer field significant)緊急指針。用到的時候值為1,用來處理避免TCP數據流中斷 。
ACK:(Acknowledgment field significant)置1時表示確認號(Acknowledgment Number)為合法,為0的時候表示數據段不包含確認信息,確認號被忽略。
PSH:(Push Function),PUSH標志的數據,置1時請求的數據段在接收方得到後就可直接送到應用程序,而不必等到緩沖區滿時才傳送。
RST:(Reset the connection)用於復位因某種原因引起出現的錯誤連接,也用來拒絕非法數據和請求。如果接收到RST位時候,通常發生了某些錯誤。
SYN:(Synchronize sequence numbers)用來建立連接,在連接請求中,SYN=1,ACK=0,連接響應時,SYN=1,ACK=1。即,SYN和ACK來區分Connection Request和Connection Accepted。
FIN:(No more data from sender)用來釋放連接,表明發送方已經沒有數據發送了。
知道這重要的6個指示標志後,我們繼續來。
16位的WINDOW字段:表示確認了字節後還可以發送多少字節。可以為0,表示已經收到包括確認號減1(即已發送所有數據)在內的所有數據段。