一、引言:
公司從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(Network Mapper)
nmap是一款開源免費的網絡發現(Network Discovery)和安全審計(Security Auditing)工具。Nmap可以檢測目標機是否在線、端口開放情況、偵測運行的服務類型及版本信息、偵測操作系統與設備類型等信息。官網地址 https://nmap.org/
2.1、Nmap包含四項基本功能:
- 主機發現(Host Discovery)
- 端口掃描(Port Scanning)
- 版本偵測(Version Detection)
- 操作系統偵測(Operating System Detection)
2.2、常用Nmap指令:
(1)完整全面的掃描
如果希望對某台主機進行完整全面的掃描,那么可以使用nmap內置的-A選項。使用了改選項,nmap對目標主機進行主機發現、端口掃描、應用程序與版本偵測、操作系統偵測及調用默認NSE腳本掃描。
nmap –T4 –A –v targethost
其中-A選項用於使用進攻性(Aggressive)方式掃描;-T4指定掃描過程使用的時序(Timing),總有6個級別(0-5),級別越高,掃描速度越快,但也容易被防火牆或IDS檢測並屏蔽掉,在網絡通訊狀況良好的情況推薦使用T4;-v表示顯示冗余(verbosity)信息,在掃描過程中顯示掃描的細節,從而讓用戶了解當前的掃描狀態。
例如,掃描局域網內地址為192.168.1.100的電腦。顯而易見,掃描出的信息非常豐富,在對192.168.1.100的掃描報告部分中(以紅框圈出),可以看到主機發現的結果“Host is up”;端口掃描出的結果,有996個關閉端口,4個開放端口(在未指定掃描端口時,Nmap默認掃描1000個最有可能開放的端口);而版本偵測針對掃描到的開放狀況進一步探測端口上運行的具體的應用程序和版本信息;OS偵測對該目標主機的設備類型與操作系統進行探測;而綠色框圖是nmap調用NSE腳本進行進一步的信息挖掘的顯示結果。
(2)主機發現
主機發現(Host Discovery),即用於發現目標主機是否在線(Alive,處於開啟狀態)。
(2.1)主機發現原理
主機發現發現的原理與Ping命令類似,發送探測包到目標主機,如果收到回復,那么說明目標主機是開啟的。Nmap支持十多種不同的主機探測方式,比如發送ICMP ECHO/TIMESTAMP/NETMASK報文、發送TCPSYN/ACK包、發送SCTP INIT/COOKIE-ECHO包,用戶可以在不同的條件下靈活選用不同的方式來探測目標機。
Nmap的用戶位於源端,IP地址192.168.0.5,向目標主機192.168.0.3發送ICMP Echo Request。如果該請求報文沒有被防火牆攔截掉,那么目標機會回復ICMP Echo Reply包回來。以此來確定目標主機是否在線。
默認情況下,Nmap會發送四種不同類型的數據包來探測目標主機是否在線。
- ICMP echo request
- a TCP SYN packet to port 443
- a TCP ACK packet to port 80
- an ICMP timestamp request
依次發送四個報文探測目標機是否開啟。只要收到其中一個包的回復,那就證明目標機開啟。使用四種不同類型的數據包可以避免因防火牆或丟包造成的判斷錯誤。
(2.2)常用指令:
用法示例:
nmap –sn –PE –PS80,135 –PU53 scanme.nmap.org
探測局域網內活動主機:
nmap –sn 192.168.10.100-120
參數選項:
-sL: List Scan 列表掃描,僅將指定的目標的IP列舉出來,不進行主機發現。
-sn: Ping Scan 只進行主機發現,不進行端口掃描。
-Pn: 將所有指定的主機視作開啟的,跳過主機發現的過程。
-PS/PA/PU/PY[portlist]: 使用TCPSYN/ACK或SCTP INIT/ECHO方式進行發現。
-PE/PP/PM: 使用ICMP echo, timestamp, and netmask 請求包發現主機。-PO[protocollist]: 使用IP協議包探測對方主機是否開啟。
-n/-R: -n表示不進行DNS解析;-R表示總是進行DNS解析。
--dns-servers : 指定DNS服務器。
--system-dns: 指定使用系統的DNS服務器
--traceroute: 追蹤每個路由節點
掃描target主機所有的TCP端口
nmap -v targethost
(3)端口掃描
端口掃描是Nmap最基本最核心的功能,用於確定目標主機的TCP/UDP端口的開放情況。默認情況下,Nmap會掃描1000個最有可能開放的TCP端口。
Nmap通過探測將端口划分為6個狀態:
- open:端口是開放的。
- closed:端口是關閉的。
- filtered:端口被防火牆IDS/IPS屏蔽,無法確定其狀態。
- unfiltered:端口沒有被屏蔽,但是否開放需要進一步確定。
- open|filtered:端口是開放的或被屏蔽。
- closed|filtered :端口是關閉的或被屏蔽。
掃描方式選項:
-sS/sT/sA/sW/sM:指定使用 TCP SYN/Connect()/ACK/Window/Maimon scans的方式來對目標主機進行掃描。 -sU: 指定使用UDP掃描方式確定目標主機的UDP端口狀況。 -sN/sF/sX: 指定使用TCP Null, FIN, and Xmas scans秘密掃描方式來協助探測對方的TCP端口狀態。 --scanflags <flags>: 定制TCP包的flags。 -sI <zombiehost[:probeport]>: 指定使用idle scan方式來掃描目標主機(前提需要找到合適的zombie host) -sY/sZ: 使用SCTP INIT/COOKIE-ECHO來掃描SCTP協議端口的開放的情況。 -sO: 使用IP protocol 掃描確定目標機支持的協議類型。 -b <FTP relay host>: 使用FTP bounce scan掃描方式
說明:
-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 閑置掃描 僵屍主機掃描,非常隱蔽
端口參數及掃描順序
-p <port ranges>: 掃描指定的端口 -F: Fast mode – 快速模式,僅掃描TOP 100的端口 -r: 不進行端口隨機打亂的操作(如無該參數,nmap會將要掃描的端口以隨機順序方式掃描,以讓nmap的掃描不易被對方防火牆檢測到)。 --top-ports <number>:掃描開放概率最高的number個端口(nmap的作者曾經做過大規模地互聯網掃描,以此統計出網絡上各種端口可能開放的概率。以此排列出最有可能開放端口的列表,具體可以參見文件:nmap-services。默認情況下,nmap會掃描最有可能的1000個TCP端口) --port-ratio <ratio>: 掃描指定頻率以上的端口。與上述--top-ports類似,這里以概率作為參數,讓概率大於--port-ratio的端口才被掃描。顯然參數必須在在0到1之間,具體范圍概率情況可以查看nmap-services文件。
參數用法示例:
-p22; -p1-65535; -p U:53,111,137,T:21-25,80,139,8080,S:9(其中T代表TCP協議、U代表UDP協議、S代表SCTP協議)
常用指令:
nmap –sS –sU –T4 –top-ports port號 ip地址
參數-sS表示使用TCP SYN方式掃描TCP端口;
-sU表示掃描UDP端口;
-T4表示時間級別配置4級;
--top-ports 300表示掃描最有可能開放的300個端口(TCP和UDP分別有300個端口)。
確定端口狀況:
如果直接針對某台計算的IP地址或域名進行掃描,那么Nmap對該主機進行主機發現過程和端口掃描。該方式執行迅速,可以用於確定端口的開放狀況。
nmap targethost
(4)版本偵測
用於確定目標主機開放端口上運行的具體的應用程序及版本信息。
(4.1)原理
簡要的介紹版本的偵測原理。版本偵測主要分為以下幾個步驟:
- 首先檢查open與open|filtered狀態的端口是否在排除端口列表內。如果在排除列表,將該端口剔除。
- 如果是TCP端口,嘗試建立TCP連接。嘗試等待片刻(通常6秒或更多,具體時間可以查詢文件nmap-services-probes中Probe TCP NULL q||對應的totalwaitms)。通常在等待時間內,會接收到目標機發送的“WelcomeBanner”信息。nmap將接收到的Banner與nmap-services-probes中NULL probe中的簽名進行對比。查找對應應用程序的名字與版本信息。
- 如果通過“Welcome Banner”無法確定應用程序版本,那么nmap再嘗試發送其他的探測包(即從nmap-services-probes中挑選合適的probe),將probe得到回復包與數據庫中的簽名進行對比。如果反復探測都無法得出具體應用,那么打印出應用返回報文,讓用戶自行進一步判定。
- 如果是UDP端口,那么直接使用nmap-services-probes中探測包進行探測匹配。根據結果對比分析出UDP應用服務類型。
- 如果探測到應用程序是SSL,那么調用openSSL進一步的偵查運行在SSL之上的具體的應用類型。
- 如果探測到應用程序是SunRPC,那么調用brute-force RPC grinder進一步探測具體服務。
(4.2)Nmap提供的版本偵測具有如下的優點:
- 高速。並行地進行套接字操作,實現一組高效的探測匹配定義語法。
- 盡可能地確定應用名字與版本名字。
- 支持TCP/UDP協議,支持文本格式與二進制格式。
- 支持多種平台服務的偵測,包括Linux/Windows/Mac OS/FreeBSD等系統。
- 如果檢測到SSL,會調用openSSL繼續偵測運行在SSL上的具體協議(如HTTPS/POP3S/IMAPS)。
- 如果檢測到SunRPC服務,那么會調用brute-force RPC grinder進一步確定RPC程序編號、名字、版本號。
- 支持完整的IPv6功能,包括TCP/UDP,基於TCP的SSL。
- 通用平台枚舉功能(CPE)
- 廣泛的應用程序數據庫(nmap-services-probes)。目前Nmap可以識別幾千種服務的簽名,包含了180多種不同的協議。
常用指令:
nmap –sV ip地址
版本偵測的指令選項:
-sV: 指定讓Nmap進行版本偵測 --version-intensity <level>: 指定版本偵測強度(0-9),默認為7。數值越高,探測出的服務越准確,但是運行時間會比較長。 --version-light: 指定使用輕量偵測方式 (intensity 2) --version-all: 嘗試使用所有的probes進行偵測 (intensity 9) --version-trace: 顯示出詳細的版本偵測過程信息。
(5)OS偵測
操作系統偵測用於檢測目標主機運行的操作系統類型及設備類型等信息。Nmap擁有豐富的系統數據庫nmap-os-db,目前可以識別2600多種操作系統與設備類型。
(5.1)OS偵測原理
Nmap使用TCP/IP協議棧指紋來識別不同的操作系統和設備。在RFC規范中,有些地方對TCP/IP的實現並沒有強制規定,由此不同的TCP/IP方案中可能都有自己的特定方式。Nmap主要是根據這些細節上的差異來判斷操作系統的類型的。
具體實現方式如下:
- Nmap內部包含了2600多已知系統的指紋特征(在文件nmap-os-db文件中)。將此指紋數據庫作為進行指紋對比的樣本庫。
- 分別挑選一個open和closed的端口,向其發送經過精心設計的TCP/UDP/ICMP數據包,根據返回的數據包生成一份系統指紋。
- 將探測生成的指紋與nmap-os-db中指紋進行對比,查找匹配的系統。如果無法匹配,以概率形式列舉出可能的系統。
常用指令:
nmap –O targethost
OS偵測指令選項:
-O: 指定Nmap進行OS偵測。
--osscan-limit: 限制Nmap只對確定的主機的進行OS探測(至少需確知該主機分別有一個open和closed的端口)。
--osscan-guess: 大膽猜測對方的主機的系統類型。由此准確性會下降不少,但會盡可能多為用戶提供潛在的操作系統。
詳細了解可參考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 msgArr = [] 15 discvArr = stdout.split("\n") 16 for discv in discvArr: 17 msgArr.append("".join(discv.encode("ascii")).strip().strip("\n")) 18 19 set_addr = set() 20 set_ip = set() 21 addr = "" 22 for msg in msgArr[3:]: 23 if "Discovered" in msg: 24 discvArr = msg.split(" on ") 25 ip = discvArr[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 discvArr = stdout.split("\n") 37 38 msgArr = [] 39 os = "" 40 hostname = ip2hostname(ip) 41 if hostname is None: 42 hostname = "未知服務" 44 for discv in discvArr: 45 disv = discv.lower() 53 # 操作系統 54 if "aggressive os guesses: " in discv: 55 os = discv[22:discv.find(",")].strip() 56 if "os details:" in discv: 57 os = discv.replace("os details:", "").strip() 58 # 主機名稱和操作系統,ip:port##ssh@host@os 59 if re.match('\d+/\w+.*open.*', discv): 62 port = discv[0:discv.index('/')] 63 resName = discv[discv.index('open') + 4:] 64 line = ip + ':' + port + '##' + resName.strip() 66 msgArr.append(line)68 for line in msgArr: 69 line = line + "@" + hostname + "@" + os 70 print line
五、資料共享
masscan git地址 https://github.com/topics/masscan
Nmap git地址 https://github.com/nmap/nmap
感謝各位大佬的分享,收獲不少,同時也感謝您的閱讀,如需轉載請注明出處https://www.cnblogs.com/huyangshu-fs/p/13324701.html