轉自:https://blog.csdn.net/qq_34398519/article/details/89055991html
Nmap是一款開源免費的網絡發現(Network Discovery)和安全審計(Security Auditing)工具。軟件名字Nmap是Network Mapper的簡稱。Nmap最初是由Fyodor在1997年開始建立的。隨後在開源社區衆多的志願者參與下,該工具逐漸成爲最爲流行安全必備工具之一。最新版的Nmap6.0在2012年5月21日發佈,詳情請參見:www.nmap.org。數據庫
通常狀況下,Nmap用於列舉網絡主機清單、管理服務升級調度、監控主機或服務運行情況。Nmap能夠檢測目標機是否在線、端口開放狀況、偵測運行的服務類型及版本信息、偵測操做系統與設備類型等信息。安全
Nmap的優勢:服務器
1. 靈活。支持數十種不一樣的掃描方式,支持多種目標對象的掃描。網絡
2. 強大。Nmap能夠用於掃描互聯網上大規模的計算機。架構
3. 可移植。支持主流操做系統:Windows/Linux/Unix/MacOS等等;源碼開放,方便移植。app
4. 簡單。提供默認的操做能覆蓋大部分功能,基本端口掃描nmap targetip,全面的掃描nmap –A targetip。dom
5. 自由。Nmap做爲開源軟件,在GPL License的範圍內能夠自由的使用。工具
6. 文檔豐富。Nmap官網提供了詳細的文檔描述。Nmap做者及其餘安全專家編寫了多部Nmap參考書籍。操作系統
7. 社區支持。Nmap背後有強大的社區團隊支持。
8. 讚譽有加。得到不少的獎勵,並在不少影視做品中出現(如黑客帝國二、Die Hard4等)。
9. 流行。目前Nmap已經被成千上萬的安全專家列爲必備的工具之一。
Zenmap是Nmap官方提供的圖形界面,一般隨Nmap的安裝包發佈。Zenmap是用Python語言編寫而成的開源免費的圖形界面,可以運行在不一樣操做系統平臺上(Windows/Linux/Unix/Mac OS等)。Zenmap旨在爲nmap提供更加簡單的操做方式。簡單經常使用的操做命令能夠保存成爲profile,用戶掃描時選擇profile便可;能夠方便地比較不一樣的掃描結果;提供網絡拓撲結構(NetworkTopology)的圖形顯示功能。
其中Profile欄位,用於選擇「Zenmap默認提供的Profile」或「用戶建立的Profile」;Command欄位,用於顯示選擇Profile對應的命令或者用戶自行指定的命令;Topology選項卡,用於顯示掃描到的目標機與本機之間的拓撲結構。
Nmap包含四項基本功能:
主機發現(Host Discovery)
端口掃描(Port Scanning)
版本偵測(Version Detection)
操做系統偵測(Operating System Detection)
而這四項功能之間,又存在大體的依賴關係(一般狀況下的順序關係,但特殊應用另外考慮),首先須要進行主機發現,隨後肯定端口情況,而後肯定端口上運行具體應用程序與版本信息,而後能夠進行操做系統的偵測。而在四項基本功能的基礎上,Nmap提供防火牆與IDS(IntrusionDetection System,入侵檢測系統)的規避技巧,能夠綜合應用到四個基本功能的各個階段;另外Nmap提供強大的NSE(Nmap Scripting Language)腳本引擎功能,腳本能夠對基本功能進行補充和擴展。
Nmap主要包括四個方面的掃描功能,主機發現、端口掃描、應用與版本偵測、操做系統偵測。在詳細講解每一個具體功能以前,首先能夠看看Nmap的典型用法。
若是直接針對某臺計算的IP地址或域名進行掃描,那麼Nmap對該主機進行主機發現過程和端口掃描。該方式執行迅速,能夠用於肯定端口的開放情況。
命令形式:
nmap targethost
能夠肯定目標主機在線狀況及端口基本情況。
若是但願對某臺主機進行完整全面的掃描,那麼可使用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腳本進行進一步的信息挖掘的顯示結果。
主機發現(Host Discovery),即用於發現目標主機是否在線(Alive,處於開啓狀態)。
主機發現發現的原理與Ping命令相似,發送探測包到目標主機,若是收到回覆,那麼說明目標主機是開啓的。Nmap支持十多種不一樣的主機探測方式,好比發送ICMP ECHO/TIMESTAMP/NETMASK報文、發送TCPSYN/ACK包、發送SCTP INIT/COOKIE-ECHO包,用戶能夠在不一樣的條件下靈活選用不一樣的方式來探測目標機。
主機發現基本原理:(以ICMP echo方式爲例)
Nmap的用戶位於源端,IP地址192.168.0.5,向目標主機192.168.0.3發送ICMP Echo Request。若是該請求報文沒有被防火牆攔截掉,那麼目標機會回覆ICMP Echo Reply包回來。以此來肯定目標主機是否在線。
默認狀況下,Nmap會發送四種不一樣類型的數據包來探測目標主機是否在線。
1. ICMP echo request
2. a TCP SYN packet to port 443
3. a TCP ACK packet to port 80
4. an ICMP timestamp request
依次發送四個報文探測目標機是否開啓。只要收到其中一個包的回覆,那就證實目標機開啓。使用四種不一樣類型的數據包能夠避免因防火牆或丟包形成的判斷錯誤。
一般主機發現並不單獨使用,而只是做爲端口掃描、版本偵測、OS偵測先行步驟。而在某些特殊應用(例如肯定大型局域網內活動主機的數量),可能會單獨專門適用主機發現功能來完成。
無論是做爲輔助用法仍是專門用途,用戶均可以使用Nmap提供的豐富的選項來定製主機發現的探測方式。
[plain] view plaincopy
-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 <serv1[,serv2],…>: 指定DNS服務器。
–system-dns: 指定使用系統的DNS服務器
–traceroute: 追蹤每一個路由節點
其中,比較經常使用的使用的是-sn,表示只單獨進行主機發現過程;-Pn表示直接跳過主機發現而進行端口掃描等高級操做(若是已經確知目標主機已經開啓,可用該選項);-n,若是不想使用DNS或reverse DNS解析,那麼可使用該選項。
下面以探測scanme.nmap.org 的主機爲例,簡單演示主機發現的用法。
命令以下:
nmap –sn –PE –PS80,135 –PU53 scanme.nmap.org
使用Wireshark抓包,咱們看到,scanme.nmap.org 的IP地址74.207.244.221發送了四個探測包:ICMPEcho,80和135端口的TCP SYN包,53端口的UDP包(DNS domain)。而收到ICMP Echo的回覆與80端口的回覆。從而肯定了scanme.nmap.org主機正常在線。
探測局域網內活動主機
掃描局域網192.168.1.100-192.168.1.120範圍內哪些IP的主機是活動的。
命令以下:
nmap –sn 192.168.1.100-120
從結果中,能夠看到這個IP範圍內有三臺主機處於活動狀態。
從Wireshark抓取的包中,能夠看到發送的探測包的狀況:
在局域網內,Nmap是經過ARP包來詢問IP地址上的主機是否活動的,若是收到ARP回覆包,那麼說明主機在線。
例如,某條ARP回覆的報文詳細信息以下:
端口掃描是Nmap最基本最核心的功能,用於肯定目標主機的TCP/UDP端口的開放狀況。
默認狀況下,Nmap會掃描1000個最有可能開放的TCP端口。
Nmap經過探測將端口劃分爲6個狀態:
open:端口是開放的。
closed:端口是關閉的。
filtered:端口被防火牆IDS/IPS屏蔽,沒法肯定其狀態。
unfiltered:端口沒有被屏蔽,可是否開放須要進一步肯定。
open|filtered:端口是開放的或被屏蔽。
closed|filtered :端口是關閉的或被屏蔽。
Nmap在端口掃描方面很是強大,提供了十多種探測方式。
2.3.1.1 TCP SYN scanning
這是Nmap默認的掃描方式,一般被稱做半開放掃描(Half-open scanning)。該方式發送SYN到目標端口,若是收到SYN/ACK回覆,那麼判斷端口是開放的;若是收到RST包,說明該端口是關閉的。若是沒有收到回覆,那麼判斷該端口被屏蔽(Filtered)。由於該方式僅發送SYN包對目標主機的特定端口,但不創建的完整的TCP鏈接,因此相對比較隱蔽,並且效率比較高,適用範圍廣。
TCP SYN探測到端口關閉:
TCP SYN探測到端口開放:
2.3.1.2 TCP connect scanning
TCP connect方式使用系統網絡API connect向目標主機的端口發起鏈接,若是沒法鏈接,說明該端口關閉。該方式掃描速度比較慢,並且因爲創建完整的TCP鏈接會在目標機上留下記錄信息,不夠隱蔽。因此,TCP connect是TCP SYN沒法使用才考慮選擇的方式。
TCP connect探測到端口關閉:
TCP connect探測到端口開放:
2.3.1.3 TCP ACK scanning
向目標主機的端口發送ACK包,若是收到RST包,說明該端口沒有被防火牆屏蔽;沒有收到RST包,說明被屏蔽。該方式只能用於肯定防火牆是否屏蔽某個端口,能夠輔助TCP SYN的方式來判斷目標主機防火牆的情況。
TCP ACK探測到端口被屏蔽:
TCP ACK探測到端口未被屏蔽:
2.3.1.4 TCP FIN/Xmas/NULL scanning
這三種掃描方式被稱爲祕密掃描(Stealthy Scan),由於相對比較隱蔽。FIN掃描向目標主機的端口發送的TCP FIN包或Xmas tree包/Null包,若是收到對方RST回覆包,那麼說明該端口是關閉的;沒有收到RST包說明端口多是開放的或被屏蔽的(open|filtered)。
其中Xmas tree包是指flags中FIN URG PUSH被置爲1的TCP包;NULL包是指全部flags都爲0的TCP包。
TCP FIN探測到主機端口是關閉的:
TCP FIN探測到主機端口是開放或屏蔽的:
2.3.1.5 UDP scanning
UDP掃描方式用於判斷UDP端口的狀況。向目標主機的UDP端口發送探測包,若是收到回覆「ICMP port unreachable」就說明該端口是關閉的;若是沒有收到回覆,那說明UDP端口多是開放的或屏蔽的。所以,經過反向排除法的方式來判定哪些UDP端口是可能出於開放狀態。
UDP端口關閉:
UDP端口開放或被屏蔽:
2.3.1.6 其餘方式
除上述幾種經常使用的方式以外,Nmap還支持多種其餘探測方式。例如使用SCTP INIT/COOKIE-ECHO方式來探測SCTP的端口開放狀況;使用IP protocol方式來探測目標主機支持的協議類型(TCP/UDP/ICMP/SCTP等等);使用idle scan方式藉助殭屍主機(zombie host,也被稱爲idle host,該主機處於空閒狀態而且它的IPID方式爲遞增。詳細實現原理參見:http://nmap.org/book/idlescan.html)來掃描目標在主機,達到隱蔽本身的目的;或者使用FTP bounce scan,藉助FTP容許的代理服務掃描其餘的主機,一樣達到隱藏本身的身份的目的。
端口掃描用法比較簡單,Nmap提供豐富的命令行參數來指定掃描方式和掃描端口。
具體能夠參見以下描述。
2.3.2.1 掃描方式選項
[plain] view plaincopy
-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掃描方式
2.3.2.2 端口參數與掃描順序
[plain] view plaincopy
-p <port ranges>: 掃描指定的端口
實例: -p22; -p1-65535; -p U:53,111,137,T:21-25,80,139,8080,S:9(其中T表明TCP協議、U表明UDP協議、S表明SCTP協議)
-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文件。
這裏,咱們以掃描局域網內192.168.1.100主機爲例。
命令以下:
nmap –sS –sU –T4 –top-ports 300 192.168.1.100
參數-sS表示使用TCP SYN方式掃描TCP端口;-sU表示掃描UDP端口;-T4表示時間級別配置4級;–top-ports 300表示掃描最有可能開放的300個端口(TCP和UDP分別有300個端口)。
從上圖中,咱們看到掃描結果,橫線處寫明有共有589端口是關閉的;紅色框圖中列舉出開放的端口和多是開放的端口。
版本偵測,用於肯定目標主機開放端口上運行的具體的應用程序及版本信息。
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多種不一樣的協議。
簡要的介紹版本的偵測原理。
版本偵測主要分爲如下幾個步驟:
首先檢查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進一步探測具體服務。
版本偵測方面的命令行選項比較簡單。
[plain] view plaincopy
-sV: 指定讓Nmap進行版本偵測
–version-intensity <level>: 指定版本偵測強度(0-9),默認爲7。數值越高,探測出的服務越準確,可是運行時間會比較長。
–version-light: 指定使用輕量偵測方式 (intensity 2)
–version-all: 嘗試使用全部的probes進行偵測 (intensity 9)
–version-trace: 顯示出詳細的版本偵測過程信息。
命令:
nmap –sV 192.168.1.100
對主機192.168.1.100進行版本偵測。
從結果中,咱們能夠看到996個端口是關閉狀態,對於4個open的端口進行版本偵測。圖中紅色爲版本信息。紅色線條劃出部分是版本偵測獲得的附加信息,由於從應用中檢測到微軟特定的應用服務,因此推斷出對方運行的Windows的操做系統。
操做系統偵測用於檢測目標主機運行的操做系統類型及設備類型等信息。
Nmap擁有豐富的系統數據庫nmap-os-db,目前能夠識別2600多種操做系統與設備類型。
Nmap使用TCP/IP協議棧指紋來識別不一樣的操做系統和設備。在RFC規範中,有些地方對TCP/IP的實現並無強制規定,由此不一樣的TCP/IP方案中可能都有本身的特定方式。Nmap主要是根據這些細節上的差別來判斷操做系統的類型的。
具體實現方式以下:
Nmap內部包含了2600多已知系統的指紋特徵(在文件nmap-os-db文件中)。將此指紋數據庫做爲進行指紋對比的樣本庫。
分別挑選一個open和closed的端口,向其發送通過精心設計的TCP/UDP/ICMP數據包,根據返回的數據包生成一份系統指紋。
將探測生成的指紋與nmap-os-db中指紋進行對比,查找匹配的系統。若是沒法匹配,以機率形式列舉出可能的系統。
OS偵測的用法簡單,Nmap提供的命令比較少。
[plain] view plaincopy
-O: 指定Nmap進行OS偵測。
–osscan-limit: 限制Nmap只對肯定的主機的進行OS探測(至少需確知該主機分別有一個open和closed的端口)。
–osscan-guess: 大膽猜想對方的主機的系統類型。由此準確性會降低很多,但會盡量多爲用戶提供潛在的操做系統。
命令:
nmap –O 192.168.1.100
從上圖中可看到,指定-O選項後先進行主機發現與端口掃描,根據掃描到端口來進行進一步的OS偵測。獲取的結果信息有設備類型,操做系統類型,操做系統的CPE描述,操做系統細節,網絡距離等。