深度分析TCP會話劫持
作為一種會話劫持的方法,黑客如果對一些并不可靠的協(xié)議進行劫持,那么將會輕而易舉的視線,但是TCP協(xié)議是一種被稱為可靠的傳輸協(xié)議,許多傳輸功能也都是基于TCP協(xié)議進行的,所以TCP會話劫持將作為本章討論的對象。
TCP會話劫持
根據(jù)TCP/IP中的規(guī)定,使用TCP協(xié)議進行通訊需要提供兩段序列號,TCP協(xié)議使用這兩段序列號確保連接同步以及安全通訊,系統(tǒng)的TCP/IP協(xié)議棧依據(jù)時間或線性的產(chǎn)生這些值。在通訊過程中,雙方的序列號是相互依賴的,這也就是為什么稱TCP協(xié)議是可靠的傳輸協(xié)議(具體可參見RFC 793)。如果攻擊者在這個時候進行會話劫持,結果肯定是失敗,因為會話雙方“不認識”攻擊者,攻擊者不能提供合法的序列號;所以,會話劫持的關鍵是預測正確的序列號,攻擊者可以采取嗅探技術獲得這些信息
TCP協(xié)議的序列號
現(xiàn)在來討論一下有關TCP協(xié)議的序列號的相關問題。在每一個數(shù)據(jù)包中,都有兩段序列號,它們分別為:
SEQ:當前數(shù)據(jù)包中的第一個字節(jié)的序號
ACK:期望收到對方數(shù)據(jù)包中第一個字節(jié)的序號
假設雙方現(xiàn)在需要進行一次連接:
S_SEQ:將要發(fā)送的下一個字節(jié)的序號
S_ACK:將要接收的下一個字節(jié)的序號
S_WIND:接收窗口
//以上為服務器(Server)
C_SEQ:將要發(fā)送的下一個字節(jié)的序號
C_ACK:將要接收的下一個字節(jié)的序號
C_WIND:接收窗口
//以上為客戶端(Client)
它們之間必須符合下面的邏輯關系,否則該數(shù)據(jù)包會被丟棄,并且返回一個ACK包(包含期望的序列號)。
C_ACK <= C_SEQ <= C_ACK + C_WIND
S_ACK <= S_SEQ <= S_ACK + S_WIND
如果不符合上邊的邏輯關系,就會引申出一個“致命弱點”,具體請接著往下看。
致命弱點
這個致命的弱點就是ACK風暴(Storm)。當會話雙方接收到一個不期望的數(shù)據(jù)包后,就會用自己期望的序列號返回ACK包;而在另一端,這個數(shù)據(jù)包也不是所期望的,就會再次以自己期望的序列號返回ACK包……于是,就這樣來回往返,形成了惡性循環(huán),最終導致ACK風暴。比較好的解決辦法是先進行ARP欺騙,使雙方的數(shù)據(jù)包“正常”的發(fā)送到攻擊者這里,然后設置包轉發(fā),最后就可以進行會話劫持了,而且不必擔心會有ACK風暴出現(xiàn)。當然,并不是所有系統(tǒng)都會出現(xiàn)ACK風暴。比如Linux系統(tǒng)的TCP/IP協(xié)議棧就與RFC中的描述略有不同。注意,ACK風暴僅存在于注射式會話劫持。
TCP會話劫持過程
假設現(xiàn)在主機A和主機B進行一次TCP會話,C為攻擊者,劫持過程如下:
A向B發(fā)送一個數(shù)據(jù)包
SEQ (hex): X ACK (hex): Y
FL
AGS: -AP--- Window: ZZZZ,包大小為:60
B回應A一個數(shù)據(jù)包
SEQ (hex): Y ACK (hex): X+60
FLAGS: -AP--- Window: ZZZZ,包大小為:50
A向B回應一個數(shù)據(jù)包
SEQ (hex): X+60 ACK (hex): Y+50
FLAGS: -AP--- Window: ZZZZ,包大小為:40
B向A回應一個數(shù)據(jù)包
SEQ (hex): Y+50 ACK (hex): X+100
FLAGS: -AP--- Window: ZZZZ,包大小為:30
攻擊者C冒充主機A給主機B發(fā)送一個數(shù)據(jù)包
SEQ (hex): X+100 ACK (hex): Y+80
FLAGS: -AP--- Window: ZZZZ,包大小為:20
B向A回應一個數(shù)據(jù)包
SEQ (hex): Y+80 ACK (hex): X+120
FLAGS: -AP--- Window: ZZZZ,包大小為:10
現(xiàn)在,主機B執(zhí)行了攻擊者C冒充主機A發(fā)送過來的命令,并且返回給主機A一個數(shù)據(jù)包;但是,主機A并不能識別主機B發(fā)送過來的數(shù)據(jù)包,所以主機A會以期望的序列號返回給主機B一個數(shù)據(jù)包,隨即形成ACK風暴。如果成功的解決了ACK風暴(例如ARP欺騙),就可以成功進行會TCP話劫持了。
【編輯推薦】