使用扫描器检查您的工作,第二部分:Nessus

作者:Mick Bauer

上个月我们开始探索危险而有趣的扫描世界,重点是强大的端口扫描器 Nmap。Nmap 帮助系统管理员和安全审计员(是的,也包括潜在的黑客)确定给定主机正在接受哪些服务的连接。

了解主机提供的入口点是评估该主机安全性的良好开端。但是我们如何解释 Nmap 给出的信息呢?例如,在我们上个月尝试的扫描之一中,输出结果如列表 1 所示。

列表 1. 使用 TCP 连接、UDP 和 RPC 模块的 Nmap 扫描

这到底意味着什么?当然,我们知道这台主机正在运行 Web 服务器(在 TCP 80 端口上)、某种级别的 RPC 服务(UDP 111、UDP 1026)以及可能的 Windows 共享(UDP 137、TCP 138-139)。但是这些服务中哪些是真正可利用的呢?

这就是安全扫描器的用武之地。冒着超前的风险,让我们看看 Nessus 扫描我们测试目标的输出(见图 1)。

Checking Your Work with Scanners, Part II: Nessus

图 1. 从列表 1 中对 Windows 98 主机进行 Nessus 扫描

篇幅不允许我展示完整的(展开的)报告,但即使是这个缩略版本也显示 Nessus 识别出七个明显的“漏洞”,或目标系统中潜在的可利用漏洞。它还生成了四个额外的警告,并提供了两条补充安全说明。

在其他事项中(您无法在图 1 中看到所有这些,因此您必须相信我的话),Nessus 确定该主机正在运行 Sambar Web 服务器,没有管理密码,并且具有危险的 mailit.pl cgi 脚本,它的整个 C:\ 驱动器在没有设置任何密码的情况下共享(即使设置了密码,Nessus 也确定该系统容易受到“空会话”连接和“首字母”密码的攻击),在 TCP 端口 1432 上运行 FTP 服务器(Nmap 错误地猜测该服务器正在运行 blueberry-lm 服务),并且 TCP/IP 堆栈使用了可预测的 TCP 序列号。这些可以通过多种方式被利用,包括 TCP 劫持和 IP 欺骗攻击。

哇!这台主机 ripe to be owned(容易被攻陷)。

那么,这种被称为 Nessus 的致命魔法是什么?为什么在分析这个系统时,它比 Nmap 更胜一筹呢?

安全扫描器详解

像 Nmap 这样的端口扫描器(它是端口扫描器的黄金标准)告诉你什么在监听,而像 Nessus 这样的安全扫描器告诉你什么是脆弱的。由于你需要在尝试探测实际弱点之前知道什么在监听,安全扫描器通常包含或链接到端口扫描器。

碰巧的是,Nessus 在每次扫描的初始步骤中都会调用 Nmap。因此,我暗示 Nessus 比 Nmap 分析得更好是具有误导性的:Nessus 依赖于 Nmap。

一旦安全扫描器确定了哪些服务存在,它就会执行各种检查,以确定哪些软件包正在运行,每个软件包的版本似乎是什么,以及它们是否容易受到任何已知漏洞的影响。可以预见的是,这种级别的智能需要一个良好的漏洞数据库,该数据库必须随着新漏洞的出现而定期更新。

理想情况下,数据库应该是用户可编辑的,即,您应该可以创建特定于您的环境和需求的自定义漏洞测试。这也确保了,如果扫描器的开发者没有立即发布新漏洞的更新,您可以自己创建更新。并非所有安全扫描器都具有这种级别的可定制性,但 Nessus 具有。

在安全扫描器定位、识别和分析了配置要扫描的每台主机上的监听服务之后,它会创建一份关于其发现的报告。更好的扫描器不会止步于指出漏洞;它们会详细解释漏洞并建议如何修复它们。

好的安全扫描器生成的报告内容如此丰富,以至于众所周知,高薪顾问会将它们作为所谓的全面安全审计的主要交付成果来展示。这是一种有问题的做法,但它强调了一个事实,即一次好的扫描会产生大量数据。

有许多免费的安全扫描器可用:VLAD、SAINT 和 Nessus 只是其中几个。然而,Nessus 作为商业产品的可行替代品脱颖而出,例如 ISS 的 Internet Scanner 和 NAI 的 CyberCop Scanner。Nessus 主要由 Renaud Deraison 和 Jordan Hrycaj 开发,无疑与 GIMP 和 Apache 一样,是与专有同类产品在可用性和灵活性方面不相上下,甚至在许多方面超越它们的工具。

在我们进一步深入之前,我应该重复上个月的警告:知识就是力量——负责任地使用它!诸如 Nessus 和 Nmap 之类的工具只能对您授权扫描的系统和网络运行。请注意,未经授权的端口扫描虽然令人不悦,但通常不是非法的,但未经授权的安全扫描可能会给您带来很多麻烦。请注意警告。

Nessus 的架构

Nessus 有两个主要部分:服务器,运行所有扫描;客户端,您可以使用它控制扫描和查看报告。这种分布式架构使 Nessus 具有灵活性,并且还允许您避免扫描活动占用工作站的 CPU 周期。它还允许您混合和匹配平台;您可以使用您选择的 UNIX 变体作为服务器,以及您选择的 X、Java 或 MS-Windows 客户端。(但是请注意,Java 客户端似乎不再处于积极开发中。)

nessusd 在 TCP 端口 3001 和 TCP 1241 上监听客户端连接(1241 最近由互联网号码分配机构分配给 Nessus;3001 最终将被淘汰)。客户端会话使用基于 El Gamal 的公钥方案进行身份验证,并使用流密码进行加密,流密码的会话密钥是为每个连接动态协商的。在这方面,Nessus 的密码层(由 Jordan Hrycaj 使用他的 libpeks 库实现)的行为类似于 SSL。

Nessus 的客户端组件 nessus 可以配置为透明登录(即,没有与您的私钥关联的密码)或使用密码来保护您的私钥,从而防止未经授权的用户从您的工作站连接到 Nessus 服务器。

一旦您连接到 Nessus 服务器,您将看到服务器支持的插件(漏洞测试)列表和许多其他选项。如果您已将其编译到 Nessus 中,您还可以选择运行分离扫描,即使您关闭客户端会话,分离扫描也可以继续运行。还可以编译一整页与知识库的创建和维护相关的选项,允许您存储扫描数据并使用它来跟踪主机从一次扫描到另一次扫描的安全性(例如,运行差异扫描)。

请注意,这些都是实验性功能;由于轻微的稳定性问题,它们必须显式编译到 Nessus 中,但到 Nessus 1.2 版本发布时,这些问题将得到修复(并且这些功能将完全集成)。我在这里提到它们是因为分离扫描功能尤其很好地体现了 Nessus 客户端-服务器架构的价值。

一旦您配置并开始扫描,Nessus 将根据指定和/或适用情况调用每个适当的模块和插件,从 Nmap 扫描开始。一个插件测试的结果可能会影响后续测试的运行方式,甚至是否运行;Nessus 在这方面非常智能。扫描完成后,结果将发送回客户端。如果启用了会话保存功能,结果也可能存储在服务器上。

获取和安装 Nessus

像大多数开源软件包一样,Nessus 提供源代码和二进制发行版。但是,Red Hat 7.0 的 Nessus 1.0.7a 版本(截至本文撰写时的最新版本)二进制文件仅可从 redhat.aldil.org/rpm.html?id=73 获取,由 Matthias Saou 提供(这些二进制文件未与实验性功能一起编译)。

如果您不使用 Red Hat 7.0,如果您的发行版没有自己的 Nessus 软件包(Debian 2.2 有),或者如果您想使用实验性功能,您将需要从源代码编译 Nessus。不用担心,如果您首先安装一些先决条件并按照 Nessus 的安装说明进行操作,则此编译应该顺利进行。Nessus FAQ (www.nessus.org/doc/faq.html) 和 Nessus 邮件列表 (list.nessus.org) 提供了大量关于编译和安装 Nessus 的提示。

Nessus 的先决条件是:Nmap,我们上个月讨论过的端口扫描器;gtk,GIMP 工具包,包括软件包 gtk+、gtk+-devel、glib-devel 和 XFree86-devel;以及脚本环境 m4 或 libgmp(其软件包简称为 gmp)。

一旦您安装了这些,您的发行版可能还有其他先决条件;我知道两种这样的情况。首先,Red Hat 7.0 需要 gmp-2.0(通常包括 gmp-3.0 但不包括 2.0;如果安装 2.0 并且 3.0 已就位,则需要使用 RPM 的 --force 选项)。此软件包可从 www.redhat.com/swr/i686/gmp-2.0.2-5.i686.html 获取。

其次,要在 SuSE Linux 上安装或编译 Nessus,您必须首先安装软件包 bison、flex、gtkdev 和 glibdev。有关更多详细信息,请参见 www.nessus.org/doc/faq.html

在所有先决条件就位后,您就可以编译和/或安装 Nessus 软件包了。编译很简单:对于四个软件包中的每一个,只需 1) 解压缩和解 tar;2) cd 进入其目录并运行 ./configure;3) make;以及 4) make install。软件包应按以下顺序编译和安装:nessus-libraries、libnasl、nessus-core 和 nessus-plugins。

在为 nessus-core 运行 configure 脚本之前,请考虑是否要使用会话保存和/或知识库功能。会话保存允许崩溃恢复(例如,恢复被应用程序或操作系统崩溃中断的扫描)和分离扫描(见上文),并通过在运行 configure 时包含标志 --enable-save-sessions 来启用。

知识库功能允许您将扫描结果存储在服务器上的数据库中,这反过来又允许您运行差异扫描。激活知识库的 configure 标志是 --enable-save-kb。

因此,如果我想编译 Nessus 以启用会话保存和知识库(及其相应的功能),在编译 nessus-core 之前,我将这样调用 configure

./configure --enable-save-sessions --enable-save-kb

有关编译和使用这些功能的详细说明,请参见 http://www.nessus.org/documentation.html(因为它们是实验性的,所以这是我在本文中要说的最后一件事)。

在所有四个软件包都编译和安装后,请确保文件 /etc/ld.so.conf 包含行 /usr/local/lib(如果它不包含,请使用您选择的文本编辑器添加它)。然后,运行 ldconfig 以更新 ld(动态链接器)的缓存。

最后,由于 Nessus 的优势之一是开发人员定期添加新的漏洞脚本,因此从完整的漏洞数据库开始是有意义的。如果您运行脚本 nessus-update-plugins,则自当前 Nessus 版本发布以来创建的所有插件都将使用 lynx 自动下载到您的系统。我建议使用 nessus-update-plugins -v,因为如果没有 -v 标志,脚本将不会打印它正在安装的插件的名称。在下载、解压缩和保存新脚本后,nessus-update-plugins 将重置 nessusd,使其看到新插件(假设 nessus 守护进程在此时处于活动状态)。

目前,此脚本不会针对 MD5 或其他哈希检查这些脚本;因此,这种机制可以通过多种方式被破坏。如果这困扰您,您可以随时从 www.nessus.org/scripts.html 手动下载插件,一次下载一个,但即便如此,您也不会知道是否有任何可疑之处,除非您在下次运行扫描之前查看每个脚本(它们位于 /usr/local/lib/nessus/plugins 中)。

Nessus 客户端

除非您仅将 Nessus 服务器用作其自己的客户端(即,在同一主机上运行 nessusd 和 nessus),否则您需要在您希望用作客户端的每台主机上执行额外的 Nessus 安装。虽然 Nessus 服务器(运行 nessusd 的主机)必须是 UNIX 主机,但客户端可以在 UNIX 或 MS-Windows 上运行。在 UNIX 客户端机器上编译和安装 Nessus 与在服务器上没有区别(如上所述)。

安装任何 Windows 客户端(WinNessus、NessusW 和 NessusWX)都稍微简单一些,因为所有三个都以二进制形式提供。就个人而言,我更喜欢这三个中的 WinNessus,因为它非常类似于 UNIX GUI(我就是这么懒)。所有三个 Windows 客户端都可以在 www.nessus.org/win32.html 找到。

在我们讨论 Nessus 客户端的正确使用之前,我们最好先启动我们的守护进程。

运行和维护 nessusd

好的,我们回到了 Nessus 服务器的控制台,准备第一次启动 Nessus。(您兴奋吗?我希望是为了好的理由而不是邪恶的!)nessusd 与许多其他守护进程不同,它可以作为适当的守护进程(即在后台运行)调用,也可以使用重新配置 Nessus 的标志和参数调用。因此,要实际在守护进程模式下启动守护进程,我们输入 nessusd -D

正如我们对客户端/服务器应用程序所期望的那样,我们还需要在我们的服务器上创建一些 Nessus 用户帐户。这些帐户独立于服务器的本地 UNIX 用户帐户。可以通过两种不同的方式创建 Nessus 帐户。首先,我们可以使用 -P 标志立即后跟用户名和一次性密码来调用 nessusd。这既不会干扰正在运行的 nessus 守护进程,也不会启动新的守护进程;但是,它会立即更新 Nessus 的用户数据库并透明地重启守护进程。

例如,要添加用户“bobo”,密码为“scuz00DL”,我们输入

nessusd -P bobo,scuz00DL

该密码被称为一次性密码,因为默认情况下,在 bobo 首次登录并提供此密码后,他的公钥将在 Nessus 服务器上注册;后续登录将不再需要他再次输入此密码(它们将使用类似于 SSL 的质询/响应事务透明地进行身份验证)。

在服务器上创建新用户帐户的第二种也是更强大的方法是使用 nessus-adduser 命令。此脚本实际上通过调用 nessusd 来完成其大部分魔力,但它为您提供了一个方便的界面,用于比简单的 nessusd -P 更精细地管理用户。系统不仅会提示您输入用户名和一次性密码,还会提示您输入用户可以从中连接的 IP 地址以及限制用户可以使用 Nessus 扫描哪些主机的规则。

如果您对这种级别的用户帐户管理感兴趣,我建议您阅读 nessus-adduser 手册页。我们剩余的空间最好用于讨论如何构建、运行和解释 Nessus 扫描。

但在我们离开身份验证主题之前,我应该提及 Nessus 使用的另一种身份验证:每个客户端会话本地的身份验证。当您第一次启动 Nessus(客户端,而不是守护进程)时,系统会提示您输入密码短语。此密码短语保护存储在您启动 Nessus 时登录的 UNIX 帐户主目录中的私钥,并且每次都会提示您输入该密码短语。然后,当您连接到 Nessus 服务器时,您的私钥将在我之前描述的透明质询/响应事务中使用;它实际上对远程 nessusd 进程进行身份验证。

如果所有这些听起来令人困惑,请不要担心:只需记住,每次启动 Nessus 时提示您输入的密码与您第一次连接到 Nessus 服务器时使用的密码无关。

使用 Nessus 执行安全扫描

现在真正的乐趣开始了!在安装 Nessus 并至少设置一个用户帐户后,您就可以开始扫描了。首先,启动客户端会话并在提示时输入您的客户端私钥密码短语(顺便说一句,您可以使用命令 nessus -C 更改或删除此密码短语,该命令将提示您输入当前的密码短语以及您想要更改的内容)。

接下来,输入您要连接的 Nessusd 主机(服务器)的名称或 IP 地址、它正在监听的端口、您首选的加密方法以及您的 Nessus 登录名/用户名(图 2)。端口和加密的默认值通常就可以了。

Checking Your Work with Scanners, Part II: Nessus

图 2. 用户“bobo”首次登录 Nessus 服务器

当您准备好连接时,单击“登录”按钮。如果这是您第一次使用指定的登录名连接到服务器,系统将提示您输入一次性密码(下次,您将不会被提示)。这样,您应该已连接并准备好构建扫描。

如果您单击“插件”选项卡,您将看到 Nessus 服务器上所有可用漏洞测试的列表,按族分组(图 3)。单击一个族的名称(这些名称列在窗口的上半部分)以查看该族的插件列表。单击族的复选框允许您启用或禁用其所有插件。

Checking Your Work with Scanners, Part II: Nessus

图 3. 插件屏幕(已选择和显示 Windows 族)

如果您不知道给定插件的作用,请单击其名称,将弹出一个信息窗口。如果您将鼠标指针悬停在插件名称上,将弹出一个摘要标题,简要说明插件的作用。复选框旁边带有黄色三角形的插件是危险的:它们执行的特定测试有可能中断甚至崩溃目标(受害者)主机上的服务。启用这些插件时要格外小心。

不要太担心选择所有插件或大量插件。Nessus 足够智能,可以跳过例如非 Windows 主机上的 Windows 测试。总的来说,Nessus 在决定运行哪些测试以及在什么情况下运行测试方面非常高效。

要配置的下一个屏幕是“首选项”(图 4)。与您可能认为的相反,此屏幕包含的不是通用首选项,而是特定于插件的首选项,其中一些是相应的插件正常工作所必需的。请务必向下滚动整个列表并尽可能多地提供信息。

Checking Your Work with Scanners, Part II: Nessus

图 4. 首选项屏幕

请注意“Ping”部分(在最顶部);通常情况下,选择任何一种 ping 方法(TCP 或 ICMP)都可能导致 Nessus 错误地判断主机已关闭,而实际上它们已启动。Nessus 不会对未回复 ping 的主机执行任何测试——如果不确定,请不要 ping。警告:在“Nmap”部分中,Linux 用户应仅选择 tcp connect(),并且应取消选择所有其他扫描类型,这是因为 libpcap 中的一个错误会影响 Nessus 执行端口扫描的方式。

“首选项”之后是“扫描选项”(图 5)。请注意,图 5 中的 Nessus 安装是使用会话保存功能编译的,分离扫描和连续扫描选项证明了这一点,否则这些选项将不存在。与“首选项”屏幕一样,您应该取消选择“端口扫描器”下的所有内容,除了 Nmap tcp connect() 扫描,这是由于上面提到的错误。

Checking Your Work with Scanners, Part II: Nessus

图 5. 扫描选项屏幕

“优化测试”选项告诉 Nessus 避免所有明显不适用的测试,但这可能会导致误报,至少在理论上是这样。考虑一下您对此有多担心,以及您是否希望扫描尽可能快地完成。说到速度,如果您关心速度,您可能想要避免使用“执行反向 (DNS) 查找...”功能;它尝试确定所有扫描的 IP 地址的主机名。

现在是时候指定我们的受害者了……哦,我的意思是目标。我们在“目标选择”屏幕的“目标:”字段中指定这些目标(图 6)。这可以包含主机名、IP 地址和网络地址,格式为 x.x.x.x/y(其中 x.x.x.x 是网络号,y 是子网掩码中的位数,例如 192.168.1.0/24),以逗号分隔的列表形式。

Checking Your Work with Scanners, Part II: Nessus

图 6. 目标选择屏幕

“执行 DNS 区域传输”选项指示 Nessus 尝试获取“目标:”框中引用的任何域名或子域名上的所有可用 DNS 信息。请注意,大多数互联网 DNS 服务器都配置为拒绝来自未知主机的区域传输请求。此屏幕中的其他选项与我之前提到的实验性会话保存功能有关——有关实验性功能的作用以及如何使用它们的更多信息,请参见 www.nessus.org/documentation.html

最后,在我们开始扫描之前的最后一个屏幕:“用户”(见图 7)。(我们跳过“知识库”,它仅在您已编译并希望使用知识库功能时适用。)在此屏幕中,我们可以更改我们的客户端密码短语(这与 nessus -C 具有相同的效果),并且我们可以列出我们在“目标选择”屏幕中指定的目标的例外情况(实际上是微调)。

Checking Your Work with Scanners, Part II: Nessus

图 7. 用户屏幕

这些例外情况称为规则,它们遵循简单的格式:accept address、deny address、default accept 或 reject。在图 7 中,列出的规则意味着不要扫描 10.193.133.60,但扫描上一个屏幕中列出的所有其他内容。

现在,到了收获的时候了。我们单击屏幕底部的“开始扫描”按钮,然后我们就开始了。扫描的长度会有所不同,主要取决于您扫描的主机数量以及您启用的测试数量。最终结果?一份类似于图 1 所示的报告。

从“报告”窗口中,除了查看报告并深入了解其各种详细信息外,您还可以将报告保存到文件。支持的报告文件格式包括 HTML、ASCII、LaTeX,当然还有专有的 Nessus 报告格式 NSR(您应该将其用于希望在 Nessus 中再次查看的报告)。

仔细阅读此报告;请务必展开所有 + 框并修复 Nessus 发现的问题。Nessus 可以发现问题,甚至可以提出解决方案,但它不会为您修复问题。此外,Nessus 不一定会找到您系统中的所有错误。

这是安全扫描器的一个事实;它们只能做这么多,并非所有插件在查找它们应该查找的东西时都同样有效。即使在它们有效的范围内,Nessus 显然也无法找到它没有插件的漏洞,因此请务必定期更新您的插件。

一些临别感言

Nessus 是一款功能强大、灵活、商业级但完全免费的安全扫描器。当正确生成和解释 Nessus 报告时,它们可以帮助您在众所周知的漏洞曲线中保持领先地位。我们尚未讨论如何编写自定义插件,但这些插件使您不仅可以测试常见的已知漏洞,甚至可以测试全新的或迄今未知的漏洞。

再次强调,请负责任地使用此工具。假设您会这样做,祝您玩得开心!

Checking Your Work with Scanners, Part II: Nessus
Mick Bauer (mick@visi.com) 是双子城地区的网络安全顾问。自 1995 年以来,他一直是 Linux 的忠实拥护者,自 1997 年以来,他一直是 OpenBSD 的狂热爱好者,特别喜欢让这些尖端的操作系统在过时的垃圾上运行。Mick 欢迎问题、评论和问候。
加载 Disqus 评论