服务和版本探测

把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选项在其它情况下打开版本探测。 有一篇关于版本探测的原理,使用和定制的文章在 https://nmap.org/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很少被需要。