当前位置:Linux教程 - Linux文化 - 2.2.x内核IP伪装存在安全漏洞

2.2.x内核IP伪装存在安全漏洞



发布日期: 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包的伪装。


——摘自:绿色兵团