歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux資訊 >> 更多Linux

2.2.x內核IP偽裝存在安全漏洞

  Linux系統2.2.x內核的IP偽裝實現中存在嚴重安全漏洞。在相關的核心代碼中對連接情況缺乏認真的檢查。攻擊者可以重寫核心中UDP偽裝表項,使攻擊者的UDP包可以被路由進內部機器。 當一個內部IP要訪問外部網絡的DNS服務器時,當發送的UDP包經過IP偽裝網關時,內核會添加一個表項來記錄這個連接。比如從內部主機A的1035端口連往外部主機C的53端口的一個UDP包,內核將這個包的源地址替換成偽裝網關(B)的IP,源端口設置成網關上為此連接分配的一個端口,缺省是從61000端口到65096端口,因此理論上可以核心同時處理4096個TCP/UDP偽裝連接。 Host A:1035 -> GW B:63767 -> Host C:53 當外部網絡發送一個UDP包到偽裝網關時,Linux IP偽裝只根據目標端口來決定是否應該將這個UDP包轉發到內部網絡。如果目標端口在已經建立的偽裝連接表中有對應表項,它就會將此包中的源ip和源端口更新相應表項的遠程主機ip和端口。攻擊者只要判斷偽裝網關的的端口就可能用自己的ip和端口來重寫偽裝連接表。偽裝網關用來為偽裝連接服務的端口范圍通常是從61000到65096,因此外部攻擊者很容易判斷哪些端口已經被用來建立連接。攻擊者可以向偽裝網關的這些端口發送UDP檢測包,然後檢查端口的ICMP應答包的IP ID。每個主機每發一個包,它的TCP/IP棧中的IP ID會遞增一。因此對於用於ip偽裝的端口所發會的ICMP應答中將會有內部主機的IP ID. 這個ID通常會與網關主機的當前IP ID相差很多,通常都在1000以上。下面的例子就顯示了利用弱點進行攻擊的過程: 主機 A 是內部主機 (192.168.1.100) 主機 B 是偽裝網關 (192.168.1.1 / 10.0.0.1) 主機 C 是一台外部DNS服務器 (10.0.0.25) 主機 X 是外部攻擊者的IP (10.10.187.13) 進行檢測之前,在偽裝網關上執行命令:ipchains -L -M -n 來顯示當前偽裝連接表的情況: > UDP 03:39.21 192.168.1.100 10.0.0.25 1035 (63767) -> 53 目前是從192.168.1.100的1035端口發往10.0.0.25的53端口的連接,偽裝端口是63767 [ 從攻擊者的機器上進行tcpdump得到的結果] (為了更容易的看清楚問題,這裡我們設置所有檢測用的包的源端口為12345 ) [ 我們的檢測將從61000端口開始,我們略掉了前面的一些結果 ] 10.0.0.1 > 10.10.187.13: icmp: 10.0.0.1 udp port 63762 unreachable [tos 0xd8] (ttl 245, id 13135) 10.10.187.13.12345 > 10.0.0.1.63763: udp 0 (DF) [tos 0x18] (ttl 254, id 23069) 10.0.0.1 > 10.10.187.13: icmp: 10.0.0.1 udp port 63763 unreachable [tos 0xd8] (ttl 245, id 13136) 10.10.187.13.12345 > 10.0.0.1.63764: udp 0 (DF) [tos 0x18] (ttl 254, id 23070) 10.0.0.1 > 10.10.187.13: icmp: 10.0.0.1 udp port 63764 unreachable [tos 0xd8] (ttl 245, id 13137) 10.10.187.13.12345 > 10.0.0.1.63765: udp 0 (DF) [tos 0x18] (ttl 254, id 23071) 10.0.0.1 > 10.10.187.13: icmp: 10.0.0.1 udp port 63765 unreachable [tos 0xd8] (ttl 245, id 13138) 10.10.187.13.12345 > 10.0.0.1.63766: udp 0 (DF) [tos 0x18] (ttl 254, id 23074) 10.0.0.1 > 10.10.187.13: icmp: 10.0.0.1 udp port 63766 unreachable [tos 0xd8] (ttl 245, id 13139) 10.10.187.13.12345 > 10.0.0.1.63767: udp 0 (DF) [tos 0x18] (ttl 254, id 23083) 10.0.0.1 > 10.10.187.13: icmp: 10.0.0.1 udp port 63767 unreachable [tos 0xd8] (ttl 244, id 17205)


^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 上面這個包的ID是17205,它與13139相差已經超過4000了,這就是說,我們發現了一個經過偽裝的連接。!!! 10.10.187.13.12345 > 10.0.0.1.63768: udp 0 (DF) [tos 0x18] (ttl 254, id 23084) 10.0.0.1 > 10.10.187.13: icmp: 10.0.0.1 udp port 63768 unreachable [tos 0xd8] (ttl 245, id 13140) 10.10.187.13.12345 > 10.0.0.1.63769: udp 0 (DF) [tos 0x18] (ttl 254, id 23088) 10.0.0.1 > 10.10.187.13: icmp: 10.0.0.1 udp port 63769 unreachable [tos 0xd8] (ttl 245, id 13141) 10.10.187.13.12345 > 10.0.0.1.63770: udp 0 (DF) [tos 0x18] (ttl 254, id 23090) 10.0.0.1 > 10.10.187.13: icmp: 10.0.0.1 udp port 63770 unreachable [tos 0xd8] (ttl 245, id 13142) 10.10.187.13.12345 > 10.0.0.1.63771: udp 0 (DF) [tos 0x18] (ttl 254, id 23091) 10.0.0.1 > 10.10.187.13: icmp: 10.0.0.1 udp port 63771 unreachable [tos 0xd8] (ttl 245, id 13143) 10.10.187.13.12345 > 10.0.0.1.63771: udp 0 (DF) [tos 0x18] (ttl 254, id 23092) 10.0.0.1 > 10.10.187.13: icmp: 10.0.0.1 udp port 63772 unreachable [tos 0xd8] (ttl 245, id 13144) [ 我們的檢測到65096端口結束,我們省略了一些結果 ] 現在我們再來檢查一下偽裝網關的偽裝連接表的情況: ipchains -L -M -n > UDP 04:35.12 192.168.1.100 10.10.187.13 1035 (63767) -> 12345 可以看到,現在遠程主機已經換成了攻擊者的ip:10.10.187.13,目標端口也換成了攻擊者檢測用的源端口:12345 現在攻擊者就可以從12345源端口發送UDP數據給內部主機的1035端口了。 <* 來源:H D Moore *> -------------------------------------------------------------------------------- 建議: 對於訪問外部DNS的問題,一個可能的解決辦法是在偽裝網關上設置一個緩存域名服務器,然後禁止UDP包的偽裝。



[ 我們的檢測到65096端口結束,我們省略了一些結果 ] 現在我們再來檢查一下偽裝網關的偽裝連接表的情況: ipchains -L -M -n > UDP 04:35.12 192.168.1.100 10.10.187.13 1035 (63767) -> 12345 可以看到,現在遠程主機已經換成了攻擊者的ip:10.10.187.13,目標端口也換成了攻擊者檢測用的源端口:12345 現在攻擊者就可以從12345源端口發送UDP數據給內部主機的1035端口了。 <* 來源:H D Moore *> -------------------------------------------------------------------------------- 建議: 對於訪問外部DNS的問題,一個可能的解決辦法是在偽裝網關上設置一個緩存域名服務器,然後禁止UDP包的偽裝。



Copyright © Linux教程網 All Rights Reserved