Nmap掃描原理與用法

aspirationflow發表於2012-06-26

Nmap掃描原理與用法

2012年6月16日

1     Nmap介紹


Nmap掃描原理與用法PDF:下載地址


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等等;原始碼開放,方便移植。

4.      簡單。提供預設的操作能覆蓋大部分功能,基本埠掃描nmap targetip,全面的掃描nmap –A targetip。

5.      自由。Nmap作為開源軟體,在GPL License的範圍內可以自由的使用。

6.      文件豐富。Nmap官網提供了詳細的文件描述。Nmap作者及其他安全專家編寫了多部Nmap參考書籍。

7.      社群支援。Nmap背後有強大的社群團隊支援。

8.      讚譽有加。獲得很多的獎勵,並在很多影視作品中出現(如黑客帝國2、Die Hard4等)。

9.      流行。目前Nmap已經被成千上萬的安全專家列為必備的工具之一。

 

1.1    Zenmap

Zenmap是Nmap官方提供的圖形介面,通常隨Nmap的安裝包釋出。Zenmap是用Python語言編寫而成的開源免費的圖形介面,能夠執行在不同作業系統平臺上(Windows/Linux/Unix/Mac OS等)。Zenmap旨在為nmap提供更加簡單的操作方式。簡單常用的操作命令可以儲存成為profile,使用者掃描時選擇profile即可;可以方便地比較不同的掃描結果;提供網路拓撲結構(NetworkTopology)的圖形顯示功能。


其中Profile欄位,用於選擇“Zenmap預設提供的Profile”或“使用者建立的Profile”;Command欄位,用於顯示選擇Profile對應的命令或者使用者自行指定的命令;Topology選項卡,用於顯示掃描到的目標機與本機之間的拓撲結構。

1.2    功能架構圖

Nmap包含四項基本功能:

  1. 主機發現(Host Discovery)
  2. 埠掃描(Port Scanning)
  3. 版本偵測(Version Detection)
  4. 作業系統偵測(Operating System Detection)

而這四項功能之間,又存在大致的依賴關係(通常情況下的順序關係,但特殊應用另外考慮),首先需要進行主機發現,隨後確定埠狀況,然後確定埠上執行具體應用程式與版本資訊,然後可以進行作業系統的偵測。而在四項基本功能的基礎上,Nmap提供防火牆與IDS(IntrusionDetection System,入侵檢測系統)的規避技巧,可以綜合應用到四個基本功能的各個階段;另外Nmap提供強大的NSE(Nmap Scripting Language)指令碼引擎功能,指令碼可以對基本功能進行補充和擴充套件。

 

 

2     Nmap基本掃描方法

Nmap主要包括四個方面的掃描功能,主機發現、埠掃描、應用與版本偵測、作業系統偵測。在詳細講解每個具體功能之前,首先可以看看Nmap的典型用法。

2.1    用法引入

2.1.1    確定埠狀況

如果直接針對某臺計算的IP地址或域名進行掃描,那麼Nmap對該主機進行主機發現過程和埠掃描。該方式執行迅速,可以用於確定埠的開放狀況。

命令形式:

nmap targethost

可以確定目標主機線上情況及埠基本狀況。

 

2.1.2    完整全面的掃描

如果希望對某臺主機進行完整全面的掃描,那麼可以使用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.2    主機發現

主機發現(Host Discovery),即用於發現目標主機是否線上(Alive,處於開啟狀態)。

2.2.1    主機發現原理

主機發現發現的原理與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

依次傳送四個報文探測目標機是否開啟。只要收到其中一個包的回覆,那就證明目標機開啟。使用四種不同型別的資料包可以避免因防火牆或丟包造成的判斷錯誤。

2.2.2    主機發現的用法

通常主機發現並不單獨使用,而只是作為埠掃描、版本偵測、OS偵測先行步驟。而在某些特殊應用(例如確定大型區域網內活動主機的數量),可能會單獨專門適用主機發現功能來完成。

不管是作為輔助用法還是專門用途,使用者都可以使用Nmap提供的豐富的選項來定製主機發現的探測方式。

-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解析,那麼可以使用該選項。

2.2.3    使用演示

探測scanme.nmap.org

下面以探測scanme.nmap.org 的主機為例,簡單演示主機發現的用法。

命令如下:

nmap –sn –PE –PS80,135 –PU53 scanme.nmap.org


使用Wireshark抓包,我們看到,scanme.nmap.org 的IP地址182.140.147.57傳送了四個探測包: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回覆的報文詳細資訊如下:

 

2.3    埠掃描

埠掃描是Nmap最基本最核心的功能,用於確定目標主機的TCP/UDP埠的開放情況。

預設情況下,Nmap會掃描1000個最有可能開放的TCP埠。

Nmap通過探測將埠劃分為6個狀態:

  1. open:埠是開放的。
  2. closed:埠是關閉的。
  3. filtered:埠被防火牆IDS/IPS遮蔽,無法確定其狀態。
  4. unfiltered:埠沒有被遮蔽,但是否開放需要進一步確定。
  5. open|filtered:埠是開放的或被遮蔽。
  6. closed|filtered :埠是關閉的或被遮蔽。

2.3.1    埠掃描原理

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被置為1TCP包;NULL包是指所有flags都為0TCP包。

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允許的代理服務掃描其他的主機,同樣達到隱藏自己的身份的目的。

 

2.3.2    埠掃描用法

埠掃描用法比較簡單,Nmap提供豐富的命令列引數來指定掃描方式和掃描埠。

具體可以參見如下描述。

2.3.2.1    掃描方式選項

-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    埠引數與掃描順序

-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檔案。
 

2.3.3    埠掃描演示

這裡,我們以掃描區域網內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埠是關閉的;紅色框圖中列舉出開放的埠和可能是開放的埠。

2.4    版本偵測

版本偵測,用於確定目標主機開放埠上執行的具體的應用程式及版本資訊。

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多種不同的協議。

2.4.1    版本偵測原理

簡要的介紹版本的偵測原理。

版本偵測主要分為以下幾個步驟:

  1. 首先檢查open與open|filtered狀態的埠是否在排除埠列表內。如果在排除列表,將該埠剔除。
  2. 如果是TCP埠,嘗試建立TCP連線。嘗試等待片刻(通常6秒或更多,具體時間可以查詢檔案nmap-services-probes中Probe TCP NULL q||對應的totalwaitms)。通常在等待時間內,會接收到目標機傳送的“WelcomeBanner”資訊。nmap將接收到的Banner與nmap-services-probes中NULL probe中的簽名進行對比。查詢對應應用程式的名字與版本資訊。
  3. 如果通過“Welcome Banner”無法確定應用程式版本,那麼nmap再嘗試傳送其他的探測包(即從nmap-services-probes中挑選合適的probe),將probe得到回覆包與資料庫中的簽名進行對比。如果反覆探測都無法得出具體應用,那麼列印出應用返回報文,讓使用者自行進一步判定。
  4. 如果是UDP埠,那麼直接使用nmap-services-probes中探測包進行探測匹配。根據結果對比分析出UDP應用服務型別。
  5. 如果探測到應用程式是SSL,那麼呼叫openSSL進一步的偵查執行在SSL之上的具體的應用型別。
  6. 如果探測到應用程式是SunRPC,那麼呼叫brute-force RPC grinder進一步探測具體服務。

2.4.2    版本偵測的用法

版本偵測方面的命令列選項比較簡單。

-sV: 指定讓Nmap進行版本偵測

--version-intensity <level>: 指定版本偵測強度(0-9),預設為7。數值越高,探測出的服務越準確,但是執行時間會比較長。

--version-light: 指定使用輕量偵測方式 (intensity 2)

--version-all: 嘗試使用所有的probes進行偵測 (intensity 9)

--version-trace: 顯示出詳細的版本偵測過程資訊。

2.4.3    版本偵測演示

命令:

nmap –sV 192.168.1.100

對主機192.168.1.100進行版本偵測。


從結果中,我們可以看到996個埠是關閉狀態,對於4個open的埠進行版本偵測。圖中紅色為版本資訊。紅色線條劃出部分是版本偵測得到的附加資訊,因為從應用中檢測到微軟特定的應用服務,所以推斷出對方執行的Windows的作業系統。

2.5    OS偵測

作業系統偵測用於檢測目標主機執行的作業系統型別及裝置型別等資訊。

Nmap擁有豐富的系統資料庫nmap-os-db,目前可以識別2600多種作業系統與裝置型別。

2.5.1    OS偵測原理

Nmap使用TCP/IP協議棧指紋來識別不同的作業系統和裝置。在RFC規範中,有些地方對TCP/IP的實現並沒有強制規定,由此不同的TCP/IP方案中可能都有自己的特定方式。Nmap主要是根據這些細節上的差異來判斷作業系統的型別的。

具體實現方式如下:

  1. Nmap內部包含了2600多已知系統的指紋特徵(在檔案nmap-os-db檔案中)。將此指紋資料庫作為進行指紋對比的樣本庫。
  2. 分別挑選一個open和closed的埠,向其傳送經過精心設計的TCP/UDP/ICMP資料包,根據返回的資料包生成一份系統指紋。
  3. 將探測生成的指紋與nmap-os-db中指紋進行對比,查詢匹配的系統。如果無法匹配,以概率形式列舉出可能的系統。

2.5.2    OS偵測用法

OS偵測的用法簡單,Nmap提供的命令比較少。

-O: 指定Nmap進行OS偵測。

--osscan-limit: 限制Nmap只對確定的主機的進行OS探測(至少需確知該主機分別有一個open和closed的埠)。

--osscan-guess: 大膽猜測對方的主機的系統型別。由此準確性會下降不少,但會盡可能多為使用者提供潛在的作業系統。

2.5.3    OS偵測演示

命令:

nmap –O 192.168.1.100


從上圖中可看到,指定-O選項後先進行主機發現與埠掃描,根據掃描到埠來進行進一步的OS偵測。獲取的結果資訊有裝置型別,作業系統型別,作業系統的CPE描述,作業系統細節,網路距離等。

3     Nmap高階用法

3.1    防火牆/IDS規避

防火牆與IDS規避為用於繞開防火牆與IDS(入侵檢測系統)的檢測與遮蔽,以便能夠更加詳細地發現目標主機的狀況。

Nmap提供了多種規避技巧,通常可以從兩個方面考慮規避方式:資料包的變換(Packet Change)與時序變換(Timing Change)。

3.1.1    規避原理

3.1.1.1    分片(Fragmentation)

將可疑的探測包進行分片處理(例如將TCP包拆分成多個IP包傳送過去),某些簡單的防火牆為了加快處理速度可能不會進行重組檢查,以此避開其檢查。

3.1.1.2    IP誘騙(IP decoys)

在進行掃描時,將真實IP地址和其他主機的IP地址(其他主機需要線上,否則目標主機將回復大量資料包到不存在的主機,從而實質構成了拒絕服務攻擊)混合使用,以此讓目標主機的防火牆或IDS追蹤檢查大量的不同IP地址的資料包,降低其追查到自身的概率。注意,某些高階的IDS系統通過統計分析仍然可以追蹤出掃描者真實IP地址。

3.1.1.3    IP偽裝(IP Spoofing)

顧名思義,IP偽裝即將自己傳送的資料包中的IP地址偽裝成其他主機的地址,從而目標機認為是其他主機在與之通訊。需要注意,如果希望接收到目標主機的回覆包,那麼偽裝的IP需要位於統一區域網內。另外,如果既希望隱蔽自己的IP地址,又希望收到目標主機的回覆包,那麼可以嘗試使用idle scan或匿名代理(如TOR)等網路技術。

3.1.1.4    指定源埠

某些目標主機只允許來自特定埠的資料包通過防火牆。例如FTP伺服器配置為:允許源埠為21號的TCP包通過防火牆與FTP服務端通訊,但是源埠為其他埠的資料包被遮蔽。所以,在此類情況下,可以指定Nmap將傳送的資料包的源埠都設定特定的埠。

3.1.1.5    掃描延時

某些防火牆針對傳送過於頻繁的資料包會進行嚴格的偵查,而且某些系統限制錯誤報文產生的頻率(例如,Solaris 系統通常會限制每秒鐘只能產生一個ICMP訊息回覆給UDP掃描),所以,定製該情況下發包的頻率和發包延時可以降低目標主機的審查強度、節省網路頻寬。

3.1.1.6    其他技術

Nmap還提供多種規避技巧,比如指定使用某個網路介面來傳送資料包、指定傳送包的最小長度、指定發包的MTU、指定TTL、指定偽裝的MAC地址、使用錯誤檢查和(badchecksum)。

更多資訊http://nmap.org/book/man-bypass-firewalls-ids.html

 

3.1.2    規避用法

-f; --mtu <val>: 指定使用分片、指定資料包的MTU.

-D <decoy1,decoy2[,ME],...>: 用一組IP地址掩蓋真實地址,其中ME填入自己的IP地址。

-S <IP_Address>: 偽裝成其他IP地址

-e <iface>: 使用特定的網路介面

-g/--source-port <portnum>: 使用指定源埠

--data-length <num>: 填充隨機資料讓資料包長度達到Num。

--ip-options <options>: 使用指定的IP選項來傳送資料包。

--ttl <val>: 設定time-to-live時間。

--spoof-mac <mac address/prefix/vendor name>: 偽裝MAC地址

--badsum: 使用錯誤的checksum來傳送資料包(正常情況下,該類資料包被拋棄,如果收到回覆,說明回覆來自防火牆或IDS/IPS)。

3.1.3    規避演示

使用命令:

nmap -v -F -Pn -D192.168.1.100,192.168.1.102,ME -e eth0 -g 3355 192.168.1.1

其中,-F表示快速掃描100個埠;-Pn表示不進行Ping掃描;-D表示使用IP誘騙方式掩蓋自己真實IP(其中ME表示自己IP);-e eth0表示使用eth0網路卡傳送該資料包;-g 3355表示自己的源埠使用3355;192.168.1.1是被掃描的目標IP地址。


我們可以從Wireshark中看到資料包的流動情況:對於每個探測包,Nmap都使用-D選項指定的IP地址傳送不同的資料包,從而達到擾亂對方防火牆/IDS檢查的目的(更好的方式-D選項中嵌入RND隨機數,這樣更具有迷惑性)。當探測到80埠時候,目標主機向我們回覆了SYN/ACK包回來(當然也向其他誘騙的IP回覆SYN/ACK包,我們無法接收到),證明80埠是開放的。

 

3.2    NSE指令碼引擎

NSE指令碼引擎(Nmap Scripting Engine)是Nmap最強大最靈活的功能之一,允許使用者自己編寫指令碼來執行自動化的操作或者擴充套件Nmap的功能。

NSE使用Lua指令碼語言,並且預設提供了豐富的指令碼庫,目前已經包含14個類別的350多個指令碼。

NSE的設計初衷主要考慮以下幾個方面:

  • 網路發現(Network Discovery)
  • 更加複雜的版本偵測(例如skype軟體)
  • 漏洞偵測(Vulnerability Detection)
  • 後門偵測(Backdoor Detection)
  • 漏洞利用(Vulnerability Exploitation)

 

3.2.1    NSE建立指令碼方法

下面以daytime.nse指令碼為例說明一下NSE格式。


NSE的使用Lua指令碼,並且配置固定格式,以減輕使用者程式設計負擔。通常的一個指令碼分為幾個部分:

description欄位:描述指令碼功能的字串,使用雙層方括號表示。

comment欄位:以--開頭的行,描述指令碼輸出格式

author欄位:描述指令碼作者

license欄位:描述指令碼使用許可證,通常配置為Nmap相同的license

categories欄位:描述指令碼所屬的類別,以對指令碼的呼叫進行管理。

rule欄位:描述指令碼執行的規則,也就是確定觸發指令碼執行的條件。在Nmap中有四種型別的規則,prerule用於在Nmap沒有執行掃描之前觸發指令碼執行,這類指令碼並不需用到任何Nmap掃描的結果;hostrule用在Nmap執行完畢主機發現後觸發的指令碼,根據主機發現的結果來觸發該類指令碼;portrule用於Nmap執行埠掃描或版本偵測時觸發的指令碼,例如檢測到某個埠時觸發某個指令碼執行以完成更詳細的偵查。postrule用於Nmap執行完畢所有的掃描後,通常用於掃描結果的資料提取和整理。在上述例項中,只有一個portrule,說明該指令碼在執行埠掃描後,若檢測到TCP 13號埠開放,那麼觸發該指令碼的執行。

action欄位:指令碼執行的具體內容。當指令碼通過rule欄位的檢查被觸發執行時,就會呼叫action欄位定義的函式。

3.2.2    NSE指令碼用法

Nmap提供不少指令碼使用的命令列引數。

-sC: 等價於 --script=default,使用預設類別的指令碼進行掃描。

--script=<Lua scripts>: <Lua scripts>使用某個或某類指令碼進行掃描,支援萬用字元描述

--script-args=<n1=v1,[n2=v2,...]>: 為指令碼提供預設引數

--script-args-file=filename: 使用檔案來為指令碼提供引數

--script-trace: 顯示指令碼執行過程中傳送與接收的資料

--script-updatedb: 更新指令碼資料庫

--script-help=<Lua scripts>: 顯示指令碼的幫助資訊,其中<Luascripts>部分可以逗號分隔的檔案或指令碼類別。

3.2.3    NSE用法演示

配合指令碼掃描192.168.1.1,檢視能否獲得有用的資訊。

命令如下:

nmap –sV –p 80 –v –script default,http*192.168.1.1


從上圖中,我們可以看到Nmap掃描到對方80埠是開放的,然後使用了大量的名字為http開頭的指令碼對其進行掃描。掃描過程發現在http-auth指令碼執行,出現了“Basic relm=TP-LINK Wireless N router WR740”字樣(紅線劃出部分),這裡已經挖掘對方的裝置型別與具體版本資訊。如果我們知道更多關於WR740已知的漏洞,那麼就可以進行更進一步的滲透測試了。

4     參考資料

4.1    書籍

Nmap Network Scanning

Nmap創始人Fyodor編寫的Nmap的權威指南,非常詳盡地描述Nmap的實現原理及使用方法。Nmap官方文件正是來自該書部分章節。

Secrets of Network Cartography

該書對Nmap的實現原理及使用場景有比較豐富的介紹。

Nmap in the Enterprise: Your Guide to Network Scanning

這本書描述Nmap在企業領域的運用。

Nmap mindmap.pdf

這nmap使用方法的思維導圖(一頁紙的圖片),對Nmap用法整理很完整。

 

4.2    網站

官網:www.nmap.org

安全工具排名:http://sectools.org/

 


相關文章