前言
nmap是业内非常知名的网络扫描工具,和netcat齐名为网络瑞士军刀,想必大部分人都看过或者听说过《黑客帝国》,里面的有几个场景使用的是nmap,不妨引用一张电影剧照:

女主通过nmap扫描开放端口,并通过弱口令拿到主机权限,这不能说明nmap多么强大,因为nmap强大之处不仅仅是扫描端口,只能说明密码复杂度多么重要!nmap常用于漏洞扫描、端口扫描、网络发现等。篇幅有限,本文将从以下五大部分介绍nmap常用用法:
主机发现网络探测指纹识别与探测防火墙/IDS逃逸信息收集暴力穷举
过程中会尽量抓包还原真实场景,用的极少的参数将尽可能忽略不讲,亦可称之为鸡肋,相信熟悉常用参数和用法后,其他鲜为人知的参数到真正需要用到的场景下再翻看man文档也不迟。
一、主机发现
涉及到的参数列表,有些参数不常用,需要时可对照参考:
选项
含义
-sP
Ping扫描
-P0
无Ping扫描
-PS
TCP SYN Ping扫描
-PU
udp Ping扫描
-PE;-PP;-PM
ICMP Ping Types扫描
-PR
ARP Ping扫描
-n
禁止DNS反向解析
-R
反向解析域名
–system-dns
使用系统域名解析器
-sL
列表扫描
-6
扫描IPv6地址
–traceroute
路由跟踪
-PY
SCTP INIT Ping扫描
-PA
TCP ACK Ping扫描
最简单的扫描,什么参数都不加,默认发SYN探测:
代码语言:txt复制
$ nmap 192.168.1.1Starting Nmap 7.91 ( https://nmap.org ) at 2021-12-25 14:29 CSTNmap scan report for openwrt.linux-code.com (192.168.1.1)Host is up (0.00026s latency).Not shown: 989 closed portsPORT STATE SERVICE21/tcp open ftp22/tcp open ssh53/tcp open domain80/tcp open http81/tcp open hosts2-ns139/tcp open netbios-ssn443/tcp open https444/tcp open snpp445/tcp open microsoft-ds1234/tcp open hotline5000/tcp open upnpMAC Address: 00:0C:29:BE:5A:26 (VMware)Nmap done: 1 IP address (1 host up) scanned in 39.51 seconds$
可以看到列出了192.168.1.1这个IP的开放端口和对应服务信息
常用指令:
代码语言:txt复制
nmap -sP -n 192.168.1.0/24 #列出当前网段下所有存活主机,发送ICMP探测,-n 禁止DNS反向解析,节省扫描时间nmap -PS -n 172.16.0.0/16 #列出当前网段下所有存活主机,发送SYN Ping探测nmap -PR -n 192.168.1.1 #使用ARP Ping扫描nmap --system-dns 119.29.29.29 blog.linux-code.com #指定DNS地址,将域名解析成IP后再进行端口探测,不常用nmap --traceroute -v blog.linux-code.com #路由跟踪,会列出每一跳的端口开放情况,不常用
反向DNS解析:
代码语言:txt复制
$ nmap -R -sL 192.168.1.0/24 |& grep '(' Starting Nmap 7.91 ( https://nmap.org ) at 2021-12-25 14:33 CSTNmap scan report for openwrt.linux-code.com (192.168.1.1)Nmap scan report for esxi.linux-code.com (192.168.1.10)Nmap scan report for qqdb.linux-code.com (192.168.1.84)Nmap scan report for pan.linux-code.com (192.168.1.95)Nmap scan report for nas.linux-code.com (192.168.1.128)Nmap scan report for node1 (192.168.1.197)Nmap done: 256 IP addresses (0 hosts up) scanned in 0.10 seconds$
二、网络探测,细致化扫描
包含的参数如下:
选项
含义
-T
时序选项,范围T0-T5
-p|-F
常用扫描方式
-sS
TCP SYN半开扫描
-sT
TCP连接扫描
-sU
UDP扫描
-sN;-sF;-sX
隐蔽扫描
-sA
TCP ACK扫描
-sW
TCP窗口扫描
-sM
TCP Maimon扫描
–scanflags
自定义TCP扫描
-sI(大写字母i)
空闲扫描
-sO
IP协议扫描
-b
FTP Bounce扫描
常用命令:
1.按时序扫描(-T0~-T5)代码语言:txt复制
$ nmap -T4 192.168.1.1
-T为时序扫描,分为-T0~-T5六个等级,数字越大速度越快越不精准,慢扫描多用于IDS逃逸,常用-T4;配合-F使用可提高扫描速度及效果,-F会尽量少的扫描端口,不会把默认端口全扫一遍
2.指定端口或端口范围:(-p)代码语言:txt复制
$ nmap -p 80 blog.linux-code.com #只扫描80端口$ nmap -p 80,443 -n 192.168.1.1 #80,443,-n不做DNS反解$ nmap -p 445-1023 192.168.1.1 #445-1023$ nmap -p 80,443,445-1000 -n 192.168.1.1 #字面意思
如果既想扫TCP又想扫UDP,可以在端口前加”T:”或”U:”,代表TCP和UDP,必须指定-sU(UDP扫描类型)且需要指定一个TCP扫描类型(如-sS、-sF、-sT等)
代码语言:txt复制
$ nmap -sU -p U:53,T:80,22 -sT -n 192.168.1.1Starting Nmap 7.91 ( https://nmap.org ) at 2021-12-25 14:37 CSTNmap scan report for 192.168.1.1Host is up (0.00037s latency).PORT STATE SERVICE22/tcp open ssh80/tcp open http53/udp open|filtered domainMAC Address: 00:0C:29:BE:5A:26 (VMware)Nmap done: 1 IP address (1 host up) scanned in 0.53 seconds$
3.nmap的6种端口状态Open开放状态Closed关闭状态;当然不一定是真的关闭,不排除对方系统做了一定的安全防护从而忽略nmap的探测报文Filtered被过滤;对方主机可能存在防火墙设备将nmap包阻隔,也可能是网络拥塞造成的,如遇到此状态建议在不同时间段再次扫描Unfiltered未被过滤;证明端口可以访问,但无法判断是Open还是Closed,当使用ACK扫描才会呈现该状态,这时建议换一种扫描方式Open|Filtered不确定态;可能受到专业设备的阻挡,nmap发出去的报文没有得到响应,可更换扫描方式再次尝试Closed|Filtered不确定是关闭还是被过滤,只出现在IPID Idle扫描中,不常用4.SYN半开扫描(-sS)
此选项常用,不会和对方主机进行三次握手,只发送SYN报文,之后断开连接,很难被防火墙或管理员检测到;结合前面所述,如果端口处于不确定态,可使用该选项进行扫描。
代码语言:txt复制
$ nmap -sS -p 22,80 -n 192.168.1.1Starting Nmap 7.91 ( https://nmap.org ) at 2021-12-25 14:39 CSTNmap scan report for 192.168.1.1Host is up (0.00030s latency).PORT STATE SERVICE22/tcp open ssh80/tcp open httpMAC Address: 00:0C:29:BE:5A:26 (VMware)Nmap done: 1 IP address (1 host up) scanned in 0.34 seconds$

每次发完SYN后,不接受第二次握手直接RST掉对端主机的SYN包,因为从对方发送第二次握手包时nmap就已经能判断端口是否有开放。
5.TCP连接扫描(-sT)
顾名思义,建立在三次握手的基础上;当SYN半开扫描不能用的时候才考虑用它,同时也是端口扫描中最基础、最稳定的扫描方式。
代码语言:txt复制
$ nmap -sT -p 22,80 -n 192.168.1.1 Starting Nmap 7.91 ( https://nmap.org ) at 2021-12-25 14:43 CSTNmap scan report for 192.168.1.1Host is up (0.00028s latency).PORT STATE SERVICE22/tcp open ssh80/tcp open httpMAC Address: 00:0C:29:BE:5A:26 (VMware)Nmap done: 1 IP address (1 host up) scanned in 0.26 seconds$

完成建联后紧接着断开连接。
6.UDP扫描(-sU)
使用UDP报文探测,扫描速度较慢,通过ICMP不可达判断端口开放情况;以下通过-p指定端口大大缩短扫描耗时:
代码语言:txt复制
$ nmap -sU -p 53,80 -n 192.168.1.1 Starting Nmap 7.91 ( https://nmap.org ) at 2021-12-25 14:45 CSTNmap scan report for 192.168.1.1Host is up (0.00028s latency).PORT STATE SERVICE53/udp open|filtered domain80/udp closed httpMAC Address: 00:0C:29:BE:5A:26 (VMware)Nmap done: 1 IP address (1 host up) scanned in 1.52 secondss$

7.隐蔽扫描(-sN;-sF;-sX)
-sN为NULL扫描,通过发送非常规TCP通信数据对计算机进行探测,若目标主机相应端口是关闭的,会响应一个RST数据表,若端口开放则不会响应任何信息。
代码语言:txt复制
$ nmap -sN -p 22,80 -n 192.168.1.1 Starting Nmap 7.91 ( https://nmap.org ) at 2021-12-25 14:49 CSTNmap scan report for 192.168.1.1Host is up (0.00026s latency).PORT STATE SERVICE22/tcp open|filtered ssh80/tcp open|filtered httpMAC Address: 00:0C:29:BE:5A:26 (VMware)Nmap done: 1 IP address (1 host up) scanned in 1.52 seconds$

-sF为FIN扫描,不需要完成TCP握手,只向目标端口发送一个FIN包,如果收到目标响应的RST包,则说明端口开放,否则视为关闭或者被拦截的(不确定态),因为目标主机对于此类无意义请求可以选择RST也可以选择不响应。
代码语言:txt复制
$ nmap -sF -p 22,80 -n 192.168.1.1 Starting Nmap 7.91 ( https://nmap.org ) at 2021-12-25 14:52 CSTNmap scan report for 192.168.1.1Host is up (0.00024s latency).PORT STATE SERVICE22/tcp open|filtered ssh80/tcp open|filtered httpMAC Address: 00:0C:29:BE:5A:26 (VMware)Nmap done: 1 IP address (1 host up) scanned in 1.59 seconds$

-sX为Xmas扫描,数据包的FIN、PSH和URG标志位置打开,即标志为1,如果目标主机端口开放则会响应一个RST包,否则判断位不确定态。
代码语言:txt复制
$ nmap -sX -p 22,80 -n 192.168.1.1Starting Nmap 7.91 ( https://nmap.org ) at 2021-12-25 14:57 CSTNmap scan report for 192.168.1.1Host is up (0.00030s latency).PORT STATE SERVICE22/tcp open|filtered ssh80/tcp open|filtered httpMAC Address: 00:0C:29:BE:5A:26 (VMware)Nmap done: 1 IP address (1 host up) scanned in 1.54 seconds$
