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

 

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協議中三次握手的前兩次異步

  1. 客戶端在向服務器第一次握手時,會組建一個數據包,設置syn標誌位,同時生成一個數字填充seq序號字段。
  2. 服務端收到數據包,檢測到了標誌位的syn標誌,知道這是客戶端發來的創建鏈接的請求包,服務端會回覆一個數據包,同時設置syn和ack標誌位,服務器隨機生成一個數字填充到seq字段。並將客戶端發送的seq數據包+1填充到ack確認號上。
  3. 在收到syn和ack後,咱們返回一個rst來結束這個鏈接,如圖所示

masscan無狀態掃描原理,就是利用了這一步,由於seq是能夠自定義的,因此在發送數據包時填充一個特定的數字,而在返回包中能夠得到相應的響應狀態,便是無狀態掃描的思路了。

  

 (2)缺點

  masscan速度快,但只能掃描端口。異步傳輸意味着掃描儀在發送探測器以前沒必要等待回覆。因爲無狀態的發包方式,若是遇到丟包的狀況,不像有鏈接時候會進行重複查詢,而是直接沒有迴應,所以準確率上不如SYN掃描那麼準確,可是能夠用重複掃描來彌補準確性上面的缺陷。

 

二、Nmap

 2.一、Nmap包含四項基本功能:

  • 主機發現(Host Discovery)
  • 端口掃描(Port Scanning)
  • 版本偵測(Version Detection)
  • 操做系統偵測(Operating System Detection)

 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

相關文章
相關標籤/搜索