網絡技術是從1990年代中期發展起來的新技術,它把互聯網上分散的資源融為有機整體,實現資源的全面共享和有機協作,使人們能夠透明地使用資源的整體能力并按需獲取信息。資源包括高性能計算機、存儲資源、數據資源、信息資源、知識資源、專家資源、大型數據庫、網絡、傳感器等。 當前的互聯網只限于信息共享,網絡則被認為是互聯網發展的第三階段。 TCP/IP序列號生成方法
TCP的Initial Sequence Number(ISN)的預測
(圖1)
正常的TCP連接基于一個三次握手(3-way handshake),一個客戶端(Client)向服務器(Server)發送一個初始化序列號ISNc, 隨后,服務器相應這個客戶端ACK(ISNc),并且發送自己的初始化序列號ISNs,接著,客戶端響應這個ISNs(如下圖),三次握手完成。
C ---〉S: (ISNc)
S ---〉C: ACK(ISNc)+ ISNs
C ---〉S: ACK(ISNs)
C ---〉S: data
and / or
S ---〉C: data
下面,我以Windows2000 Advanced Server為例,來說一下兩臺主機是如何進行三次握手。
(圖2)
(圖3)
我們可以看到:
1) Smartboy首先發送一個seq:32468329的包給服務器202.116.128.6。
2) 然后, 202.116.128.6響應主機Smartboy, 它送給Smartboy自己的
seq:3333416325 而且響應Smartboy的ack:3240689240。
3) Smartboy再響應服務器202.116.128.6, seq:3240689240, ack:3333416326。
三次握手完畢,兩臺幾建立起連接。
可以看出,在三次握手協議中,Clinet一定要監聽服務器發送過來的ISNs, TCP使用的sequence number是一個32位的計數器,從0-4294967295。TCP為每一個連接選擇一個初始序號ISN,為了防止因為延遲、重傳等擾亂三次握手,ISN不能隨便選取,不同系統有不同算法。理解TCP如何分配ISN以及ISN隨時間變化的規律,對于成功地進行IP欺騙攻擊很重要。
在Unix系統里,基于遠程過程調用RPC的命令,比如rlogin、rcp、rsh等等,根據/etc/hosts.equiv以及$HOME/.rhosts文件進行安全校驗,其實質是僅僅根據源IP地址進行用戶身份確認,以便允許或拒絕用戶RPC。這就給與了那些攻擊者進行IP地址欺騙的機會。
讓我們看X是如何冒充T來欺騙S,從而建立一個非法連接 :
X---->S: SYN(ISNx ) , SRC = T
S---->T: SYN(ISNs ) , ACK(ISNT) (*)
X---->S: ACK(ISNs+1 ) , SRC = T (**)
X---->S: ACK(ISNs +1) , SRC = T, 攻擊命令(可能是一些特權命令)
但是,T必須要在第(**)中給出ISNs, 問題是ISNs在第(*)步中發給了T(X當然很難截取到),幸運的是,TCP協議有一個約定: ISN變量每秒增加250,000次,這個增加值在許多版本比較舊的操作系統中都是一個常量,在FreeBSD4.3中是125000次每秒,這就給X一個可乘之機。
看一下X是如何猜出ISNs :
a、首先, X發送一個SYN包來獲取服務器現在的ISNs
X ---〉S: (ISNx)
S ---〉X: ACK(ISNx)+ ISNs# (1)
b、緊接著,X冒充T向服務器發送SYN包
X ---〉S: SYN(ISNx ) , SRC = T (2)
c、于是,服務器發出一個響應包給T(這個包X是收不到的)
S ---〉T: SYN(ISNs$) , ACK(ISNT ) (3)
d、X計算ISNs$:
ISNs$ = ISNs# + RTT×Increment of ISN (4)
其中,RTT(Round Trip Time),是一個包往返X和S所用的時間,可以通過Ping 來得到。
(圖4)
上圖顯示了round trip times (RTT) 大概是0。
Increment of ISN是協議棧的初始序列號每秒鐘增加的值,以Unix為例,當沒有外部連接發生時,服務器的ISN每秒增加128,000,有連接的時候,服務器的ISN每秒增加64,000。
e、于是,
X ---> S : ACK(ISNs$) (冒充可信主機成功了)
X ---> S : 惡意的命令或竊取機密消息的命令
在評價以下的解決方案時有幾點要注意:
1.該解決方案是否很好地滿足TCP的穩定性和可操作性的要求? 2.該解決方案是否容易實現? 3.該解決方案對性能的影響如何? 4.該解決方案是否經得起時間的考驗?
以下的幾種方案各有各的優點和缺點,它們都是基于增強ISN生成器的目標提出的。
配置和使用密碼安全協議
TCP的初始序列號并沒有提供防范連接攻擊的相應措施。TCP的頭部缺少加密選項用于強加密認證,于是,一種叫做IPSec的密碼安全協議的技術提出了。IPSec提供了一種加密技術(End to end cryptographic),使系統能驗證一個包是否屬于一個特定的流。這種加密技術是在網絡層實現的。其它的在傳輸層實現的解決方案(如SSL/TLS和SSH1/SSH2), 只能防止一個無關的包插入一個會話中,但對連接重置(拒絕服務)卻無能為力,原因是因為連接處理是發生在更低的層。IPSec能夠同時應付著兩種攻擊(包攻擊和連接攻擊)。它直接集成在網絡層的安全模型里面。
上面的解決方案并不需要對TCP協議做任何得修改,RFC2385(“基于TCP MD5簽名選項的BGP會話保護)和其他的技術提供了增加TCP頭部的密碼保護,但是,卻帶來了收到拒絕服務攻擊和互操作性和性能方面的潛在威脅。使用加密安全協議有幾個優于其它方案的地方。TCP頭部加密防止了Hijacking和包擾亂等攻擊行為,而TCP層仍然能夠提供返回一個簡單增加ISN的機制,使方案提供了最大程度的可靠性。但實現IPSec非常復雜,而且它需要客戶機支持,考慮到可用性,許多系統都選擇使用RFC 1948。
使用RFC1948
在RFC1948中,Bellovin提出了通過使用4-tuples的HASH單向加密函數,能夠使遠程攻擊者無從下手(但不能阻止同一網段的攻擊者通過監聽網絡上的數據來判斷ISN)。
Newsham 在他的論文 [ref_newsham]中提到:
RFC 1948 [ref1]提出了一種不容易攻擊(通過猜測)的TCP ISN的生成方法。此方法通過連接標識符來區分序列號空間。每一個連接標識符由本地地址,本地端口,遠程地址,遠程端口來組成,并由一個函數計算標識符分的序列號地址空間偏移值(唯一)。此函數不能被攻擊者獲得,否則,攻擊者可以通過計算獲得ISN。于是,ISN就在這個偏移值上增加。ISN的值以這種方式產生能夠抵受上面提到的對ISN的猜測攻擊。
一旦全局ISN空間由上述方法來生成,所有的對TCP ISN的遠程攻擊都變得不合實際。但是,需要指出的,即使我們依照RFC 1948來實現ISN的生成器,攻擊者仍然可以通過特定的條件來獲得ISN(這一點在后面敘述).
另外,用加密的強哈希算法(MD5)來實現ISN的生成器會導致TCP的建立時間延長。所以,有些生成器(如Linux kernel )選擇用減少了輪數的MD4函數來提供足夠好的安全性同時又把性能下降變得最低。削弱哈希函數的一個地方是每幾分鐘就需要對生成器做一次re-key 的處理,經過了一次re-key的處理后,安全性提高了,但是,RFC793提到的可靠性卻變成另一個問題。
我們已經知道,嚴格符合RFC1948的ISN生成方法有一個潛在的危機:
一個攻擊者如果以前合法擁有過一個IP地址,他通過對ISN進行大量的采樣,可以估計到隨后的ISN的變化規律。在以后,盡管這個IP地址已經不屬于此攻擊者,但他仍然可以通過猜測ISN來進行IP欺騙。
以下,我們可以看到RFC 1948的弱點:
ISN = M + F(sip, sport, dip, dport, )
其中
ISN 32位的初始序列號
M 單調增加的計數器
F 單向散列哈希函數 (例如 MD4 or MD5)
sip 源IP地址
sport 源端口
dip 目的IP地址
dport 目的端口
哈希函數可選部分,使遠程攻擊者更難猜到ISN.
ISN自身的值是按照一個常數值穩定增加的,所以F()需要保持相對的穩定性。而根據Bellovin 所提出的,是一個系統特定的值(例如機器的啟動時間,密碼,初始隨機數等),這些值并不 會經常變。
但是,如果Hash函數在實現上存在漏洞(我們無法保證一個絕對安全的Hash函數,況且,它的實現又與操作系統密切相關),攻擊者就可以通過大量的采樣,來分析,其中,源IP地址,源端口,目的IP地址,目的端口都是不變的,這減少了攻擊者分析的難度。
Linux TCP的ISN生成器避免了這一點。它每5分鐘計算一次值,把泄漏的風險降到了最低。
有一個辦法可以做的更好:
取M = M + R(t)
ISN = M + F(sip, sport, dip, dport, )
其中
R(t) 是一個關于時間的隨機函數
很有必要這樣做,因為它使攻擊者猜測ISN的難度更大了(弱點在理論上還是存在的)。
網絡的神奇作用吸引著越來越多的用戶加入其中,正因如此,網絡的承受能力也面臨著越來越嚴峻的考驗―從硬件上、軟件上、所用標準上......,各項技術都需要適時應勢,對應發展,這正是網絡迅速走向進步的催化劑。
|