• Nmap原理02


    编写自己的服务探测脚本

    1. 添加自己的探测脚本

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

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

      在shodan上搜索AMQP:

     

     

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

      找到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 |
        Probe UDP DNSStatusRequest q|x10|
        Probe TCP NULL q||
      protocol:必须是TCP或者UDP
      probestring:告诉Nmap发送的数据,格式为:q|.....|。内容类似于C和Perl,支持转义字符:,a, , 。如果分隔符是你在内容中需要的,也可以换其他的分隔符。
    match指令
      Syntax: match <service> <pattern> [<versioninfo>]
      Example:

        match ftp m/^220.*Welcome to .*Pure-?FTPd (dS+s*)/ p/Pure-FTPd/ v/$1/ cpe:/a:pureftpd:pure-ftpd:$1/
        match ssh m/^SSH-([d.]+)-OpenSSH[_-]([w.]+) ? /i p/OpenSSH/ v/$2/ i/protocol $1/ cpe:/a:openbsd:openssh:$2/
        match mysql m|^x10x01xffx13x04Bad 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 $| p/lpd/ h/$1/
        match afs m|^[dD]{28}s*(OpenAFS)([d.]{3}[^s]*)| 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.* $/i
        softmatch smtp m|^220 [-.w ]+SMTP.* |
        softmatch pop3 m|^+OK [-[]()!,/+:<>@.w ]+ $|  
      
    格式与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

  • 相关阅读:
    5.4Java Collections工具类 != Collection接口没关系
    4.30Java 手动敲简易的HashSet
    5.4Java使用容器存储表格数据
    4.30Java Iterator迭代器遍历容器元素(List/Set/Map)
    5.4Java IO流开篇
    windows管理规范WMI
    META标签的奥妙
    C#2.0泛型--Dictionary,List用法
    Win32类及其管理对象
    Asp.net中GridView使用详解(引)
  • 原文地址:https://www.cnblogs.com/liun1994/p/6986544.html
Copyright © 2020-2023  润新知