nmap使用指南
0x00 簡介
nmap還用介紹嗎?搞安全的人還有不知道或者不會用nmap的嗎?據我觀察,能夠全面靈活運用nmap的人其實並不多見。其實nmap早已經不再是你眼中那個網路層的掃描器軟體了,早在十年前它就已經進化成為一個全功能的安全評估框架。今天,利用nmap強大的腳本功能,你可以輕鬆開發出任何漏洞檢測和利用的功能,甚至完全不需要掌握那些常見的程式語言。本課我向你介紹了nmap幾乎全部參數功能,同時演示了如何自己開發一個腳本的過程。
本文使用的nmap
版本是7.92
0x01 歷史進程
- 誕生於1997年
- 最早的版本只有2000行程式碼,沒有版本號
- 只作為埠掃描工具
- 6個月後成為黑客社區中網路掃描的事實標準
- 2003年發布3.45版本
- Fyodor開始全職維護nmap
- 增加了服務檢測、OS檢測、時間控制等功能
- 進入成熟期
- 2006年集成NSE
- 從單一的網路掃描工具,轉變為可擴展的全功能漏洞評估引擎
0x02 默認掃描參數
- 默認
TCP
syn
掃描,利用TCP
的三次握手機制,當發送syn
包後,如果目標主機的那個埠是開著的,就會返回syn
+ack
數據包,同時nmap
接收到之後不再返回ack
的確認包,不會建立完成的TCP
連接,節約掃描發起者機器的資源 - 默認掃描
1000個
常用埠,包括http
、https
、ftp
、smtp
、ssh
等等
0x03 指定掃描IP
0x03-1 指定多個掃描IP
例子 | 含義 |
---|---|
sudo nmap 10.0.2.1,2,25 |
掃描10.0.2.1 、10.0.2.2 、10.0.2.25 這3個IP |
sudo nmap 10.0.1,2.23,25 |
掃描10.0.1.23 、10.0.1.25 、10.0.2.23 、10.0.2.25 這4個IP |
sudo nmap 10.0,1.2,3.23,25 |
掃描10.0.2.23 、10.0.2.25 、10.0.3.23 、10.0.3.25 、10.1.2.23 、10.1.2.25 、10.1.3.23 、10.1.3.25 這8個IP |
例子 | 含義 |
---|---|
sudo nmap 10.0.2.20-25 |
掃描10.0.2.20-25 這一段的IP |
sudo nmap 10.0.2-10,25 |
掃描10.0.2-10,25 這幾段的IP |
sudo nmap 10.0.2-10.20-25 |
掃描10.0.2-10.20-25 這幾段的IP |
例子 | 含義 |
---|---|
sudo nmap 10.0.2.25/24 |
掃描10.0.2.1/24 這個網段中的所有IP |
sudo nmap 10.0.2.1/16 |
掃描10.0.2.1/16 這個網段中的所有IP |
例子 | 含義 |
---|---|
sudo nmap -iL ip.txt |
掃描ip.txt 這個文件內容中所有的IP ,注意IP 得是一個一行的形式寫入文件中 |
0x03-2 指定掃描域名
例子 | 含義 |
---|---|
sudo nmap www.baidu.com |
掃描www.baidu,com 這個域名對應的IP |
0x03-3 排除要掃描的IP
例子 | 含義 |
---|---|
sudo nmap 10.0.2.25/24 --exclude 10.0.2.2,3,4 |
掃描10.0.2.1/24 這個網段中除10.0.2.2 、10.0.2.3 、10.0.2.4 外的所有IP |
sudo nmap 10.0.2.25/24 --exclude 10.0.2.2-10 |
掃描10.0.2.1/24 這個網段中除10.0.2.2-10 這一段外的所有IP |
sudo nmap 10.0.2.25/16 --exclude 10.0.2.0/24 |
掃描10.0.2.1/16 這一大段中除10.0.2.0/24 這一小段外的所有IP |
例子 | 含義 |
---|---|
sudo nmap 10.0.2.25/24 --excludefile exip.txt |
掃描10.0.2.25/24 這個網段中除exip.txt 文件內容中包含的IP 外的所有IP |
0x04 反向域名查詢
0x04-1 -R 一定要做DNS反向域名查詢
例子 | 含義 |
---|---|
sudo nmap 220.181.38.251 -R -sn |
在掃描時一定要做DNS 反向域名查詢,也就是查詢IP 地址對應的域名,並且只做主機發現 |
0x04-2 -n 不做DNS反向域名查詢
例子 | 含義 |
---|---|
sudo nmap 220.181.38.251 -n -sn |
在掃描時不做DNS 反向域名查詢,也就是不查詢IP 地址對應的域名,並且只做主機發現 |
0x04-3 –dns-servers 指定 DNS 伺服器做反向域名查詢
例子 | 含義 |
---|---|
sudo nmap 220.181.38.251 -R --dns-servers 114.114.114.114 -sn |
在掃描時做DNS 反向域名查詢,指定DNS 伺服器為114.114.114.114 ,並且只做主機發現 |
0x05 -e <iface> 指定發包網卡
例子 | 含義 |
---|---|
sudo nmap 10.0.2.25 -e eth0 |
指定發掃描數據包的網卡為eth0 |
如果沒有指定發包網卡,nmap
就會使用本機序號為第一個的網卡發掃描包
0x06 主機發現
做掃描的時候,先做主機發現,別一上來就對所有的
IP
發送大量數據包進行埠掃描,不要做這種莽撞的行為,因為在掃描的時候經常會觸發安全機制的報警,所以做掃描的時候要越隱蔽越好,先做主機發現再做埠掃描,不僅節省自己的時間,還能避免被發現,何樂而不為呢?
0x06-1 -sn 使用ICMP,TCP ping掃描,只做主機發現
向目標系統的80
或443
埠發送ICMP
和TCP
ping
掃描,如果目標系統返回了ICMP
響應包、SYN+ACK
包、RST+ACK
包,就認為這個IP
是活著的
並且判斷完IP
是否是活著的之後,就會結束,不會再發送埠掃描數據包
例子 | 含義 |
---|---|
sudo nmap -sn 192.168.123.2 |
掃描192.168.123.2 是否是活著的 |
0x06-2 -Pn 跳過主機發現環節
跳過主機發現環節,直接將IP
視為在線狀態,直接發送大量的埠掃描數據包;不加此參數的情況是:若發現此IP
不在線,則不進行埠掃描
因為會發出大量的掃描數據包,一點也不隱蔽,所以用此參數來進行主機發現是不可取的
例子 | 含義 |
---|---|
sudo nmap -Pn 192.168.123.2 |
掃描192.168.123.2 ,不管此IP 是否是活著的狀態 |
0x06-3 –traceroute 顯示經過的路由
例子 | 含義 |
---|---|
sudo nmap www.baidu.com --traceroute -sn |
在掃描結果種顯示每一跳經過的路由IP ,而且只做主機發現這一步 |
0x06-4 -PS 發送 TCP SYN 包
加入這個參數之後只會發送TCP
SYN
數據包包
例子 | 含義 |
---|---|
sudo nmap 192.168.123.1 -PS -sn |
只發送TCP SYN 包進行主機發現 |
0x06-5 -PA 發送 TCP SYN 包
加入這個參數之後只會發送TCP
ACK
數據包
例子 | 含義 |
---|---|
sudo nmap 192.168.123.1 -PA -sn -n |
只發送TCP ACK 包進行主機發現,並且跳過DNS 反向域名解析環節 |
0x06-6 -PU 發送 UDP 包
加入這個參數之後只會發送UDP
數據包
例子 | 含義 |
---|---|
sudo nmap 192.168.123.1 -PU -sn -n |
只發送UDP 包進行主機發現,並且跳過DNS 反向域名解析環節 |
0x06-7 -PY 發送 SCTP 包
加入這個參數之後只會發送SCTP
數據包
例子 | 含義 |
---|---|
sudo nmap 192.168.123.1 -PY -sn -n |
只發送SCTP 包進行主機發現,並且跳過DNS 反向域名解析環節 |
0x06-8 -PE 發送 ICMP 包
加入這個參數之後只會發送ICMP
數據包,跟使用ping
命令是完全一回事
例子 | 含義 |
---|---|
sudo nmap 192.168.123.1 -PE -sn -n |
只發送ICMP 包進行主機發現,並且跳過DNS 反向域名解析環節 |
0x06-9 -PP 請求目標系統時間戳
請求目標系統時間戳,如果返回的話則說明這個IP
是活著的
例子 | 含義 |
---|---|
sudo nmap 192.168.123.1 -PP -sn -n |
請求目標系統時間戳,如果返回的話則說明這個IP 是活著的,並且跳過DNS 反向域名解析環節 |
抓包結果顯示發送了兩次 ICMP 數據包請求目標系統時間戳都沒有得到回復,但其實這個IP
是活著的
注意:每個參數的使用場景不一樣,沒有哪個參數可以全場景覆蓋,要針對當前掃描的環境使用相對應的掃描參數
0x06-10 -PM 請求目標系統子網掩碼
請求目標子網掩碼,如果返回的話則說明這個IP
是活著的
例子 | 含義 |
---|---|
sudo nmap 192.168.123.1 -PM -sn -n |
請求目標系統子網掩碼,如果返回的話則說明這個IP 是活著的,並且跳過DNS 反向域名解析環節 |
抓包結果顯示發送了兩次 ICMP 數據包請求目標系統子網掩碼都沒有得到回復,但其實這個IP
是活著的
注意:每個參數的使用場景不一樣,沒有哪個參數可以全場景覆蓋,要針對當前掃描的環境使用相對應的掃描參數
0x06-11 -PO[protocol list] 指定IP協議包探測目標主機是否開啟
指定IP
協議包探測目標主機是否開啟,如果返回的話則說明這個IP
是活著的
數值 | 值描述 |
---|---|
0 | 保留欄位,用於IPv6(跳躍點到跳躍點選項) |
1 | Internet控制消息 (ICMP) |
2 | Internet組管理 (IGMP) |
3 | 網關到網關 (GGP) |
4 | IP中的IP(封裝) |
5 | 流 |
6 | 傳輸控制 (TCP) |
7 | CBT |
8 | 外部網關協議 (EGP) |
9 | 任何私有內部網關(Cisco在它的IGRP實現中使用) (IGP) |
10 | BBNRCC監視 |
11 | 網路語音協議 |
12 | PUP |
13 | ARGUS |
14 | EMCON |
15 | 網路診斷工具 |
16 | 混亂(Chaos) |
17 | 用戶數據報文 (UDP) |
18 | 復用 |
19 | DCN測量子系統 |
20 | 主機監視 |
21 | 包無線測量 |
22 | XEROXNSIDP |
23 | Trunk-1 |
24 | Trunk-2 |
25 | leaf-1 |
26 | 1eaf-2 |
27 | 可靠的數據協議 |
28 | Internet可靠交易 |
29 | 1SO傳輸協議第四類 (TP4) |
30 | 大塊數據傳輸協議 |
31 | MFE網路服務協議 |
32 | MERIT節點之間協議 |
33 | 序列交換協議 |
34 | 第三方連接協議 |
35 | 域之間策略路由協議 |
36 | XTP |
37 | 數據報文傳遞協議 |
38 | IDPR控制消息傳輸協議 |
39 | TP+ +傳輸協議 |
40 | IL傳輸協議 |
41 | IPv6 |
42 | 資源命令路由協議 |
43 | IPv6的路由報頭 |
44 | IPv6的片報頭 |
45 | 域之間路由協議 |
46 | 保留協議 |
47 | 通用路由封裝 |
48 | 可移動主機路由協議 |
49 | BNA |
50 | IPv6封裝安全有效負載 |
51 | IPv6驗證報頭 |
52 | 集成的網路層安全TUBA |
53 | 帶加密的IP |
54 | NBMA地址解析協議 |
55 | IP可移動性 |
56 | 使用Kryptonet鑰匙管理的傳輸層安全協議 |
57 | SKIP |
58 | IPv6的ICMP |
59 | IPv6的無下一個報頭 |
60 | IPv6的信宿選項 |
61 | 任何主機內部協議 |
62 | CFTP |
63 | 任何本地網路 |
64 | SATNET和BackroomEXPAK |
65 | Kryptolan |
66 | MIT遠程虛擬磁碟協議 |
67 | Internet Pluribus包核心 |
68 | 任何分散式文件系統 |
69 | SATNET監視 |
70 | VISA協議 |
71 | Internet包核心工具 |
72 | 電腦協議Network Executive |
73 | 電腦協議Heart Beat |
74 | Wang Span網路 |
75 | 包影片協議 |
76 | Backroom SATNET監視 |
77 | SUN ND PROTOCOL—臨時 |
78 | WIDEBAND監視 |
79 | WIDEBAND EXPAK |
80 | ISO Internet協議 |
81 | VMTP |
82 | SECURE—VMTP(安全的VMTP) |
83 | VINES |
84 | TTP |
85 | NSFNET—IGP |
86 | 不同網關協議 |
87 | TCF |
88 | EIGRP |
89 | OSPF IGP |
90 | Sprite RPC協議 |
9] | Locus地址解析協議 |
92 | 多播傳輸協議 |
93 | AX.25幀 |
94 | IP內部的IP封裝協議 |
95 | 可移動網路互連控制協議 |
96 | 旗語通訊安全協議 |
97 | IP中的以太封裝 |
98 | 封裝報頭 |
99 | 任何私有加密方案 |
100 | GMTP |
101 | Ipsilon流量管理協議 |
102 | PNNI over IP |
103 | 協議獨立多播 |
104 | ARIS |
105 | SCPS |
106 | QNX |
107 | 活動網路 |
108 | IP有效負載壓縮協議 |
109 | Sitara網路協議 |
110 | Compaq對等協議 |
111 | IP中的IPX |
112 | 虛擬路由器冗餘協議 |
113 | PGM可靠傳輸協議 |
114 | 任何0跳躍協議 |
115 | 第二層隧道協議 |
116 | D-II數據交換(DDX) |
117 | 互動式代理傳輸協議 |
118 | 日程計劃傳輸協議 |
119 | SpectraLink無線協議 |
120 | UTI |
121 | 簡單消息協議 |
122 | SM |
123 | 性能透明性協議 |
124 | ISIS over IPv4 |
125 | FIRE |
126 | Combat無線傳輸協議 |
127 | Combat無線用戶數據報文 |
128 | SSCOPMCE |
129 | IPLT |
130 | 安全包防護 |
131 | IP中的私有IP封裝 |
132 | 流控制傳輸協議 |
133~254 | 未分配 |
255 | 保留 |
例子 | 含義 |
---|---|
sudo nmap 192.168.123.1 -PO1 -sn -n |
指定IP 協議包探測目標主機是否開啟,-PO1 表示使用ICMP協議 ,如果返回的話則說明這個IP 是活著的,並且跳過DNS 反向域名解析環節 |
0x07 埠掃描
0x07-1 –top-ports <number> 掃描最常用的埠
例子 | 含義 |
---|---|
sudo nmap 10.0.2.25 --top-ports 100 |
掃描前100個最常用的埠 |
0x07-2 指定掃描埠
例子 | 含義 |
---|---|
sudo nmap 10.0.2.25 -p22,80,443,5000 |
掃描10.0.2.25 的22 、80 、443 、5000 埠 |
sudo nmap 10.0.2.25 -p1-100 |
掃描10.0.2.25 的1-100 埠 |
sudo nmap 10.0.2.25 -p- |
掃描10.0.2.25 的全部埠,也就是1-65535 埠 |
0x07-3 -sS 發 TCP SYN 包掃描
例子 | 含義 |
---|---|
sudo nmap 192.168.123.1 -sS |
發TCP 的SYN 數據包進行掃描 |
0x07-4 -sA 發 TCP ACK 包掃描
例子 | 含義 |
---|---|
sudo nmap 192.168.123.1 -sA |
發TCP 的ACK 數據包進行掃描 |
0x07-5 -sT 三次握手建立完整的 TCP 連接
有些特殊的應用可能會拒絕SYN
掃描,拒絕半開的連接,所以這時候必須要通過三次握手建立完成的TCP
連接才能發現埠是否是開放的
例子 | 含義 |
---|---|
sudo nmap 192.168.123.1 -sT |
通過三次握手建立完整的TCP 連接,來判斷埠是否開放 |
0x07-6 -sN 發送的 TCP 包 flag 位為空
目標主機收到包之後丟棄掉,即不做響應代表這個埠是開放的,如果返回RST
數據包則表示這個埠是開放的;當然這和目標主機的安全配置有關,只是一般情況下是這樣的
所以使用此參數進行埠掃描時要先確保目標IP
是活著的
例子 | 含義 |
---|---|
sudo nmap 192.168.123.1 -sN |
發送的TCP 包flag 位全設置為0,進行埠掃描 |
0x07-7 -sF 發送的 TCP 包 flag 位的 Fin 設置為1
目標主機收到包之後丟棄掉,即不做響應代表這個埠是開放的,如果返回RST
數據包則表示這個埠是開放的;當然這和目標主機的安全配置有關,只是一般情況下是這樣的
所以使用此參數進行埠掃描時要先確保目標IP
是活著的
例子 | 含義 |
---|---|
sudo nmap 192.168.123.1 -sF |
發送的TCP 數據包flag 中Fin 設置為1 |
0x07-8 -sX 發送的 TCP 包 flag 位的 Urgent、Push、Fin 設置為1
目標主機收到包之後丟棄掉,即不做響應代表這個埠是開放的,如果返回RST
數據包則表示這個埠是開放的;當然這和目標主機的安全配置有關,只是一般情況下是這樣的
所以使用此參數進行埠掃描時要先確保目標IP
是活著的
例子 | 含義 |
---|---|
sudo nmap 192.168.123.1 -sX |
發送的TCP 數據包flag 中Urgent 、Push 、Fin 設置為1 |
0x07-9 –scanflags <flags> 自定義 TCP Flags設置
例子 | 含義 |
---|---|
sudo nmap 192.168.123.1 --scanflags syn,ack,fin |
自定義發送的TCP 數據包flag 中syn 、ack 、Fin 設置為1 |
0x07-10 重頭戲:-sI <zombie host[:probeport]> 殭屍掃描
參數:-sI <zombie host[:probeport]>
殭屍掃描
是非常非常隱蔽的掃描方式
原理
-
首先需要在被掃描的網路中找一台符合下面兩個要求的電腦
-
非常非常空閑的電腦,空閑到沒有和別的任何電腦進行通訊(在一個大型的網路中這種空閑的機器還是比較好找的)
-
這台電腦的
IPID
必須是遞增的,且增長方式是有規律的,比方說每次遞增1
(IPID
即是IP
頭部的ID
欄位)
很多的電腦的
IPID
都是遞增的,比方說一天中的第一個數據包的IPID
是隨即的,下一個數據包的IPID
則會在前一個的IPID
上加1或加2或者加一些有規律的數值 -
-
nmap
先探測殭屍機當前的IPID
是多少,並記錄下來 -
然後
nmap
將自己的IP
地址偽裝成殭屍機的IP
地址,向要目標主機的埠發送SYN
包 -
目標主機埠接收到
SYN
包之後-
如果目標埠是開放的則會向殭屍機發送
SYN+ACK
,但是殭屍機從頭到尾都沒有發送過SYN
包,憑空接收到了目標主機的向它發送SYN+ACK
,殭屍機就會返回RST
數據包,此時殭屍機的IPID
遞增1
-
如果目標埠是關閉的則會向殭屍機發送
RST
包,殭屍機莫名其妙的接收到這個RST
包之後會將這個包丟棄掉,此時殭屍機的IPID
不變化
-
-
這時候
nmap
再次向殭屍機發送數據包,探測殭屍機當前的IPID
,如果數值為之前探測的基礎上+2
,則表明目標主機的目標埠是開放的;如果數值為之前探測的基礎上+1
,則表明目標主機的目標埠是關閉的 -
在整個過程中掃描者是完全隱蔽的,安全性很高。但是反向做路由追蹤還是有可能發現的,不過難度特別大。
例子
- 殭屍機
IP
:10.0.2.11
- 目標
IP
:10.0.2.25
實施殭屍掃描
執行命令:sudo nmap 10.0.2.25 -sI 10.0.2.11 -Pn
註:利用此命令可以單獨探測殭屍機的IPID
變化規律
執行命令:sudo nmap 10.0.2.11 -p445 --script=ipidseq.nse
使用nmap
專門用來掃描IPID
變化的腳本ipidseq.nse
0x07-11 -sU 發 UDP 數據包掃 UDP 埠
因為UDP
是不建立連接的,沒有辦法像TCP
那樣在建立連接的過程中就可以判斷出埠是否開放,所以掃UDP
埠挺不靠譜的
掃UDP
埠一般需要建立基於UDP
以上的應用層連接,發送應用層報文才可以判斷UDP
埠是否開放
例子 | 含義 |
---|---|
sudo nmap 192.168.123.1 -sU |
發送UDP 數據包,掃描UDP 埠 |
0x07-12 默認配置下埠掃描在做什麼
如果目標主機和kali不在同一網段中
執行命令:sudo nmap 192.168.123.1,2 -p80,5000
一圖勝千言
如果目標主機和kali在同一網段中
執行命令:sudo nmap 10.0.2.2,25 -p22,5000
一圖勝千言
0x08 -sV 掃描服務版本
結合多種方式,包括banner
,指紋等技術,判斷目標埠上運行的到底是什麼服務,準確率很高的
例子 | 含義 |
---|---|
sudo nmap 10.0.2.25 -p22,5000 -sV |
探測22 和5000 埠運行的是什麼服務 |
例子 | 含義 |
---|---|
sudo nmap 192.168.123.1 -p53 -sU -sV |
探測UDP 53 埠運行的是什麼服務 |
0x09 -O 掃描系統版本
很多情況下沒有辦法100%判斷出系統的具體版本,就會給出所有可能的結果
例子 | 含義 |
---|---|
sudo nmap 10.0.2.25 -O |
探測系統版本 |
0x0a 掃描速度控制
0x0a-1 -T<0-5> 設置掃描速度等級
0
最慢,5
最快,不過最快速度可能會更容易被發現
例子 | 含義 |
---|---|
sudo nmap 10.0.2.25 -T3 |
限定掃描速度為等級3 |
0x0a-2 –scan-delay <time> 設置探測間隔時間
例子 | 含義 |
---|---|
sudo nmap 10.0.2.25 --scan-delay 10s |
每個掃描間隔10 秒 |
sudo nmap 10.0.2.25 --scan-delay 10m |
每個掃描間隔10 分鐘 |
sudo nmap 10.0.2.25 --scan-delay 10h |
每個掃描間隔10 小時 |
0x0a-3 –min-rate 最小掃描速度
例子 | 含義 |
---|---|
sudo nmap 10.0.2.25 --min-rate |
最小掃描速度 |
0x0a-3 –min-rate 最大掃描速度
例子 | 含義 |
---|---|
sudo nmap 10.0.2.25 --max-rate |
最大掃描速度 |
0x0a-4 解決掃描被卡住的問題(大範圍地址空間)
nmap
掃描大範圍地址塊時經常會被卡死在中間的一個IP
中。
絕大多數是由於目標系統的安全機製造成的,目標系統發現你在掃描時就估計將你的掃描請求掛在那不響應,讓掃描進行不下去
例子 | 含義 |
---|---|
sudo nmap 10.0.2.0/24 --host-timeout 10m |
設置掃描超時時間為10分鐘 ,超過了設置的時間就會掃描下一個 |
0x0b 躲避安全檢測
0x0b-1 -f 將 IP 數據段分片(8位元組一片)
將IP
數據段分片發送,使目標的安全機制IPS
等設備無法還原數據包的原始內容,從而使安全檢測機制失效
比方說
標準的TCP
包頭是20
個位元組,加入了-f
參數後會將這個20
位元組分3
個包發出去,第一個包8
位元組,第二個包8
位元組,第三個包4
位元組再加上4
位元組TCP
數據段的內容(如果有數據段的話也是每次發8
位元組)
例子 | 含義 |
---|---|
sudo nmap 10.0.2.25 -f |
將 IP 數據段分片(8位元組一片) |
0x0b-2 -D <decoy1,decoy2[,ME],…> 偽造多個源IP,真實IP隱藏在其中
ME
代表自己的IP
偽造多個源IP
發送掃描數據包,將真實的掃描IP
隱藏起來
據有些安全資料上說,當
ME
位於第6個*或者再之後時,有些知名廠家安全設備不會記錄到安全日誌中
例子 | 含義 |
---|---|
sudo nmap 10.0.2.25 -D 10.0.2.22,10.0.2.23,10.0.2.24,ME |
偽造10.0.2.22 10.0.2.23 10.0.2.24 和自己的真實IP ME 對目標10.0.2.25 進行掃描 |
0x0b-3 -S <IP_Address> 偽造源IP
將源IP
進行偽造,使用此參數的話還需要別的方法判斷偽造的源IP
是否接收到了回包
此參數需要搭配-e <iface>
指定網卡,-Pn
跳過主機發現這兩個參數
例子 | 含義 |
---|---|
sudo nmap 10.0.2.25 -S 10.0.2.11 -e eth0 -Pn |
偽造源IP 為10.0.2.11 進行探測,並且指定了發包網卡為eth0 ,跳過主機發現環節 |
0x0b-4 -g <portnum> 指定發包埠
例子 | 含義 |
---|---|
sudo nmap 10.0.2.25 -g 3333 |
指定掃描數據包發送的埠為3333 |
0x0b-5 –proxies <url1,[url2],…> 掛上HTTP或SOCKS4代理進行掃描
例子 | 含義 |
---|---|
sudo nmap 10.0.2.25 --proxies //10.0.2.11:8080 |
使用HTTP 代理進行發包掃描 |
0x0b-6 –data <hex string> 在掃描包中數據段附加自定義的16進位數據
例子 | 含義 |
---|---|
sudo nmap 192.168.123.1 --data "AABB02" |
在掃描數據包附加16進位數據AABB02 |
sudo nmap 192.168.123.1 --data "\xAA\xBB\x02" |
在掃描數據包附加16進位數據\xAA\xBB\x02 |
sudo nmap 192.168.123.1 --data "0xaabb02" |
在掃描數據包附加16進位數據0xaabb02 |
0x0b-7 –data-string <string> 在掃描數據包數據段中附加自定義的ASCII字元
例子 | 含義 |
---|---|
sudo nmap 192.168.123.1 --data-string aabbccdd |
在掃描數據包附加ASCII 數據aabbccdd |
sudo nmap 192.168.123.1 --data-string "aa bb cc dd" |
在掃描數據包附加ASCII 數據aa bb cc dd |
0x0b-8 –ip-options <options> 指定IP OPTION數據(暫時不知道咋用)
0x0b-9 –ttl <val> 指定發送掃描包的TTL值
例子 | 含義 |
---|---|
sudo nmap 192.168.123.1 --ttl 25 |
指定發送掃描包的TTL值為25 |
0x0b-10 –spoof-mac <mac address/prefix/vendor name> 偽造掃描數據包中的MAC地址
可能會造成收不到回包的情況
例子 | 含義 |
---|---|
sudo nmap 192.168.123.1 --spoof-mac AA:BB:CC:DD:EE:FF |
偽造數據包中的MAC 地址AA:BB:CC:DD:EE:FF |
0x0b-11 –badsum 使用錯誤的checksum
將IP
包頭中的checksum
校驗值故意寫錯,看看目標的安全檢測機制會不會放棄這樣的包,從而繞過安全機制
例子 | 含義 |
---|---|
sudo nmap 192.168.123.1 --badsum |
故意使用錯誤的checksu |
0x0c 輸出格式
0x0c-1 -oA <basename> 將掃描結果保存為三種根式日誌
三種主要的根式日誌,分別是xml
、nmap
、gnmap
例子 | 含義 |
---|---|
sudo nmap 192.168.123.1 -oA a |
將掃描結果保存為三種主要的根式日誌,文件名為a |
a.nmap
格式的內容就是螢幕輸出的內容
a.gnmap
格式的內容是為了方便用grep
命令篩選結果的
比方說掃描了大量的IP
後,現在想要提取所有開放80
埠的IP
地址
可以這樣執行命令:cat a.gnmap | grep 80
a.xml
格式就是xml
格式嘍
0x0c-2 -oX <file> 將掃描結果保存為XML格式文件
三種主要的根式日誌,分別是xml
、nmap
、gnmap
例子 | 含義 |
---|---|
sudo nmap 192.168.123.1 -oX a |
將掃描結果保存為XML格式文件,文件名為a.xml |
0x0c-3 顯示詳細資訊
例子 | 含義 |
---|---|
sudo nmap 192.168.123.1 -v |
顯示詳細資訊 |
sudo nmap 192.168.123.1 -vv |
顯示更詳細資訊 |
sudo nmap 192.168.123.1 -vvv |
顯示更更詳細資訊 |
sudo nmap 192.168.123.1 -v3 |
等同於-vvv |
0x0c-4 -d 顯示debug資訊
例子 | 含義 |
---|---|
sudo nmap 192.168.123.1 -d |
顯示debug 資訊 |
0x0c-5 –reason 顯示判斷埠狀態的依據
例子 | 含義 |
---|---|
sudo nmap 10.0.2.25 --reason |
在結果中顯示判斷埠狀態的依據 |
0x07-6 –open 掃描結果中只顯示開放的埠
例子 | 含義 |
---|---|
sudo nmap 10.0.2.25 --open |
只顯示開放的埠 |
0x07-7 –packet-trace 顯示 nmap 都發了或收了什麼包
例子 | 含義 |
---|---|
sudo nmap 10.0.2.25 --packet-trace |
顯示nmap 都發了和都收了什麼包 |
0x07-8 –script-trace 只顯示腳本都發了和都收了什麼包
例子 | 含義 |
---|---|
sudo nmap 10.0.2.25 --script-trace |
只顯示腳本都發了和都收了什麼包 |
0x07-9 –iflist 顯示系統中都有哪些網卡
例子 | 含義 |
---|---|
sudo nmap --iflist |
顯示系統中都有哪些網卡 |
0x0d -6 開啟 IPV6 掃描
例子 | 含義 |
---|---|
sudo nmap fe80::a00:27ff:fe6a:30e3 -6 |
開啟IPV6 掃描 |
0x0e NSE 腳本引擎(Nmap Scripting Engine)
0x0e-1 簡介
-
2006年發布4.21 ALPHA1版本時加入的
-
在第二屆Google summer code大會上創造的
-
由於具有
NSE
腳本引擎,所以nmap
成為了全功能的掃描工具套件 -
基於
lua
語言特殊標記的腳本框架,腳本由NSE
執行lua
是非常快速的解釋性語言,很多waf
上會使用lua
-
升級腳本文件:
nmap --script-updatedb
-
腳本文件保存在:
/usr/share/nmap/scripts
-
腳本的描述和使用方法://nmap.org/nsedoc/ 或者 在腳本中查看
description
部分 -
目前默認包含
600
多個腳本(14大類)類型 中文 Auth 身份認證 Broadcast 廣播 Brute 暴力 Default 默認 Discovery 發現類 Dos 拒絕服務 Exploit 漏洞利用 External 外部類(查詢第三方介面獲取資訊,比方說有的網站會公布這個IP是否已經中招了、遭泄露了等等) Fuzzer 模糊測試 Intrusive 入侵性探測 Malware 惡意軟體類 Safe 安全 Version 獲取版本資訊類 Vuln 漏洞類 一般在企業中建議使用
Default
,Safe
類型的腳本進行掃描,盡量避免使用Intrusive
、Dos
、Exploit
類型的腳本,盡量對自己家的伺服器溫柔一點
0x0e-2 腳本使用
例子 | 含義 |
---|---|
sudo nmap 192.168.123.1 --script=http-title |
使用http-title.nse 這個腳本 |
sudo nmap 10.0.2.25 -sC |
使用所有的Default 類腳本 |
sudo nmap 10.0.2.25 --script=default |
使用所有的Default 類腳本,與-sC 相同 |
sudo nmap 10.0.2.25 --script=vuln |
使用所有的Vuln 類腳本 |
sudo nmap 10.0.2.25 --script=dos,exploit,vuln |
使用所有的Dos 、Exploit 、Vuln 類腳本 |
sudo nmap 10.0.2.25 --script="not(dos or exploit or vuln)" |
使用除Dos 、Exploit 、Vuln 類外的所有腳本 |
sudo nmap 10.0.2.25 --script="whois-ip,banner,upnp-info" |
使用whois-ip.nse 、banner.nse 、upnp-info.nse 這三個腳本 |
sudo nmap 10.0.2.25 --script="http-*" |
使用所有的以http- 開頭的腳本 |
sudo nmap 10.0.2.25 --script="http-* and not(http-slowloris or http-brute or http-enum or http-form-fuzzer)" |
使用除http-slowloris.nse 、http-brute.nse 、http-enum.nse 、http-form-fuzzer.nse 外所有以http- 開頭的腳本 |
sudo nmap 10.0.2.25 --script=+vuln -p4343 |
使用所有的Vuln 類腳本掃描4343 埠;當服務不工作在非標準埠時,部分腳本就不工作了,使用+ 來強制Vuln 類所有腳本都要對4343 埠進行掃描 |
0x0e-3 腳本參數
例子 | 含義 |
---|---|
sudo nmap 192.168.123.1 --script=http-title --script-args=http.useragent="w00l00" |
使用http-title.nse 這個腳本,並設置其中的useragent 參數值為w00l00 |
例子 | 含義 |
---|---|
sudo nmap 192.168.123.1 --script=http-majordomo2-dir-traversal,http-axis2-dir-traversal --script-args=http-axis2-dir-traversal.uri=/axis2/,uri=/majordomo/ |
分別指定http-majordomo2-dir-traversal.nse 和http-axis2-dir-traversal.nse 兩個腳本中的uri 參數值 |
0x0e-4 使用實例
例子 | 含義 |
---|---|
sudo nmap 10.0.2.25 -sL --script=targets-sniffer -e eth0 |
targets-sniffer.nse 腳本的功能是做被動偵聽 |
sudo nmap 10.0.2.25 -p3306 -script=mysql-brute |
針對mysql 3306 埠做簡單的暴力破解密碼 |
sudo nmap 10.0.2.25 -p25 -script=smtp-brute |
針對smtp 25 埠做簡單的暴力破解密碼 |
sudo nmap 10.0.2.25 -p3306 -script=mysql-audit --script-args='mysql-audit.username="root"',mysql-audit.password="pass",mysql-audit.filename=/usr/share/nmap/nselib/data/mysql-cis.audit |
提供mysql 帳號root 密碼pass ,連接之後,按照/usr/share/nmap/nselib/data/mysql-cis.audit 文件內容做相應的審計,檢測是否存在漏洞 |
sudo nmap 10.0.2.25 -p445 -n --open --script=smb-vuln-ms17-010.nse |
檢測ms17-010 漏洞 |
0x0e-5 寫自己的腳本
使用Lua
的語法寫就行,注意要把TAB
鍵改成2個空格長度
先來看一個現成的smb-vuln-ms17-010.nse
----------------------------------------------------------- 頭部 -----------------------------------------------------------
----------------------------------------------------------- 頭部 -----------------------------------------------------------
----------------------------------------------------------- 頭部 -----------------------------------------------------------
-- 變數定義,應用模組
local nmap = require "nmap"
local smb = require "smb"
local vulns = require "vulns"
local stdnse = require "stdnse"
local string = require "string"
-- 描述,我這個腳本幹嘛用的;[[ ]] 是多行注釋
description = [[
Attempts to detect if a Microsoft SMBv1 server is vulnerable to a remote code
execution vulnerability (ms17-010, a.k.a. EternalBlue).
The vulnerability is actively exploited by WannaCry and Petya ransomware and other malware.
The script connects to the $IPC tree, executes a transaction on FID 0 and
checks if the error "STATUS_INSUFF_SERVER_RESOURCES" is returned to
determine if the target is not patched against ms17-010. Additionally it checks
for known error codes returned by patched systems.
Tested on Windows XP, 2003, 7, 8, 8.1, 10, 2008, 2012 and 2016.
References:
* //technet.microsoft.com/en-us/library/security/ms17-010.aspx
* //blogs.technet.microsoft.com/msrc/2017/05/12/customer-guidance-for-wannacrypt-attacks/
* //msdn.microsoft.com/en-us/library/ee441489.aspx
* //github.com/rapid7/metasploit-framework/blob/master/modules/auxiliary/scanner/smb/smb_ms17_010.rb
* //github.com/cldrn/nmap-nse-scripts/wiki/Notes-about-smb-vuln-ms17-010
]]
---
-- 告訴你這個腳本怎麼用,怎麼樣執行命令
-- @usage nmap -p445 --script smb-vuln-ms17-010 <target>
-- @usage nmap -p445 --script vuln <target>
--
-- @see smb-double-pulsar-backdoor.nse
--
-- @output
-- Host script results:
-- | smb-vuln-ms17-010:
-- | VULNERABLE:
-- | Remote Code Execution vulnerability in Microsoft SMBv1 servers (ms17-010)
-- | State: VULNERABLE
-- | IDs: CVE:CVE-2017-0143
-- | Risk factor: HIGH
-- | A critical remote code execution vulnerability exists in Microsoft SMBv1
-- | servers (ms17-010).
-- |
-- | Disclosure date: 2017-03-14
-- | References:
-- | //cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-0143
-- | //technet.microsoft.com/en-us/library/security/ms17-010.aspx
-- |_ //blogs.technet.microsoft.com/msrc/2017/05/12/customer-guidance-for-wannacrypt-attacks/
--
-- @xmloutput
-- <table key="CVE-2017-0143">
-- <elem key="title">Remote Code Execution vulnerability in Microsoft SMBv1 servers (ms17-010)</elem>
-- <elem key="state">VULNERABLE</elem>
-- <table key="ids">
-- <elem>CVE:CVE-2017-0143</elem>
-- </table>
-- <table key="description">
-- <elem>A critical remote code execution vulnerability exists in Microsoft SMBv1
 servers (ms17-010).
</elem>
-- </table>
-- <table key="dates">
-- <table key="disclosure">
-- <elem key="month">03</elem>
-- <elem key="year">2017</elem>
-- <elem key="day">14</elem>
-- </table>
-- </table>
-- <elem key="disclosure">2017-03-14</elem>
-- <table key="refs">
-- <elem>//technet.microsoft.com/en-us/library/security/ms17-010.aspx</elem>
-- <elem>//cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-0143</elem>
-- <elem>//blogs.technet.microsoft.com/msrc/2017/05/12/customer-guidance-for-wannacrypt-attacks/</elem>
-- </table>
-- </table>
--
-- @args smb-vuln-ms17-010.sharename Share name to connect. Default: IPC$
---
-- 作者是誰
author = "Paulino Calderon <paulino()calderonpale.com>"
-- 這個腳本遵循的許可
license = "Same as Nmap--See //nmap.org/book/man-legal.html"
-- 這個腳本屬於哪些類
categories = {"vuln", "safe"}
----------------------------------------------------------- 規則 -----------------------------------------------------------
----------------------------------------------------------- 規則 -----------------------------------------------------------
----------------------------------------------------------- 規則 -----------------------------------------------------------
[[
Rule:決定在什麼情況下運行後續的Action,滿足設置的條件才運行後續的Action
有Prerule、Postrule、Portrule、Hostrule
比如 Portrule 通常用於檢測服務匹配的特徵字元串
]]
hostrule = function(host)
return smb.get_port(host) ~= nil
end
local function check_ms17010(host, port, sharename)
local status, smbstate = smb.start_ex(host, true, true, "\\\\".. host.ip .. "\\" .. sharename, nil, nil, nil)
if not status then
stdnse.debug1("Could not connect to '%s'", sharename)
return false, string.format("Could not connect to '%s'", sharename)
else
local overrides = {}
local smb_header, smb_params, smb_cmd
stdnse.debug1("Connected to share '%s'", sharename)
overrides['parameters_length'] = 0x10
--SMB_COM_TRANSACTION opcode is 0x25
smb_header = smb.smb_encode_header(smbstate, 0x25, overrides)
smb_params = string.pack(">I2 I2 I2 I2 B B I2 I4 I2 I2 I2 I2 I2 B B I2 I2 I2 I2 I2 I2",
0x0, -- Total Parameter count (2 bytes)
0x0, -- Total Data count (2 bytes)
0xFFFF, -- Max Parameter count (2 bytes)
0xFFFF, -- Max Data count (2 bytes)
0x0, -- Max setup Count (1 byte)
0x0, -- Reserved (1 byte)
0x0, -- Flags (2 bytes)
0x0, -- Timeout (4 bytes)
0x0, -- Reserved (2 bytes)
0x0, -- ParameterCount (2 bytes)
0x4a00, -- ParameterOffset (2 bytes)
0x0, -- DataCount (2 bytes)
0x4a00, -- DataOffset (2 bytes)
0x02, -- SetupCount (1 byte)
0x0, -- Reserved (1 byte)
0x2300, -- PeekNamedPipe opcode
0x0, --
0x0700, -- BCC (Length of "\PIPE\")
0x5c50, -- \P
0x4950, -- IP
0x455c -- E\
)
stdnse.debug2("SMB: Sending SMB_COM_TRANSACTION")
local result, err = smb.smb_send(smbstate, smb_header, smb_params, '', overrides)
if(result == false) then
stdnse.debug1("There was an error in the SMB_COM_TRANSACTION request")
return false, err
end
local result, smb_header, _, _ = smb.smb_read(smbstate)
if not result then
stdnse.debug1("Error reading SMB response: %s", smb_header)
-- error can happen if an (H)IPS resets the connection
return false, smb_header
end
local _ , smb_cmd, err = string.unpack("<c4 B I4", smb_header)
if smb_cmd == 37 then -- SMB command for Trans is 0x25
stdnse.debug1("Valid SMB_COM_TRANSACTION response received")
--STATUS_INSUFF_SERVER_RESOURCES indicate that the machine is not patched
if err == 0xc0000205 then
stdnse.debug1("STATUS_INSUFF_SERVER_RESOURCES response received")
return true
elseif err == 0xc0000022 then
stdnse.debug1("STATUS_ACCESS_DENIED response received. This system is likely patched.")
return false, "This system is patched."
elseif err == 0xc0000008 then
stdnse.debug1("STATUS_INVALID_HANDLE response received. This system is likely patched.")
return false, "This system is patched."
end
stdnse.debug1("Error code received:%s", stdnse.tohex(err))
else
stdnse.debug1("Received invalid command id.")
return false, string.format("Unexpected SMB response:%s", stdnse.tohex(err))
end
end
end
----------------------------------------------------------- Action -----------------------------------------------------------
----------------------------------------------------------- Action -----------------------------------------------------------
----------------------------------------------------------- Action -----------------------------------------------------------
action = function(host,port)
local vuln_status, err
local vuln = {
title = "Remote Code Execution vulnerability in Microsoft SMBv1 servers (ms17-010)",
IDS = {CVE = 'CVE-2017-0143'},
risk_factor = "HIGH",
description = [[
A critical remote code execution vulnerability exists in Microsoft SMBv1
servers (ms17-010).
]],
references = {
'//technet.microsoft.com/en-us/library/security/ms17-010.aspx',
'//blogs.technet.microsoft.com/msrc/2017/05/12/customer-guidance-for-wannacrypt-attacks/'
},
dates = {
disclosure = {year = '2017', month = '03', day = '14'},
}
}
local sharename = stdnse.get_script_args(SCRIPT_NAME .. ".sharename") or "IPC$"
local report = vulns.Report:new(SCRIPT_NAME, host, port)
vuln.state = vulns.STATE.NOT_VULN
vuln_status, err = check_ms17010(host, port, sharename)
if vuln_status then
stdnse.debug1("This host is missing the patch for ms17-010!")
vuln.state = vulns.STATE.VULN
else
vuln.state = vulns.STATE.NOT_VULN
vuln.check_results = err
end
return report:make_output(vuln)
end
編寫自己的腳本,內容如下
----------------------------------------------------------- Header -----------------------------------------------------------
----------------------------------------------------------- Header -----------------------------------------------------------
----------------------------------------------------------- Header -----------------------------------------------------------
local http = require "http"
local nmap = require "nmap"
description = [[
檢查網站根目錄下是否有 "robots.txt" 這個文件
]]
author = "w00l00"
license = "Same as Nmap--See //nmap.org/book/man-legal.html"
categories = {"default", "discovery", "safe"}
----------------------------------------------------------- Rules -----------------------------------------------------------
----------------------------------------------------------- Rules -----------------------------------------------------------
----------------------------------------------------------- Rules -----------------------------------------------------------
-- 規則是 判斷埠是否開放,開放則返回True
portrule = function(host, port)
return port.state == "open"
end
----------------------------------------------------------- Action -----------------------------------------------------------
----------------------------------------------------------- Action -----------------------------------------------------------
----------------------------------------------------------- Action -----------------------------------------------------------
-- 如果規則函數返回的是True,做下面的Action
action = function(host, port)
-- 請求目標主機目標埠下的 robots.txt 文件
local robots = http.get(host, port, "/robots.txt")
-- 如果返回的http狀態碼是200則表明文件存在
if robots.status == 200 then
return "robots.txt status 200"
else
return "robots.txt status: " .. robots.status
end
end
執行自己編寫的腳本
0x0f -A 綜合參數,相當於 -O、-sV、-sC、traceroute 參數結合體
例子 | 含義 |
---|---|
sudo nmap 10.0.2.25 -A |
-A 綜合參數,相當於-O 、-sV 、-sC 、traceroute 參數結合體 |
- 對應的影片鏈接:點擊查看