session劫持是一種比較復雜的攻擊方法。大部分互聯(lián)網(wǎng)上的電腦多存在被攻擊的危險。這是一種劫持tcp協(xié)議的方法,所以幾乎所有的局域網(wǎng),都存在被劫持
可能。
兩臺主機要想進行TCP通信,必須經(jīng)過一個三次握手的過程。三次握手過程中服務端和客戶端一般會協(xié)商一個序列號。這個序列號一般是一個長整數(shù)。用來標記
每個數(shù)據(jù)包本來的順序。服務端或者客戶端使用這個序列號來重組在網(wǎng)絡傳輸過程中亂序了的數(shù)據(jù)包。服務端和客戶端在三次握手過程中還會協(xié)商其他的內(nèi)容
比如window
size用來通知對方自己可以緩存多少個數(shù)據(jù)包,以防止某一方過快發(fā)送數(shù)據(jù)包導致丟包。
下面簡述一下三次握手的過程:
假設A想要和B進行通信。
A會先發(fā)給B一個TCP數(shù)據(jù)包。這個數(shù)據(jù)包中的SYN標志被置位,因此又將這個數(shù)據(jù)包叫做SYN數(shù)據(jù)包。在這個數(shù)據(jù)包中會包含A的Window
size信息,并且會包含一個ISN(Initial Sequence
Number)號,就是初始序列號ISNA。好像最初的ISN號碼固定從一個數(shù)字開始,這樣更容易被人劫持,所以后來這個數(shù)字變?yōu)榱艘粋偽隨機數(shù)。這個值的取值范
是0到2^32-1。這個數(shù)據(jù)包中不帶負載數(shù)據(jù)。
B在收到SYN數(shù)據(jù)包后會返回一個SYN+ACK數(shù)據(jù)包,這個SYN+ACK數(shù)據(jù)包用來告訴A:
"我收到了你的SYN數(shù)據(jù)包"。同時B會將A發(fā)過來的ISNA號,原封不動地插入這個ACK數(shù)據(jù)包。并且將自己的ISNB號碼放入這個ACK數(shù)據(jù)包中返回給A。這個數(shù)據(jù)包
同樣不會帶任何的負載數(shù)據(jù)。
A收到B的ACK數(shù)據(jù)包時,同樣會返回給B一個ACK數(shù)據(jù)包表示成功收到對方的數(shù)據(jù)包。同時A也會將B發(fā)送來的ISNA數(shù)據(jù)+1,放入這個ACK數(shù)據(jù)包返回給B。這個數(shù)據(jù)
包中可以攜帶負載數(shù)據(jù),也可以不攜帶負載數(shù)據(jù)。(因為這時連接已經(jīng)建立了)
通過上面的三次握手之后,一個完整的TCP連接就建立好了。
之后的序列號都是主機收到的數(shù)據(jù)包中的序列號+收到包中的數(shù)據(jù)大小。第三次握手中,如果ACK數(shù)據(jù)包中攜帶數(shù)據(jù),那么ISNA就不再是+1了。而是+數(shù)據(jù)大小。
Session Hiject
TCP協(xié)議在設計之初并沒有考慮太多安全的因素。Session都是通過客戶端IP,客戶端Port,服務端IP,服務端Port來驗證的。
session劫持一般發(fā)生在A和B建立連接之后的通信過程中。Hacker一般會首先監(jiān)聽網(wǎng)絡上的通信數(shù)據(jù)包。在某次通信過程中,Hacker在B發(fā)送信息給A之前,假冒
B發(fā)給A一個數(shù)據(jù)包。這個數(shù)據(jù)包中使用B的IP和端口,并且將上次B收到的序列號+此數(shù)據(jù)包的數(shù)據(jù)大小作為序列號。在A收到這個數(shù)據(jù)包時,就會以為這個數(shù)據(jù)
是B發(fā)給他的。同時A會根據(jù)Hacker發(fā)給他的數(shù)據(jù)包修改自己的序列號。如果真正的B嘗試發(fā)送數(shù)據(jù)包給A時,A會因為序列號不正確拋棄這個數(shù)據(jù)包(這時因為B沒
有收到A的響應,所以會重發(fā)這個數(shù)據(jù)包,而這個數(shù)據(jù)包在發(fā)送到A之后又被拋棄)從此Hacker就可以代替B和A通信了。
完成這個過程一般需要一下3個步驟:
1、監(jiān)控,跟蹤某個Session通信過程。
2、破壞Session同步通信。
3、劫持這個Session。
下面簡述一下實現(xiàn)以上三個步驟的過程。
1、通過簡單的sniff就可以監(jiān)聽網(wǎng)絡上的數(shù)據(jù)包。
2、要想破壞Session同步,我們需要預測數(shù)據(jù)包的序列號。如果我們有權限訪問網(wǎng)絡,那就可以sniff到網(wǎng)絡通信過程,并且從數(shù)據(jù)包中可以計算出下個序列號
。這就是本地session劫持。如果我們沒有權限,不可以sniff到客戶端和服務端的通信過程,那就比較麻煩了。預測序列號是很不可能的,因為可選范圍太大
。(2^32中可能性)
在如法預測序列號的時候,可以通過ARP欺騙的方法對客戶端和服務端來個中間人攻擊。這樣就可以使兩者之間的通信都在Hacker的監(jiān)控之下。
3、在上面兩個步驟完成之后,就只剩下重組數(shù)據(jù)包,并且發(fā)送給通信的某一端了。重組數(shù)據(jù)包有很多中方法和現(xiàn)成的工具。這里就不說了。