首页 -> 安全研究

安全研究

绿盟月刊
绿盟安全月刊->第39期->技术专题
期刊号: 类型: 关键词:
创建“硬盘版”的NFR IDS网络探测器

作者: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探测器没有什么区别。
版权所有,未经许可,不得转载