nmap使用指南

W00L00發表於2022-03-26

0x00 簡介

nmap還用介紹嗎?搞安全的人還有不知道或者不會用nmap的嗎?據我觀察,能夠全面靈活運用nmap的人其實並不多見。其實nmap早已經不再是你眼中那個網路層的掃描器軟體了,早在十年前它就已經進化成為一個全功能的安全評估框架。今天,利用nmap強大的指令碼功能,你可以輕鬆開發出任何漏洞檢測和利用的功能,甚至完全不需要掌握那些常見的程式語言。本課我向你介紹了nmap幾乎全部引數功能,同時演示瞭如何自己開發一個指令碼的過程。

本文使用的nmap版本是7.92

image-20220325162247098

0x01 歷史程式

  • 誕生於1997年
    • 最早的版本只有2000行程式碼,沒有版本號
    • 只作為埠掃描工具
    • 6個月後成為黑客社群中網路掃描的事實標準
  • 2003年釋出3.45版本
    • Fyodor開始全職維護nmap
    • 增加了服務檢測、OS檢測、時間控制等功能
    • 進入成熟期
  • 2006年整合NSE
    • 從單一的網路掃描工具,轉變為可擴充套件的全功能漏洞評估引擎

0x02 預設掃描引數

  • 預設TCP syn掃描,利用TCP的三次握手機制,當傳送syn包後,如果目標主機的那個埠是開著的,就會返回syn+ack資料包,同時nmap接收到之後不再返回ack的確認包,不會建立完成的TCP連線,節約掃描發起者機器的資源
  • 預設掃描1000個常用埠,包括httphttpsftpsmtpssh等等

0x03 指定掃描IP

0x03-1 指定多個掃描IP

例子 含義
sudo nmap 10.0.2.1,2,25 掃描10.0.2.110.0.2.210.0.2.25這3個IP
sudo nmap 10.0.1,2.23,25 掃描10.0.1.2310.0.1.2510.0.2.2310.0.2.25這4個IP
sudo nmap 10.0,1.2,3.23,25 掃描10.0.2.2310.0.2.2510.0.3.2310.0.3.2510.1.2.2310.1.2.2510.1.3.2310.1.3.25這8個IP

image-20220325004733347

例子 含義
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

image-20220325005544670

例子 含義
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

image-20220325005758883

例子 含義
sudo nmap -iL ip.txt 掃描ip.txt這個檔案內容中所有的IP,注意IP得是一個一行的形式寫入檔案中

image-20220325010055774

0x03-2 指定掃描域名

例子 含義
sudo nmap www.baidu.com 掃描www.baidu,com這個域名對應的IP

image-20220324233643718

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.210.0.2.310.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

image-20220325010237185

例子 含義
sudo nmap 10.0.2.25/24 --excludefile exip.txt 掃描10.0.2.25/24這個網段中除exip.txt檔案內容中包含的IP外的所有IP

image-20220325010426850

0x04 反向域名查詢

0x04-1 -R 一定要做DNS反向域名查詢

例子 含義
sudo nmap 220.181.38.251 -R -sn 在掃描時一定要做DNS反向域名查詢,也就是查詢IP地址對應的域名,並且只做主機發現

image-20220325175418772

image-20220325175533234

0x04-2 -n 不做DNS反向域名查詢

例子 含義
sudo nmap 220.181.38.251 -n -sn 在掃描時不做DNS反向域名查詢,也就是不查詢IP地址對應的域名,並且只做主機發現

image-20220325175746724

image-20220325175858216

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,並且只做主機發現

image-20220325180430896

image-20220325180523385

0x05 -e <iface> 指定發包網路卡

例子 含義
sudo nmap 10.0.2.25 -e eth0 指定發掃描資料包的網路卡為eth0

image-20220325004329043

如果沒有指定發包網路卡,nmap就會使用本機序號為第一個的網路卡發掃描包

0x06 主機發現

做掃描的時候,先做主機發現,別一上來就對所有的IP傳送大量資料包進行埠掃描,不要做這種莽撞的行為,因為在掃描的時候經常會觸發安全機制的報警,所以做掃描的時候要越隱蔽越好,先做主機發現再做埠掃描,不僅節省自己的時間,還能避免被發現,何樂而不為呢?

0x06-1 -sn 使用ICMP,TCP ping掃描,只做主機發現

向目標系統的80443埠傳送ICMPTCP ping掃描,如果目標系統返回了ICMP響應包、SYN+ACK包、RST+ACK包,就認為這個IP是活著的

並且判斷完IP是否是活著的之後,就會結束,不會再傳送埠掃描資料包

例子 含義
sudo nmap -sn 192.168.123.2 掃描192.168.123.2是否是活著的

image-20220326231805062

image-20220325160918236

0x06-2 -Pn 跳過主機發現環節

跳過主機發現環節,直接將IP視為線上狀態,直接傳送大量的埠掃描資料包;不加此引數的情況是:若發現此IP不線上,則不進行埠掃描

因為會發出大量的掃描資料包,一點也不隱蔽,所以用此引數來進行主機發現是不可取的

例子 含義
sudo nmap -Pn 192.168.123.2 掃描192.168.123.2,不管此IP是否是活著的狀態

image-20220325161634733

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 包進行主機發現

image-20220325163818274

image-20220325164116669

0x06-5 -PA 傳送 TCP SYN 包

加入這個引數之後只會傳送TCP ACK資料包

例子 含義
sudo nmap 192.168.123.1 -PA -sn -n 只傳送TCP ACK 包進行主機發現,並且跳過DNS反向域名解析環節

image-20220325164456252

image-20220325164346257

0x06-6 -PU 傳送 UDP 包

加入這個引數之後只會傳送UDP 資料包

例子 含義
sudo nmap 192.168.123.1 -PU -sn -n 只傳送UDP 包進行主機發現,並且跳過DNS反向域名解析環節

image-20220325165255590

image-20220325165216711

0x06-7 -PY 傳送 SCTP 包

加入這個引數之後只會傳送SCTP 資料包

例子 含義
sudo nmap 192.168.123.1 -PY -sn -n 只傳送SCTP 包進行主機發現,並且跳過DNS反向域名解析環節

image-20220325170549306

image-20220325170706245

0x06-8 -PE 傳送 ICMP 包

加入這個引數之後只會傳送ICMP 資料包,跟使用ping命令是完全一回事

例子 含義
sudo nmap 192.168.123.1 -PE -sn -n 只傳送ICMP 包進行主機發現,並且跳過DNS反向域名解析環節

image-20220325172513655

image-20220325171616497

0x06-9 -PP 請求目標系統時間戳

請求目標系統時間戳,如果返回的話則說明這個IP是活著的

例子 含義
sudo nmap 192.168.123.1 -PP -sn -n 請求目標系統時間戳,如果返回的話則說明這個IP是活著的,並且跳過DNS反向域名解析環節

image-20220325172358857

image-20220325172318373

抓包結果顯示傳送了兩次 ICMP 資料包請求目標系統時間戳都沒有得到回覆,但其實這個IP是活著的

注意:每個引數的使用場景不一樣,沒有哪個引數可以全場景覆蓋,要針對當前掃描的環境使用相對應的掃描引數

0x06-10 -PM 請求目標系統子網掩碼

請求目標子網掩碼,如果返回的話則說明這個IP是活著的

例子 含義
sudo nmap 192.168.123.1 -PM -sn -n 請求目標系統子網掩碼,如果返回的話則說明這個IP是活著的,並且跳過DNS反向域名解析環節

image-20220325173245931

image-20220325173340517

抓包結果顯示傳送了兩次 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反向域名解析環節

image-20220325174506504

image-20220325174726816

0x07 埠掃描

0x07-1 --top-ports <number> 掃描最常用的埠

例子 含義
sudo nmap 10.0.2.25 --top-ports 100 掃描前100個最常用的埠

image-20220325003844196

0x07-2 指定掃描埠

例子 含義
sudo nmap 10.0.2.25 -p22,80,443,5000 掃描10.0.2.2522804435000
sudo nmap 10.0.2.25 -p1-100 掃描10.0.2.251-100
sudo nmap 10.0.2.25 -p- 掃描10.0.2.25的全部埠,也就是1-65535

image-20220325011539720

0x07-3 -sS 發 TCP SYN 包掃描

例子 含義
sudo nmap 192.168.123.1 -sS TCPSYN資料包進行掃描

image-20220325214137025

image-20220325213922402

0x07-4 -sA 發 TCP ACK 包掃描

例子 含義
sudo nmap 192.168.123.1 -sA TCPACK資料包進行掃描

image-20220325215110697

image-20220325215223870

0x07-5 -sT 三次握手建立完整的 TCP 連線

有些特殊的應用可能會拒絕SYN掃描,拒絕半開的連線,所以這時候必須要通過三次握手建立完成的TCP連線才能發現埠是否是開放的

例子 含義
sudo nmap 192.168.123.1 -sT 通過三次握手建立完整的TCP連線,來判斷埠是否開放

image-20220325214414172

image-20220325214607733

0x07-6 -sN 傳送的 TCP 包 flag 位為空

目標主機收到包之後丟棄掉,即不做響應代表這個埠是開放的,如果返回RST資料包則表示這個埠是開放的;當然這和目標主機的安全配置有關,只是一般情況下是這樣的

所以使用此引數進行埠掃描時要先確保目標IP是活著的

例子 含義
sudo nmap 192.168.123.1 -sN 傳送的TCPflag位全設定為0,進行埠掃描

image-20220325221857670

image-20220325222314871

0x07-7 -sF 傳送的 TCP 包 flag 位的 Fin 設定為1

目標主機收到包之後丟棄掉,即不做響應代表這個埠是開放的,如果返回RST資料包則表示這個埠是開放的;當然這和目標主機的安全配置有關,只是一般情況下是這樣的

所以使用此引數進行埠掃描時要先確保目標IP是活著的

例子 含義
sudo nmap 192.168.123.1 -sF 傳送的TCP資料包flagFin設定為1

image-20220325222400871

image-20220325222841696

0x07-8 -sX 傳送的 TCP 包 flag 位的 Urgent、Push、Fin 設定為1

目標主機收到包之後丟棄掉,即不做響應代表這個埠是開放的,如果返回RST資料包則表示這個埠是開放的;當然這和目標主機的安全配置有關,只是一般情況下是這樣的

所以使用此引數進行埠掃描時要先確保目標IP是活著的

例子 含義
sudo nmap 192.168.123.1 -sX 傳送的TCP資料包flagUrgentPushFin設定為1

image-20220325222941303

image-20220325223212540

0x07-9 --scanflags <flags> 自定義 TCP Flags設定

例子 含義
sudo nmap 192.168.123.1 --scanflags syn,ack,fin 自定義傳送的TCP資料包flagsynackFin設定為1

image-20220325224957370

image-20220325225147970

0x07-10 重頭戲:-sI <zombie host[:probeport]> 殭屍掃描

引數:-sI <zombie host[:probeport]> 殭屍掃描

是非常非常隱蔽的掃描方式

原理

  1. 首先需要在被掃描的網路中找一臺符合下面兩個要求的計算機

    • 非常非常空閒的計算機,空閒到沒有和別的任何計算機進行通訊(在一個大型的網路中這種空閒的機器還是比較好找的)

    • 這臺計算機的IPID必須是遞增的,且增長方式是有規律的,比方說每次遞增1IPID即是IP頭部的ID欄位)

    很多的計算機的IPID都是遞增的,比方說一天中的第一個資料包的IPID是隨即的,下一個資料包的IPID則會在前一個的IPID上加1或加2或者加一些有規律的數值

  2. nmap先探測殭屍機當前的IPID是多少,並記錄下來

  3. 然後nmap將自己的IP地址偽裝成殭屍機的IP地址,向要目標主機的埠傳送SYN

  4. 目標主機埠接收到SYN包之後

    1. 如果目標埠是開放的則會向殭屍機傳送SYN+ACK,但是殭屍機從頭到尾都沒有傳送過SYN包,憑空接收到了目標主機的向它傳送SYN+ACK,殭屍機就會返回RST資料包,此時殭屍機的IPID遞增1

      image-20220325234241313

    2. 如果目標埠是關閉的則會向殭屍機傳送RST包,殭屍機莫名其妙的接收到這個RST包之後會將這個包丟棄掉,此時殭屍機的IPID不變化

      image-20220326003549102

  5. 這時候nmap再次向殭屍機傳送資料包,探測殭屍機當前的IPID,如果數值為之前探測的基礎上+2,則表明目標主機的目標埠是開放的;如果數值為之前探測的基礎上+1,則表明目標主機的目標埠是關閉的

  6. 在整個過程中掃描者是完全隱蔽的,安全性很高。但是反向做路由追蹤還是有可能發現的,不過難度特別大。

例子

  • 殭屍機IP10.0.2.11
  • 目標IP10.0.2.25

實施殭屍掃描

執行命令:sudo nmap 10.0.2.25 -sI 10.0.2.11 -Pn

image-20220326014920327

注:利用此命令可以單獨探測殭屍機的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

image-20220325221720774

image-20220325220157336

0x07-12 預設配置下埠掃描在做什麼

如果目標主機和kali不在同一網段中

執行命令:sudo nmap 192.168.123.1,2 -p80,5000

一圖勝千言

image-20220325153132549

如果目標主機和kali在同一網段中

執行命令:sudo nmap 10.0.2.2,25 -p22,5000

一圖勝千言

image-20220325015657489

0x08 -sV 掃描服務版本

結合多種方式,包括banner,指紋等技術,判斷目標埠上執行的到底是什麼服務,準確率很高的

例子 含義
sudo nmap 10.0.2.25 -p22,5000 -sV 探測225000埠執行的是什麼服務

image-20220326162508601

例子 含義
sudo nmap 192.168.123.1 -p53 -sU -sV 探測UDP 53埠執行的是什麼服務

image-20220326162715813

0x09 -O 掃描系統版本

很多情況下沒有辦法100%判斷出系統的具體版本,就會給出所有可能的結果

例子 含義
sudo nmap 10.0.2.25 -O 探測系統版本

image-20220326162252716

0x0a 掃描速度控制

0x0a-1 -T<0-5> 設定掃描速度等級

0最慢,5最快,不過最快速度可能會更容易被發現

例子 含義
sudo nmap 10.0.2.25 -T3 限定掃描速度為等級3

image-20220326163057579

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 偽造源IP10.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

image-20220326173941948

image-20220326173911912

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

image-20220326174433376

image-20220326174552510

0x0b-8 --ip-options <options> 指定IP OPTION資料(暫時不知道咋用)

0x0b-9 --ttl <val> 指定傳送掃描包的TTL值

例子 含義
sudo nmap 192.168.123.1 --ttl 25 指定傳送掃描包的TTL值為25

image-20220326180342686

image-20220326180303129

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

image-20220326181220475

image-20220326181041082

0x0b-11 --badsum 使用錯誤的checksum

IP包頭中的checksum校驗值故意寫錯,看看目標的安全檢測機制會不會放棄這樣的包,從而繞過安全機制

例子 含義
sudo nmap 192.168.123.1 --badsum 故意使用錯誤的checksu

0x0c 輸出格式

0x0c-1 -oA <basename> 將掃描結果儲存為三種根式日誌

三種主要的根式日誌,分別是xmlnmapgnmap

例子 含義
sudo nmap 192.168.123.1 -oA a 將掃描結果儲存為三種主要的根式日誌,檔名為a

image-20220326181822411

a.nmap格式的內容就是螢幕輸出的內容

image-20220326182027203

a.gnmap格式的內容是為了方便用grep命令篩選結果的

image-20220326182201250

比方說掃描了大量的IP後,現在想要提取所有開放80埠的IP地址

可以這樣執行命令:cat a.gnmap | grep 80

image-20220326182434935

a.xml格式就是xml格式嘍

0x0c-2 -oX <file> 將掃描結果儲存為XML格式檔案

三種主要的根式日誌,分別是xmlnmapgnmap

例子 含義
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 在結果中顯示判斷埠狀態的依據

image-20220325004139695

0x07-6 --open 掃描結果中只顯示開放的埠

例子 含義
sudo nmap 10.0.2.25 --open 只顯示開放的埠

image-20220325003945068

0x07-7 --packet-trace 顯示 nmap 都發了或收了什麼包

例子 含義
sudo nmap 10.0.2.25 --packet-trace 顯示nmap都發了和都收了什麼包

image-20220326183241345

0x07-8 --script-trace 只顯示指令碼都發了和都收了什麼包

例子 含義
sudo nmap 10.0.2.25 --script-trace 只顯示指令碼都發了和都收了什麼包

0x07-9 --iflist 顯示系統中都有哪些網路卡

例子 含義
sudo nmap --iflist 顯示系統中都有哪些網路卡

image-20220326183713489

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 漏洞類

    一般在企業中建議使用DefaultSafe型別的指令碼進行掃描,儘量避免使用IntrusiveDosExploit型別的指令碼,儘量對自己家的伺服器溫柔一點

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 使用所有的DosExploitVuln類指令碼
sudo nmap 10.0.2.25 --script="not(dos or exploit or vuln)" 使用除DosExploitVuln類外的所有指令碼
sudo nmap 10.0.2.25 --script="whois-ip,banner,upnp-info" 使用whois-ip.nsebanner.nseupnp-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.nsehttp-brute.nsehttp-enum.nsehttp-form-fuzzer.nse外所有以http-開頭的指令碼
sudo nmap 10.0.2.25 --script=+vuln -p4343 使用所有的Vuln類指令碼掃描4343埠;當服務不工作在非標準埠時,部分指令碼就不工作了,使用+來強制Vuln類所有指令碼都要對4343埠進行掃描

image-20220326193441371

0x0e-3 指令碼引數

例子 含義
sudo nmap 192.168.123.1 --script=http-title --script-args=http.useragent="w00l00" 使用http-title.nse這個指令碼,並設定其中的useragent引數值為w00l00

image-20220326205943657

image-20220326210129956

例子 含義
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.nsehttp-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漏洞

image-20220326212312350

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&#xa; servers (ms17-010).&#xa;</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

執行自己編寫的指令碼

image-20220326221752300

0x0f -A 綜合引數,相當於 -O、-sV、-sC、traceroute 引數結合體

例子 含義
sudo nmap 10.0.2.25 -A -A綜合引數,相當於-O-sV-sCtraceroute 引數結合體