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 http://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
-
指令碼的描述和使用方法:https://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:
* https://technet.microsoft.com/en-us/library/security/ms17-010.aspx
* https://blogs.technet.microsoft.com/msrc/2017/05/12/customer-guidance-for-wannacrypt-attacks/
* https://msdn.microsoft.com/en-us/library/ee441489.aspx
* https://github.com/rapid7/metasploit-framework/blob/master/modules/auxiliary/scanner/smb/smb_ms17_010.rb
* https://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:
-- | https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-0143
-- | https://technet.microsoft.com/en-us/library/security/ms17-010.aspx
-- |_ https://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>https://technet.microsoft.com/en-us/library/security/ms17-010.aspx</elem>
-- <elem>https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-0143</elem>
-- <elem>https://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 https://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 = {
'https://technet.microsoft.com/en-us/library/security/ms17-010.aspx',
'https://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 https://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 引數結合體 |
- 對應的視訊連結:點選檢視