Nmap原理02 - 编写自己的服务探测脚本

编写自己的服务探测脚本

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

3.参考文献

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

时间: 2024-11-03 05:34:17

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

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

Nmap原理02 - 版本探测介绍(上) 1.介绍 本文将介绍如何通过修改或添加nmap-service-probes文件来实现对nmap中未知服务的探测,首先介绍服务和版本探测的相关信息,然后介绍服务和版本探测的原理以及nmap-service-probes的文件格式,最后通过一个例子演示修改nmap-service-probes文件识别自己的服务,本节介绍前半部分介绍+技术摘要. 转载请注明出处:http://www.cnblogs.com/liun1994/ 2. Service and

Nmap原理-01选项介绍

Nmap原理-01选项介绍 1.Nmap原理图 Nmap包含四项基本功能:主机发现/端口扫描/版本探测/操作系统探测.这四项功能之间存在大致的依赖关系,比如图片中的先后关系,除此之外,Nmap还提供规避防火墙的技巧以及NSE库.下面对这四类Nmap选项进行介绍,主要介绍每个选项有什么作用,如想了解原理,可以阅读本文附录的参考文献. 2. 主机发现 例子: nmap –sn –PE –PS80,135 –PU53 scanme.nmap.org 使用wireshark可以查看,nmap在运行上述语

利用BashShell编写Nginx服务控制脚本

使用源码包安装的Nginx没办法使用"service nginx start"或"/etc/init.d/nginx start"进行操作和控制,所以写了以下的服务控制脚本. 可以使用的选项有: start  启动 stop  停止 reload 重载 restart  重启 status   状态 test 检查配置文件 1.创建脚本文件并添加执行权限 # touch /etc/init.d/nginx # chmod +x /etc/init.d/nginx 2

CGI原理解析之二------WEB服务和CGI交互数据

#include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/wait.h> #include <stdlib.h> #define    CGI_NAME "get_post.ums" #define    REQUEST_METHOD "REQUEST_METHOD=POST" #define REQUEST_PARAM

osgi + felix example3编写与使用服务的改进

osgi + felix example3编写与使用服务的改进 上一篇博文中我们提及了如何对一个服务进行注册,但在example2和example2b中都没有对这个服务进行相应的使用,在本文中将对这个服务进行使用相应的使用,在felix的官网中,对该服务的使用方法是对目前已经注册的bundle进行扫描,然后使用服务,但是个人觉得Activator这种启动bundle最好只有一个,并且本文搭建了一个完整的环境,部署多个Activator bundle也不现实,因此本文采用了其他方法. 思路 在本文

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

使用C#编写的windows服务安装到服务器上行后进行启动时,总是提示“服务启动后又停止了”. 检查了服务逻辑是没问题,安装在开发本地也是正常,网上查了资料说是可能是服务没有注册,我检查了服务是正常注册,相对应的方法试很多了,但是都没有解决.后来无意中看了一个帖子说可以在windows的本地服务日志里边看报错信息.看到这个,我的问题就有办法处理了,查了一下保存信息,提示找不到“E:\\”,看到这里我就明白是怎么回事了,我的开发机有E盘,服务器上没有E盘,而我的日志文件默认写在E盘,所以服务启动后

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

Nmap扫描教程之网络基础服务DHCP服务类 Nmap网络基础服务 网络基础服务是网络正常工作的基石,常见的网络基础服务包括DHCP服务和DNS服务.其中,DHCP服务用来为计算机动态分配IP地址:DNS服务用来对主机名进行解析.本章将介绍网络基础服务的扫描方法. NmapDHCP服务类 DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是一种局域网的网络协议.它的主要作用就是,给内部网络或网络服务供应商自动分配IP地址.当一台客户机需要一个IP

为程序编写Service服务管理脚本

SaltStack通过Service方式管理服务,对于通用的服务,如mysql.apache.php等,自带service服务管理脚本,SaltStack可以方便管理.但是对于一些公司自有的服务,可能这些服务在开发之初,并没有考虑日后会采用Service脚本进行服务管理,为了统一Salt对服务的管理,我采用的方式是为每一个程序编写Service脚本. 这里主要注意以下两个问题: 1.这里有部分机器的优化,放在/etc/profile和/root/.bashrc中,而这两个文件在用户登陆的时候,会

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

如果你玩windows系统,你对服务这个东西并不会陌生,服务可以帮我们做很多事情,在不影响用户正常工作的情况下,可以完成很多我们需要的需求. 众所周知,微软的visio studio内置的Service类可以编写windows服务,对于一个Java开发人员来说,想要编写一个windows服务部署到服务器里面, 还要在自己的开发环境装一个visio studio,那太麻烦了. 那么问题来了,我想用java编写一个windows服务,这个想法可行吗?答案是肯定的,可行! 开源的JavaService