网络资产扫描-masscan和nmap结合扫描

 

1、引言:html

  公司从2018年开始研发CMDB,项目的定位的方向是①做为公司产品的资产数据中心,提供统一的模型和对外接口,统一维护一份资产信息,避免各个产品(好比,全栈智能监控、自动化运维、带外、smartLog等)各自维护CI。②做为资源全生命周期管理平台,融合流程产品和CMDB自动发现能力,作一个闭环CI管理系统,提供最准确的设备资产信息及CI之间关系(部署、父子、包含、引用等)、机房机柜逻辑图等。做为其中一个亮点功能,指定网段或指定IP的CI扫描就必不可少。python

 

2、网络资产扫描做用:git

   经过原始IP报文来发现网络上存活的主机、主机提供的服务(应用程序名和版本)、服务运行的操做系统(包括版本信息),以及使用什么类型的报文过滤器/防火墙(对扫描的异常结果作分析)等。github

 

3、masscan和Nmap分析:服务器

一、masscan网络

 (1)优点----在6分钟内扫描完整个IPv4app

  masscan使用的是无状态扫描的方法。TCP链接是有状态的,须要对SYN-ACK包进行seq number的校验这个等待链接的过程须要在缓冲区占用很大的资源,所以限制了扫描的速度。masscan无状态的扫描则是masscan与目标主机不创建完整的TCP链接,扫描者主机先向目标主机发送一个SYN请求链接数据包,目标主机会向扫描者主机回复一个SYN/ACK确认链接数据包,当扫描者主机收到目标主机发送回来的SYN/ACK确认链接数据包以后,扫描者主机向目标主机发送RST结束链接(选项–banners除外(由于要获取banner信息,必需要进行完整的三次握手))。即masscan不创建完整的TCP链接,收到SYN/ACK以后,发送RST结束链接(选项--banners除外)。masscan采用异步的方式批量的把数据包发出去,而后记录有回应的IP。所以,效率上得以大幅提升。运维

   (1.1) 补充:无状态扫描的原理ssh

    TCP协议中三次握手的前两次异步

  1. 客户端在向服务器第一次握手时,会组建一个数据包,设置syn标志位,同时生成一个数字填充seq序号字段。
  2. 服务端收到数据包,检测到了标志位的syn标志,知道这是客户端发来的创建链接的请求包,服务端会回复一个数据包,同时设置syn和ack标志位,服务器随机生成一个数字填充到seq字段。并将客户端发送的seq数据包+1填充到ack确认号上。
  3. 在收到syn和ack后,咱们返回一个rst来结束这个链接,如图所示

masscan无状态扫描原理,就是利用了这一步,由于seq是能够自定义的,因此在发送数据包时填充一个特定的数字,而在返回包中能够得到相应的响应状态,便是无状态扫描的思路了。

  

 (2)缺点

  masscan速度快,但只能扫描端口。异步传输意味着扫描仪在发送探测器以前没必要等待回复。因为无状态的发包方式,若是遇到丢包的状况,不像有链接时候会进行重复查询,而是直接没有回应,所以准确率上不如SYN扫描那么准确,可是能够用重复扫描来弥补准确性上面的缺陷。

 

二、Nmap

 2.一、Nmap包含四项基本功能:

  • 主机发现(Host Discovery)
  • 端口扫描(Port Scanning)
  • 版本侦测(Version Detection)
  • 操做系统侦测(Operating System Detection)

 2.二、Nmap在端口扫描方面很是强大,提供了十多种探测方式。

     -sA        ACK扫描       检查端口是否开放,可用于探测防火墙 

     -sP        Ping扫描      快速发现网络 

     -sR        PRC扫描       定位PRC,对成功扫描的机器记录 

     -sS        TCP SYN扫描   快速和隐蔽的扫描,半开放扫描 

     -sU        UDP扫描       肯定符合特定UDP端口是否开放 

     -sX        XMAS扫描      隐蔽扫描,扫描特定配置的防火墙 

     -sL        列出扫描对象  列出要扫描的IP,使用-n选项确保不向网络中发数据包 

     -sO        IP协议扫描    寻找使用IP协议的主机 

     -sM        FIN/ACK扫描   隐蔽扫描,适用于unix系统 

     -sI        闲置扫描      僵尸主机扫描,很是隐蔽

详细了解可参考http://www.javashuo.com/article/p-kjiaqzbs-my.html

masscan在存活主机主机扫描方面速度要高于Nmap,故为提升扫描准确度,能够先使用masscan扫描开启的端口,再用nmap进行详细的扫描。

 

4、代码示例(使用python脚本)

masscan扫描存活主机

 1 # -*- coding: UTF-8 -*-
 2 import re
 3 import commands
 4 import sys
 5 reload(sys)
 6 sys.setdefaultencoding('utf8')
 7 
11 # 执行命令
12 state, stdout = commands.getstatusoutput("masscan 指定ip -p22 --rate 10000")
13 # 获取命令结果
14 infoArr = []
15 discoverArr = stdout.split("\n")
16 for discover in discoverArr:
17     infoArr.append("".join(discover.encode("ascii")).strip().strip("\n"))
18 
19 set_addr = set()
20 set_ip = set()
21 addr = ""
22 for info in infoArr[3:]:
23     if "Discovered" in info:
24         discoverArr = info.split(" on ")
25         ip = discoverArr[1]  # 截取ip地址
26         port = re.findall(".*port(.*)/tcp.*", info)  # 取出端口号
27         addr = ip.strip() + ":" + str(port).strip()
28         addr = addr.replace('[\' ', '').replace('\']', '').replace('[', '').replace(']', '')
29 
30         set_addr.add(addr)  # 保存扫描出的ip地址端口号
31         set_ip.add(ip)  # 保存ip地址
32 
33 for ip in set_ip:
34     print ip

Nmap精确扫描存活主机端口

 1 # -*- coding: UTF-8 -*-
 2 import commands
 3 import re
 4 import socket
29 
31 # 执行操做系统扫描任务
34 state, stdout = commands.getstatusoutput('nmap -O --osscan-guess -p ' + 指定端口+ ' ' + ip地址)
35 # 获取命令结果
36 discoverArr = stdout.split("\n")
37 
38 infoArr = []
39 os = ""
40 hostname = ip2hostname(ip)
41 if hostname is None:
42     hostname = "未知服务"

44 for discover in discoverArr:
45     discover = discover.lower()
53     # 操做系统
54     if "aggressive os guesses: " in discover:
55         os = discover[22:discover.find(",")].strip()
56     if "os details:" in discover:
57         os = discover.replace("os details:", "").strip()
58     # 主机名称和操做系统,ip:port--ssh@host@os
59     if re.match('\d+/\w+.*open.*', discover):
62         port = discover[0:discover.index('/')]
63         resName = discover[discover.index('open') + 4:]
64         line = ip + ':' + port + '--' + resName.strip()
66         infoArr.append(line)
67     if re.match('\d+/\w+.*filtered.*', discover):
70         port = discover[0:discover.index('/')]
71         resName = discover[discover.index('filtered') + 8:]
72         line = ip + ':' + port + '--' + resName.strip()
74         infoArr.append(line)

75 for line in infoArr:
76     line = line + "@" + hostname + "@" + os
77     print line

 

5、资料共享

masscangit地址 https://github.com/topics/masscan

Nmapgit地址 https://github.com/nmap/nmap

 

 感谢各位大佬的分享,收获很多,同时也感谢您的阅读,如需转载请注明出处http://www.javashuo.com/article/p-pxzdgmfr-mx.html