九、 服务和版本探测

把 Nmap 指向一个远程机器,它可能告诉您 端口 25/tcp,80/tcp,和 53/udp 是开放的。使用包 含大约 2,200 个著名的服务的 nmap-services 数据库, Nmap 可以报告那些端口可能分别对应 于一个邮件服务器 (SMTP) web 服务器(HTTP) 和域名服务器(DNS) 这种查询通常是正确的 -- 事实上,绝大多数在 TCP 端口 25 监听的守护进程是邮件 服务器。然而,您不应该把赌注押在 这上面! 人们完全可以在一些奇怪的端口上运行服务。

即使 Nmap 是对的,假设运行服务的确实是 SMTP,HTTP 和 DNS,那也不是特别多的信息。 当为 您的公司或者客户作安全评估(或者甚至简单的网络明细清单)时, 您确实想知道正在运行什么 邮件和域名服务器以及它们的版本。 有一个精确的版本号对了解服务器有什么漏洞有巨大帮 助。 版本探测可以帮您获得该信息。

在用某种其它类型的扫描方法发现 TCP 和/或者 UDP 端口后, 版本探测会询问这些端口,确定 到底什么服务正在运行。 nmap-service-probes 数据库包含查询不同服务的探测报文 和解析 识别响应的匹配表达式。 Nmap 试图确定服务协议 (如 ftp,ssh,telnet,http),应用程序名 (如 ISC Bind,Apache httpd,Solaris telnetd),版本号, 主机名,设备类型(如 打印机, 路由器),操作系统家族 (如 Windows,Linux)以及其它的细节,如 如是否可以连接 X server SSH 协议版本 ,或者 KaZaA 用户名)。当然,并非所有服务都提供所有这些信息。 如果 Nmap 被编译成支持 OpenSSL, 它将连接到 SSL 服务器,推测什么服务在加密层后面监听。 当发现 RPC 服务时, Nmap RPC grinder (-sR)会自动被用于确定 RPC 程序和它的版本号。 如果在扫描 某个 UDP 端口后仍然无法确定该端口是开放的还是被过滤的,那么该端口状态就 被标记为 open|filtered。 版本探测将试图从这些端口引发一个响应(就像它对开放端口做的一样), 如 果成功,就把状态改为开放。 open|filtered TCP 端口用同样的方法对待。 注意 Nmap -A 选项 在其它情况下打开版本探测。 有一篇关于版本探测的原理,使用和定制的文章在 http://www.insecure.org/nmap/vscan/

当 Nmap 从某个服务收到响应,但不能在数据库中找到匹配时, 它就打印一个特殊的 fingerprint 和一个 URL 给您提交,如果您确实知道什么服务运行在端口。 请花两分钟提交您的发现,让每个人受益。由于这些提交, Nmap 有 350 种以上协议如 smtp,ftp,http 等的大约 3,000 条模式匹配。

用下列的选项打开和控制版本探测。

-sV (版本探测)

打开版本探测。 您也可以用-A 同时打开操作系统探测和版本探测。

--allports (不为版本探测排除任何端口)

默认情况下,Nmap 版本探测会跳过 9100 TCP 端口,因为一些打印机简单地打印送到该端 口的 任何数据,这回导致数十页 HTTP get 请求,二进制 SSL 会话请求等等被打印出来 这一行为可以通过修改或删除 nmap-service-probes 中的 Exclude 指示符改变 您也可 以不理会任何 Exclude 指示符,指定--allports 扫描所有端口

--version-intensity <intensity> (设置 版本扫描强度)

当进行版本扫描(-sV)时,nmap 发送一系列探测报文 ,每个报文都被赋予一个 1 到 9 之 间的值。 被赋予较低值的探测报文对大范围的常见服务有效,而被赋予较高值的报文 一 般没什么用。强度水平说明了应该使用哪些探测报文。数值越高, 服务越有可能被正确 识别。 然而,高强度扫描花更多时间。强度值必须在 0 和 9 之间。 默认是 7。当探测报 文通过 nmap-service-probes ports 指示符 注册到目标端口时,无论什么强度水平,探 测报文都会被尝试。这保证了 DNS 探测将永远在任何开放的 53 端口尝试, SSL 探测将 在 443 端口尝试,等等。

--version-light (打开轻量级模式)

这是 --version-intensity 2 的方便的别名。轻量级模式使 版本扫描快许多,但它识别 服务的可能性也略微小一点。

--version-all (尝试每个探测)

--version-intensity 9 的别名, 保证对每个端口尝试每个探测报文。

--version-trace (跟踪版本扫描活动)

这导致 Nmap 打印出详细的关于正在进行的扫描的调试信息。 它是您用--packet-trace 所得到的信息的子集。

-sR (RPC 扫描)

这种方法和许多端口扫描方法联合使用。 它对所有被发现开放的 TCP/UDP 端口执行 SunRPC 程序 NULL 命令,来试图 确定它们是否 RPC 端口,如果是, 是什么程序和版本号 因此您可以有效地获得和 rpcinfo -p 一样的信息, 即使目标的端口映射在防火墙后面(或者被 TCP 包装器保护) Decoys 目前不能和 RPC scan 一起工作 这作为版本扫描(-sV) 的一部分自动打开。 由于版本探测包括它并且全面得多,-sR 很少被需要。