随着相关组织公布的安全漏洞接踵而来,多数企业都面临着发现自身系统中的安全隐患重大压力。为了满足企业的这种需要,许多商业公司和开放源代码组织都为发现安全漏洞的自动化做了很多努力,并最终开发出了各种各样的安全评估工具。这些安全评估工具又称为扫描器(scanners),其种类繁多,性能各异。本章将简要介绍这些工具的用法及其使用场合,并就如何选取合适的扫描工具做一些探讨,以帮助读者在场永无休止的网络战争中立于不败之地
扫描器的历史
扫描器的历史要追溯到20世纪90年代,当时internet刚刚起步并在各大学校园中得到迅速发展,CERT也很快建立并运作起来,Gopher在万维网中仍然处于研究阶段;在计算机安全领域,各厂商能够解决大多数的安全问题,UNIX管理员也开始领略到黑客的狡猾了,我们今天所实践的internet安全正处于幼儿时期,但现代安全工具的蓝图却正在逐步绘制起来。
1992年,一名名叫Chris Klaus的计算机科学系学生在做internet安全试验时,编写了一种扫描工具——internet Security Scanner(ISS),该工具可以远程探测UNIX系统的各种通用漏洞。Chris这样写到:
ISS项目使我开始对计算机安全产生了浓厚的兴趣。我以前就听说过许多有关黑客和骇客入侵到NASA和大学网络的事儿,于是我想找出这些安全问题的深层原因,以及这些人为何能够访问到那些我们认为很安全计算机中。我通过internet搜索这些相关的信息,包括Phrack和CERT等咨询机构。
很多信息都是含糊其词的,并没有解释入侵者为何能够访问这些系统。多数信息一般都是警告管理员要严密保护好各种口令,并及时地打上供应商提供的补丁程序,而并没有入侵者如何探测某个网站并进宪入侵等内容。在请教了许多安全领域的专家、阅读了CERT咨询机构的大量文章之后,我开始在我的领域内寻找各种各样的安全漏洞。
令我感到惊讶的是,许多机器的安全保护都做的很好,但有一个域内的机器却有明显的漏洞,任何人都可以通过这些漏洞入侵到这台计算机上,并进而访问这个域内的其他计算机。——Chris Klauw(摘自ISS 1.0中的readme文件,1993年)。
ISS是internet上用来进行远程安全评估扫描的最早的工具之一,它能能别出几十种常见的安全漏洞,并将这些漏洞做上标记以便日后解决。虽然有些人担心该工具的强大功能可能会被用于非法目的,但多数管理员对这个工具却很欢迎。
几年以后,Dan Farmer(以COPS闻名)和Wietse Venema(以TCP_Wrapper闻名)编写了一个类似的工具,称为SATAN(Security Administrator Tool for Analyzing Networks,系统管理员网络分析工具)。SATAN本质上与ISS相同,但有一些优点:具有一个更加成熟的扫描引擎、基于Web的界面,并能进行分类检查。然而与ISS不同的是,SATAN的发布引起了媒体的极大关注:1995年4月该产品发布时,《时代》杂志发表了一篇关于SATAN和Dan Farmer的文章,CERT还评论了该工具的能力(CA-1995-06)。许多人甚至担心SATAN的发布会给internet带来混乱。
事实并非像预料中的那样混乱,只是由于几天以后人们纷纷下载SATAN而造成了网络有点拥塞而已。
注意 奇怪的是,Farmer因为SATAN丢掉了他在SGI的工作,然而Klaus却利用ISS创办了一个拥有几百万资产的网络安全公司——Internet Security Systems(ISS)。
从那时起,安全评估技术就得了不断的发展并日趋成熟。今天,业界已经出现了十几种扫描器,每种都有其优点,也有其弱点;但自从ISS和SATAN问世以来,相关的基本理论和基本概念却没有改变多少。
扫描器的工作原理
大家可能注意到,与Windows和UNIX相关的漏洞有很多,但这些操作系统漏洞基本上可以分为两类:一类是一些本地漏洞(host-level,主机级),另一类是一些远程漏洞(remote-level,远程级)。
对于远程漏洞,我们可以使用多种方法来完成漏洞自动扫描的任务。例如,一种方法是使用诸如nmap的端口扫描工具识别出操作系统的类型,然后记录下所有处理监听状态的端口;这样,用户就会得到一系列端口(如21、25、53、80等等)和操作系统的类型(如Linux kernet2.2)。然而,这种方法也有一定的缺陷:虽然用户得到了不少数据(即端口信息),但却无法得到诸如究竟哪些服务存在安全漏洞等细节,用户得到的只是关于自己系统的一些概要信息;至于如何识别那些处于监听状态的服务,以及这些服务是否存在有漏洞,所有这些工作只能由用户自己来完成。例如,如果通过数据得知识算机X运行的操作系统是Linux 2.2 kernet,在端口21有一个服务正处理监听状态,我们往往难以确定这样的系统是否会有wu-ftpd缓冲区溢出等问题;事实上,我们甚至连该系统上是否运行有wu-ftpd都不清楚(可能正运行有ProFTPd或glftpd等)。因此,即使扫描到了哪些端口是开放的,我们仍然需要:
a)识别该端口上有哪些服务正处于监听状态。
b)识别这些服务的版本。
c)研究与该服务及其版本相关的已知漏洞
尽管这种方法对于十几台机器是可行的,但对于拥有数百台机器听中大型企业,这种方法却几乎是不可能实现的。
更实际一点的解决方法是,在前面的端口扫描和操作系统识别的基础上再添加某种识别监听服务类型和版本的机制。回到前面wu-ftpd缓冲区溢出的例子上,识别了服务的版本以后,我们现在可以得知。
a)服务器运行的操作系统是Linux Kernel 2.2。
b)端口21正处于监听状态。
c)该监听服务的类型和版本号。
假定由上述过程,我们得知正在使用的服务器是wu-ftpd 2.4.2版本;这样,我们的工作又进了一步,现在只需要研究wu-ftpd 2.4.2版本都有哪些漏洞就可以了。
注意 读者需要注意端口扫描(port scanning)和漏洞扫描(vulnerability scanning)的区别。尽管多数漏洞扫描器也需要扫描开放的TCP和UDP端口,但这只是它们的一项功能。相反,尽管诸如nmap之类的端口扫描器也有某些其他功能(如操作系统识别),但一般不包含漏洞数据库。简言之,多数漏洞扫描器所做的工作都比端口扫描器所做的工作更进了一步。
漏洞扫描的最后一步就是研究对应版本的监听服务都有哪些漏洞。在很大程度上,这个过程与黑客的攻击过程非常类似:扫描、查询、研究、攻击。在这个阶段,我们会得知wu-ftpd 2.4.2版本的确存在着漏洞。
根据所有已知的产品漏洞(目前估计有2000到3000种之多)来建立一个完整的系统,并正确识别和跟踪这些产品漏洞是一项相当艰巨的任务。这些漏洞数据的采集和管理也为建立这种自动化的工具带来了极大的难度。
尽管实现的细节各不相同,但基于上述分析,我们可以推断出多数扫描方法所共有的一些部件:
·漏洞数据 漏洞评估扫描器一般都具有内部的漏洞信息数据库,以便精确地识别远端系统的漏洞。
·扫描机制 扫描的技术关键在于它能正确识别出对应的服务、子系统以及漏洞。根据扫描器实现方法的不同,有些扫描器在扫描大范围的机器时可能效率不是很高。
·报告机制 查找问题是一回事,精确地报告这些问题则完全是另一回事儿。有些产品能够更清晰地报告扫描结果。
有的扫描器可能不太符合上述要求,但这样例外的扫描器毕竟是少数。
注意 一种更加彻底也更加危险的方法是,找到了这些漏洞以后对这些漏洞实施攻击。SNI在其最初的Ballista产品中试图这样做过。从理论上讲,这肯定会找出某些诊断错误的漏洞(也称为假阳性,false positives)。然而,这种方法也会带来极大的混乱。例如,攻击诸如BIND NXT等漏洞会破坏掉DNS服务器,如果这种攻击成功的话,所有运行有BIND漏洞版本的DNS服务器都会被破坏掉!