網絡資產掃描-masscan和nmap結合掃描

 

一、引言:

  公司從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協議中三次握手的前兩次

  1. 客戶端在向服務器第一次握手時,會組建一個數據包,設置syn標誌位,同時生成一個數字填充seq序號字段。
  2. 服務端收到數據包,檢測到了標誌位的syn標誌,知道這是客戶端發來的建立連接的請求包,服務端會回覆一個數據包,同時設置syn和ack標誌位,服務器隨機生成一個數字填充到seq字段。並將客戶端發送的seq數據包+1填充到ack確認號上。
  3. 在收到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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章