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 VERSION
21/tcp open ftp WU-FTPD wu-2.6.1-20
22/tcp open ssh OpenSSH 3.1p1 (protocol 1.99)
53/tcp open domain ISC BIND 9.2.1
79/tcp open finger Linux fingerd
111/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 printer
631/tcp open ipp CUPS 1.1
953/tcp open rndc?
5000/tcp open ssl/ftp WU-FTPD wu-2.6.1-20
5001/tcp open ssl/ssh OpenSSH 3.1p1 (protocol 1.99)
5002/tcp open ssl/domain ISC BIND 9.2.1
5003/tcp open ssl/finger Linux fingerd
6000/tcp open X11 (access denied)
8000/tcp open http-proxy Junkbuster webproxy
8080/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 purpose
Running: Linux 2.4.X|2.5.X
OS details: Linux Kernel 2.4.0 - 2.5.20
Nmap 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