Nmap识别MongoDB 6.0指纹
朋友反馈一个问题,说使用Nmap扫描MongoDB服务时对于6.0以上的版本默认无法识别到服务版本信息。
如上图所示,对应的VERSION信息是空的,在提示信息中可以看到,官方推荐将指纹信息上传以帮助更新服务指纹,又或者可以通过Nmap的默认脚本mongodb-info来做版本识别。前一种方式需要等待官方做指纹文件更新或产品版本更新,后者使用脚本又会影响到扫描速度。如果想在当前的Nmap版本下不使用脚本来识别MongoDB 6.0以上版本,唯一的办法是使用Nmap内置的服务指纹将MongoDB 6.0服务版本识别出来。
Nmap服务指纹解析
Nmap默认的服务指纹文件位于/usr/share/nmap目录下,文件名是nmap-service-probes,根据默认端口27017可以找到Nmap识别MongoDB服务的内容:
上图中的匹配规则用到了四个指令:
- Probe:为识别服务发送的字符串信息;
- rarity:1-9范围的数字,是服务识别和可靠性的概率,数字越大,扫描概率越小,返回信息价值越低;
- ports:服务识别常用的端口,效果与nmap的-p参数相同;
- match:根据Probe指令发送字符串返回的信息,匹配服务指纹规则;
上图中用于识别MongoDB服务,通过TCP协议发送到服务端的字符串是:
\x41\0\0\0\x3a\x30\0\0\xff\xff\xff\xff\xd4\x07\0\0\0\0\0\0test.$cmd\0\0\0\0\0\xff\xff\xff\xff\x1b\0\0\0\x01serverStatus\0\0\0\0\0\0\0\xf0\x3f\0
match指令的格式包括:
- 服务名称(service)
- 匹配规则(pattern)
- 版本信息(versioninfo)
以第一行的match指令为例:
match mongodb m|^.*version.....([\.\d]+)|s p/MongoDB/ v/$1/ cpe:/a:mongodb:mongodb:$1/
- 服务名称:MongoDB
- 匹配规则:m|^.*version.....([\.\d]+)|s,采用Perl格式的正则表达式,s表示包含换行符;
- 版本信息:p/MongoDB/ v/$1/