讀書筆記 —TCP Reset封包的網路攻擊
這篇筆記,主要是記錄我閱讀 Paul A. Watson 於2003年發表的文章『Slipping in the Window: TCP Reset Attacks』,他在十幾年前提出了TCP協定(RFC 793)中,可能造成的漏洞,其漏洞在2010年新的規範RFC 5961已經被修補,但實作上並非都會採用RFC 5961的規範,這篇文章將會簡單帶大家瞭解這個漏洞可能引發的方法。
TCP Reset是一個可以強制中斷雙方連線的封包,攻擊者可以用它來中斷原本的服務,這種攻擊方式是屬於一種阻斷式攻擊,目的不是竊取資料,而是讓服務中斷,影響服務品質。
背景
Sliding Window
網路的意義在於讓兩台電腦可以互相溝通,網際網路就讓這個概念擴增到全世界的電腦可以互相溝通,但是所有電腦不可能彼此互連,所以當我們要傳訊息給遠方的朋友時,中間會經過很多不同的電腦幫忙傳遞。
基於物理限制,你想要傳遞的訊息不可能一整包整個傳過去,就像是宅配還是會限制一個箱子最大多大一樣,他會限制你一次傳遞過去的資料最高多大,假設我們要傳遞的資料有256k,而這個限制假設是4k,那我們就得分成64份並打上順序編號,每一份就是一個封包,但是有個限制,就是當對方收到完整64份資料的時候,他才會知道完整的資料是什麼。
前述說過,你要把資料傳遞給遠方的朋友,中間會經過很多人,經過越多人風險就越大,有可能資料被幹走,或是資料被傳到中國出不來,如果你不在意每個封包有沒有正確傳遞給對方,那你的電腦就瘋狂的送出64個封包然後結束,這種方式就是所謂的UDP,速度非常快。
當然,這世界上還是有很多很重要的資料,我們必須讓這些資料安穩地到達(也就是所謂的可靠性),做法很簡單,我們送出一個封包給對方,對方收到之後送個封包回來告訴我他收到了,那我就知道他已經收到,可以再送下一個封包了,這種告知已收到的封包稱之為ACK封包。那如果對方超過我規定的時間把ACK封包送回來,那我就會主觀的認為他沒收到這個封包,我重送就是了。這種方式可以讓我知道對方都有收到封包。這種方式就是所謂的TCP,速度比UDP還慢,因為你每次都要等封包。
因為每次送一個封包出去就要等他回來,這樣速度實在太慢了,所以我們就想個機制,那我們就一次送三個封包,等他們回應ACK之後,再持續送出封包就好,這就是所謂的 Sliding Window,為達到效率及可靠性,我們決定一次送五個打上編號的封包出去(Window Size為5),假設一號封包的ACK先回來,我們再送出六號封包,有一項特別的規定,假設三號封包先回ACK,還是得等二號封包回ACK才會再送封包出去,整個設計很有排隊的風範。(附註:因為接收端不見得會按照順序收到,可能會是1 3 2 5 4之類的順序收到封包,無法預測)
Window Size越大,就越像UDP,速度就越快。
TCP Reset 封包
封包在傳遞資料的前後,需要很多的溝通,包含資料怎麼傳遞或是告知資料對方已經傳完,不要再收了等等。
TCP Reset封包就是個特殊封包,他會告訴接收人,強制中斷連線,不管你收到哪,不要再收資料了。在RFC 793的規範中,若是TCP Reset封包上的編號是有效的,則該封包就被認定為正常封包。而接收端一旦收到 TCP Reset 封包,就會立即中斷連線。
假封包
傳統攻擊方式會製作一堆假封包,每個封包附上一組猜測的封包編號,送到接收者,這種方式又稱之為 Off-path attack(畢竟封包跟原本路徑不一樣),這種攻擊方式其實很沒效率,因為攻擊方其實不知道封包的起始編號(Initial Sequence Numberm, ISN)是多少(通常不會是1),他的可能性可能多達42億(2³²),攻擊方很難短時間產生這麼多假封包送出去猜,同時若是送太多封包出去,很容易被發現正在攻擊別人。
所以在這情況下,硬體廠商只要在挑選起始封包編號夠隨機就可以了,
但是,現在化的網路設備開始進入Gb等級,撥接網路越來越高,取而代之的是寬頻網路,現代化的設備導致利用大量假封包造成阻斷攻擊的難度提高,但少數方法卻不受影響,他就是 TCP Reset 攻擊。
攻擊方法
現實情境
在現實狀況之下,因為有 Sliding Window 的幫忙,所以攻擊者不需要瘋狂猜測封包編號,因為Sliding Window讓發送者可以同時發送很多個封包,所以接收端也會同時接受一個範圍的封包。
再加上TCP Reset封包的特性,只要一個封包就可以讓接收端選擇中斷連線,而在Sliding Window機制之下,該封包序號甚至不需要按順序接收,這給攻擊者一個機會,可以提升攻擊的成功性。
TCP Reset 攻擊
基本概念是利用 Window Size 來減少對封包序號的猜測,此種攻擊方法要求『接收端必須允許順序不對,但是序號仍在Windows Size範圍的封包被接收』,若是成功的話,連線就會立即被中斷。
傳統TCP封包會把Window Size設定為65535(2¹⁶),這代表原本(2³²)的序號,只需要猜65535次內就可以猜中。
若是有Window Scaling (RFC-1323)的幫忙,則攻擊會更加容易。
TCP Window Scaling
TCP Window Scaling在RFC-1323中被加入,這是一種讓TCP能有高效能的擴充規格,此種擴充規格用來加大Window Size,最高可達1,073,741,823 bytes。他通常用於LFN (Long Fat Network)網路,這種網路特性是高速及高延遲,像是衛星網路就會採用這樣的技術。
當Window Size被大幅度地增加,TCP Reset攻擊的難度就會大幅度下降。
而Cisco設備之間會採用BGP的協議,該協議會讓Window Size下降到16384,但可延伸到65535,這可以減少攻擊的成功性。
作業系統的設定
前述說過,Window Size的大小跟攻擊的難度很有關係,而在不同作業系統中,有不同的預設值。(詳情自行參考文章)
當然,作業系統在追求效能的狀況之下,Window Size通常都比較大。
封包編號初始值的猜測
通常都以亂數進行猜測,然而卻有例外狀況。
Bindview的Michal Zalewski在2003年的文章『Strange Attractors and TCP/IP Sequence Number Analysis — One Year Later (Zalewski, 2003).』提出,Cisco的IOS裝置在產生ISN時,曾經有設計瑕疵,目前已經被修復。此類的瑕疵讓編號的初始值時,具有可預測性。
而作業系統(Win95, 98, NT, 2000, AIX, HP/UX, IRIX, MacOS, and others),在ISN的可預測性是『戲劇化的容易』,另外如前述所說,因為效能考量所以加大了Window Size,在兩個因素混合之下,降低了攻擊方的難度。
TCP Source Port的猜測
一個成功的 TCP Reset 攻擊,還需要猜中四個東西,分別是封包原始發送者的IP/Port 以及接收者的IP/Port,雙方的IP比較容易得知,接收者的Port也很容易,特定服務就會在特定的Port。
唯一一個困難的點,在於封包原發送者的Port,每個新的TCP連線都會產生一組新的,而這個Port的可能性高達65536(2¹⁶)種可能。
然而,65536個port並非全部都有可能,像是1–1024就被保留給process,49152–65535被保留給私人的port,有些作業系統還會保留 5001–65535給自己使用,所以只會剩下3977種可能的port。
(文章中有整理了一些作業系統告訴大家他可能的port號範圍。)
所以攻擊方若是很清楚地知道雙方的系統狀況,那麼成功率同時也會大幅度提升。
結論
實驗的部分我就不整理了,僅整理出這篇的觀點跟大家分享。這篇文章我不是第一次看了,但是資訊安全類的文章通常細節都滿多的,我也無法全部都記起來,所以將筆記下來,之後比較好複習,也跟有興趣的朋友一同分享。