首页 -> 安全研究
安全研究
绿盟月刊
绿盟安全月刊->第39期->技术专题
作者:stardust <stardust@nsfocus.com>
主页:http://www.nsfocus.com
日期:2003-03-03
NFR是一个众所周知的商业IDS产品,与其他的IDS相比,NFR吸引人的地方在于它提供了强大的N-Code脚本语言,通过脚本化的代码来检测攻击。NFR从它的名字(Network Flight Recorder)就可以了解到它最初是作为一个通用的网络流量分析和记录软件来设计的,NFR的网络探测器其实只是提供了一个网络流量分析底层框架,以N-Code作为实现分析的用户接口,完全可以用于其他目的地网络监控。N-Code具有完善强大的数据包分析能力,利用它可以完成相当复杂细致的数据包分析工作,这种能力这对于检测复杂的攻击,减少漏报和误报相当有利。而且NFR完全开放了所有其用于检测的N-Code代码,还提供了开发和编辑N-Code代码的工具,网络管理员和精通安全的技术人员可以方便地开发自己的监控和统计网络流量检测代码,几乎具有无限的灵活性。NFR早期曾发布过开放源码的研究版,当时的l0pht组织为其写了大量检测网络攻击的N-Code,后来出于商业的考虑NFR封闭了软件的源码。如果NFR是一个GPL的软件,很有可能到现在拥有Snort的地位,而其脚本化的检测方式远远优于简单粗糙的Snort,这方面的成功的例子就是Nessus扫描器,正是NASL脚本使Nessus拥有极大的可扩展性,使之完全可比商业扫描器产品相抗衡。
正常情况下,NFR IDS的网络探测器软件储存在一张只读光盘上,探测器硬件一般就一台PC架构的机器(也就是一台配置较高的PC机),探测器从光盘启动运行,运行过程中光盘必须一直在光驱中,就象玩光盘版的游戏一样。如果要在普通PC机上安装NFR IDS网络探测器也是可以的,但叫人不爽的是软件会独占整个硬盘作为软件本身和数据储存的设备,而且要带光盘运行,对于没有光驱和多系统启动的机器来说是不可接受的。是不是有办法使NFR脱离光盘运行呢?把探测器光盘做成一个ISO文件,用虚拟光驱软件把它挂到虚拟机上运行,理论上是可以的。但探测器在当前流行的虚拟机软件Virutal PC上安装有问题,不能成功;VMWare上虽然可以正常安装,但NFR探测器软件却不能识别VMWare的虚拟网络接口,无法使用。而且在虚拟机上跑IDS探测器无法满足必要的性能要求,只能用来做偶尔的测试。
经过研究和Sinbad的大力指点,在了解了探测器软件的运行机制后终于找到了比较完美的解决方法。NFR探测器光盘其实是一个经过剪裁的OpenBSD系统加上实际的探测器软件,探测器在机器上安装时会启动光盘上的OpenBSD系统,把实际的探测器程序全部复制到硬盘上,以后每次运行从光盘启动后OpenBSD系统后执行硬盘上的探测器程序,告警数据也是存放在硬盘上的目录中。因此我们只要想办法把硬盘中的数据和程序弄出来,把它放在一个自己安装的OpenBSD系统上就能用了。
具体操作有如下几个主要步骤(以NFR 5.1.0 NID-100探测器为例):
1、在VMWare或一台真正的机器上以正常的方式安装NFR探测器,安装完成后VMWare中运行的探测器是不可用的,原因前面已经提到过了,不过这没有关系,我们只是想要获得其中的数据和程序文件。
2、制作一张OpenBSD系统的急救软盘:一般OpenBSD系统的安装光盘都带有此软盘的映象文件,将其写入一张空白的软盘就可做出来。一般这张软盘包含了一个基本的OpenBSD系统和一些常用的工具程序,比如我们这次会用到的打包用的tar和传输文件用的ftp。
3、在域局网上准备一个FTP服务器用来接收文件。
4、用急救软盘启动探测器机器,把硬盘上的探测器软件分区挂上来,将上面的文件和目录打包FTP出来。可能的操作如下:
# mount /dev/wd0d /mnt <---- 挂上硬盘上的探测软件分区,具体的设备名在不同的系统中可能不一样
# cd /mnt
# ls -l <---- 列出分区上的文件
total 40
drwx------ 2 1003 1003 1024 May 15 04:15 bin
drwx------ 7 root 1003 512 Apr 15 15:23 data
drwxr-xr-x 10 1003 1003 512 Apr 15 09:45 etc
drwx------ 2 root 1003 512 May 15 04:16 floppy
drwxr-xr-x 2 1003 1003 512 May 15 04:15 help
drwx------ 6 root 1003 512 Apr 15 15:30 index
drwxr-xr-x 2 1003 1003 512 Oct 29 2001 lhelp
drwxr-xr-x 3 1003 1003 512 May 15 04:15 library
drwx------ 2 1003 1003 512 Apr 15 09:45 log
drwx-----T 2 root wheel 1024 Apr 15 15:41 lost+found
-rw-r--r-- 1 root 1003 5 Apr 15 09:45 monitor.pid
drwx------ 2 root 1003 512 Apr 15 15:23 nfrmail
drwxr-xr-x 13 1003 1003 1536 May 15 04:15 packages
drwx------ 3 root 1003 512 Apr 15 15:42 remote_queue
drwxr-xr-x 2 root 1003 512 Apr 15 09:45 shms
drwxr-xr-x 2 root wheel 512 Apr 15 15:23 sy
drwxr-xr-x 2 1003 1003 512 May 22 17:27 tmp
drwxr-xr-x 2 1003 1003 512 Oct 29 2001 updates
drwxr-xr-x 10 1003 1003 512 May 15 04:15 zone
# tar cf tmp/bin.tar bin <---- 把文件bin目录打包
# cd tmp
# ls -l
total 10400
-rw-r--r-- 1 root 1003 5314560 May 22 17:39 bin.tar
把bin等所有目录及文件打包到/mnt/tmp/后,用ifconfig和route命令设置好本机的网络参数后将那些.tar文件用ftp传输到局域网上的FTP服务器上。这样我们就完整地得到了探测器的实际执行程序。
5、安装一个OpenBSD 3.0系统,这将是我们以后运行探测器的机器,如果不顾虑性能,也可以装在虚拟机上。在安装完的机器里创建一个目录(比如/nfr)用来存放那些探测器程序目录和数据文件,把那些复制出来的.tar文件解压到此目录下。得到结果的可能如下:
[root@ /]> ls -l
total 8650
drwxr-xr-x 15 root wheel 512 Feb 25 06:46 ./
drwxr-xr-x 15 root wheel 512 Feb 25 06:46 ../
-rw-r--r-- 2 root wheel 683 Apr 27 2002 .cshrc
-rw-r--r-- 2 root wheel 160 May 20 2002 .profile
drwxr-xr-x 2 root wheel 512 Oct 19 2001 altroot/
drwxr-xr-x 2 root wheel 1024 Jan 18 00:50 bin/
-r-xr-xr-x 1 root wheel 53248 Apr 25 2002 boot*
-rw-r--r-- 1 root wheel 4332626 Apr 25 2002 bsd
drwxr-xr-x 4 root wheel 15360 Feb 25 06:44 dev/
drwxr-xr-x 16 root wheel 2048 May 21 2002 etc/
drwxr-xr-x 4 root wheel 512 May 21 2002 home/
drwxr-xr-x 2 root wheel 512 Oct 19 2001 mnt/
drwxr-xr-x 18 root wheel 1024 Apr 16 2002 nfr/
drwx------ 2 root wheel 512 Jan 17 09:18 root/
drwxr-xr-x 2 root wheel 2048 Oct 19 2001 sbin/
drwxr-xr-x 2 root wheel 512 Oct 19 2001 stand/
lrwxr-xr-x 1 root wheel 11 Apr 25 2002 sys@ -> usr/src/sys
drwxrwxrwt 2 root wheel 512 Feb 25 06:46 tmp/
drwxr-xr-x 15 root wheel 512 Oct 19 2001 usr/
drwxr-xr-x 24 root wheel 512 Oct 19 2001 var/
[root@ /]> cd nfr
[root@ /nfr]> ls -l
total 52
drwxr-xr-x 18 root wheel 1024 Apr 16 2002 ./
drwxr-xr-x 15 root wheel 512 Feb 25 06:46 ../
drwx------ 2 root wheel 1024 Apr 16 2002 bin/
drwx------ 16 root wheel 512 Apr 16 2002 data/
drwxr-xr-x 10 root wheel 512 Apr 16 2002 etc/
drwx------ 2 root wheel 512 Apr 16 2002 floppy/
drwxr-xr-x 2 root wheel 512 Apr 16 2002 help/
drwx------ 15 root wheel 512 Apr 16 2002 index/
drwxr-xr-x 2 root wheel 512 Oct 29 2001 lhelp/
drwxr-xr-x 3 root wheel 512 Apr 16 2002 library/
drwx------ 2 root wheel 512 Apr 16 2002 log/
drwx------ 2 root wheel 512 Apr 16 2002 nfrmail/
drwxr-xr-x 53 root wheel 7168 Apr 16 2002 packages/
drwxr-xr-x 2 root wheel 512 Apr 16 2002 shms/
drwxr-xr-x 2 root wheel 512 Apr 16 2002 sy/
drwxrwxrwx 2 root wheel 512 Apr 16 2002 tmp/
drwxr-xr-x 2 root wheel 512 Oct 29 2001 updates/
drwxr-xr-x 10 root wheel 512 Apr 16 2002 zone/
6、用探测器软件光盘中/IDA/BIN/目录下所有的maild、monitor、savecore、watchdog程序覆盖OpenBSD系统/bin下的同名程序并加上可执行属性。
7、修改配置文件。主要是如上例中的/nfr/etc目录下的nfrd.cfg文件:
[root@ /nfr]> cd etc
[root@ /nfr/etc]> ls
./ compat3.0/ maps/ patch_info
../ cur_share_size nfr.remote.ida* run/
access/ enabled.cfg nfr.stand.ida* spaceman.cf
alertd/ guisrv.cf* nfrd.cfg* type-mapping.map*
alertd.cf* httpd/ nfrd.cfg.proto values.values*
cgi.cf* locks/ nfrstatd.cf vars/
[root@ /nfr/etc]> cat nfrd.cfg
nfr_intf=de0
cpulimit=20000
packetTrack=off
performTrack=off
funcTrack=off
ipFragHwm=1048576
tcpSessionHwm=30000
tcpSynTimeout=10
tcpSynAckTimeout=15
tcpGCTimeout=600
icmpIpCksumZero=on
icmpIpCksumZeroSwab=off
icmpIpCksumOff1=on
icmpIpCksumSwabId=on
icmpIpCksumLen20=on
arpRouteUpdate=on
frag_limit=50
nfrd.cfg文件中的其他参数可以不改,最主要是把第一行的监听网络接口定义"nfr_intf=de0"改成当前系统的可用网络接口设备文件名。
8、编写启动和停止NFR探测器的脚本。经过研究分析,NFR探测器的启动可以使用/nfr/bin/nfrwatch程序来完成。
[root@ /nfr/etc]> cd ../bin
[root@ /nfr/bin]> ls
./ getserver* nfrstatd* run_unlimited*
../ guisrv* nfrwatch* scontrol*
alertd* histogram* package_sync* scriptalert*
central_fixcase* list* pkgsquash* setenabled*
control* mergeres* put* space_compute*
diffacf* nfrd* rc* spaceman*
diffacf.sh* nfrpatch* rt_remote* ugacf*
get* nfrpkg* rt_settime*
在启动nfrwatch程序之前必须先export一个叫NFRHOME的环境变量,在此变量中定义NFR探测器程序和数据放置的主目录:
[root@ /nfr]> export NFRHOME=/nfr
[root@ /nfr]> bin/nfrwatch
这样就基本上可以启动NFR的网络探测器了。
可以把启动和停止操作相关的命令写成脚本,下面是两个例子:
[root@ /nfr]> cat start_nfr
########################################################
#!/bin/sh
NFRHOME=/nfr
export NFRHOME
cd ${NFRHOME}
if [ -d ${NFRHOME}/etc/run ]
then
#rm -f ${NFRHOME}/etc/run/nfrwatch.pid
rm -f ${NFRHOME}/etc/run/alertd.pid
rm -f ${NFRHOME}/etc/run/nfrd.pid
rm -f ${NFRHOME}/etc/run/spacemand/*
rm -f ${NFRHOME}/etc/run/getput/*
fi
if [ -x ${NFRHOME}/bin/nfrwatch ]
then
if [ -f ${NFRHOME}/etc/nfrd.cfg ]
then
#echo "Starting NFR . . .";
${NFRHOME}/bin/nfrwatch
else
echo " *** NFR not started.";
echo " *** Could not find config file: etc/nfrd.cfg";
fi
else
echo " *** NFR not started.";
echo " *** Could not find or execute: bin/nfrwatch";
fi
########################################################
[root@ /nfr]> cat stop_nfr
########################################################
#!/bin/sh
NFRHOME=/nfr
export NFRHOME
cd ${NFRHOME}
pid=`cat ${NFRHOME}/etc/run/nfrwatch.pid`
if test "$pid"
then
#echo "Shutting down NFR . . .";
kill -TERM $pid
else
echo " *** Could not stop NFR";
fi
########################################################
如果一切顺利,启动NFR探测器以后你应该可以看到如下的许多进程:
PID TT STAT TIME COMMAND
30341 ?? Is 0:00.22 bin/nfrwatch
5652 ?? S 0:06.85 bin/alertd
23405 ?? S 0:02.68 bin/nfrstatd
12170 ?? I 0:00.41 bin/spaceman
3435 ?? I 0:00.11 /bin/maild
9678 ?? S 0:27.39 bin/nfrd library
30576 ?? I 0:00.13 bin/guisrv
26375 ?? S 0:00.33 ./bin/list packages/_nfrstats/status
1456 ?? S 0:02.20 bin/list packages/_alertd/systemlist
18988 ?? S 0:02.35 bin/list packages/_alertd/networklist
31923 ?? S 0:00.19 bin/list packages/attacksigs/badweb
20055 ?? S 0:00.24 bin/list packages/attacksigs/dns
12126 ?? S 0:00.31 bin/list packages/attacksigs/finger
28852 ?? S 0:00.23 bin/list packages/attacksigs/lockd
31213 ?? S 0:00.19 bin/list packages/attacksigs/pop3
19585 ?? S 0:00.22 bin/list packages/attacksigs/rlogin
14165 ?? S 0:00.19 bin/list packages/attacksigs/smtp
3526 ?? S 0:00.19 bin/list packages/attacksigs/snmp
2063 ?? S 0:00.25 bin/list packages/attacksigs/telnetbd
12956 ?? S 0:00.25 bin/list packages/attacksigs/tftp
1550 ?? S 0:00.18 bin/list packages/attacksigs/x11
238 ?? S 0:00.30 bin/list packages/dos/echochargen
8750 ?? S 0:00.19 bin/list packages/dos/netbios
6657 ?? S 0:00.22 bin/list packages/dos/pingflood
12348 ?? S 0:00.25 bin/list packages/dos/pingreply
2264 ?? S 0:00.18 bin/list packages/dos/snork
7351 ?? S 0:00.20 bin/list packages/dos/winnuke
15152 ?? S 0:00.21 bin/list packages/id/failedlogin
3349 ?? S 0:00.23 bin/list packages/id/portscan
16696 ?? S 0:00.26 bin/list packages/id/rpc
11433 ?? S 0:00.43 bin/histogram packages/network/icmp2
4985 ?? S 0:00.24 bin/histogram packages/network/tcp
22873 ?? S 0:00.28 bin/histogram packages/network/udp
14381 ?? S 0:00.23 bin/list packages/scanners/cybercop
2081 ?? S 0:00.21 bin/list packages/scanners/ident
2830 ?? S 0:00.27 bin/list packages/scanners/iss
17358 ?? S 0:00.25 bin/list packages/services/ftp
4140 ?? S 0:00.26 bin/list packages/apacheworm/pud
4963 ?? S 0:00.21 bin/list packages/www/apache
28567 ?? S 0:00.26 bin/list packages/www/badguy
18820 ?? S 0:00.23 bin/list packages/www/cgi
3047 ?? S 0:00.27 bin/list packages/www/coldfusion
29555 ?? S 0:00.26 bin/list packages/www/iis
968 ?? S 0:00.31 bin/list packages/www/compliance
32032 ?? S 0:00.24 bin/list packages/www/general
5337 ?? S 0:00.23 bin/list packages/www/uservars
10528 ?? S 0:00.24 bin/list packages/udp/portscan
22791 ?? S 0:00.22 bin/list packages/udp/udpflood
17117 ?? S 0:00.27 bin/list packages/telnet/telnetoption
15584 ?? S 0:00.22 bin/list packages/telnet/telnetvars
19210 ?? S 0:00.31 bin/list packages/tcp/portscan
14168 ?? S 0:00.36 bin/list packages/tcp/session
10656 ?? S 0:00.24 bin/list packages/tcp/synflood
10973 ?? S 0:00.24 bin/list packages/tcp/badflags
15365 ?? S 0:00.21 bin/list packages/tcp/hdrlength
31182 ?? S 0:00.16 bin/list packages/scanner/retina
1 ?? Ss 0:00.29 /sbin/init
23911 ?? Ss 0:00.98 syslogd
11665 ?? Is 0:00.11 portmap
23081 ?? Is 0:00.29 inetd
6906 ?? Is 0:01.44 /usr/sbin/sshd
15497 ?? Is 0:00.42 cron
29408 C0 Ss 0:02.26 -bash (bash)
还应该可以看到服务器监听了2010端口,等待NFR的AI(控制台程序)去连接它:
[root@ /nfr]> netstat -na|grep LIST|grep 2010
tcp 0 0 *.2010 *.* LISTEN
用NFR的AI连接此探测器,对其进行管理与一般的NFR探测器没有什么区别。
版权所有,未经许可,不得转载