ARP欺骗和ICMP欺骗催生全新DOS工具(4)
三、解决方案
对于大多数人来说,ARP是一个隐藏的底层协议。你以时不时的观察它,但是平常不会有人对它发生兴趣。你可以用arp命令来检查你的ARP缓存,但是当一个网络出现问题的时候,这个并不是我们首先想到的。Windows也存在这个命令,记住这一点也许对你有帮助。但是当一个ARP欺骗通过网关从另一个网络发向你时,恐怕你也无能为力了。同样的,你也可以在你的路由表中发现重定向的路由信息(route 命令,用“D”标志来标明)。
ARP攻击设计来攻击10Base2以太网。如果网络已一些比较先进的方式进行连接,通常是智能HUB或交换机,那么攻击就很容易被发现,甚至是不可能的(类似于被动攻击)。所以这是一个向你的老板要求更新网络设备的理由。
这么想起来,ICMP重定向真是一个非常疯狂的想法。首先,一些网络的结构非常简单,对路由表不需要任何添加;其次,大多数的稳定的网络上,仅仅是用手动的办法来更新路由。这并不是一个经常更新的工作,为什么要通过ICMP呢?最后,这个对于你来说是非常危险的,你可以在你的系统上关闭ICMP重定向,这样可以减少同RFC1122的冲突。哎,这可不容易呀!在Linux这种提供源码的机器上,你可以重新编译内核。在Irix 6.2和一些其它的系统上,可以“set icmp_dropredirects=1”。这与其它的OS,我也不知道有什么办法。
时间证明了这个真理:不要信任未确认的主机。否则,网络上帝不会对你施予怜悯的。 一些人认为“我有防火墙,我怕谁”,认为一些安全问题对它来说无关紧要。我承认防火墙的作用,但是这并不是经常有效。
想象这样一个环境,所有的机器都直接与Internet相连,你不得不与你不了解的人共用你的内部网,他们使用的是vanilla SGI 的机器,而他们简直是在到处告诉别人“来攻击我吧,我的买主使它非常简单”(是这样的,那些人认识Unix,从侏罗纪公园...),另外,通向你的路由器由别的机构控制。让我们来到一个标准的网络环境,它会提供我们安全,不受外部的攻击。人们在这里工作,使用电脑。同样,这里的每台机器也存在安全问题。所以,当你下一次提到防火墙的时候,请记住它并不能保护每一个人。
John Goerzen提供了一个Perl脚本,可以在系统启动时运行。它主要是在Linux机器中维持一个已知的IP地址与硬件地址的缓存,设置标志,以使其不会被更新和改变。配置文件非常简单——IP addr 配 MAC addr,用空格键分割,“#”作为注释。
这个脚本仅仅在Linux机器上测试过——在其它平台上的人需要修改arp命令的格式。
注意:脚本需要运行在网络接口启动之后,服务和客户运行之前;另外,一些人会在ARP被锁定时窃取连接。以下是它的脚本:
#!/usr/bin/perl
# Program: forcehwaddr
# Program to run ARP to force certain tables.
# Specify filenames to read from on command line, or read from stdin.
foreach (<>) { # For each input line....
chomp; # Strip if CR/LF
if (/^#/) { next; } # If it's a comment, skip it.
if (((($host, $hw) = /\s*(.+?)\s+(\S+)\s*/) == 2) &&
!(/^#/)) {
# The text between the slashes parses the input line as follows:
# Ignore leading whitespace. (\s*)
# Then, start matching and put it into $host ($host, (.+?))
# Skip over the whitespace after that (\s+)
# Start matching. Continue matching until end of line or optional
# trailing whitespace.
# Then, the if checks to see that both a
# host and a hardware address were matched.
# (2 matches). If not, we skip the
# line (assuming it is blank or invalid or something).
# The second part of the if checks to see if the line starts with
# a pound sign; if so, ignore it (as a comment).
# Otherwise, run the appropriate command:
printf("Setting IP %-15s to hardware address %s\n", $host, $hw);
system "/usr/sbin/arp -s $host $hw\n";
}
}