TCP/IP協議棧中一些報文的含義和作用
URG: Urget pointer is valid (緊急指針字段值有效)
SYN: 表示建立連接
FIN: 表示關閉連接
ACK: 表示響應
PSH: 表示有 DATA數據傳輸
RST: 表示連接重置。
1、++SYN++:一段TCP對話開始時的數據包,收到的主機將以syn+ack回應,並進入半連接狀態,將此鏈接存入隊列,等待75s(可設置)。
//:服務器接收到連接請求(syn= j),將此信息加入未連接隊列,並發送請求包給客戶(syn=k,ack=j+1),此時進入SYN_RECV狀態。當服務器未收到客戶端的確認包時,重發請求包,一直到超時,才將此條目從未連接隊列刪除。
//:SYN數據包本質上是將syn位設為1的TCP包。因此,如果你的防火牆丟棄所有的發往外網接口的SYN包,那么你將不 能讓外部任何主機主動建立連接。
++可能造成的攻擊方式++:SYN泛洪。通過大量發送目標不可達的、偽造的IP和端口號的syn連接包,大量消耗被攻擊主機帶寬和流量,可造成DDOS攻擊
++可能的防護方式++:將首次收到的syn包丟棄,由於tcp保證到達的特性,正常訪問的用戶會重傳一個syn,而惡意構造的則不會重傳。缺點是要維護一個已到達的syn數據包的表,以便確定是否已經首次拋棄。
2、++ACK++:TCP的報文到達確認(ACK),是對接收到的數據的最高序列號的確認,並向發送端返回一個下次接收時期望的TCP數據包的序列號(Ack Number)。例如,主機A發送的當前數據序號是400,數據長度是100,則接收端收到后會返回一個確認號是501的確認號給主機A
//:TCP協議應當保證數據報按序到達接收方。如果接收方收到的數據報文沒有錯誤,只是未按序號,這種現象如何處理呢?TCP協議本身沒有規定,而是由TCP協議的實現者自己去確定。通常有兩種方法進行處理:一是對沒有按序號到達的報文直接丟棄,二是將未按序號到達的數據包先放於緩沖區內,等待它前面的序號包到達后,再將它交給應用進程。后一種方法將會提高系統的效率。例如,發送方連續發送了每個報文中100個字節的TCP數據報,其序號分別是1,101,201,…,701。假如其它7個數據報都收到了,而201這個數據報沒有收到,則接收端應當對1和101這兩個數據報進行確認,並將數據遞交給相關的應用進程,301至701這5個數據報則應當放於緩沖區,等到201這個數據報到達后,然后按序將201至701這些數據報遞交給相關應用進程,並對701數據報進行確認,確保了應用進程級的TCP數據的按序到達。(++若惡意未發送201數據包,而繼續發送后續數據,緩沖區是否會溢出?++)
++可能的攻擊方式++:如上所述,是否存在緩沖區被數據填滿的情況而導致拒絕服務或者數據溢出?
3、++FIN++:FIN(ISH)為TCP報頭的碼位字段,該位置為1的含義為發送方字節流結束,用於關閉連接。
當兩端交換帶有FIN標志的TCP報文段並且每一端都確認另一端發送的FIN包時,TCP連接將會關閉。FIN位字面上的意思是連接一方再也沒有更多新的數據發送。然而,那些重傳的數據會被傳送,直到接收端確認所有的信息
//:用於TCP四次握手斷開連接,即互相發送ACK/FIN數據包,彼此ACK確認。
//:ACK/FIN包(ACK和FIN標記設為1)通常被認為是FIN(終結)包.然而,由於連接還沒有關閉,FIN包總是打上ACK標記.沒有ACK標記而僅有FIN標記的包不是合法的包,並且通常被認為是惡意的
++可能的攻擊方式++:由於TCP關閉連接四次握手,其中兩次服務器發送數據包;1:可以丟棄客戶端發送FIN之后的服務器相應的ACK/FIN數據包。2:可以丟棄服務器主動發送的FIN數據包;即:當客戶端發送FIN數據包之后,丟棄任何從服務器傳來的數據包。會導致服務器為結束連接同時在超時時間內重發兩份數據包
4、++RST++:表示復位,用來異常的關閉連接,在TCP的設計中它是不可或缺的。就像上面說的一樣,發送RST包關閉連接時,不必等緩沖區的包都發出去(不像上面的FIN包),直接就丟棄緩存區的包發送RST包。而接收端收到RST包后,也不必發送ACK包來確認。TCP處理程序會在自己認為的異常時刻發送RST包。例如,A向B發起連接,但B之上並未監聽相應的端口,這時B操作系統上的TCP處理程序會發RST包。又比如,AB正常建立連接了,正在通訊時,A向B發送了FIN包要求關連接,B發送ACK后,網斷了,A通過若干原因放棄了這個連接(例如進程重啟)。網通了后,B又開始發數據包,A收到后表示壓力很大,不知道這野連接哪來的,就發了個RST包強制把連接關了,B收到后會出現connect reset by peer錯誤。
++可能的攻擊方式++:A和服務器B之間建立了TCP連接,此時C偽造了一個TCP包發給B,使B異常的斷開了與A之間的TCP連接,就是RST攻擊了.
實際上從上面RST標志位的功能已經可以看出這種攻擊如何達到效果了。那么偽造什么樣的TCP包可以達成目的呢?我們至頂向下的看。1、假定C偽裝成A發過去的包,這個包如果是RST包的話,毫無疑問,B將會丟棄與A的緩沖區上所有數據,強制關掉連接。2、如果發過去的包是SYN包,那么,B會表示A已經發瘋了(與OS的實現有關),正常連接時又來建新連接,B主動向A發個RST包,並在自己這端強制關掉連接。這兩種方式都能夠達到復位攻擊的效果。
似乎挺恐怖,然而關鍵是,如何能偽造成A發給B的包呢? 這里有兩個關鍵因素,源端口和序列號。++一個TCP連接都是四元組,由源IP、源端口、目標IP、目標端口唯一確定一個連接++。所以,如果C要偽造A發給B的包,要在上面提到的IP頭和TCP頭,把源IP、源端口、目標IP、目標端口都填對。這里B作為服務器,IP和端口是公開的,A是我們要下手的目標,IP當然知道,但A的源端口就不清楚了,因為這可能是A隨機生成的。當然,如果能夠對常見的OS如windows和linux找出生成source port規律的話,還是可以搞定的。序列號問題是與滑動窗口對應的,偽造的TCP包里需要填序列號,如果序列號的值不在A之前向B發送時B的滑動窗口內,B是會主動丟棄的。所以我們要找到能落到當時的AB間滑動窗口的序列號。這個可以暴力解決,因為一個sequence長度是32位,取值范圍0-4294967296,如果窗口大小像上圖中我抓到的windows下的65535的話,只需要相除,就知道最多只需要發65537(4294967296/65535=65537)個包就能有一個序列號落到滑動窗口內。RST包是很小的,IP頭+TCP頭也才40字節,算算我們的帶寬就知道這實在只需要幾秒鍾就能搞定
ICMP數據報
++1、目的不可達++: 當路由器收到一個無法傳遞下去的IP報文時,會發送ICMP目的不可達報文(Type為3)給IP報文的源發送方。報文中的Code就表示發送失敗的原因。
Code
0 = net unreachable;
1 = host unreachable;
2 = protocol unreachable;
3 = port unreachable;
4 = fragmentation needed and DF set;
5 = source route failed.
++2、傳輸時間超時++:
網絡傳輸IP數據報的過程中,如果IP數據包的TTL值逐漸遞減為0時,需要丟棄數據報。這時,路由器需要向源發送方發送ICMP超時報文(Type為11),Code為0,表示傳輸過程中超時了。
一個IP數據報可能會因為過大而被分片,然后在目的主機側把所有的分片重組。如果主機遲遲沒有等到所有的分片報文,就會向源發送方發送一個ICMP超時報文,Code為1,表示分片重組超時了。
++3、參數錯誤報文++:當路由器或主機處理數據報時,發現因為報文頭的參數錯誤而不得不丟棄報文時,需要向源發送方發送參數錯誤報文(Type為12)。當Code為0時,報文中的Pointer表示錯誤的字節位置。
++4、源冷卻++:路由器在處理報文時會有一個緩存隊列。如果超過最大緩存隊列,將無法處理,從而丟棄報文。並向源發送方發一個ICMP源冷卻報文(Type為4),告訴對方:“嘿,我這里客滿了,你遲點再來。”
++5、重定向++:路由器在處理報文時會有一個緩存隊列。如果超過最大緩存隊列,將無法處理,從而丟棄報文。並向源發送方發一個ICMP源冷卻報文(Type為4),告訴對方:“嘿,我這里客滿了,你遲點再來。”
++6、請求回顯或回顯應答++:Type(8)是請求回顯報文(Echo);Type(0)是回顯應答報文(Echo Reply)。
請求回顯或回顯應答報文屬於查詢報文。Ping就是用這種報文進行查詢和回應
++6、時間戳報文++:時間戳報文是用來記錄收發以及傳輸時間的報文。Originate Timestamp記錄的是發送方發送報文的時刻;Receive Timestamp記錄的是接收方收到報文的時刻;Transmit Timestamp表示回顯這最后發送報文的時刻。
++7、信息請求或信息響應++:這種報文是用來找出一個主機所在的網絡個數(一個主機可能會在多個網絡中)。報文的IP消息頭的目的地址會填為全0,表示this,源地址會填為源IP所在的網絡IP。
在協議層面的攻擊
1、TCP SYN FLOOD攻擊
2、TCP 完整連接攻擊
3、TCP 連接結束半連接攻擊
4、UDP 流量攻擊
5、DNS 放大攻擊