這是一篇簡介IP-Spoofing(IP欺騙)原理的文章.想當年著名Hacker,Kevin與安全專家
下村勤之間的較量就是以IP-Spoofing開始的.這篇文章需要你具有一定的unix基礎和tcpip概念,
IP-Spoofing 是一種比較復雜的攻擊手段.但准確的說它是一次攻擊的一個步驟.文章
中使用的一些標記:
A:目標主機
B:被信任主機
C:不可達主機
Z:發起攻擊的主機
(1)2:主機1偽裝成主機2
文章中常用的一種圖解:
tick host a control host b
1 A --SYN---> B
tick:一段時間的泛指.
host a:一台加入到tcp會話中的機器.
control:tcp頭中設置的相關的位.
host b:一台加入到tcp會話中的機器.
這裡是說明主機A向主機B發了一條SYN置位的包.
在Unix主機中,信任的方式時非常簡單的.假如你在主機A和主機B中各有一個賬號.你希望在主
機A和主機B中能夠比較方便的來回登錄.你可以在自己的目錄下建立一個.rhost文件.在A種的
文件中可以簡單的寫上" B username",在B中的類似(在/etc/hosts.equiv中可以為整個系統建
立信任關系,相關的具體語法可以參考其他資料).現在你就可以用那些以r開頭的系統命令了,
而不需要每次都輸入密碼.看看發生了什麼,所有的認證都是基於主機的,也就是基於ip的,只
要你是來自這個ip的就認為是可以信任的.ip-sproofing就是對基於ip認證的系統進行攻擊的一
種手段.比如說rlogin命令,就是一個通過這種機制,可以不輸入密碼就登錄到遠程主機的命令.
我們都知道ip是無連接的,不可靠的協議.它的32bit的頭中,包含了自己要去的
目的主機的ip地址,幾乎所有的tcp/ip協議的傳輸都是被包含在ip包中發送的.它的
所有的可靠性都是由它的上層協議來保證的.如果不可達,icmp的不可達報文就會發送會主機.它
的無狀態的特性,說明它不保存上一個包的任何狀態.因此,我們就可以通過修改ip協議棧的方法,
把所需要的ip地址填寫到我們所發送出去的ip包中,來達到冒充其他主機的目的.
tcp協議是保證傳遞可靠的上層協議,它通過多種方法實現可靠傳遞.但我們所關心的只
有兩種,即數據的sequence號和Acknowledgement號.tcpip協議棧會對所有發出的數據分配seq號,
對所有接收到的數據,會發出ack以表示確認.因為它要處理丟包,重發等等情況.seq號可以是一個
32位的數字,所以它的范圍在 0-- 4,294,967,295之間.所有的tcp頭中的seq號是所發送的數據的
第一個字節的序號.ack號是下一個所希望得到的數據的seq號.
tcp還利用滑動窗口和窗口通告的方式來進行流控.窗口的大小是16比特的.所以這也限制
了在特定情況下的seq號的上限.這為我們以後猜測seq號,縮小了范圍.其他的tcp中的置位信息,
如RST,PSH,FIN的意義可以參考一下相關的書籍.
在傳送數據之前要建立連接,就是常說的3次握手,示意圖如下
1 A ---SYN---> B
2 A <---SYN/ACK--- B
3 A ---ACK---> B
在(1)中,客戶端會同時發送它的seq起始號(ISN).在(2)中,服務器會返回自己的ISN和對(1)中ISN
的一個回應ACK號(ISN(A)+1),在(3)中,客戶端會返回對(2)中服務器的ISN的回應ACK號(ISN(B)+1).
因為現在並沒有傳遞什麼數據,所以現在的seq,ack都是為了以後傳遞數據所進行的初始化.
最重要的一點是,你要知道起始的seq號是如何被選擇的和它們與時間變化所相關的聯系.
一般來說當機器啟動的時候,seq被初始化成1.這種管理,已經被公認為是不好的.在一般的
tcp_init()源程序的注釋中你可以找到類似的注釋.初始化的序列號(ISN)會每秒鐘增加128,000,
大概一個32位的ISN在沒有任何連接的情況下,9.32個小時後會發生循環,而且,每發生一次
connect()的調用,會增加64,000.
為什麼要使用這種可預測的ISN選取方式呢?為什麼不用隨機的方法呢?因為我們知道每次
連接會有4個量來標記(一對tcp端口和ip地址).如果一個老的連接中的一個在網上游蕩了很久的
包,現在被投遞了過來.而由一個新的連接永了同樣的端口對,我們只能用seq來區分數據的正確
性.如果每次用隨機的seq,將無法保證seq號在這種情況下不會發生沖突.每次增大,將有效的解決
這個問題.但是也給安全留下了隱患.
攻擊過程:
ip-spoofing攻擊包括幾個步驟:
1.找到要攻擊的主機A
2.發現和它有關的信任主機B
3.將B利用某種方法攻擊癱瘓
4.對A的seq號進行取樣
5.猜測新的可能的seq號
6.用這個seq號進行嘗試連接
7.如果連接成功,則執行一個命令,留下一個後門.
當然,一般由軟件會配合整個攻擊過程.一般攻擊從一台你擁有root賬號的主機開始,以獲
取另一個主機的root賬號為目的.
IP-spoofing的最大困難是你所進行的是一次盲攻擊.因為你偽裝成別的主機,所以中間的
路由器不會把包路由回來.當然主機B(被信任的主機)已經被你攻擊癱瘓,它無法回應.而你要在無法
接受任何回應包的同時,參測可能的回應包,並替代主機B做回答.怎麼樣?不容易吧!這其中最需要的
猜測的就是seq號了.猜錯了,目標主機就會丟棄你的包.
尋找主機A的信任主機,也是一件不太容易的事.你可以通過showmout命令或rpcinfo,
nslookup得到一些信息.這需要你有很豐富的經驗.具體方法,請參考相關的書籍.實在不行,只能在
相鄰的一些ip上進行猜測.
攻擊信任主機使它癱瘓,也是必不可少的一步.但它本身也可以單獨寫一篇文章,所以
ip-spoofing是比較高級的攻擊方法一種.這裡你可以使用各種類型的flood(洪水)軟件,進行攻擊.
原理就是在一定時間內發出大量的包給目的主機,使主機資源耗盡,達到攻擊的目的.
現在進入了主要部分.猜測目的主機的seq號.首先主機要以真實的身份做幾次嘗試性的連
接,把其中的ISN號記錄下來.並對RTT(round-trip time)往返時間進行猜測.RTT將被用來猜測下一次
可能的ISN(配合128,000/秒,64,000每次連接的規律).一般要猜測很多次.在這之中可能會出現幾種
情況:
1.如果猜測正確,數據將會放到接收緩沖區中.
2.如果seq小於目的主機所期望的seq號,包被丟棄
3.如果seq大於目的主機所期望的seq號,但是小於tcp的接受窗口范圍,將被放到一個懸掛隊列中,因
為有可能是後發送的數據,先到達了.
4.如果目的主機所期望的seq號,又不在tcp的接受窗口范圍之內,包被丟棄.
下面是一個攻擊的示意圖:
1 Z(b) ---SYN---> A
2 B <---SYN/ACK--- A
3 Z(b) ---ACK---> A
4 Z(b) ---PSH---> A
攻擊如果得手,一般會執行一個命令,比如`cat + + >> ~/.rhosts` ,這使目標主機信任所
有的主機.由此也可以看到.rhost文件是多麼的危險.
再強調一遍,這所有的一切都是建立在ip認證的基礎上,所以ip認證的所有軟件,都有同樣的
問題.如果不是十分的必須,請不要使用 .rhost, /etc/host.equiv之類的文件,和r*命令.或者用你
的路由器把從外部來的對這種認證的請求全部屏蔽掉.
由於ISN的這種非隨機的選取機制,使ip-spoofing能夠得逞. Bellovin描述了一種解決方法.
每一次連接都有自己的seq空間,但是這些空間之間的數字沒有明顯的關聯關系.例如:
ISN=M+F(localhost,localport,remotehost,remoteport)
M是一個計時器,F是一個加密散列值.F是無法計算的.用這種機制可以解決問題.
但是,畢竟Internet不可能在一夜之間改變.在Internet上到處潛伏著危機.
Ip-spoofing的軟件,在很多地方可以找到.這裡就不列舉了.
sphinx Zhu
1999.4.19
有的主機.由此也可以看到.rhost文件是多麼的危險.
再強調一遍,這所有的一切都是建立在ip認證的基礎上,所以ip認證的所有軟件,都有同樣的
問題.如果不是十分的必須,請不要使用 .rhost, /etc/host.equiv之類的文件,和r*命令.或者用你
的路由器把從外部來的對這種認證的請求全部屏蔽掉.
由於ISN的這種非隨機的選取機制,使ip-spoofing能夠得逞. Bellovin描述了一種解決方法.
每一次連接都有自己的seq空間,但是這些空間之間的數字沒有明顯的關聯關系.例如:
ISN=M+F(localhost,localport,remotehost,remoteport)
M是一個計時器,F是一個加密散列值.F是無法計算的.用這種機制可以解決問題.
但是,畢竟Internet不可能在一夜之間改變.在Internet上到處潛伏著危機.
Ip-spoofing的軟件,在很多地方可以找到.這裡就不列舉了.
sphinx Zhu
1999.4.19