你不可不知的 Nmap 使用技巧
Nmap 是一款網路掃描和主機偵測的非常有用的工具。合理使用,不僅可以用來資訊收集和列舉,同時也可以用來作為一個漏洞探測器或安全掃描器。另外 Nmap 還跨平臺,適用於 Windows、Linux 和 Macintosh 等主流作業系統,功能強大,乃居家旅行之必備良品。
總的來說,Nmap 具有四大功能。
-
主機發現
-
埠掃描
-
服務版本偵測
-
作業系統偵測
這四大應用乃 Nmap 之精髓,同時它們之間具有邏輯上的順序關係。首先進行主機判斷,發現在指定通道上存活的主機,然後對這些存活的主機進行埠掃描,接著記錄這些執行服務的版本號,最後針對不同作業系統我們還可以有不同的具體應對方案,順手便把對方的作業系統給偵測了。
在這四大基本應用之上,Nmap 還有一些用來規避、繞過防火牆的組合技巧。最後本文將介紹 Nmap 的一個強大的應用模組,名曰 Nmap 指令碼引擎(Nmap Script Engine),簡稱 NSE。在本文中,我們將學習使用 NSE 來幹一些本來看起來繁瑣的事情,也就是說實現了自動化。
基本掃描策略
掌握以下幾點基本操作,熟練後敲命令就像背書一樣。排名不分先後。
0x01:無任何附加引數
nmap IP地址
分情況。如果是超級使用者,無引數掃描等價於 sS 引數掃描(SYN,半連線);否則,無引數掃描等價於 sT 引數掃描(TCP,完整連線)。
0x02:冗餘
nmap -vv IP地址
按照基本法,v 引數通常表示冗餘。我們使用兩個 v 引數表示將偵測過程原原本本的列印輸出出來。
0x03:指定埠號
nmap -p埠號 IP地址
這裡 p 引數表示埠,標準寫法後面跟的埠號之間沒有空格。但是如果寫一個空格也並無妨。
0x04:作業系統偵測
nmap -O IP地址
nmap -A IP地址
作業系統偵測有兩個引數選項,其一是引數 O,其二是引數 A,後者乃前者的冗餘版本。我更多的使用 A 引數,以得到更多的資訊。
0x05:只進行主機發現
nmap -sn IP地址
主機發現的手段不下幾十種,但是最常用的卻是 sn 引數,它表示 “使用 ping 掃描來偵測存活的主機,而不進行埠掃描”。
0x06:跳過主機發現
nmap -Pn IP地址
有時候對方主機開啟了防火牆(這是很自然的事情),可能過濾掉了你傳送的 ICMP 協議資料包,這樣如果想要使用 sn 引數來進行主機發現就不管用了,產生的結果也不可靠。於是你不得不使用 Pn 引數,它假設所有的目標 IP 均為存活,並一個一個主機的進行埠掃描,你懂的這樣會犧牲一些時間作為代價。
0x07:掃描和版本號偵測
nmap -sV IP地址
該選項通過偵測開放的埠來判斷開放的服務,並試圖檢測它的版本。雖然 A 選項也能做到,但是要檢測開放的服務版本,sV 一定是最合適的。
0x08:UDP 掃描
nmap -sU IP地址
之前我們的掃描都是針對 TCP 的,而有些服務卻是建立在 UDP 協議上的。比如 NTP(123埠)、SNMP(161埠)等服務,就必須使用 UDP 協議進行掃描。
繞過防火牆
前面講的 Pn 選項就可以看成是 sn 選項的逃脫策略。所謂逃脫,就是不讓別人發現自己,否則要乾的偵測工作還沒搞完,就被迫中止豈不讓人笑話。同樣的,排名不分先後。
0x01:利用掩體
namp -D IP地址1,IP地址2... IP地址
你可以使用 D 選項(英文 decoy)跟一些 IP 地址,IP 和 IP 之間用逗號隔開。這樣看起來用來偵測而傳送的資料包不僅來自於你的 IP 地址,還來自於這些掩體 IP。這就叫做 “混入其中”。
0x02:禁用 ping
nmap -P0 IP地址
在 2010 年之後,該選項和 PN 選項被一起合併到 Pn 選項之中。但是如果你願意,你仍然可以使用 P0 選項(P 後面跟的是零)。
0x03:IP 地址偽裝
sudo proxychains nmap ...
偽裝 IP 地址的方法也有很多,比如你可以使用 prxychains 這款工具來實現匿名代理。
0x04:空閒掃描
nmap -sI 殭屍IP地址[:開放的殭屍埠] IP地址
和 D 選線不同的是,sI 根本不使用你自己的 IP 地址,而是使用空閒的網路資源。這樣隱蔽性就更強了。開放的殭屍埠為選填,預設等於 80 埠。具體原理請參考 Nmap 文件。根據這個理論,你不能使用空閒掃描來掃描你自己的主機 IP。在 msfconsole 中,你可以使用 auxiliary/scanner/ip/ipidseq
來完成這個工作。
0x05:指定網絡卡進行掃描
nmap -e 網絡卡 IP地址
當你擁有不止一個網絡卡的時候,這很有用。
0x06:限制掃描時間
nmap --host-timeout 時間 IP地址
限制每個 IP 地址的掃描時間(單位為秒),當要掃描大量的主機 IP 時這很有用。
0x07:指定源 IP 地址
nmap -S 源IP地址 IP地址
使用冒充的 IP 地址進行掃描以增強隱蔽性。這裡偽裝成的 IP 也可以來自於下線狀態的主機地址。
0x08:指定源主機埠
nmap -g 53 IP地址
使用 g 引數,或者 source-port 引數,來手動設定用來掃描的埠。常用的,如 20、53、67 埠。
0x09:資料包分片技術
nmap -f IP地址
nmap --mtu mtu單元大小 IP地址
上面兩種方法都可以利用資料包分片技術,某些防火牆為了加快處理速度而不會進行重組處理,這樣從而逃脫防火牆或闖入檢測系統的檢測。注意,mtu 的值必須是 8 的倍數(如 8、16、24、32 等)。
0x10:新增垃圾資料
nmap --data-length 垃圾資料長度 IP地址
一些常見的掃描之資料包是有特定的資料長度的,通過在傳送的資料包末尾新增隨機的垃圾資料,以達到混淆視聽的作效果。
0x11:隨機選擇掃描物件
nmap --randomize-hosts IP地址
如果你要掃描大量的,比如成百上千的主機 IP,這很有效。它會打亂掃描順序,以規避檢測系統的檢測。
0x12:偽裝 MAC 地址
nmap --spoof-mac 偽造MAC IP地址
你可以通過指定供應商的名字來偽裝 MAC 地址。可選的名字有 Dell、Apple、3Com。當然也可以手動指定 MAC 地址的值。或者為了簡單起見,可以在上面 “偽造IP” 的地方填寫數字 0,這將生成一個隨機的 MAC 地址。
0x13:偽造檢驗值
nmap --badsum IP地址
這將使用偽造的 TCP / UDP / SCTP 校驗和傳送資料。
0x14:掃描速度
nmap -T0 IP地址
T後面跟的數字代表掃描速度,數字越大則速度越快。0~5分別表示:妄想症、鬼鬼祟祟、彬彬有禮、正常、好鬥、精神病。
Nmap 指令碼引擎
Nmap 指令碼引擎內建在 Nmap 中,使用 script 引數進行呼叫。它的英文名是 Nmap Script Engine,簡稱 NSE。
Nmap 內建了一些已經寫好的指令碼,在 Kali 等主流滲透系統中被儲存在 /usr/share/nmap/scripts/
資料夾下。檔案字尾名是 .nse
。使用 sC(等價於 script=default)或者 script 引數對 Nmap 指令碼進行呼叫。
0x01:按類別掃描
nmap --script=類別 IP地址
Nmap 的指令碼類別分為以下幾類。
-
auth:負責處理鑑權證書、繞開鑑權的指令碼。
-
broadcast:處理在區域網內探查更多服務開啟的狀況,如 dhcp / dns / sqlserver 等服務。
-
brute:提供暴力破解方式,針對常見的應用如 http / snmp 等。
-
default:使用 sC 或 A 選項時預設的指令碼,提供基本指令碼掃描能力。
-
discovery:挖掘更多的網路服務資訊,如 smb 列舉、snmp 查詢等。
-
dos:用於進行拒絕服務攻擊。
-
exploit:利用已知的漏洞入侵系統。
-
external:利用第三方的資料庫或資源,如進行 whois 解析。
-
fuzzer:模糊測試指令碼,傳送異常的包到目標主機,探測出潛在的漏洞。
-
malware:探測目標是否感染了病毒,是否開啟了後門。
-
safe:與 fuzzer 功能相反,屬於安全性指令碼。
-
version:負責增強信性服務與版本掃描功能的指令碼。
-
vuln:負責檢查目標主機是否有常見的漏洞,如 ms08_067。
你可以使用 vuln 指令碼對目標主機進行簡單的漏洞勘查。
可以看到,就這麼輕而易舉的掃描出來靶機的兩個漏洞,ms08_067
和 ms17_010
漏洞。對漏洞熟悉的同學知道,ms17_010
漏洞,它有一個名字好聽的衍生版本,曰之 “永恆之藍(externalblue)”。該攻擊手段便是利用了這個漏洞。經檢驗,這兩個靶機上的漏洞都可以被直接利用。
0x02:使用特定的指令碼進行掃描
nmap --script=特定的指令碼名字 IP地址
所謂 Nmap 指令碼的名字,就是 /usr/share/nmap/scripts/
資料夾下的那些檔案,去掉字尾後的東西。
0x03:增強和個性化定製指令碼
CVE(Common Vulnerablities and Exposures)是安全界的一個規範。一個較著名的,Exploit-DB 資料庫以 CVE 規範為基礎,對確定披露的漏洞進行了分類。我們將使用下面的指令碼直接訪問 Exploit-DB 資料庫並匯入 Nmap。這是 Exploit-DB 資料庫的線上搜尋介面。當然漏洞庫多了去了,但我之所以將它列出,因為該地址預設是儲存在 Kali 的收藏欄裡面的。
這裡提供兩個別人已經寫好的指令碼。(可以自己在 Github 尋找)
想要安裝這些 Nmap 指令碼,很簡單。
cd /usr/share/nmap/scripts
接著將連結提供的指令碼複製貼上到該路徑即可。
具體細節或有不同,如 vulscan 還需要將漏洞資料庫的相關資訊儲存到本地。
呼叫時以 scripts/ 為根目錄,對字尾名為 nse 的指令碼進行呼叫。
我已經安裝好了,以下是一個使用示範。相比於普通的漏洞掃描,通常它會更多有價值的資訊。
nmap --script 指令碼之間用逗號隔開 --script-args 引數之間用逗號隔開 IP地址
GitHub 上說了,要使用這兩個指令碼,必須和 sV 引數一起呼叫。
nmap -sV --script 指令碼名 --script-args 引數 IP地址
使用 vulners.nse
使用 vulscan.nse
將二者整合到一條命令
除此之外你還可以編寫自己的 Nmap 指令碼,這裡是一個較為基礎的入門指南。