已經有很多介紹DOS(Denial of Service,即拒絕服務)攻擊的文章,但是,多數人還是不知道DOS到底是什麼,它到底是怎麼實現的。本文主要介紹DOS的機理和常見的實施方法。因前段時間仔細了解了TCP/IP協議以及RFC文檔,有點心得。
同時,文中有部分內容參考了Shaft的文章翻譯而得。要想了解dos攻擊得實現機理,必須對TCP有一定的了解。
1、什麼是dos攻擊
DOS:即Denial Of Service,拒絕服務的縮寫,可不能認為是微軟的DOS操作系統了。好象在5·1的時候鬧過這樣的笑話。拒絕服務,就相當於必勝客在客滿的時候不再讓人進去一樣,呵呵,你想吃餡餅,就必須在門口等吧。dos攻擊即讓目標機器停止提供服務或資源訪問。
2、有關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數據段頭格式。RFC793中的
(請大家注意網頁顯示空格使下面的格式錯位了)
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Source Port Destination Port
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Sequence Number
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Acknowledgment Number
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Data U A P R S F
Offset Reserved R C S S Y I Window
G K H T N N
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Checksum Urgent Pointer
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Options Padding
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
data
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
TCP Header Format
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的時候表示數據段不包含確認信息,確認號被忽略。