首页 > 代码库 > Nmap原理02 - 版本探测介绍(上)

Nmap原理02 - 版本探测介绍(上)

Nmap原理02 - 版本探测介绍(上)

1.介绍

  本文将介绍如何通过修改或添加nmap-service-probes文件来实现对nmap中未知服务的探测,首先介绍服务和版本探测的相关信息,然后介绍服务和版本探测的原理以及nmap-service-probes的文件格式,最后通过一个例子演示修改nmap-service-probes文件识别自己的服务,本节介绍前半部分介绍+技术摘要。

  转载请注明出处:http://www.cnblogs.com/liun1994/

2. Service and Application Version Detection

  在对应的官方文档中https://nmap.org/book/vscan.html#vscan-intro属于这一节的内容,使用nmap-services文件可以识别知名的2200个服务,nmap-services文件主要基于端口识别。但是这种识别是不可靠的,即使是正确的这些信息也不可靠,了解运行在端口上的服务版本更重要,这有助于确定服务易受攻击的类型。这就需要服务和版本探测,来探测具体的信息,Nmap通过特定的探针来了解更多的数据,Nmap通过读取socket中的数据进行匹配。Nmap目前可以识别超过1000个服务。

  下面是服务和版本探测的输出:

# nmap -A -T4 localhost Starting Nmap ( http://nmap.org )Nmap scan report for felix (127.0.0.1)(The 1640 ports scanned but not shown below are in state: closed)PORT     STATE SERVICE    VERSION21/tcp   open  ftp        WU-FTPD wu-2.6.1-2022/tcp   open  ssh        OpenSSH 3.1p1 (protocol 1.99)53/tcp   open  domain     ISC BIND 9.2.179/tcp   open  finger     Linux fingerd111/tcp  open  rpcbind    2 (rpc #100000)443/tcp  open  ssl/http   Apache httpd 2.0.39 ((Unix) mod_perl/1.99_04-dev)515/tcp  open  printer631/tcp  open  ipp        CUPS 1.1953/tcp  open  rndc?5000/tcp open  ssl/ftp    WU-FTPD wu-2.6.1-205001/tcp open  ssl/ssh    OpenSSH 3.1p1 (protocol 1.99)5002/tcp open  ssl/domain ISC BIND 9.2.15003/tcp open  ssl/finger Linux fingerd6000/tcp open  X11        (access denied)8000/tcp open  http-proxy Junkbuster webproxy8080/tcp open  http       Apache httpd 2.0.39 ((Unix) mod_perl/1.99_04-dev)8081/tcp open  http       Apache httpd 2.0.39 ((Unix) mod_perl/1.99_04-dev)Device type: general purposeRunning: Linux 2.4.X|2.5.XOS details: Linux Kernel 2.4.0 - 2.5.20Nmap finished: 1 IP address (1 host up) scanned in 42.494 seconds
解释:
  1. 端口515将服务作为打印机提供,但该版本字段为空。 Nmap通过探测确定服务名称,但无法确定其他任何内容。
  2. 端口953将服务提供为“rndc?”,问号告诉我们,Nmap甚至无法通过探测来确定服务名称。
    显示rndc,因为它已经在nmap-services中注册了端口953。不幸的是,Nmap的任何一个探测器都没有引起任何rndc的响应。
    如果他们有,Nmap将打印一个服务指纹和提交的URL,以便它可以在下一个版本被识别。
  3. 从上面的输出可以看出,服务和版本探测输出的不只是版本号,这取决于探针探测所返回的结果以及我们所写的匹配语句

3. 技术摘要

  Nmap首先根据选项执行端口扫描,然后将所有open 或者 open|filtered的TCP and/or UDP端口传递到服务扫描模块,然后这些端口被并行探测;根据什么来探测?贡献者贡献的Nmap探针来探测。

  1)Nmap检查上述端口列表有哪些是Exclude排除在外的,Exclude指令在nmap-service-probes文件中会介绍。如果排除在外,不进行探测。

  2)如果端口是TCP,Nmap尝试连接它,如果连接成功,那么端口状态会由open|filtered转换成open。这很少出现,因为端口检测既然没检测出来,试图与它连接应该连接不上。

  3)一旦TCP连接建立,Nmap会监听5秒钟(NULL Probes),通过欢迎信息确定他们的服务类型,如果数据收到,Nmap会将其与保存的3000多NULL探针指纹进行匹配,如果服务被完全确定,那么该端口的服务扫描完成。如果服务没有被探测出来,Nmap有“soft match”的机制,Nmap会继续选择探针进行探测,这些探针被限制到与该服务相匹配的探针上。

  4)每个探针都有被认为最有效的探测端口列表,例如GetRequest的探针识别Web服务器,其列出的端口80-85,88-80-80和8080-8085, Nmap顺序执行与正在扫描的端口号匹配的探针。每个探针包括一个探测字符串,它被发送到端口;将返回的响应与上面的NULL探针描述中讨论的的签名正则表达式进行比较。与NULL探测一样,这些测试可能导致完全匹配(结束探测)和软匹配(将未来探测限制到与某个服务相匹配的探测)或者根本不匹配。Nmap用于测试匹配的正则表达式的确切列表取决于探针后面配置。从X11Probe返回的数据不太可能匹配为GetRequest探针制作的任何正则表达式。另一方面,像RTSPRequest这样的探测器返回的结果很可能与为GetRequest制作的正则表达式匹配,因为正在测试的两个协议是密切相关的。因此,RTSPRequest探测器具有对GetRequest匹配的后备。

  如果从处于open|filtered状态的UDP端口接收到版本检测期间的任何响应,则该状态更改为打开。这使得版本检测成为UDP扫描的绝佳补充,当一些常见的防火墙规则生效时,它被强制将所有已扫描的UDP端口标记为已打开|过滤。将UDP扫描与版本检测相结合可以做到简单的UDP扫描只需要很多次,这是一个有效和有用的技术。

  5)由于需要管理连接,Nmap提高速度的技术:大多数探针具有通用性;如果服务匹配software指令,那么Nmap只需要尝试可能匹配该服务的探针;所有的探针都不是相等的,有些可以探测出更多的服务,Nmap通过使用稀有度,来避免尝试不太可能实现匹配的探针。

  6)如果至少有一个探针引起响应,但是Nmap无法识别该服务,则响应内容将以指纹的形式打印给用户。

  7)探针选择

    Nmap使用rarity变量来控制探针的选择,rarity的值越高,那么它被认为不常见,不太可能被尝试;可以通过选项指定rarity的值。

    (1)如果是TCP,NULL探针第一个被尝试;

    (2)将扫描端口列为可能端口的所有探针将会被尝试,按照探针顺序进行尝试。

    (3)所有其他具有小于或等于扫描的rarity值的探针也按照它们在nmap服务探针中出现的顺序进行尝试。

    一旦探针发现匹配,算法终止并报告输出。

    因为除了NULL探针以外,其他探针都附带了rarity变量值,因此很容易在版本探测中控制他们;Nmap默认的rarity强度是7。

nmap -sV --version-intensity 3 scanme.nmap.org
--version-light 等价于指定2
--version-all 等价于指定9
如果指定0,那么只有空探针被尝试

  如果上面的论述不清楚,可以通过使用 --version-trace选项和-d选项;这将显示连接和数据读写的状态,对我们理解执行过程非常有用。

  例子可参考:https://nmap.org/book/vscan-technique-demo.html

4. 参考文献

  https://nmap.org/book/vscan.html

 

Nmap原理02 - 版本探测介绍(上)