1.0 介绍
nessus是一种用来自动检测和发现已知安全问题的强大工具。一般类似说某人,一个黑客团体,一个安全公司或者研究者发现了一种特殊的方式来突破某种软件中的安全限制。这种发现可能是很偶然的或者是通过直接的研究发现的;该漏洞就会被以不同级别的细节描述向安全社区公布。nessus就是设计来帮助it相关人员在黑客对这些漏洞进行利用前确定和解决这些已知安全问题的。nessus是一种有多种功能的强大工具。但是它的使用却相对比较复杂而且指导新用户如何安装并使用它的相关文章也很少。因为这个原因,本文试图对nessus的一些基础例如安装与配置进行介绍。本文会介绍当前版本的nessus(nessus 2.0.8a和nessuswx 1.4.4)中的特性。以后有机会还会继续对nessus进行深入的讨论。
nessus是一种在gpl许可下的开放软件。长期以来许多都机构都嘲笑使用这样的开放软件是浪费时间,而宁可选择那些“提供支持”的正规公司开发的商业软件。但是这样的软件一般需要花费几百或者上千美圆来购买,并且一般人都以为他们都是物有所值。不过现在已经有人开始意识到例如nessus这样的开放软件其实并不比那些商业软件差,某些时候还比那些商业软件要好。目前甚至可以从www.tenablesecurity.com获得付费的针对nessus的技术支持。nessus同样还有一个很大的社区来不断的进行开发与完善,其中最主要的开发者是renaud deraison。如果允许和其他的漏洞扫描器进行一个客观的比较的话,nessus与那些商业扫描器比起来一样优秀甚至更优秀。[参见: information security, network computing]
nessus一个很强大的特性是它的客户端服务器技术。服务器可以放置在网络中的不同地方来获得不同的信息。一个中央客户端或者多哥分布式客户端可以对所有的服务器进行控制。服务器可以在机会所有unix类系统上运行。它甚至可以运行在mac os x和ibm/aix,但是在linux上的安装应该是更简单的。这些特性为渗透测试者门提供了很大的灵活性。客户端有windows下和unix下的版本。事实是是nessus服务器进行真正的测试工作而客户端只是提供配置和报告功能。
2.0 安装
nessus服务器的安装即使对于我这样用惯了windows的人来说都相当简单。首先需要一个unix平台,然后在安装前建议最好安装一些其他的外部程序:例如nmap(工业标准的端口扫描器),hydra(一种弱口令测试工具)以及nikto(一种cgi脚本检查器)。虽然并不是一定需要,但是这些外部程序会极大的增强nessus的扫描能力。只所以选择这些软件是因为它们都是这同类软件中最好的。如果在nessus安装前他们已经被安装在path$中的话安装nessus过后他们都自动的可以直接使用了。
最简单的安装的方式是使用lynx来自动安装。许多linux版本中都已经包含了lynx。使用lynx来自动安装的命令是(以普通用户登录,而不是root) :
lynx -source http://install.nessus.org sh
这样就可以在大部分的平台上安装服务器而不需要再进行其他的步骤了。你也可以下载最新的安装脚本来本地运行。无论你是直接从网站安装还是用同样的安装脚本离线安装,该脚本都会设置一个临时的suid并在需要的时候让你输入root口令 – 如果你不喜欢这种特性你也可以分别下载,编译和安装四个所需的tar文件。上面的命令也可以用来定期对扫描器进行升级。安装的过程中会询问你关于代理服务器的设置,下载的方式(www或者cvs),需要安装的部分等等问题,大多数情况下选择默认最好。虽然这是最简单的安装方式;但是你也赋予了install.nessus.org临时的root权限。因此这就会带来一个安全风险,尽管该风险很小。因此如果你很多疑,多疑在安全领域不是坏事,你也可以采取传统的方式通过下载并编译源文件来进行安装。想了解关于下载源代码安装的详细信息可以访问下面这个地址: www.nessus.org/nessus_2_0.html.
3.0 设置
在服务器安装完成以后,还需要进行一些基本的设置。安装完成后首先的工作是使用”nessus-adduser”命令来添加一个用户。该脚本会向你询问准备采取的身份验证方式。身份验证包括几种方式,但是建议选择最简单的密码验证的方式。接下来会询问对于用户帐号的限制规则。在一个大的企业中使用nessus的情况下有时候需要对用户进行限制只允许某个用户对特定的一些ip地址进行扫描,但是大多数情况下一般不会设置该选项来对用户进行限制,而让用户可以对任意目标进行任意方式的扫描。接下来如果在客户端和服务器端需要加密的通讯传输的话还需要生成一个证书。证书的生成可以通过nessus-mkcert命令来完成。
3.1 升级插件
在进行扫描前,还需要对插件进行升级。nessus的插件和常见的病毒扫描程序的病毒特征很相似。编写的每个插件都是针对某个特定的漏洞进行检测的。这些插件可以对漏洞进行实际的应用或者只是对软件某些已知存在漏洞的版本进行检测。插件可以用大多数常见的语言编写但是一般插件都是用nessus攻击脚本语言(nasl)来写的。nasl是为了漏洞测试而专门设计的一种nessus自己的语言。nasl插件通过向目标发送特定的代码然后将结果与保存的漏洞值进行比对来完成对目标的测试。有一些内置的插件不使用nasl。这些插件都是用c以及perl脚本来编写的,用来完成一些nasl不能轻易完成的工作。其中就包含了一个用来进行端口---程序判断的插件。
应当经常对插件进行升级。新的漏洞总是不断的被发现与散播。特别是在新的漏洞向公众发布后,nessus社区中的某个成员就会编写相应nasl插件,公开发布并提交到www.nessus.org。开发者会对该插件进行检查,检查通过以后就会放到可用的插件列表中去。对于那些高风险,高安全级别的漏洞插件一般是与漏洞信息公开发布的同一天发布的。从维护列表升级插件的工作相当简单,只需要用:nessus-update-plugins 就可以完成了。该命令必须以root身份调用。否则你不能从www.nessus.org 获得完整的插件列表。用nasl编写新的以及特殊需求的插件也是很简单的,因此你可以编写自定义的插件。
3.2 启动后台进程
现在nessus已经安装,升级并可以运行了。运行服务器的最简单方式是以root的身份使用nessusd –d命令。必须通过一个客户端才能使用nessus。有三种形式的nessus客户端可以选择。首先是在安装服务器端的同时安装的本地unix gui版本的客户端。nessus还可以从命令行控制。对于在windows环境下工作的人,nessus还提供了一种windows版本的客户端,叫做nessuswx。你可以从这里下载nessuswx的二进制安装文件。nessuswx的安装是标准的windows安装过程,因此安装很简单。这三种客户端都很好用,但是我个人更喜欢nessuswx。相比unix环境下的客户端来说它的组织更好,报表功能更简单,而且对于不同会话(要扫描的主机分组)的管理机制更好。运行unix下的gui客户端你只需要在命令行下输入nessus命令,对于nessuswx来说,运行只需要在安装完成以后点击那个眼睛形状的图标就可以了。
3.3 客户连接
因为nessus是一种客户端-服务器技术,因此每次运行客户端之前都必须与服务器建立连接。对于unix下的本地客户端来说你需要输入服务器的ip地址,用户名以及密码(使用nessus-adduser命令创建密码)然后点击登录。nessuswx的登陆过程与之相似但是使用的communications connect菜单完成的。客户端通过ssl与服务器连接然后下载一个当前以及安装的插件列表。在第一次运行的时候客户端还会下载一个ssl证书并请求一个验证。该验证保证了进行与服务器端的通讯。图1和图2分别是在unix下和windows下用gui工具与服务器连接的情况。图3是使用nessuswx客户端进行用户验证的情况。
图1: 启动nessus服务器并用unix gui连接

图2: 用nessuswx(windows客户端)连接nessus服务器
图3: 输入服务器ip地址并登录以及用nessus_adduser来设置密码
4.0 使用nessus
现在我们已经安装了并连接了nessus,接下来我们开始讨论nessus的功能了。nessus最强大的部分就是它的插件特性。插件的选择是依次扫描成功的关键。大多数的插件都写得很好,很少会造成漏报或者误报;但是,少数的插件却存在这样的情况。一个编写得不好的插件的例子就是rfp编写的针对windows iis msdac/rds漏洞的攻击测试代码。rain forest puppy (rfp)在1999年公布了该漏洞。该漏洞利用了/msadc/msadcs.dll文件并导致对未打补丁的iis 4.0服务器的完全控制。该nessus插件存在的问题是它只检查该文件是否存在。它并没有考虑服务器是否有打补丁以及windows的版本问题。因此如果在扫描中包含了该插件的话会对 许多的iis服务器产生误报,因此你需要手工来处理这些误报的问题。
但是在有些人叫嚣,“开放软件中的问题真是多”之前,我想指出的是在那些价格很高的“有技术支持”的漏洞扫描器中也存在相同的问题。这个问题和软件的类型没关,而是由目前的技术水平造成的。而区别其实在于使用那些商业扫描器的时候你不能像使用nessus那样可以对那些“专有”的检测手段进行检查,因此让误报的鉴别工作变得更困难。
4.1 选择危险/非危险插件
插件的分类方式有很多种,有一些分类方式比较有迷惑性。方法相似的插件是分在一类的。更重要的是,一些插件被分到了危险/拒绝服务(dos)类。这些插件会进行dos攻击并会造成实际存在这类漏洞的系统崩溃。因此我也不必提醒使用者不能对那些业务系统盲目的进行这种类型的测试了。虽然这些测试不会造成长期的破坏,但是至少重新启动这些系统才能恢复正常的工作。在unix和windows客户端下,都有按钮可以选择“使用所有的插件(enable all plug-ins)”或者“使用除了危险插件以外的所有插件(enable all but dangerous plug-ins)”(在nessuswx下叫做”enable non-dos”)。需要注意的是一般是插件的作者来决定该插件是否属于危险插件的。大多数情况下这些插件的类型选择都是很合理的。但是还是有一些例外(例如:rpc_endpoint mapper插件)会造成dos但是却没有列在危险插件清单中。unix下的本地客户端用一个警告三角形区分了危险插件。而nessus下却除了“enable non-dos”按钮以外没有其他特殊的方式来区分危险插件。还需要注意的是有些情况下“非危险”插件同样会造成系统或者服务的崩溃。因为这些插件一般都是发送的非标准信息,因此风险虽然很小但是始终存在,一些潜在的dos情况总会在无意中产生。所以每当在对系统进行扫描的应当注意系统崩溃的情况,虽然可能性不大,但是即使只使用非危险插件的情况下也有很小的几率出现这样的问题。下面的图4中显示了在unix下的gui客户端中选择使用插件的情况。图5和图6显示的是windows平台下使用nessuswx进行插件选择的情况:
图4: 在unix nessus gui中选择使用所有非危险插件
图5: 在windows nessuswx客户端中选择使用的插件
图6: 在windows nessuswx客户端中使用非危险插件
4.2 安全检查
现在我们开始介绍与安全检查相关的概念了。安全检查会去掉那些与安全检查兼容的插件中危险的部分而只利用例如查看banner中的版本这样的被动方式来对目标进行检查。由于被检测的系统或者服务可能打上了补丁或者采取了临时解决方案,安全检测的准确性比实际对漏洞进行利用来进行判断的方式准确性要低。它们可能会造成漏报或者误报。但是有价值的是这样的检测不会造成系统的崩溃。安全检查选项在扫描选项页面里(nessuswx中的选项页面)。图7中显示的是nessuswx的安全检查选项接口:
图7: 选择安全检查
还有一种插件的组织放肆后是根据目标产品类型进行分类例如windows, ftp, snmp. smb. cisco等等。我认为这种很随意的分类方式实际的效果不大。例如一种只在windows系统下存在的ftp漏洞是应该分在windows类呢还是分在ftp类呢?因为类型的选择取决于插件的编写者,所以这这两种类型都有可能出现。nessus中的过滤/选择机制对于分离出某些特定的漏洞很有帮助。过滤器可以通过插件名称,插件编号等等来创建。点击类型然后再选择插件就可以显示插件具体测试的内容是什么。如果需要跟深入的了解细节,则可以查看cgi.nessus.org/plugins/中的实际nasl代码。注意dos分类的插件与危险/dos类的插件并不完全相同。一个危险/dos分类的查禁会对漏洞进行利用而dos类的插件只是通过例如检查软件版本这样的方式来检查漏洞。如果要对一个非业务系统进行没有顾及的扫描的话,允许使用所有的插件是最好的选择。如果需要进行隐秘扫描或者对业务系统进行扫描,那么插件的选择工作就会变得复杂。
4.3 端口扫描
扫描过程的另一个关键部分是端口扫描。端口扫描是确定一个ip地址上所有活动端口的过程。每个端口都是与某个特定的应用程序绑定的。nessus是一种智能的扫描器,它指挥在某个特定的程序可以进行测试的情况下才对其进行测试。例如,只有在发现web服务器运行的端口有效的情况下才会使用web服务器插件进行测试。因为管理员经常会改变端口的默认值来隐藏服务,因此nessus提供了一个叫做services的插件。该插件会尝试识别在每个端口运行的具体程序。一旦确定了对应的应用程序,就只使用用户选择的以及相关的插件对其进行测试。
nessus中可以选择多种方式来对端口进行扫描。 nessus中包含了内置的nmap,nmap目前被认为是业内最好的端口扫描器。它同时还有另外一种内部扫描器以及一个可以自定义的ping扫描器。这如同插件选择一样,端口扫描也取决于具体的情况。对于简单的扫描来说,在unix gui下的”perf”标签中和nessuswx下的端口扫描标签中选择并以默认参数运行的内部”sync”扫描就足够能满足要求了。图8和9分别是在nessuswx以及unix gui客户端下进行syn扫描选项选择的情况:
图8: 在nessuswx中配置内部的syn扫描来进行简单的端口扫描
图9: 在unix客户端中配置内部的syn扫描来进行简单的端口扫描
4.3 指定目标
最后的任务是对你的目标进行指定。配置工作是在目标标签页中完成的。目标可以指定为单个的ip地址,自网或者一个ip地址段。我一般将目标分成几个逻辑组。因为一次处理一个小的组会让工作变得更简单。图10和11显示了在两种客户端下对目标进行选择的情况:
图10: 在unix gui下指定目标
图11: 在nessuswx下选择目标
4.4 开始扫描
当nessus客户端和服务器都准备完成以后你就可以对系统进行扫描了。在unix gui中要开始扫描只需要点击窗口中的”start scan”按钮就可以了。在nessuswx中,右键点击准备进行扫描的会话然后在菜单中选择execute。只要使用得当,nessus可以找出系统中存在的问题并给出解决方案,但是运用不好的话它可能会造成系统崩溃,丢失数据等等。使用的工具越强大,随之而来的风险与责任也大。被扫描的系统在很少的情况下会崩溃。因此不要在没有许可的情况下对系统进行扫描。我建议你第一次使用nessus来进行扫描的时候最好是对自己用做测试的系统进行扫描。本文就不对整个扫描过程,区分误报以及隐秘扫描,防火墙扫描技术等进行讨论了。图12,13和14显示的是用nessuswx进行扫描的情况。
图12: 在nessuswx中开始扫描
图13: 在nessuswx中开始扫描
图14: 正在进行的nessuswx扫描
5.0 结论
nessus是一种很好的工具可以帮助你发现已知的安全漏洞。正如在本文中多次提到的那样,因为nessus强大的能力有可能由于某些危险插件的原因造成业务系统不能正常工作,因此使用的时候应该比较小心。要了解关于nessus更多的信息,可以访问nessus的官方网站www.nessus.org。
|