一、引言:
公司從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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/582.html
標籤:其他
上一篇:rtmp規范1.0全面指南
