关于Nmap的指纹库

前言:这两个星期一直在改自己写的东西,今天又需要相关端口的指纹banner,所以顺便来学习下nmap的指纹库

参考文章:https://raw.githubusercontent.com/nmap/nmap/master/nmap-service-probes
参考文章:https://github.com/boy-hack/nmap-parser
参考文章:https://nmap.org/book/vscan-fileformat.html
参考文章:https://blog.csdn.net/LoveStarbucks/article/details/103871879

指纹库的位置

linux上安装完nmap之后可以来到/usr/share/nmap当下目录下,这里有相关的指纹信息的文件

或者直接访问github上的https://raw.githubusercontent.com/nmap/nmap/master/nmap-service-probes

probe转换JSON形式

通过 https://github.com/boy-hack/nmap-parser 提供的脚本可以将nmap-service-probes 转换为json格式的文件,让我们自己的端口识别脚本在指纹识别中进行处理和识别分析

JSON形式下的字段信息

  • protocol是协议,tcp或udp

  • probename是协议的名称

  • probestring是这个协议要发送的payload

  • ports是一个端口列表,在这个端口里才使用这个协议

  • matches和softmatches是匹配的指纹列表

格式

exclude指令

Syntax: Exclude

比如Exclude 53,T:9100,U:30000-40000,这种情况的话就是排除 tcp和udp端口的53端口,还有TCP的9100端口和UDP的30000-40000端口

Exclude T:,这个的话默认哪个端口都不进行排除,如下图所示

注意:

  • 此指令从版本扫描中排除指定的端口,仅使用一次,在所有探针之前,文件的顶部。

  • 在nmap中如果想扫全部的端口,那么可以通过--allports指令来可以覆盖Exclude指令。

Probe指令

Syntax: Probe

protocol字段:必须是TCP或者UDP
probestring字段:告诉Nmap发送的数据 格式为:q|.....|,格式内容类似于C和Perl,支持转义字符:\0,\a,\n,\r。如果分隔符是你在内容中需要的,也可以换其他的分隔符。

具体的例子有如下所示

Probe TCP GetRequest q|GET / HTTP/1.0\r\n\r\n| 
Probe UDP DNSStatusRequest q|\0\0\x10\0\0\0\0\0\0\0\0\0| 
Probe TCP NULL q||

注意:这里需要注意的就是Probe TCP NULL q||这个格式内容,这个被称作为NULL探针,也就是双方建立socket的时候,此时客户端默认不发送任意内容。

match指令

Syntax: match []

service:匹配成功的服务名称;
pattern:格式为:m/[regex]/[opts];regex格式采用Perl语言格式;目前opts支持“i”,代表的含义是匹配不区分大小写;“s”:代表在‘.’字符后面有新行。
versioninfo:包含很多可选的字段,每个字段都由一个标识符开始,然后是分隔符包含的字段值。下面介绍7个字段:

  • p/vendorproductname/ 供应商或者服务明
  • v/version/ 应用的版本信息,$1的意思由match指令中第一个()的内容替换;
  • i/info/ 其他进一步的信息
  • h/hostname/ 主机名
  • o/operatingsystem/ 服务在什么操作系统之上
  • d/devicetype/ 服务运行的设备类型
  • cpe:/cpename/[a] nmap通用的指纹格式
  • 在某些情况下,帮助函数可以用在替换之前, i/$P(3)/;$P()函数将会过滤掉不可打印的字符;另一个帮助函数是 $SUBST().在打印之前做替换;
  • v/$SUBST(1,"",".")/ 意思是在打印$1之前,将''替换成'.'打印。
  Example:
    match ftp m/^220.*Welcome to .*Pure-?FTPd (\d\S+\s*)/ p/Pure-FTPd/ v/$1/ cpe:/a:pureftpd:pure-ftpd:$1/
    match ssh m/^SSH-([\d.]+)-OpenSSH[_-]([\w.]+)\r?\n/i p/OpenSSH/ v/$2/ i/protocol $1/ cpe:/a:openbsd:openssh:$2/
    match mysql m|^\x10\0\0\x01\xff\x13\x04Bad handshake$| p/MySQL/ cpe:/a:mysql:mysql/
    match chargen m|@ABCDEFGHIJKLMNOPQRSTUVWXYZ|
    match uucp m|^login: login: login: $| p/NetBSD uucpd/ o/NetBSD/ cpe:/o:netbsd:netbsd/a
    match printer m|^([\w-_.]+): lpd: Illegal service request\n$| p/lpd/ h/$1/
    match afs m|^[\d\D]{28}\s*(OpenAFS)([\d\.]{3}[^\s\0]*)\0| p/$1/ v/$2/
  该指令告诉Nmap如何基于探针返回的字符串识别服务,一个探针可能跟着100多match指令;

softmatch指令

格式与match指令类似,主要的不同是扫描将会继续,在软匹配之后;但是探针被限制在软匹配匹配出的服务指定的探针

Example:
softmatch ftp m/^220 [-.\w ]+ftp.*\r\n$/i
softmatch smtp m|^220 [-.\w ]+SMTP.*\r\n|
softmatch pop3 m|^\+OK [-\[\]\(\)!,/+:<>@.\w ]+\r\n$|

ports和sslports指令

告诉Nmap探针所要发送数据的端口,仅使用一次,在每个探针的下面。

Example:
ports 21,43,110,113,199,505,540,1248,5432,30444
ports 111,4045,32750-32810,38978

totalwaitms指令

放弃探针之前所要等待的时间;

tcpwrappedms指令:

该指令仅用于NULL探针。 如果服务在此计时器用尽之前关闭TCP连接,则该服务标记为tcpwrapped。 否则,匹配继续照常。

rarity指令

用于控制使用探针;

fallback指令

参考文章:https://nmap.org/book/vscan-technique.html#vscan-cheats-and-fallbacks

此指令用于指定哪个探针作为回退,如果当前探针没有匹配项;由于前一个探针可能返回数据很慢,因此可以开启新的探针,将新探针的结果与前面的匹配。

posted @ 2021-09-03 00:50  zpchcbd  阅读(3148)  评论(0编辑  收藏  举报