SAINT全称安全管理员集成网络工具(Security Administrators Integrated Network Tool)。它脱胎于著名的网络脆弱性检测工具SATAN(Security Administrator Tool for Analyzing Network,安全管理员网络分析工具),也就是通常说撒旦:)。但是,SATAN的两位作者Dan Farmer和Wietse Venema并没有参与SAINT的开发。
特点
SAINT是一个集成化的网络脆弱性评估环境。它可以帮助系统安全管理人员收集网络主机信息,发现存在或者潜在的系统缺陷;提供主机安全性评估报告;进行主机安全策略测试。SAINT还具有非常友好的界面,用户可以在本地或者远程通过Netscape、Mozilla、lynx等浏览器对其进行管理,自然还包括Micro $oft Internet Explorer(远程管理模式下)。
工作模式
SAINT有两种工作模式:简单模式(simple mode)和探究模式(exploratory mode)。
简单模式(simple mode)
在这种模式下,SIANT通过测试各种网络服务,例如:finger、NFS、NIS、ftp、tftp、rexd、statd等,来尽可能地收集远程主机和网络的信息。除了系统提供的各种服务之外,这些信息还包括系统现有或潜在的安全缺陷,包括:网络服务的错误配置;系统或者网络工具的安全缺陷;脆弱的安全策略。然后,SAINT把这些信息以HTML格式输出到浏览器,用户可以通过浏览器对数据进行分析、查询收集的信息。
探究模式
SAINT真正强大之处还在于其探究模式。基于开始搜集的数据和用户配置的规则集,通过扫描次级主机来测试主机之间的信任通道、主机之间的依赖性,以及实现更深入的信息收集。这样用户不但可以使用分析主机和网络的,而且可以通过测试主机或者网络之间信任的继承关系,帮助用户对系统的安全级别作出合理的判断。
工作机制
在SAINT软件包中有一个目标捕捉程序,通常这个程序使用fping判断某台主机或者摸个子网中的主机是否正在运行。如果主机在防火墙之后,就通过tcp_scan进行端口扫描来判断目标主机是否正在运行。接着把目标主机列表传递给数据收集引擎进行信息收集。最后SAINT把收集的信息和安全分析/评估报告以HTML格式输出到用户界面(浏览器)。
安装
系统需求
SAINT主要是使用perl编写的,具有很好的跨平台能力,能够运行在大多数UNIX系统:
SunOS 4.1.3_U1
SunOS 5.3 - 5.5.1 (Solaris 2.3 - 2.5.1)
IRIX 5.3 - 6.5.8
Linux
FreeBSD 4
SAINT应该还可以运行与以下系统(没有经过测试):
其它OSunOS版本
其它IRIX版本
AIX
BSD系统
HP-UX
System V Release 4
Ultrix
Tru64
获得所需软件
以下是安装SAINT需要的软件:
SAINT
Perl
Mozilla
nmap(可选)
Samba utilities(可选)
SAINT可以使用nmap为其提供某些扫描服务(作为端口扫描的利器,nmap已经被集成到一些系统安全评估软件中,例如:Nessus、SAINT。跑题了^_^)。SAINT的鼻祖是SATAN,SATAN的整体扩展性很好,否则就不会产生SAINT了,但是它使用的端口扫描手段却非常原始,因此使用nmap作为端口扫描工具是非常明智的,不过SAINT使用nmap好象只是用来进行远程主机操作系统指纹特征(fingerprinting)的收集。没有充分发挥NMAP强大的端口扫描能是SAINT的一个遗憾。
编译安装
编译SAINT非常简单,只要使用如下命令就可以了:
$cd path-of-saint
$./congigure
$make
使用
启动SAINT
SAINT编译完成后,就可以运行SAINT了。有两种方式运行SAINT:交互模式(本地模式)、远程模式。注意:在运行SAINT之前需要确认config/paths.pl文件中指定的各种工具的路径是否正确。
本地模式
启动SAINT非常简单,首先以root用户身份登录
#cd /path-of-saint
#./saint
然后,你就可以看到如下的图形界面(如果你想使用其它浏览器例如:mozilla可以修改config/paths.pl文件的 $MOSAIC变量)。
远程模式
如果运行SAINT的主机无法提供图形界面,或者你需要把扫描结果和他人分享,就可以使用SAINT的远程模式。在远程工作模式下,SAINT提供如下管理特征:
基于主机的访问控制
通过设置config/saint.cf文件中的 $allow_hosts变量或者使用-h命令行选项,能够限制可以使用SAINT的远程主机IP地址。你可以指定多个可以访问SAINT的主机地址,每个IP地址使用空格分开,还可以使用统配符指定某个网段的地址,例如10.1.1.*指定一个C类网段(有点落后,不如使用IP/CIDR方式灵活^_^)。
用户认证
在远程模式下,SAINT需要对不同用户的访问权限进行限制(如果不加限制,恐怕会引狼入室:P)。默认情况下,有两个可以登录的用户:admin和saint,你还可以修改config/passwd加入其它的用户。每个用户都需要输入正确的密码才能够使用SAINT,而且每个用户的权限是不同的,admin用户具有使用各种功能的权限,而saint个其它用户只能查看扫描报告、教程和其它的文档。
监听端口
修改config/saint.cf文件的 $server_port变量或者通过-p命令行选项,可以设置SAINT的TCP监听端口,默认值是1414。然后,用户在浏览器中指定SAINT的监听端口号就可以访问SAINT了,例如:http://192.168.0.67:1414。
清楚了远程模式的这些限制,现在可以在远程工作模式下启动SAINT了。首先,以root用户的身份登录
#cd path-of-saint
#./saint -r -h IP地址列表 -p 监听端口
Security Administrators Integrated Network Tool
Portions copyright (C) 1998,1999,2000,2001 World Wide Digital Security, Inc.
Portions copyright (C) 1995 by Dan Farmer and Wietse Venema.
SAINT is starting up...
Enter new passwords for "admin" or hit ENTER to leave as is
Password:输入admin用户的密码
Confirm Password:确认admin用户密码
Enter new passwords for "saint" or hit ENTER to leave as is
Password:输入saint用户的密码
Confirm Password:确认saint用户密码
然后,在别的主机启动浏览器输入http://SAINT所在主机地址:端口号,就可以看到如下界面了。
目标选择
进入SAINT的主界面之后,需要选择扫描目标,点击SAINT控制面板的target selection进入目标选择界面。
Primary target selection
扫描的主要目标,可以是单一主机、以空格分割的主机列表、地址范围以及子网。这里还有两个选项,分别对应SAINT的两种工作模式:简单模式(simple mode)和探究模式(exploratory mode)。
Scan the target host(s) only. (Disables smurf check.):只扫描目标主机;
Scan all hosts in the target hosts subnet(s):扫描目标主机的子网。
Scanning level selection
设置SAINT的攻击级别(attack level),或者说SAINT的探测强度。详细解释见配置文件(config/saint.cf和命令行选项
Firewall Support
设置你是否则防火墙之后对目标主机进行扫描。如果你处于防火墙之后,需要打开Firewall Support ,否则会影响扫描结果的准确性。
OK,所有的东西都设置好了,现在可以按下Start the scan按钮开始扫描了。这时你的浏览器会不断地显示数据搜集的进度,耐心地等待一会(如果扫描目标很多,可能需要非常长的时间),等出现如下页面,就可以进入下一步了。
SAINT data collection
Data collection in progress...
10/31/01-06:03:53 bin/timeout 60 bin/fping 192.168.0.68
10/31/01-06:03:54 bin/timeout 20 bin/rpc.saint 192.168.0.68
10/31/01-06:03:54 bin/timeout 20 bin/dns.saint 192.168.0.68
10/31/01-06:03:54 bin/timeout 20 bin/ostype.saint 192.168.0.68
. . .
Data collection completed (1 host(s) visited).
---------------------------------------------------------------
Back to the SAINT start page | Continue with report and analysis | View primary target results
处理扫描结果
在探测完成之后,用户可以有两个选择:查看扫描结果(View primary target result)和结果分析(report and analysis)。如果选择View primary target result,SAINT将直接报告目标主机的一般信息、提供的网络服务以及系统缺陷等信息,比较直观,我们将不在赘述。
下面我们主要介绍SAINT的数据分析。SAINT的结果分析特征比较容易使用但是却难以描述,能否更好地发挥这种智能化方式的潜力,更多地靠意会和使用经验,而不是言传。
SAINT的数据分析功能大体分为三类:缺陷(vulnerabilities)、主机信息(Host informations)、主机之间的信任关系(Trust)。在扫描过程中,虽然大量的数据的采集是同时一道进行的,但是SAINT会对采集到的数据采取不同的处理和分析方式。而且数据之间可以以超连接的方式交叉引用。这三类信息只是表达和显示采集到的数据的不同部分。
缺陷(Vulnerabilities)
顾名思义,这是目标主机或者目标网络的弱点。SAINT对目标的缺陷采用三种基本的显示方式:
Approximate Danger Level
SAINT能够对探测到的潜在问题的危险程度进行评估,然后按照其危险程度进行排序。最危险的是目标主机root帐户被侵入,而危险程度最底的是对发现的不必要服务的警告信息。
Type of Vulnerability
对各种缺陷的类型进行分类
Vulnerability Count
按照缺陷的数量对目标主机进行分类,缺陷最多的列前。
主机信息(Host Information)
收集到的主机信息是非常重要的,这些信息包括:服务器所处的网络;网络上的重要主机;网络的子网划分以及域名。出次之外还可以进行单个主机的查询。主机信息包括:
服务类(Class of Service)信息
这类信息包括主机提供的各种网络服务,例如:匿名FTP、WWW等。这些信息是由rpcinfo和TCP端口扫描收集的。
系统类型(System Type)
这类信息首先一目标系统主机的硬件类型分类,然后如果可能再进一步以操作系统的类型和版本来划分。这里SAINT就需要借助nmap了,如果没有nmap,就只能通过ftp、telnet和sendmail等软件的欢迎信息来实现了(有多大的可信度?一个有经验的网络管理人员,是不会泄露这类信息的。因此,要充分发挥SAINT的能力,最好安装nmap :P)。
域名(Internet Domain)
显示主机的域名。
子网(Subnet)
就SAINT而言,每个子网可以有256个IP地址。
主机名
用于在当前探测信息数据库中查询指定主机的信息。
主机之间的信任关系(Trust)
这是一些网络主机之间信任关系(例如:通过某些服务不需要登录)的信息。通过这类信息能够发现网络上最重要的主机。大量主机之间的信任关系,能够大大削弱网络的安全性,攻击者只要攻破一点,就可能侵入整个网络。
SAINT的配置和优化
SAINT的目录结构
SAINT只需要编译,不必进行make install。SAINT软件包中有很多目录和文件,下面我们做一个简单地介绍:
bin/*
保存SAINT用来进行数据采集的程序。
config/*
保存SAINT所有的配置文件。
html/*
在这个目录中,有HTML文件和一些perl脚本文件,SAINT使用它们产生输出的HTML界面。其中docs/目录保存着SAINT的使用以及其它技术文档。
perl/*
SAINT的数据采集以及其它的perl模块,
results/数据库
这个目录保存SAINT的所有数据库,每个数据库由以下四个文件组成:
all-hosts: 保存SAINT在扫描过程中发现的株距列表,包括没有进行扫描的主机。
facts: 保存各种工具产生的检测结果,SAINT对这些结果进行处理然后产生检测报告。
todo: 保存已经检测需要进行探测的主机列表。主要为了避免对同一个目标进行重复探测。
cve: 这个文件保存所有发现的缺陷。
rules/*
保存SAINT使用的规则集。灵活的规则设定使SAINT具有强大的扩展能力。
src/*
一些SAINT支持程序的原文件。
配置文件(config/saint.cf和命令行选项
SAINT可以通过命令行参数来设置检测功能,也可以通过修改其配置文件来设置各个功能选项,因此这里把它们放在一块介绍。命令行的优先级比配置文件高,也就是说如果配置文件和命令行的设置不同,SAINT将以命令行为准。SAINT的配置文件config/saint.cf中的选项全部使用perl语言的语法定义,而且SAINT绝大部分功能是使用perl语言实现的,因此懂一些perl方面的东西可以有助于各好地发挥SAINT的强大威力。下面对其配置文件中的各个选项进行详细介绍(括号内是对应的命令行选项)
$saint_data(-d data diretory)
设置保存扫描结果数据的目录。如果不是以/开头,就表示是results的相对路径。默认值是saint-data。
$attack_level(-a attack level)
这个选项设置SAINT的攻击级别(attack level),或者说SAINT的探测强度。
# Default attack level (0=light, 1=normal, 2=heavy,
# 3=heavy+, 4=top10, 5=custom)
$attack_level = 0;
在这些级别中,强度越低速度越快,也越难以被目标发现,但是收集的信息优先;反之,攻击强度越高,收集的信息也越详尽,但是副作用也越明显。注意:如果设置的攻击强度大于3(heavy+),SAINT会发起拒绝服务攻击,因此可能造成目标主机宕机。
这些攻击级别中有一个top10(4)攻击级别,如果选择这个攻击级别,SAINT将选择一些特定的系统缺陷进行探测,这些缺陷是SANS研究中新筛选的十大最危险的安全威胁列表。而custom攻击级别允许高级用户建立自己的攻击级别,下面我们再详细介绍。
$extreme(-x或-X))
这是影响SAINT攻击特征的另一个变量,它控制SAINT是否进行危险检查。如果这个变量被设置为1,SAINT就会进行一些攻击程序,例如:针对某些缺陷的缓冲区溢出攻击程序。这种检查有助于减少SAINT的误报警。但是要注意:一定要谨慎使用这个功能,因为它已经超出了扫描的范畴,可能会对目标主机造成一些影响,例如:宕机。SAINT进行的危险检查包括:
IIS 5缓冲区溢出攻击
iPlanet Web Publisher缓冲区溢出
iPlanet HTTP方法缓冲区溢出
可以看出,这个选项至少目前功能还比较有限,而且把所有的用来测试的数据都写在了bin/http.saint文件之内,有点和SAINT所追求的扩展性相违背。不知道SAINT4.X版本是否有所改进,不过SAINT4.x是要花钱的。
每个攻击级别对应的探测方法
前面我们几少了攻击级别,每种攻击级别都有自己使用的探测方法,例如:
# Probes by attack level.
#
# ? Means conditional, controlled by rules.todo.
# * Matches anything.
@heavy= (
@light,
finger.saint,
users.saint?,
oot.saint?,
yp-chk.saint?,
$heavy_tcp_scan = cpscan.saint 16660,27665,
65000,1-1525,1527-9999,
$heavy_udp_scan = udpscan.saint 27444,31335,
1-1760,1763-2050,32767-33500,
*?,
);
@heavy用来定义攻击级别;其中的@light表示在heavy攻击级别中,首先要进行light级别的探测;?表示条件选项,由rules/todo决定;<*?>表示其它没有在这个列表中列出的探测方法由rules/todo决定是否执行。
Custom攻击级别(-C custom_level)
攻击级别5对应Custom攻击级别,这个攻击级别允许用户定义自己的扫描方式。你可以使用上面的语法直接在config/saint.cf文件中直接定义自己的探测列表,也可以使用图形界面来定义,点击SAINT控制面板Configuration Management功能的Set up custom scan按钮,就可以进入。@custom_level包括一个定制攻击级别的列表。例如:
$attack_level = 5;
# 定制自己的攻击级别http
@http = (
cpscan.saint 80,
http.saint?
);
# 把用户定义的所有扫描加入到custom_levels列表
@custom_levels = ("custom", "http");
# 从以上的列表中选择使用的扫描方式
#
$custom_level = "http";
$password_guesses(-g 次数)
SAINT能够使用UNIX系统中的finger和rusers服务和Windows中的netbios请求找出登录帐户,然后对其密码进行猜测。 $password_guesses变量可以限制对每个帐户密码的猜测次数(0-5)。默认值是2。如果这个值为0就表示取消帐户密码猜测;等于1表示只检测帐户密码是否为空。
1.帐户密码是否为空
2.密码是否和帐户名相同(虽然看起来比较可笑,但是这种情况确实广泛存在)
3.密码是否password
4.密码是否是登录名的反写
5.密码是否是登录名加数字1
注意在某些系统中,如果帐两次登录失败,就会被锁住,这种猜测方式虽然简单,但是对于系统的管理却非常有用。
目标文件(-F target_file)
默认情况下,SAINT需要你在命令行或者图形管理界面中指定扫描目标。除了这种方式,你还可以从一个文件中成匹录入扫描目标。这个功能涉及两个变量: $use_target_file、 $target_file。例如:
# 是否希望从某个文件中读取扫描目标
# 0=no; 1=yes
$use_target_file = 1;
# 指定保存目标列表的文件名
# 只有 $use_target_file = 1才可用
$target_file = "target_file";
超时选项
某些网络探测可能会造成进程挂起,或者向目标主机发起连接已经很长时间。为了避免这种情况延误整个扫描过程,SANIT引入了一些超时变量。
# timeout values
$long_timeout = 60;
$med_timeout = 20;
$short_timeout = 10;
$timeout=1
一般情况下所有探测过程的超时时间都由全局超时变量 $timeout决定。某些扫描过程可能需要很长的时间,因此有自己的局部超时变量,例如:
$nfs_chk_timeout = $long_timeout;
$snmp_timeout = 120;
超时信号(-t timeout level)
当某个探测过程超时,SAINT就会发出一个信号终止这个进程。默认的终止信号是9,你可以使用man kill来获取信号的详细信息。
$timeout_kill = 9;
$maximum_threads
为了加快扫描过程,SAINT可以同时启动多个探测进程。这个变量的值需要根据自己系统的情况设定,太小会使扫描过程比较漫长;如果太大可能造成SAINT消耗大量的系统资源,效果可能适得其反。
# 显然,1表示禁止多探测任务
$maximum_threads = 5;
$status_file(-S status file)
在探测过程中,SAINT需要跟踪运行的每个探测进程的状态,并把探测过程的名字保存在一个文件中。这个文件的由 $status_file变量设置:
$status_file = "status_file";
临近度变量(-z|-Z)
这些变量( $max_proximity_level、 $proximity_descent、 $sub_zero_proximity、 $attack_proximate_subnets)是SAINT中要求最为苛刻的一组变量。除非你知道你正在干什么,否则不要使它大于3。如果它大于3,会对你有不利影响。
临近度指的是当前目标和原始探测目标的接近程度。例如:你探测一个叫作victim.com的站点。在探测过程中,SAINT发现了为这个站点提供域名服务nic.ddn.mil,那么nic.ddn.mil和victim.com的临近程度就是1;如果扫描nic.ddn.mil时,发现nic.ddn.mil通过NFS向some.host.gov和another.host.gov导出了文件系统,那么some.host.gov和another.host.gov和victim.com的临近度就是2。
随着 $max_proximity_level(-l)增加,SAINT扫描的目标数量会以幂指数的数量增长。接着,你就有麻烦了,这些网络的系统管理员如果发起反击,你就惨了:)。在默认状况下, $max_proximity_level的值是0,表示只扫描原始目标。
$max_proximity_level = 0;
对于比较大的 $max_proximity_level,有一个变量 $proximity_descent(-A)可以帮助你减小你的麻烦。使用这个变量,可以让SAINT逐步减小对远离原始目标主机的扫描强度。
$proximity_descent = 1;
还有一个变量 $sub_zero_proximity,可以在攻击强度小于0时,是否停止SAINT对这个目标的扫描(0表示停止,1表示继续)。 $sub_zero_proximity的默认值是0。
$sub_zero_proximity = 0;
在临近度变量中,还有一个变量 $attack_proximate_subnets用来配置SAINT是否对目标所在的子网进行扫描(0或者1)。注意,一定要谨慎使用。默认情况下,这个变量的值为0,就是只扫描目标主机。
$attack_proximate_subnets = 0
信任(-U)和非信任(-u)
在默认状态下,SAINT假定自己运行在目标主机的非信任主机上,也就是说目标主机的rhosts、hosts.equiv NFS输出等文件中没有发起扫描的主机。你可以根据实际情况修改 $untrusted_host变量或者使用命令行改变这个设置。
# Does SAINT run on an untrusted host?
# (0=no; 1=yes, this host does not appear
# export files of hosts that are being
# probed)
#
$untrusted_host = 1;
目标子网掩码(-n netmasks)
SAINT在进行smurf攻击测试时,需要知道目标的子网掩码和广播地址。一般,C类子网比较普遍,因此默认值是255.255.255.0,255.255.255.128,255.255.255.192。你可以根据实际情况改变其设置。
目标排除
在进行扫描时,攻击某些目标的风险是比较大的,在SAINT中,可以通过设置 $only_attack_these和 $dont_attack_these来指定只对某些目标进行扫描和避开对某些目标。下面是SAINT的默认设置:
$only_attack_these = "podunk.edu, 192.9.9";
$dont_attack_these = "gov, mil";
$dont_use_nslookup
对于某些探测的输出,例如:finger,SAINT需要使用DNS查询。这个变量控制SAINT是否对主机名进行DNS查询。
# Set to one if nslookup does not work.
# (0 = use nslookup, 1 = don use nslookup)
$dont_use_nslookup = 0;
ICMP变量
在开始探测之前,SAINT会试图使用ping检测目标是否正在运行。 $dont_use_ping(0或者1)控制SAINT在探测之前是否进行ICMP检测。默认情况下, $dont_use_ping=0,也即使使用ping。但是,现在大多数的站点都处于防火墙之后,防火墙一般会把ICMP包过滤掉,这时需要把 $dont_use_ping设置为1,采取其它方式进行检测。
如果 $dont_use_ping等于1(或者 $firewall_flag = 1),SAINT会采取其它的方式检测目标是否运行。这种方式就是扫描目标的一些TCP端口,看这些端口是否有回应。扫描的端口由 $std_ports变量指定,例如:
$std_ports = "25,53,80,139,143";
防火墙变量
现在,SAINT扫描的目标一般在防火墙之后,因此需要改变SAINT的某些扫描方式,上面所说的只是一例。如果目标在防火墙之后,首先需要改变 $firewall_flag变量的值(默认是0,即没有防火墙):
$firewall_flag = 1;
然后,还需要设置三个防火墙相关的变量。1). $fw_timeout:设置连接超时时间,一旦在这段时间内没有响应,就认为连接被防火墙阻塞;2). $fw_loadlimit:设置连接请求的数量,防止SAINT由于等待大量的连接响应而造成系统过载;3). $fw_tcp_scan:设置整个TCP扫描的时间。例如:
$fw_timeout = 5;
$fw_loadlimit = 20;
$fw_tcp_scan = 1000;
结论
SAINT是一个比较不错的综合性系统脆弱性评估工具,功能也比较强大、全面。然而,它毕竟脱胎于传统的扫描工具SATAN,因此除了继承了SATAN的良好扩展能力,也继承了SATAN的一些缺陷,例如:其端口扫描模块仍然只采用一些传统的端口扫描方式,根本没有使用一些隐秘端口扫描技术,性能和NMAP等专门的端口扫描工具根本无法相比。但是,SAINT仍然不失为一个很好的安全工具。
作者:nixe0n