使用扫描器检查您的工作,第一部分 (共二部分): nmap
您可能听说过一些可怕的故事,讲述了邪恶的系统破解者如何容易地使用互联网上现成的软件工具来探测潜在受害者的系统漏洞。坏消息是,这些故事通常是真的。好消息是,许多这些工具对于扫描您自己的系统以查找弱点的合法目的非常有用(甚至为此而设计)。
本月和下个月的专栏将探讨普通系统管理员和高级安全专业人员如何使用 nmap 和 nessus 这两个优秀的开源软件包来提高系统安全性。但请记住,知识就是力量,您有责任负责任地使用它(并以不会迫使任何黑衣人没收您心爱的红帽 boxen 的方式使用它)。
为什么要扫描?如果您是系统破解者,您扫描是为了确定系统正在运行哪些服务,以及这些服务容易受到哪些众所周知的漏洞的攻击。如果您是系统管理员,您扫描的目的本质上相同,但目的是修复(或至少了解)您的系统,而不是入侵它们。
好人使用与他们试图阻止的坏人相同的工具,这听起来可能很奇怪。毕竟,我们不会通过试图踢开自己的门来测试我们的门锁。但系统安全比物理安全复杂得多。要衡量联网计算机系统的相对安全性,远没有衡量您家的门那么容易。虽然理想情况下我们应该始终知道我们管理的每台主机上哪些网络进程处于活动状态,但事实是在这个超连接时代,很难跟踪这些信息。
因此,我们这些有安全意识的极客有义务认真对待任何可以提供某种理智检查的工具,即使是不完整和不完美的工具(就像任何试图衡量像系统安全这样不断变化的目标的工具一样),尽管或者甚至因为该工具对坏人有用。但是,我们也需要记住,安全扫描器或任何其他单一工具或技术都不会神奇地赋予完全的安全性。请跟我重复:安全是一个过程,而不是一个产品。
说了这么多,我们喜欢安全扫描器还有一个原因:名声。假装自己是 s00p3r 3L33T HaX0r 很有趣。使用像 nmap 和 nessus 这样的工具,同时面不改色地说我们正在“工作”,真是太棒了!
系统扫描基本上有两种类型。端口扫描查找开放的 TCP 和 UDP 端口,即“监听服务”。安全扫描更进一步,探测已识别服务是否存在已知弱点。就复杂性而言,执行端口扫描就像数一栋房子有多少门窗;运行安全扫描更像是摇晃所有门把手并检查窗户是否有警报传感器。
哦,我差点忘了 ping 扫描,可以说是第三种扫描。这些扫描用于识别给定范围或网络中哪些 IP 是活动的(即,哪些主机响应 ping)。虽然这可能很有用,具体取决于手头的任务,但为了将本月专栏保持在可管理的水平,我将重点关注单系统端口和安全扫描。我们在这里讨论的一切都适用,无论您扫描的是五台主机还是 65,500 台。
端口扫描的基本前提很简单:如果您尝试连接到给定的端口,您可以确定该端口是关闭/非活动的,还是应用程序(即,Web 服务器、FTP 守护程序等)正在那里接受连接。碰巧的是,编写一个简单的端口扫描器很容易,该扫描器使用本地 connect( ) 系统调用来建立各种端口上的 TCP 连接;使用正确的模块,您甚至可以使用 Perl 来做到这一点。但是,这种方法也恰好是最具侵入性和最明显的扫描方式,并且往往会在目标系统上产生大量日志条目。
Fyodor 的 nmap 登场了。如果您愿意,nmap 可以执行简单的 connect( ) 扫描,但它的真正特色是“隐身扫描”。隐身扫描涉及使用伪造的 TCP 数据包,旨在触发来自每个目标系统的响应,而无需实际完成 TCP 连接。
nmap 除了 TCP Connect 扫描、UDP 扫描、RPC 扫描、ping 扫描甚至操作系统指纹识别之外,还支持四种不同的隐身扫描类型。它还拥有许多对黑帽黑客比白帽黑客更有用的功能,例如 FTP 反弹扫描、ACK 扫描和 Window 防火墙扫描,但这些功能对 Linux Journal 的高度道德的读者来说几乎没有意义。简而言之,nmap 是迄今为止功能最丰富、用途最广泛的端口扫描器。
下面是 nmap 可以执行的最重要扫描类型的摘要
TCP 连接扫描—使用操作系统的原生 connect( ) 系统调用尝试在每个探测端口上进行完整的三次 TCP 握手(SYN、ACK-SYN、ACK)。连接失败(即,如果服务器用 ACK-RST 数据包回复您的 SYN 数据包)表示端口已关闭。它不需要 root 权限,并且是最快的扫描方法之一。然而,不足为奇的是,大多数服务器应用程序都会记录在打开后立即关闭的连接,因此这是一种相当“嘈杂”的扫描。
TCP SYN 扫描—TCP 连接扫描的三分之二;如果目标返回 ACK-SYN 数据包,nmap 会立即发送 RST 数据包,而不是使用 ACK 数据包完成握手。像这样的“半开放”连接不太可能被记录,因此 SYN 扫描比 TCP 连接扫描更不易察觉。权衡之处在于,由于数据包是由 nmap 而不是内核构建的,因此您必须以 root 身份运行 nmap 才能使用此模式。
TCP FIN 扫描—nmap 甚至没有假装发起标准 TCP 连接,而是发送单个 FIN(结束)数据包。如果目标的 TCP/IP 堆栈符合 RFC-793 标准(MS-anything、HP-UX、IRIX、MVS 和 Cisco IOS 不符合),则开放端口将丢弃该数据包,而关闭端口将发送 RST。
TCP NULL 扫描—类似于 FIN 扫描,但发送的是无 TCP 标志的数据包(即,空数据包)。也依赖于上面描述的符合 RFC-793 标准的行为。
TCP Xmas Tree 扫描—类似于 FIN 扫描,但发送的数据包设置了 FIN、PSH 和 URG 标志(分别为结束、推送数据和紧急)。它也依赖于上面描述的符合 RFC-793 标准的行为。
UDP 扫描—由于 UDP 是一种无连接协议,即,在任一方向的数据包之间没有协议定义的关联,因此 UDP 没有像上面描述的 TCP 扫描中那样的握手。但是,如果 UDP 数据包发送到关闭的 UDP 端口,则大多数操作系统的 TCP/IP 堆栈将返回 ICMP “端口不可达”数据包。因此,可以假定不返回 ICMP 数据包的端口是开放的。由于探测数据包及其潜在的 ICMP 数据包都不能保证到达(请记住,UDP 是无连接的,ICMP 也是如此),因此 nmap 通常会为每个探测的 UDP 端口发送多个 UDP 数据包,以减少误报。根据我的经验,nmap 的 UDP 扫描的准确性因目标操作系统而异,但总比没有好。
RPC 扫描—与其他扫描类型结合使用,此功能将使 nmap 尝试确定被标识为开放的端口中哪些端口正在托管 RPC(远程过程调用)服务,以及这些服务和版本号是什么。
Ping 扫描(扫射)—请参阅上面的“扫描类型及其用途”。
哇!扫描方法列表真长——我遗漏了 ACK 扫描和 Window 扫描(如果您有兴趣,请参阅 nmap(1) 上的手册页)。nmap 还有另一个非常有用的功能,操作系统指纹识别。基于目标对 nmap 发送的各种神秘数据包的响应特征,nmap 可以对每个目标主机正在运行的操作系统做出有根据的猜测。
nmap 非常有用和流行,现在已包含在大多数 Linux 发行版中。Red Hat 7.0 和 Debian 2.2,我目前选择的两种风格,都带有 nmap(分别在 Applications/System 和 Extra/Net 下)。因此,对于大多数 Linux 用户来说,安装 nmap 的最简单方法是通过其系统的软件包管理器(例如,RPM、dselect、YAST)和首选的操作系统安装介质(CD-ROM、FTP 等)。
但是,如果您想要最新版本的 nmap 和/或其源代码,两者都可以从 http://www.insecure.org/ (Fyodor 的网站)以 RPM 和 TGZ 格式获得。如果您希望从源代码编译 nmap,只需下载并展开 tarball,然后输入以下命令(允许展开的源代码目录名称有任何差异;当您阅读本文时,nmap v2.53 可能已过时)
cd nmap-2.53 ./configure make make install
有两种不同的方式来运行 nmap。最强大和最灵活的方式是通过命令行提示符。还有一个名为 nmapfe 的 GUI,它为您构建和执行 nmap(见图 1)。
此 GUI 对于快速扫描或作为学习 nmap 命令行语法的辅助工具非常有用。但是,我强烈建议学习 nmap 本身,因为 GUI 仅呈现 nmap 功能的子集。此外,为小小的 nmap 启动 X 界面有点杀鸡用牛刀。
nmap 命令很容易学习。简单扫描的基本语法是:nmap -s (扫描类型) -p (端口范围选项) (目标)。-s 标志紧跟以下选项之一
T: TCP 连接扫描
S: TCP SYN 扫描
F: TCP FIN 扫描
N: TCP NULL 扫描
X: TCP Xmas Tree 扫描
U: UDP 扫描(可以与上述扫描类型结合使用)
R: RPC 扫描(可以与上述扫描类型结合使用)
-s 标志指定要运行的扫描类型,可以后跟任何 TCP 扫描类型、U(用于 UDP 扫描)、R(用于 RPC 扫描/识别)或这三组标志的任意组合。但是,在给定的会话中只能指定一种 TCP 扫描类型。如果完全省略 -s 标志,则默认扫描类型为 TCP 连接。
例如,-sSUR 告诉 nmap 对指定目标执行 SYN 扫描、UDP 扫描,最后执行 RPC 扫描/识别。但是,-sTSR 将失败,因为 TCP 连接和 TCP SYN 都是 TCP 扫描。
如果您使用 -p 标志声明端口范围,则可以组合逗号和破折号来创建要扫描的非常具体的端口组。例如,键入 -p 20-23,80,53,600-1024 告诉 nmap 扫描端口 20 到 23、80、53 和 600-1024。但是,请不要在端口范围中使用任何空格。
同样,“目标”表达式可以是主机名、主机 IP 地址、网络 IP 地址或 IP 地址范围。例如,键入 192.168.17.* 会扩展到网络中的所有 255 个 IP 地址—192.168.17.0/24(事实上,您可以使用 192.168.17. 0/24 代替);10.13.[1,2,4].* 扩展到 10.13.1.0/24、10.13.2.0/24 和 10.13.4.0/24。如您所见,nmap 在它可以理解的目标表达式类型方面非常灵活。
在我们进一步深入之前,让我们检查一些使用我们迄今讨论过的标志的基本扫描。本节中的示例都使用在 Red Hat 7.0 上运行的 nmap 版本 2.53(截至本文撰写时为最新版本)。这些示例中的目标系统正在运行 Windows 98,并安装并激活了 Sambar Web 服务器,以获得良好的衡量标准。
首先,假设我们希望 nmap 执行“全默认”扫描。如果我们不想提供任何标志,则不需要提供;如果仅给出目标 IP 或 IP 表达式,nmap 将 ping 每个目标主机,然后使用 TCP 连接方法扫描(目标)端口 0-1024 以及 /usr/share/nmap/nmap-services 中列出的所有其他端口(您到此文件的路径可能有所不同),总共 1,523 个 TCP 端口。清单 1 显示了针对 Windows 98 系统运行此类全默认扫描的外观。
请注意,查询 1,523 个端口仅用了两秒钟。当我说 TCP 连接方法很快时,我不仅仅是在“吹牛”。
对于我们的下一个示例扫描,假设我们想在扫描中添加 UDP,并且与此同时,我们想看看我们找到的任何开放端口是否正在运行 RPC 应用程序。由于我们希望除了 TCP 连接扫描之外还进行 UDP 端口扫描,而不是替代 TCP 连接扫描,因此我们需要明确说明。我们的命令及其输入将如清单 2 所示。
清单 2. 使用 TCP 连接、UDP 和 RPC 模式的 Nmap 扫描
-sU 和 -sR 扫描(在上面的 -sTUR 中组合)特别适合一起使用:RPC 是一种 UDP 密集型协议。当 nmap 在开放端口上找到 RPC 服务时,它会将 RPC 应用程序的名称附加在括号中,如果 nmap 可以对版本号做出可信的猜测,则包括版本号。
假设我们正在寻找更具体的东西。这可能是因为我们对主机正在运行什么有一些了解,和/或我们希望最大限度地缩短扫描时间。要指定我们想要查看哪些端口,我们将 -p 标志以及端口列表附加到命令中。在此列表中可以使用逗号和破折号,但不能使用空格。清单 3 显示了一个扫描,我们在其中检查所有特权端口 (1-1024) 以及我们担心的一些高端口,即 TCP 12345 和 12346(NetBus 的默认端口)和 UDP 31337(BackOrifice 的默认端口)
最后,因为它非常容易,让我们对多台主机进行扫描。nmap 接受的主机表达式甚至比端口表达式更灵活:可以使用通配符、方括号(列表)和“斜杠/子网位数”表示法。以下命令看起来就像在我的整个测试网络(254 个地址,这次省略了输出)上执行清单 3 中的扫描
nmap -sTU -p 1-1024,12345,12346,31336 10.13.13.0/24
nmap 具有一系列令人恐惧的功能,旨在偷偷穿过防火墙、避免触发入侵检测软件以及以其他方式帮助用户逃避检测。我完全不想在这里讨论这些功能;虽然毫无疑问它们有合法的用途,但我希望本文的其余部分花在一些不太明显以破解为导向的漂亮功能上。
假设您是一个大型网络的管理员,有人在您的机房中安装了一台服务器,该服务器似乎可以从 Internet 访问,可能违反了您组织的安全策略(和/或让您感到愤慨,因为没有人征求您的许可)。在采取权威行动之前,您决定首先尽可能多地了解您的网络可能面临的风险。
幸运的是,神秘服务器的 IP 地址用紫色蜡笔潦草地写在其正面。同样幸运的是,您是正义的 nmap 复仇天使,因为您本月阅读了“Paranoid Penguin”。以下是一些 nmap 选项,可帮助您找出究竟发生了什么。
首先,这头野兽运行的是什么操作系统?操作系统指纹识别(由 -O 标志召唤)可能会告诉您。当您使用 -O 时,nmap 会发送设置了各种 TCP 选项的数据包,并将收到的回复与其操作系统指纹数据库 (/usr/share/nmap/nmap-os-fingerprints 在我的 Red Hat 7.0 系统上) 进行比较。根据我的经验,此功能效果非常好,除了在 MacOS 8 上(它似乎让它感到困惑)。
接下来,任何活动端口是否都在运行具有 root 权限的服务?显然,某些服务需要这么高的权限,但许多服务不需要;如果此框上的 Web 服务器以 root 身份运行,则肯定需要有人进行对话。使用 -I 标志使 nmap 查询目标的 ident 守护程序,其唯一目的是告诉世界哪个用户拥有每个监听服务。
我们能否最大限度地减少过度激进的扫描会使目标系统或网络过载的机会?哦,是的。-T 标志允许我们指定计时模式;选项包括 Paranoid、Sneaky、Polite、Normal、Aggressive 和 Insane,网络不友好程度依次增加(基于 nmap 在数据包之间等待的时间以及它是串行还是批量发送数据包)。如果您想对目标和/或网络放慢速度,-T Polite 是一个不错的选择。
我们如何进行快速扫描,检查可能的服务,而无需扫描所有特权端口?-F 标志告诉 nmap 仅扫描 nmap-services 中列出的那些端口。通过这种方式,我们避免了不太可能产生任何有趣结果的端口。
最后,有没有一种简单的方法将我们收集到的证据另存为文本文件?键入 -oN 文件名 告诉 nmap 将其结果写入文本文件。如果我们希望 nmap 使用 HaX0r Sp3ll1ng,我们可以改用 -oS 文件名(“S”代表“Script-Kiddie-Talk”)。
在清单 4 中,我们看到未经授权的服务器正在接受 Secure Shell、Telnet、HTTP/SSL、LPD、X 和 nessus 等连接。nessus?为什么,这是一个安全扫描器。您绝对不希望 Internet 主机能够访问您网络上的 nessus 服务器——这恰好是下个月专栏的主题。
尽管 nmap 功能强大,但 nessus 为我们提供了一种更进一步的方法,可以探测 nmap 发现的所有这些监听端口是否存在已知弱点。同样,我们将专注于为善而非为恶而使用这些强大的工具;与此同时,我希望您也能对 nmap 这样做。
