Nmap服务版本探测研究

news2024/9/22 23:15:45

文件nmap-services

作用:预定义服务和端口映射表,该文件原则上不允许修改

nmap-services未定义33890端口映射,扫描结果:

PORT      STATE SERVICE REASON

33890/tcp open  unknown syn-ack

nmap-services定义33890端口映射,扫描结果:

PORT      STATE SERVICE      REASON

33890/tcp open  ms-term-serv syn-ack

文件nmap-service-probes

作用:定义了服务版本探测的probe,其中预定义了probe和端口的映射,如果有映射,在NULL probe之后就会使用该probe探测,否则会自上而下的尝试每个probe,直到成功。

自上而下尝试probe的范围,由--version-intensity参数决定,rarity <= intensity的probe均会被尝试。NULL probe不受这个范围影响,添加端口映射关系的probe也不受该值影响。

--version-intensity 默认7级(0-9总共10个级别),0级的含义是除了NULL probe和注册了该端口的probe外,其他级别的probe的均不尝试。目前nmap的probe总共有142个,NULL probe没有rarity值。

--version-light 等效于--version-intensity 2

--version-all 等效于--version-intensity 9

由上面的原理得出结论:

  1. 知名端口容易匹配到合适probe进行版本探测;
  2. 自定义端口有可能匹配不到合适的probe;
  3. 自定义端口扫描时间大于知名端口;

PORT       STATE         SERVICE         REASON          VERSION

3389/tcp   open    ssl/ms-wbt-server?   syn-ack ttl 127

PORT       STATE       SERVICE       REASON         VERSION

3389/tcp   open    ms-wbt-server   syn-ack ttl 64   Microsoft Terminal Services

服务探测流程 

# nmap -sV -Pn -n -p50000 -d9 -vv --version-intensity 0 192.168.186.246

上面命令只执行NULL映射端口的Probe,通过 -d9 -vv可以从输出总查看执行过程。

执行过程:

1、Nmap先做端口扫描,然后把状态为open或者是open|filtered的TCP或UDP端口传递给服务识别模块,最后这些端口会并行的做服务探测。

Initiating Service scan at 21:10

Starting probes against new service: 192.168.186.246:50000 (tcp)

event_new(): event_new (IOD #1) (EID #8)

初始化服务探测,创建IO Daemon 编号#1,创建Event编号EID #8。

2、Nmap检查端口是否是需要排除的端口(见下文的Exclude Directive),如果是需要排除的端口那么Nmap不会对这个端口做服务探测。这里主要是避免对一些打印机的服务端口发包。在nmap-service-probes文件中定义:

# The Exclude directive takes a comma separated list of ports.

# The format is exactly the same as the -p switch.

Exclude T:9100-9107

3、如果端口是TCP,Nmap会先和端口建立一个连接,如果连接成功并且这个端口的状态原来是open|filtered的,那么Nmap把这个端口的状态改成open。这样做对那些为了隐秘扫描(例如FIN scan)而识别端口为open|filtered非常有用,这样能进一步确认端口的状态。

定义EID 8事件为创建连接会话

nsock_connect_tcp(): TCP connection requested to 192.168.186.246:50000 (IOD #1) EID 8

sock连接池加载事件EID 8

nsock_pool_add_event(): NSE #8: Adding event (timeout in 5000ms)

将EID 8事件关联到IOD 1,以便于IOD监听回包。

process_iod_events(): Processing events on IOD 1 (ev=2)

执行事件

process_event(): Processing event 8

process_event(): NSE #8: Sending event

监听返回信息:创建连接成功

nsock_trace_handler_callback(): Callback: CONNECT SUCCESS for EID 8

[192.168.186.246:50000]

4、一旦上面的连接建立,Nmap尝试等待5s。一些常见的服务,包括大部分的FTP、SSH、SMTP、Telnet、POP3、IMAP服务,为了标示自己会对建立的连接发送一些Welcome banner信息,这个过程称为NULL Probe。

NULL Probe仅仅是Read request from IOD #1(因为前面已经成功创建连接,这里是获取服务端发送的Banner信息,通过新事件执行:event_new (IOD #1) (EID #18)),没有发送任何的数据,也没有创建新的连接,在等待的时间(timeout: 6000ms,这个值是可以修改的,这个值是totalwaitms指令在Probe下设置的)内如果收到了数据,Nmap会将收到的banner信息和NULL Probe的将近3000个服务签名特征进行匹配(下文中的match Directive)。假如服务完全识别了(个人理解就是服务和版本信息都识别出来了),那么这个端口的服务识别就结束了。有时候Nmap只匹配到了服务类型,没有匹配到版本信息(下文softmatch Directive),那么Nmap会继续进行扫描,因为已经识别出来了服务那么Nmap会有针对的发送Probe。

Nmap尝试等待,调整该值可以规避一些响应比较慢的情况:

totalwaitms 6000

5、UDP Probe或者前面的NULL Probe匹配失败再或者是NULL Probe有soft match,那么就会接着顺序进行nmap-service-probes文件中其他的Probe。

每一个服务都注册到了一个常见的端口中(通过nmap-services文件),每一个service probe都包含了一个端口的列表,表示在这些端口上面最有可能开放这个服务。例如 GetRequest是一个识别web servers的Probe,包含的端口为80-85、8000-8010(不限于这些端口),那么Nmap在扫描的时候会顺序对这些开放的端口进行GetRequest probe探测。

Service scan sending probe GetRequest to 192.168.186.246:50000 (tcp)

创建HTTP请求事件

event_new (IOD #1) (EID #27)

Write request for 18 bytes to IOD #1 EID 27 [192.168.186.246:50000]: GET / HTTP/1.0....

创建HTTP请求监听事件

event_new (IOD #1) (EID #34)

Read request from IOD #1 [192.168.186.246:50000] (timeout: 5000ms) EID 34

将请求和读取返回事件分别注册并执行(先执行监听,后执行请求)

Processing event 34 (timeout in 5000ms, done=0)

Processing event 27 (timeout in 5000ms, done=0)

请求你成功

Callback: WRITE SUCCESS for EID 27 [192.168.186.246:50000]

读取超时(此时可以指定超时等待事件,GetRequest默认是5s)

Callback: READ TIMEOUT for EID 34 [192.168.186.246:50000]

6、一个probe包含了一个probe string,在服务探测的时候发送给目标端口,目标返回的数据会和这个对应的probe的一系列特征字符串(signature,下文中的 match Directive)进行匹配。如果匹配成功则服务识别结束,如果是一个softmatch那么Nmap有选择的进行下一步probe,要是都匹配失败则看是否有 fallback Directive,如果有则执行fallback Directive,更具体的参考fallback Directive和Cheats and Fallback部分。

在服务探测期间如果收到了来自UDP端口的数据,并且端口的UDP状态为open|filtered那么Nmap把这个端口的UDP状态改成open。在UDP扫描的时候如果因为有防火墙的干扰导致所有的端口状态为open|filtered,那么结合服务探测对端口的状态做进一步的探测,这是非常有用的。

7、在大部分的情况下,NULL probe和接下来的每一个不是只有一个)probable port probes(probable port probe:我理解就是ports Directive指令中包含这个端口)就能够识别出来服务。NULL probeprobable port probes共用同一个连接,所以在大部分情况下只要简单的建立一个连接就可以识别出来服务。

如果NULL probe和probable probe没有识别出来服务,Nmap会继续按序尝试其他的probe。那么对于TCP来说不得不重新建立一个连接(对于UDP来说就只要一个包就可以了),因为为了避免不同的probe之间相互影响,有可能前面发送的probe在超时以后还会收到目标端口的回应数据,如果没有重新建立连接的话,那么Nmap就会分不清楚回应的数据对应的是哪个probe。这个重新建立连接可能会要花费点时间了,如果再算上Nmap必须设置6s的超时来等待数据的返回,那么这就更加糟糕了。为了应对这种糟糕的情况,Nmap利用了几种技术来加快扫描的速度:Probe TCP TLSSessionReq

  • Nmap尽可能使每一个probe匹配多个服务。例如GenericLines probe发送两个换行符("\r\n\r\n")给目标端口,这样就可以匹配许多的服务,包括FTP、ident、POP3、UUCP、Postgres和whois。GetRequest probe匹配了更多的服务,类似的还有HELP probe("help\r\n")和RPC、MS SMB probe。
  • 如果一个服务是softmatch,那么Nmap只会去尝试可能匹配服务的probe(也就是说Nmap会有目的和针对性的进行probe)。
  • 所有的probe都是不等价的!有一些匹配更多的服务,基于此Nmap用rarity度量值(rarity Directive)来避免尝试那些可能匹配失败的probe。我们可以用--version-intensity, --version-all, and --version-light选项来选择rarity值。

8、有一些(并不是一个)probes会探测目标端口是否正在运行于SSL之上,如果探测成功Nmap会通过SSL连接重新探测这个服务(会从NULL probe重新来过:Service scan sending probe NULL to 61.135.169.125:443 (tcp)),识别出运行于SSL加密后的真正服务。例如,Nmap会对443端口进行SSL probe,如果探测成功则尝试GetRequest probe,因为一般有一个web服务运行于SSL加密之后。

做SSL探测的Probe有很多,比如:

Probe TCP SSLSessionReq:SSLv3 ClientHello probe

Probe TCP TLSSessionReq:TLSv1.2 ClientHello probe.

Probe TCP SSLv23SessionReq:SSLv2-compatible ClientHello

9、另外一个通用的probe识别会去基于RPC的一些服务,一旦探测成功Nmap RPC grinder就会初始化,开始暴力(翻译有点不准)探测RPC程序的版本、名称。

Probe TCP RPCCheck

10、至少有一个probe会导致目标回应数据,如果Nmap没有成功识别出来服务,那么目标回应的数据会作为特征值(fingerprint)输出,如果你知道目标运行的服务那么你可以把fingerprint提交给Nmap,集成到nmap-probe-services中。

Nmap-service-probes中的一些指令

1. Exclude Directive:排除指令是指在做服务识别时需要排除的端口,这个命令只能使用一次,一般是放在了文件的头部(也就是任何探测命令之前)。在nmap-service-probes文件中默认包含了tcp端口的9100到9107之间的端口(Exclude T:9100-9107),这是因为这些端口一般都是用于打印机的,这些监听的端口会打印数据只要你给这个端口发送了任何的数据。你可以使用--allports选项,这样服务探测会去探测所有的端口。

2. Probe Directive:探测指令告诉Nmap发送何种字符串去识别各种服务,也就是定义了一个探测包。

Probe的语法为:Probe protocol probename probestring

示例:Probe TCP X11Probe q|\x6C\0\x0B\0\0\0\0\0\0\0\0\0|

protocol:

 这个只能是TCP或者UDP。Nmap只会对这两种协议的服务做probe

probename:

 这是给本次的probe取的名称,个人猜测在Nmap中会有很多的地方用这个probename来代表这个服务probe。在后面的fallback Directive中我们会遇到使用这个probename,还有在Nmap指定--version-trace选项后会打印出来对这个端口做了哪些服务probe,在这里就会使用这个probe name,如:Service scan sending probe Help to 192.168.1.1:3389 (tcp)

probestring:

  Nmap为了服务探测发送的字符串。Probestring必须以"q"字母开头,然后以分隔符"|"为字符串的开头和结尾。在分隔符之间是真正发送的字符,发送的字符格式跟C or Perl字符格式类似,允许这些转义字符:\\ \0, \a, \b, \f, \n, \r, \t, \v, and \xHH(H是十六进制数字)。有一个特殊的probestring,叫做TCP NULL probe,分隔符之间的字符串为空(Probe TCP NULL q||),这个特殊的probe的作用见下面的章节。如果你想在probestring中包含分隔符那么你可能需要选择除|以外的字符。

3. match Directive:匹配指令告诉Nmap如何从目标机返回的字符串中识别出来服务。

match的语法为:match service pattern [versioninfo]

示例:match networkaudio m|^\0\x19\x02\0\x02\0\x07\0Protocol version mismatch\0| p/Network Audio System/

service:

 这是和pattern相匹配的服务名称.例如是ssh,smtp,http.可以在服务名前增加ssl标志,表示这个服务是通过SSL隧道加密的.

pattern:

 这是用于识别返回的字符串是否匹配对应的服务。pattern的格式跟Perl类似,语法是m/[regex]/[opts],"m"表示字符串的开始,接着的/是分隔符,这个分隔符可以是任何其他可打印的字符只要和接下来的分隔符相匹配即可。[regex]部分是一个Perl风格的表达式,目前仅支持i、s这两个选项,分别表示大小写不敏感和’.’元字符包括换行符。这两个选项和我们一般的正则表达式中的意义一致。[regex]还支持分组。

versioninfo:

 versioninfo部分包含了几个可选的子选项。每一个选项都由一个特定的标示符开始(例如h代表”hostname”),接下来是一个分隔符(分隔符虽然可以是不同的字符但是强烈建议用斜线/),再接着就是选项的值,下面是所有可能的选项格式:

https://img-blog.csdn.net/20150513175744604

 上面所列的选项都可能为空。在这些选项中可能经常会遇到$1、$2这样的数字,这些其实就是我们正则表达式中的分组引用(引用pattern中的分组)。

4. softmatch Directive

语法:softmatch <service> <pattern>

示例:softmatch ftp m/^220 [-.\w ]+ftp.*\r\n$/i

 softmatch指令和上文的match(上文的match其实可以理解为hard match)指令差不多,主要的一个不同就是softmatch以后会要继续执行其他的probe,但是后面执行的probe是有选择性的,因为softmatch已经识别出来了服务,之所以在识别出来服务以后还要继续执行是为了进一步识别版本号。比如我们识别出来目标端口开放了http服务,但是没有能识别出来app是Apache还是Nginx或者是IIS。

 在nmap官网中提到softmatch指令不会有<versioninfo>部分,但是我在较新的nmap 6.47 的nmap-service-probes文件中却看到softmatch也会有versioninfo部分,这个是暂时未搞清楚的。

5. Ports and sslports Directive

语法:ports <端口列表>

示例:ports 111,4045,32750-32810,38978

Ports(sslports)指令告诉Nmap该probe识别的服务一般都在哪些端口上面监听(运行),每一个probe只能有一个ports(sslports)指令

6. Totalwaitms Directive

语法:totalwaitms milliseconds

示例:totalwaitms 6000

 Totalwaitms指令表示本次probe的超时等待时间。这个指令一般不太常用,probe在发送了数据会在指定的时间等待目标数据返回。在Nmap中这个值默认为6000(虽然book上面说是5000,但是看了一下最新的nmap-service-probes中是6000,且不同的probe的totalwaittms可能不一样)。

7. Rarity Directive

语法:rarity <0-9>

示例:rarity 7

 rarity指令表示改probe被调用的优先级,值越高表示被调用的优先级越低,也就代表该probe能够正确识别服务的概率越低(也可以理解为该probe识别的服务不常见)。

8. fallback Directive:回退指令,如果当前定义的特征值没有匹配到(match Directive failed),并且指定了fallback指令那么回退到指定的probe再进行匹配。

fallback语法:fallback <comma separated list of probes>

示例:fallback GetRequest,GenericLines

 fallback是可选的指令。对TCP probe如果没有定义fallback指令,Nmap会首先和当前定义的Probe进行匹配,并且会隐式的回退(fallback)NULL Probe进行匹配(当然是当前的probe匹配失败)。如果定义了fallback指令,那么在当前的probe匹配失败后会回退到fallback定义的probe去进行匹配,如果继续匹配失败则回退到NULL probe进行匹配

 UDP probe流程相同,除了隐式的回退到NULL probe。

 至于为什么要有fallback指令可以参考上文的"Nmap的服务探测流程"。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/506380.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从环形图出发,打造高效数据分析流程

什么是环形图&#xff1f; 环形图是一种数据可视化的图表类型&#xff0c;它通常用于显示数据的比例关系和占比情况。环形图与饼图类似&#xff0c;都是由一个圆形或圆环和若干个扇形组成&#xff0c;每个扇形的面积大小表示该数据所占比例的大小。与饼图不同的是&#xff0c;…

强化学习p4-Actor-Critic

策略网络和价值网络的架构 我们知道状态价值函数 V π ( s ) ∑ a π ( a ∣ s ) ⋅ Q π ( s , a ) V_\pi(s)\sum_a\pi(a|s)\cdot Q_\pi(s,a) Vπ​(s)∑a​π(a∣s)⋅Qπ​(s,a)&#xff0c;在策略学习中&#xff0c;我们用神经网络去近似 π \pi π函数&#xff0c;得到策…

模糊PID(重心法解模糊梯形图FC)

模糊PID的模糊化请参看下面的博客文章: 博途PLC模糊PID三角隶属度函数指令(含Matlab仿真)_plc 模糊pid_RXXW_Dor的博客-CSDN博客三角隶属度函数FC,我们采用兼容C99标准的函数返回值写法,在FB里调用会更加直观,下面给大家具体讲解代码。常规写法的隶属度函数FC可以参看下…

分享一个提高运维效率的 Python 脚本

哈喽大家好我是咸鱼&#xff0c;今天给大家分享一个能够提升运维效率的 python 脚本 咸鱼平常在工作当中通常会接触到下面类似的场景&#xff1a; 容灾切换的时候批量对机器上的配置文件内容进行修改替换对机器批量替换某个文件中的字段 对于 Linux 机器&#xff0c;咸鱼可以…

Fiddler 抓包工具使用 - 手摸手教你

Fiddler简介 Fiddler 是一款免费、灵活、操作简单、功能强大的 HTTP 代理工具&#xff0c;是目前最常用的 HTTP 抓包工具之一。可以抓取所有的 HTTP/HTTPS 包、过滤会话、分析请求详细内容、伪造客户端请求、篡改服务器响应、重定向、网络限速、断点调试等功能。 Fiddler工作…

2023什么蓝牙耳机好?经销商盘点新手必入蓝牙耳机品牌

蓝牙耳机是除手机外我们使用频率最高的数码产品&#xff0c;我做蓝牙耳机经销商五年来&#xff0c;对各个品牌都有深入了解。近期看到很多新手们咨询什么蓝牙耳机好&#xff0c;我给大家盘点一下新手必看的五大蓝牙耳机品牌。 1.JEET Air 2蓝牙耳机 推荐理由&#xff1a;专为舒…

和AI聊天

AI产品工具目录&#xff1a;AI产品目录 Prompt 在和AI聊天时&#xff0c;你得表明你需要啥&#xff0c;并且描述的越精确&#xff0c;AI回答的就越贴近你的预期&#xff0c;简单的对话&#xff0c;可以自己尝试&#xff0c;但是如果想做应用级别的就得学习这种聊天技术&#…

Guitar Pro8.1最新中文版自动扒谱编写吉他谱 新功能讲解

Guitar Pro8是一款非常受欢迎的音乐制作软件&#xff0c;它可以帮助用户创建和编辑各种音乐曲谱。从其诞生以来就送专门为了编写吉他谱而研发迭代的。 尽管这款软件可能已经成为全球最受欢迎的吉他打谱软件&#xff0c;在编写吉他六线谱和乐队总谱中始终处于行业领先地位&…

测试人的内卷,性能测试入门到实践该如何做?突破内卷...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 性能测试如何入门…

什么是边缘计算盒子?要看哪些参数

一、什么是边缘计算盒子 边缘计算盒子&#xff08;Edge Computing Box&#xff09;是一种用于边缘计算的设备&#xff0c;通常包括计算、存储、网络和安全等功能。它通常是一台小型的计算机&#xff0c;可以放置在物联网设备、传感器或其他边缘设备附近&#xff0c;用于处理和…

北峰通信,用专业打造“全方位、立体化”应急通信保障体系

最近热映的电影《惊天救援》里&#xff0c;杜江饰演的消防员韩凯&#xff0c;在一次化工园区发生爆炸后&#xff0c;他作为消防救援站里的通信员&#xff0c;第一时间奔赴重灾区&#xff0c;及时将第一现场的情况传到了后方指挥部。 众所周知&#xff0c;通讯系统是生命线系统的…

linux 定时器

Linux 系统实现底半部的机制主要有tasklet&#xff0c;工作队列和软中断。 tasklet 和工作队列都是调度中断底半部的良好机制&#xff0c;tasklet 基于软中断实现。 内核定时器也依靠软中断实现;内核中的延时是忙等待或者睡眠等待&#xff0c;为了充分利用CPU资源&#xff0c…

还在找ChatGPT的国内镜像?这些都很不稳定,试试这两个

ChatGPT 因为账号限制的原因&#xff0c;注册的流程比较复杂&#xff0c;特别是需要国外的手机号进行接收验证码&#xff0c;这就难坏了很多国内的用户。 为了能用上ChatGPT 很多人免费的搭建了一些国内能够使用的ChatGPT 。这些网址不用魔法就能够使用ChatGPT &#xff0c;非…

基于docker的apisix网关的java插件开发

基于docker的apisix网关的java插件开发 1 创建java插件项目1.1 从github上获取demo1.2 改造demo 2 快速部署2.1 重新制作apisix镜像2.2 修改/apisix-docker/example/apisix_conf/config.yaml2.3 修改/apisix-docker/example/docker-compose.yml2.4 重新启动apisix网关 3 apisix…

网络基础学习:osi七层模型

osi七层模型 什么是OSI&#xff0c;什么是ISO?为什么ISO要提出OSI网络七层模型&#xff1f;OSI七层的划分以及具体内容第七层 应用层第六层 表示层第五层 会话层第四层 传输层第三层 网络层第二层 数据链路层第一层 物理层 每一层与设备的对应关系 什么是OSI&#xff0c;什么是…

大模型混战,最先实现“智慧涌现”的会是谁?

作者 | 曾响铃 文 | 响铃说 几秒钟写出了一篇欢迎词&#xff1b; 小说人物乱入现实&#xff0c;快速创作不重样的故事&#xff1b; 鼠标一点&#xff0c;一封英文工作沟通邮件撰写完成&#xff1b; 准确解出数学应用题&#xff0c;还给出解题步骤&#xff1b; 甚至还能理…

【微控制器】16KB R5F102AAASP、R7FA2L1A93CFL 128KB和R7FA2E1A73CFJ 64KB 嵌入式技术资料

R5F102AAASP RL78 16位微控制器具有超低功耗、增强性能、高集成度和各种强大的外设功能。得益于以上特性&#xff0c;RL78 MCU非常适合用于各种应用&#xff0c;包括电池供电设备和家用应用。 RL78微控制器MCU系列包括通用和专用器件。这些MCU可为系统设计人员提供高级省电特性…

实验五 Java多线程程序设计

实验目的 掌握Runnable接口实现多线程的方法掌握Thread类实现多线程的用法掌握Java语言中多线程编程的基本方法 实验内容 线程接力&#xff08;45分&#xff09; 编写一个应用程序&#xff0c;除了主线程外&#xff0c;还有三个线程&#xff1a;first、second和third。firs…

MySQL基础(二十四)索引的数据结构

1 为什么使用索引 顺序查询和数据使用二叉树结构再进行查询,如图&#xff1a; 2 索引及其优缺点 2.1 索引概述 MySQL官方对索引的定义为&#xff1a;索引&#xff08;Index&#xff09;是帮助MySQL高效获取数据的数据结构。 **索引的本质&#xff1a;**索引是数据结构。你…

第九章 使用Vsftpd服务传输文件

文章目录 第九章 使用Vsftpd服务传输文件一、文件传输协议1、FTP介绍2、FTP工作模式 二、Vsftpd服务程序1、安装Vsftpd服务程序2、防火墙配置3、过滤注释信息并通过重定向符写回原始的主配置文件4、Vsftpd服务程序常用的参数以及作用5、匿名访问模式&#xff08;1&#xff09;、…