一、引言:
公司從2018年開始研發CMDB,項目的定位的方向是①作爲公司產品的資產數據中心,提供統一的模型和對外接口,統一維護一份資產信息,避免各個產品(比如,全棧智能監控、自動化運維、帶外、smartLog等)各自維護CI。②作爲資源全生命週期管理平臺,融合流程產品和CMDB自動發現能力,做一個閉環CI管理系統,提供最準確的設備資產信息及CI之間關係(部署、父子、包含、引用等)、機房機櫃邏輯圖等。作爲其中一個亮點功能,指定網段或指定IP的CI掃描就必不可少。
二、網絡資產掃描作用:
通過原始IP報文來發現網絡上存活的主機、主機提供的服務(應用程序名和版本)、服務運行的操作系統(包括版本信息),以及使用什麼類型的報文過濾器/防火牆(對掃描的異常結果做分析)等。
三、masscan和Nmap分析:
1、masscan
(1)優勢----在6分鐘內掃描完整個IPv4
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) 補充:無狀態掃描的原理
TCP協議中三次握手的前兩次
- 客戶端在向服務器第一次握手時,會組建一個數據包,設置syn標誌位,同時生成一個數字填充seq序號字段。
- 服務端收到數據包,檢測到了標誌位的syn標誌,知道這是客戶端發來的建立連接的請求包,服務端會回覆一個數據包,同時設置syn和ack標誌位,服務器隨機生成一個數字填充到seq字段。並將客戶端發送的seq數據包+1填充到ack確認號上。
- 在收到syn和ack後,我們返回一個rst來結束這個連接,如圖所示
masscan無狀態掃描原理,就是利用了這一步,因爲seq是可以自定義的,所以在發送數據包時填充一個特定的數字,而在返回包中可以獲得相應的響應狀態,即是無狀態掃描的思路了。
(2)缺點
masscan速度快,但只能掃描端口。異步傳輸意味着掃描儀在發送探測器之前不必等待回覆。由於無狀態的發包方式,如果遇到丟包的情況,不像有連接時候會進行重複查詢,而是直接沒有迴應,因此準確率上不如SYN掃描那麼準確,但是可以用重複掃描來彌補準確性上面的缺陷。
2、Nmap
2.1、Nmap包含四項基本功能:
- 主機發現(Host Discovery)
- 端口掃描(Port Scanning)
- 版本偵測(Version Detection)
- 操作系統偵測(Operating System Detection)
2.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 閒置掃描 殭屍主機掃描,非常隱蔽
詳細瞭解可參考https://www.cnblogs.com/guge-94/p/11322334.html
masscan在存活主機主機掃描方面速度要高於Nmap,故爲提高掃描準確度,可以先使用masscan掃描開啓的端口,再用nmap進行詳細的掃描。
四、代碼示例(使用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
五、資料共享
masscangit地址 https://github.com/topics/masscan
Nmapgit地址 https://github.com/nmap/nmap
感謝各位大佬的分享,收穫不少,同時也感謝您的閱讀,如需轉載請註明出處https://www.cnblogs.com/huyangshu-fs/p/13324701.html