筆記:非法tcp報文以及防火牆過濾

 

一、非法TCP報文攻擊

在TCP報文的報頭中,有幾個標誌字段:

1.  SYN:連接建立標誌,TCP SYN報文就是把這個標誌設置爲1,來請求建立連接。

2.  ACK:迴應標誌,在一個TCP連接中,除了第一個報文(TCP SYN)外,所有報文都設置該字段作爲對上一個報文的響應。

3.  FIN: 結束標誌,當一臺主機接收到一個設置了FIN標誌的TCP報文後,會拆除這個TCP連接。

4.  RST:復位標誌,當IP協議棧接收到一個目標端口不存在的TCP報文的時候,會迴應一個RST標誌設置的報文。

5.  PSH:通知協議棧儘快把TCP數據提交給上層程序處理。

非法TCP報文攻擊是通過非法設置標誌字段致使主機處理的資源消耗甚至系統崩潰,例如以下幾種經常設置的非法TCP報文:

1.        SYN 比特和FIN比特同時設置的TCP報文

正常情況下,SYN標誌(連接請求標誌)和FIN標誌(連接拆除標誌)不能同時出現在一個TCP報文中,而且RFC也沒有規定IP協議棧如何處理這樣的畸形報文。因此各個操作系統的協議棧在收到這樣的報文後的處理方式也不相同,攻擊者就可以利用這個特徵,通過發送SYN和FIN同時設置的報文,來判斷操作系統的類型,然後針對該操作系統,進行進一步的攻擊。

2.        沒有設置任何標誌的TCP報文

正常情況下,任何TCP報文都會設置SYN,FIN,ACK,RST,PSH五個標誌中的至少一個標誌,第一個TCP報文(TCP連接請求報文)設置SYN標誌,後續報文都設置ACK標誌。有的協議棧基於這樣的假設,沒有針對不設置任何標誌的TCP報文的處理過程,因此這樣的協議棧如果收到了這樣的報文可能會崩潰。攻擊者利用了這個特點,對目標主機進行攻擊。

3.        設置了FIN標誌卻沒有設置ACK標誌的TCP報文

正常情況下,除了第一報文(SYN報文)外,所有的報文都設置ACK標誌,包括TCP連接拆除報文(FIN 標誌設置的報文)。但有的攻擊者卻可能向目標主機發送設置了FIN標誌卻沒有設置ACK標誌的TCP報文,這樣可能導致目標主機崩潰。

4.建立TCP連接(通過3次握手實現)
假如服務器A和客戶機B通信。
(1)B->;A。當B要和A通信時,B首先向A發一個SYN標記的包,告訴A請求建立連接。只有當A收到B發來的SYN包,纔可以建立連接,除此之外別無它法。因此,如果你的防火牆丟棄所有的發往外網接口的SYN包,那麼你將不能讓外部任何主機主動建立連接。
(2)B<-A。接着,A收到後會發一個對SYN包的確認包(SYN/ACK)回去,表示對第一個SYN包的確認,並繼續握手操作。
(3)B->;A。B收到SYN/ACK包後,B發一個確認包(ACK),通知A連接已建立。至此,3次握手完成,一個TCP連接完成。
需要注意的是,當3次握手完成、連接建立以後,TCP連接的每個包都會設置ACK位。這就是爲何連接跟蹤很重要的原因了,沒有連接跟蹤,防火牆將無法判斷收到的ACK包是否屬於一個已經建立的連接。
2.1.2 結束TCP連接(通過4次握手實現)
假如服務器A和客戶機B通信。注意,由於TCP連接是雙向連接,因此關閉連接需要在兩個方向上做。
(1)B->;A。當B要與A結束通信時,B首先向A發一個FIN標記的包,告訴A請求結束連接。由於連接還沒有關閉,FIN包總是打上ACK標記。沒有ACK標記而僅有FIN標記的包不是合法的包,並且通常被認爲是惡意的。
(2)B<-A。A送出ACK包給B,表示成功地中止B->;A傳輸通道。不過A->;B可能還有數據包需要傳送,所以A->;B傳輸通道仍舊繼續暢通,直到傳輸完畢纔會進入下一步。
(3)B<-A。當A完成B<-A的傳輸後,便送出ACK/FIN包。
(4)B->;A。B送出ACK包給A進行確認。
2.1.3 發送連接復位包結束TCP連接
4次握手不是結束TCP連接的唯一方法。有時,如果主機需要儘快關閉連接(或連接超時,端口或主機不可達),RST包將被髮送。注意,由於RST包不是 TCP連接中的必須部分,可以只發送RST包(即不帶ACK標記)。但在正常的TCP連接中RST包可以帶ACK確認標記。注意,RST包是可以不要收方進行確認的。
2.1.4 無效的TCP標記
至此,已經看到了SYN、ACK、FIN、和RST標記。另外,還有PSH和URG標記。
最常見的非法組合是SYN/FIN包。注意,由於SYN包是用來初始化連接的,它不可能和FIN以及RST標記一起出現,這也是一個惡意攻擊。
當網絡中出現別的一些組合(如SYN/FIN/PSH、SYN/FIN/RST、SYN/FIN/RST/PSH),很明顯網絡肯定受到了攻擊。
另外,已知的非法包還有FIN(無ACK標記)和“NULL”包。如同早先討論的,由於ACK/FIN包的出現是爲了結束一個TCP連接,那麼正常的 FIN包總是帶有ACK標記的。“NULL”包就是沒有任何TCP標記的包(URG、ACK、PSH、RST、SYN、FIN都爲0)。
在正常的網絡活動下,到目前爲止TCP協議棧不可能產生帶有上面提到的任何一個標記組合的TCP包。當你發現這些不正常的包時,肯定有人對你的網絡不懷好意。另外利用tcp報文的其他字段的漏洞也可以進行網絡攻擊如果字段mss,序列號,確認號。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章