编写自己的服务探测脚本

1. 添加自己的探测脚本

  nmap-service-probes文件的格式将在第二节介绍,本节通过一个例子说明如何添加自己的服务探测脚本。

  AMQP协议,即Advanced Message Queuing Protocol,一个提供统一消息服务 的应用层标准高级消息队列协议。AMQP协议基于TCP5672端口。

  在shodan上搜索AMQP:

 

  可以看到97.74.65.116这个ip下有AMQP服务在运行,并且返回的数据为:AMQP\x01\x01\x00\n.

  找到nmap-service-probes文件中对应的匹配脚本,我们在后面加了[amqp test]作为测试:

 

  nmap扫描输出:

  可以看到nmap正是使用这条匹配语句完成对服务和版本探测的,如果我们删掉,nmap会打印让我们提交指纹的页面,如下:

  几点建议:

    1)如果我们想针对具体的应用进行识别,服务探测脚本是一方面,可以根据nmap自带的进行修改和添加。

    2)服务探测功能有限,还可以使用NSE脚本引擎来实现。

    3)Nmap做的无非是解析返回的结果,进行显示,如果我们其他工具能够完成这个功能,没有必要非得用nmap,python,java解析一样可以。  

2. nmap-service-probes文件格式

  nmap-service-probes文件是面向行的,#开头的代表注释,会被解析器忽略,空白行也会被忽略;其他行是下面指令之一。

Probe指令
  Syntax: Probe <protocol> <probename> <probestring>
 
 例如:
    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||
  protocol:必须是TCP或者UDP
  probestring:告诉Nmap发送的数据,格式为:q|.....|。内容类似于C和Perl,支持转义字符:\0,\a,\n,\r。如果分隔符是你在内容中需要的,也可以换其他的分隔符。
match指令
  Syntax: match <service> <pattern> [<versioninfo>]
  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指令;
  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之前,将'_'替换成'.'打印。
softmatch指令:
  
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$|  
  
格式与match指令类似,主要的不同是扫描将会继续,在软匹配之后;但是探针被限制在软匹配匹配出的服务指定的探针, ports 和 sslports指令:
 
 Example:
    ports 21,43,110,113,199,505,540,1248,5432,30444
    ports 111,4045,32750-32810,38978
  告诉Nmap探针所要发送数据的端口,仅使用一次,在每个探针的下面。
totalwaitms指令:
  
放弃探针之前所要等待的时间;
tcpwrappedms
指令:
 
 该指令仅用于NULL探针。 如果服务在此计时器用尽之前关闭TCP连接,则该服务标记为tcpwrapped。 否则,匹配继续照常。
rarity指令:
  用于控制使用探针;
fallback指令:
  
此指令用于指定哪个探针作为回退,如果当前探针没有匹配项;由于前一个探针可能返回数据很慢,因此可以开启新的探针,将新探针的结果与前面的匹配。
  具体可参考:https://nmap.org/book/vscan-technique.html#vscan-cheats-and-fallbacks
Exclude指令

  例如:
    Exclude 53,T:9100,U:30000-40000
  此指令从版本扫描中排除指定的端口,仅使用一次,在所有探针之前,文件的顶部。
  目前文件中排除的是Exclude T:9100-9107。因为这几个端口是打印机端口,可能会导致打印发送的探针。
  --allports指令,可以覆盖Exclude指令。

3.参考文献

  https://nmap.org/book/vscan-fileformat.html

Nmap原理02 - 编写自己的服务探测脚本的更多相关文章

  1. Nmap原理02 - 版本探测介绍(上)

    Nmap原理02 - 版本探测介绍(上) 1.介绍 本文将介绍如何通过修改或添加nmap-service-probes文件来实现对nmap中未知服务的探测,首先介绍服务和版本探测的相关信息,然后介绍服 ...

  2. Nmap原理-01选项介绍

    Nmap原理-01选项介绍 1.Nmap原理图 Nmap包含四项基本功能:主机发现/端口扫描/版本探测/操作系统探测.这四项功能之间存在大致的依赖关系,比如图片中的先后关系,除此之外,Nmap还提供规 ...

  3. nmap原理及使用方法

    NMap,也就是Network Mapper,是Linux下的网络扫描和嗅探工具包. 1简介 nmap是一个网络连接端扫描软件,用来扫描网上电脑开放的网络连接端.确定哪些服务运行在哪些连接端,并且推断 ...

  4. SHELL编写NGINX服务控制脚本

    使用源码包安装的Nginx没办法使用"service nginx start"或"/etc/init.d/nginx start"进行操作和控制,所以写了以下的 ...

  5. C#编写的windows服务安装后启动提示“服务启动后又停止了”

    使用C#编写的windows服务安装到服务器上行后进行启动时,总是提示“服务启动后又停止了”. 检查了服务逻辑是没问题,安装在开发本地也是正常,网上查了资料说是可能是服务没有注册,我检查了服务是正常注 ...

  6. 唱吧DevOps的落地,微服务CI/CD的范本技术解读----最大的难点并不是实际业务代码的编写,而是服务的监控和调试以及容器的编排

    1.业务架构:从单体式到微服务 K歌亭是唱吧的一条新业务线,旨在提供线下便捷的快餐式K歌方式,用户可以在一个电话亭大小的空间里完成K歌体验.K歌亭在客户端有VOD.微信和Web共三个交互入口,业务复杂 ...

  7. 【JavaService】使用Java编写部署windows服务

    如果你玩windows系统,你对服务这个东西并不会陌生,服务可以帮我们做很多事情,在不影响用户正常工作的情况下,可以完成很多我们需要的需求. 众所周知,微软的visio studio内置的Servic ...

  8. Nmap扫描教程之网络基础服务DHCP服务类

    Nmap扫描教程之网络基础服务DHCP服务类 Nmap网络基础服务 网络基础服务是网络正常工作的基石,常见的网络基础服务包括DHCP服务和DNS服务.其中,DHCP服务用来为计算机动态分配IP地址:D ...

  9. [转贴]systemd 编写服务管理脚本

    [转贴]sparkdev大神的博客, 关于 systemd的配置文件的 介绍, 自己之前二进制安装 k8s 时 超过一个 service文件 但是当时不明不白的. 现在再学习一下大神的文章 的确牛B ...

随机推荐

  1. windows环境下安装ZooKeeper

    $.说明 ZooKeeper: ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件. 它是一个为分布式 ...

  2. openstack组件服务的入口寻找方法

    在centos7系统上,安装openstack服务以后,可以通过以下命令,查找到该系统上,已经安装的openstack服务 [root@xzto01n010027244133 ~]# systemct ...

  3. C# LINQ(4)

    where作为LINQ的条件关键字. where的右面是表达式 表达式可以方法返回值,但是where的右面最终是一个可检测真假的表达式 代码: static void Main(string[] ar ...

  4. Guideline 2.1 - Information Needed需要补充录制视频

    1.被拒回文 Guideline 2.1 - Information Needed We have started the review of your app, but we are not abl ...

  5. SpringBoot+MyBatis+MySQL读写分离(实例)

    ​ 1. 引言 读写分离要做的事情就是对于一条SQL该选择哪个数据库去执行,至于谁来做选择数据库这件事儿,无非两个,要么中间件帮我们做,要么程序自己做.因此,一般来讲,读写分离有两种实现方式.第一种是 ...

  6. sql中日期转换

    date_format的函数使用令日期格式转换变得十分便捷首先先说一个自己粗心踩到的坑.因为最开始自己建的表里面存的数据,已经固定是周一的时间了,然后有一个状态判断是需要拿到所有周一是否有数据,当时忘 ...

  7. 【bzoj3309】DZY Loves Math 莫比乌斯反演+线性筛

    Description 对于正整数n,定义f(n)为n所含质因子的最大幂指数.例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007)=1, f(1)=0. 给定正整数a,b, ...

  8. 洛谷P4011 孤岛营救问题(状压+BFS)

    传送门 和网络流有半毛钱关系么…… 可以发现$n,m,p$都特别小,那么考虑状压,每一个状态表示位置以及钥匙的拥有情况,然后每次因为只能走一步,所以可以用bfs求出最优解 然后是某大佬说的注意点:每个 ...

  9. Laravel-安装composer

    一.系统环境   Laravel框架有些系统上的要求,因此需要保证自己运行环境.要求的环境有:对于PHP的版本要求比较法高,其他的是扩展,可以在php.ini文件中开启 PHP >= 5.5.9 ...

  10. linux下 zip解压 tar解压 gz解压 bz2等各种解压文件命令

    .tar 解包:tar xvf FileName.tar 打包:tar cvf FileName.tar DirName (注:tar是打包,不是压缩!) ——————————————— .gz 解压 ...