文章

Nmap服务识别过程

了解Nmap的服务识别前先简单介绍下默认配置扫描,如下nmap会对80/443发TCP包探测是否存活除非你指定了-Pn参数默认认可主机是存活的就不会给80/443发包,而是直接使用你指定的参数进行探测。

1
2
nmap xxx.xxx.xxx.xx -p port
nmap xxx.xxx.xxx.xx -p port -Pn

假设你是用-sS -Pn参数指定发起一个TCP SYN扫描且默许远程IP主机存活,nmap会直接发起SYN数据包,如果对方有回应就会回复SYN+ACK数据包(如下图所示)。

一般来说你没指定-sT进行全连接扫描的话nmap就会发出一个RST数据包中断响应了(因为端口通不通、主机存活与否都可以确认了)。

image-20250311185533519

那怎么匹配出27017端口就是mongdb服务的呢?

image-20250311185845017

nmap的文件目录下有一个nmap-services文件,该文件存储了端口-服务的映射关系和一个评分,评分是依据历史数据计算出来所属服务的可能性,值越接近1说明可能性越大。

那么大概知道了因为我们-sS扫描(TCP)加上端口又是27017,所以对应的服务识别成mongodb就很正常了(此处我改成了mongod22做测试)。

image-20250311190059728

总的来说这种基于端口+协议方式来识别服务只能说是做参考,要根据特定的探针和响应精准确定服务这样肯定是不行的,当然nmap也是支持的。

当我们使用了-sV参数的时候,nmap会从nmap-service-probes文件中获取端口可能的探针文件(probe)并作为raw_data发送到服务器,根据服务器的响应来match准确的服务信息、系统信息和版本信息。

如下图所示:

Probe TCP mongodb:表示TCP协议,最终的service识别成mongodb,其中探针数据就是qxxx中的内容

rarity:表示的该探针的稀缺性,控制探针的扫描优先级,和nmap-services中的评分相反,值越低表示探测常见服务,值越高反而是冷门服务

ports:表示哪些端口会应用这个探针

match:表示对响应内容的匹配,后面还有一些p/xx/ v/xx/ cpe:/xxx/用于匹配具体的组件信息、操作系统等信息

image-20250311191034868

添加-sV参数可以通过Wireshark看到确实三次握手后调用了探针内的内容作为数据发送并获取了对端响应。

image-20250311191925461

本文由作者按照 CC BY 4.0 进行授权