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