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协议中三次握手的前两次异步
masscan无状态扫描原理,就是利用了这一步,由于seq是能够自定义的,因此在发送数据包时填充一个特定的数字,而在返回包中能够得到相应的响应状态,便是无状态扫描的思路了。
(2)缺点
masscan速度快,但只能扫描端口。异步传输意味着扫描仪在发送探测器以前没必要等待回复。因为无状态的发包方式,若是遇到丢包的状况,不像有链接时候会进行重复查询,而是直接没有回应,所以准确率上不如SYN扫描那么准确,可是能够用重复扫描来弥补准确性上面的缺陷。
二、Nmap
2.一、Nmap包含四项基本功能:
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