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

0x01 歷史行程
- 誕生于1997年
- 最早的版本只有2000行代碼,沒有版本號
- 只作為埠掃描工具
- 6個月后成為黑客社區中網路掃描的事實標準
- 2003年發布3.45版本
- Fyodor開始全職維護nmap
- 增加了服務檢測、OS檢測、時間控制等功能
- 進入成熟期
- 2006年集成NSE
- 從單一的網路掃描工具,轉變為可擴展的全功能漏洞評估引擎
0x02 默認掃描引數
- 默認
TCPsyn掃描,利用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 引數結合體 |
- 對應的視頻鏈接:點擊查看
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/449779.html
標籤:其他
