UDP报文比较容易伪造,攻击者可以伪造大量的UDP报文,使其源地址为大量不同的IP地址,然后使用这些数据包进行探测,就可以诱使 PortSentry启动对UDP扫描的自动相应机制,将受保护主机从网络上隔离,从而完成对其的拒绝服务攻击。因此,应该慎重使用PortSentry 的这个功能。对于连接到Inte.net上的主机不要使用这项功能保护,设置BLOCK_UDP=0。对于内部网络的主机,建议打开这项功能,设置 BLOCK_UDP=1,这样可以检测到网络地址欺骗行为,而且从某种程序上还可以检测到被侵入的主机。
# BLOCK_TCP
设置针对TCP探测主动相应功能。也有0、1、2三个选项。解释同上。
对于TCP连接,PortSentry会等待建立一个完整的连接,而这是非常难以伪造的,因此TCP伪造报文不是什么太大问题。将这项功能打开吧。
BLOCK_UDP和BLOCK_TCP是下面几个功能选项(KILL_ROUTE、KILL_RUN_CMD)的入口。
# KILL_ROUTE
如果检测到攻击,PortSentry能够主动断开到恶意主机的路由。使用KILL_ROUTE指定切断路由,PortSentry使用的外部命令。注意:出于安全的考虑,一定要使用完全路径指定PortSentry使用的外部命令。宏$TARGETS$被用来指定恶意主机的地址。 PortSentry可以使用两种方式切断恶意主机的路由:
1. 直接使用route命令
你可以使用route命令将到恶意地址的网关定义为本地子网的一个地址,一般使用localhost地址127.0.0.1即可。
KILL_ROUTE="/sbin/route add $TARGET$ 127.0.0.1"
这是最基本的设置,你可以使用route命令其它的一些选项,关于route命令的用法请参考手册页,man route。在portsentry.conf文件中已经提供了一些针对不同系统的设置。
2. 使用包过滤
系统内核一般具有包过滤功能,因此使用包过滤,比直接使用使用route程序具有更大的灵活性。
* ipfwadm
Linux-2.0.x内核使用ipfwadm程序管理IP防火墙:
KILL_ROUTE="/sbin/ipfwadm -I -i deny -S $TARGET$ -o"
* ipchains
Linux-2.2.x内核使用ipchains:
KILL_ROUTE="/sbin/ipchains -I input -s $TARGET$ -j DENY -l"
* iptables
Linux-2.4.x内核使用iptables:
KILL_ROUTE="/sbin/iptables -I input -s $TARGET$ -j DENY --log-level alert --log-prefix "stealth_scan"
# KILL_HOST_DENY
如果系统使用了TCP_wrappers,可以使用KILL_HOST_DENY使PortSentry将恶意主机地址放到hosts.deny文件中。TCP_wrappers会拒绝从这些地址发起的连接。
KILL_HOSTS_DENY="ALL: $TARGET$ : DENY"
# KILL_RUN_CMD
KILL_RUN_CMD设置PortSentry执行KILL_ROUTE命令之前使用的命令。如果BLOCK_UDP/BLOCK_TCP=2,PortSentry就会只使用KILL_RUN_CMD指定的命令。
可以使用KILL_RUN_CMD指定针对攻击行为的反应程序或者脚本。你可以编写一个脚本,使其能够对目标主机进行扫描,并且能够针对发现的各种系统缺陷,发起反击(难度很大,不过不是不可能^_^);或者向对方发出警告信息。但是,建议你不要对攻击主机采取过于激烈的措施,因为发起端口扫描的系统本身可能已经被侵入了。注意上面的选项中用到了两个宏$TARGET$和$PORT$,但是它们在这个选项中是无效的。
# SCAN_TRIGGER
PortSentry有一个状态引擎,能够记住连接的主机。使用SCAN_TRIGGER选项可以使PortSentry忽略一定数量的端口扫描,不对其作出反应。通过增减这个选项的值,可以调整对于扫描的敏感程度。这个选项的默认值是0,也就是对端口扫描立刻作出反应。如果不想使 PortSentry过于敏感的话,可以把这个值设置为1或者2,这样会减少误报警的发生。如果这个值再大,就会是系统过于迟钝。
# PORT_BANNER
设置标题(banner)信息,一旦PortSentry被激活,就可以把这段文本信息发送到连接主机。不过,如果你不想惹事的话,建议你不要使用这个功能,即使用了也不要使用伤人的话。否则可能触怒一些人,他们会想尽一切办法干掉你的系统。注意如果你使用隐秘扫描检测模式(-stcp或者 -sudp),这项功能无效。
2.3 编辑portsentry.ignore文件
portsentry.ignore文件保存你不想阻塞的主机地址,至少要包括127.0.0.1以及本机的接口。建议你不要把内部网络的所有 IP地址都放到这个文件中。因为如果内部网络的某太主机被侵入了,攻击者就可能利用这太主机攻击PortSentry保护的主机。反之,如果被侵入主机 IP地址不在这个文件,PortSentry可能检测到它被侵入了。
2.4 编译
PortSentry目前支持linux、bsd、solaris、hpux、hpux-gcc、freebsd、openbsd、netbsd、bsdi、aix、osf等系统。可以根据自己的平台进行编译。例如,在Linux系统上:
#make linux
#make install
PortSentry就会被安装到自己的路径。默认是:/usr/local/psionic/portsentry。你也可以设置自己喜欢的路径,请参考A.1.编辑portsentry_config.h文件。
为了方便使用,可以将/usr/local/psionic/portsentry加入到PATH变量中。
3.使用
安装完毕以后,就可以启动PortSentry了。启动portsentry非常简单,它只有六个操作模式参数。注意:每次只能使用一种监视模式。这六个监视模式是:
* portsentry -tcp
基本TCP端口绑定模式。PortSentry将检查所有的配置文件,接着在后台绑定所有在portsentry.conf文件中指定的TCP端口 (默认情况下,不超过64个)。如果你想检查PortSentry的启动状态,可以浏览其日志文件。PortSentry使用的默认日志文件是/var /log/messages,你也可以根据需要指定自己的日志文件。
* portsentry -udp
基本UDP端口绑定模式。PortSentry检查配置文件,接着在后台绑定所有的UDP端口(默认情况下,不超过64个)。可以从日志文件中的到PortSentry的启动状态。
* portsentry -stcp
TCP隐秘扫描检测模式。如果使用这种检测模式,PortSentry会打开一个RAW套接字,监视所有进入的报文。如果某个向内报文的目的端口是被监视端口,PortSentry就会进行反应动作。这种检测模式可以检测到connect()扫描、SYN/半公开扫描以及FIN扫描。
* portsentry -atcp
高级TCP隐秘检测模式。在这种模式下,PortSentry回对某个范围的端口号进行监听,需要被监听的端口号范围由 ADVANCED_PORTS_TCP指定,还可以使用ADVANCED_EXCLUDE_TCP指定在这个范围中,不需要监听的端口号。在此,你应该注意以下问题:
o 这种模式在所有的检测模式中是最敏感和高效的。它不必等到扫描到引线端口,才进行反应。
o 不过这种检测模式可能切断合法的网络传输。如果你连接到一个FTP站点,对方就会返回一个标志请求(ident request)。如果PortSentry正在监视ident端口(113),它就会马上切断你和这个FTP端口的联系。所以,你应该把这个端口放到 ADVANCED_EXCLUDE_TCP选项中。
* portsentry -sudp
UDP隐秘扫描检测模式。和TCP隐秘检测模式相似。不过,PortSentry只是对UDP端口进行监听,而不进行绑定操作。
* portsentry -audp
高级UDP隐秘扫描检测模式。和atcp选项非常相似,只是它是面向UDP协议的。这个一个非常高级的选项,但是产生误报警的几率很高,使用时,要非常小心。如果在本地网络上,有一台路由器发出RIP(Routing Information Protocol)广播包,就可能被PortSentry阻塞。所以你需要把一些端口放到ADVANCED_EXCLUDE_UDP选项中,以免发生麻烦。
4.测试
使用某种模式启动PortSentry,然后查看PortSentry的日志文件(/var/log/messages或者/usr /local/psionic/portsentry/portsentry.log)。如果成功启动PortSentry,你会看到象下面这样的信息:
Jun 28 06:05:20 nixeon portsentry[957]: adminalert: portsentry is starting.
Jun 28 06:05:20 nixeon portsentry[957]: adminalert: Going into listen mode on TCP port: 143
. . .
Jun 28 06:05:20 nixeon portsentry[957]: adminalert: PortSentry is now active and listening.
上面这些信息的最后一行表示PortSentry已经成功初始化,如果你没有看到这些信息就表示其启动失败。
在日志文件中,你将会看到所有被PortSentry监听的端口。如果某个端口正在使用,PortSentry就会在日志中给出绑定失败的警告信息。如果所有的端口都无法绑定,它就会退出,可以从其日志文件中找到错误信息。
对于高级隐秘扫描检测模式,PortSentry将列出自己不监听的端口。这是一种反向绑定。
现在,你可以从另外的主机上telnet到被监视的端口上了。一旦你开始登录,在PortSentry的日志文件中就会加入以下形式的日志信息:
Oct 9 09:12:44 nemesis portsentry[1644]: attackalert: Connect from host: 123.345.56.78 to TCP port: 143
Oct 9 09:12:46 nemesis portsentry[1644]: attackalert: Host server.haxor.org/123.345.56.78 has been blocked via dropped route.
Oct 9 09:12:46 nemesis portsentry[1644]: attackalert: Host server.haxor.org/123.345.56.78 has been blocked via wrappers.
此时,如果你断开这个连接,然后重新连接到测试主机,你将发现目标主机不可达。保护生效了
5.输出信息以及记录文件
PortSentry在使用过程中,会把所有状态、错误、成功以及其它未知信息写到syslog。在日志中,PortSentry使用如下标志:
* adminalert
指示PortSentry的状态。
* securityalert
表示发生了安全问题。
* attackalert
某台主机触发了触发器,PortSentry对其作出了反应。
PortSentry在阻断到某个主机路由时,会把主机地址等信息写到portsentry.blocked.tcp/atcp/stcp /udp/audp/sudp文件中,同时还写到portsentry.history文件。每次重新启动 PortSentry,portsentry.blocked.*文件都会被删除,而portsentry.history文件可以用来记录被阻塞的主机。
.总结
随着网络的日益普及,入侵检测也成为了网络安全的一个非常重要的领域,IDS(Intrusion Dection System,入侵检测系统)的重要性日益提高。入侵检测系统基本可以分成两个类:基于主机的入侵检测系统,为某台主机提供保护,例如 PortSentry;网络入侵检测系统,能够对网络报文进行模式匹配,例如snort。
本文介绍了一个基于主机的入侵检测工具--PortSentry。简要介绍了某些端口扫描技术,重点讲述了PortSentry的安装、配置和使用
文章来源于领测软件测试网 https://www.ltesting.net/