Nmap(Network Mapper)是一款免费的开源网络扫描器,向目标主机发送特定的数据包,根据返回的流量特征,分析主机信息。主要功能有:「端口扫描」、「主机探测」、「服务识别」和「系统识别」。
Nmap使用教程
- 1、端口扫描
- 1.1、 指定端口
- 1.2、 指定扫描方式
- 1.2.1、 TCP全连接扫描
- 1.2.2、 SYN半链接扫描
- 1.2.3、 隐秘扫描
- 1.2.4、 扫描UDP端口
- 2、主机发现
- 2.1、指定主机
- 2.2、Wireshark抓包分析主机发现原理
- 2.2.1、局域网外
- 2.2.2、局域网内
- 3、服务识别
- 4、系统识别
- 5、扫描结果导出
- 6、NES脚本
kali 自带 nmap ,「终端」输入 nmap 可以看到 nmap 的版本,证明 nmap 可用。
参数:
-p
指定端口(端口探测)-sT
指定扫描方式为 TCP全连接-sS
指定扫描方式为 SYN半连接-sF
指定扫描方式为 Fin扫描-sN
指定扫描方式为 Null扫描-sX
指定扫描方式为 Xmas扫描-sU
扫描UDP端口-sP
指定网段(主机探测)-sn
指定网段(主机探测)-sV
识别服务指纹-o
识别操作系统-oN
导出结果为txt- -
oX
导出结果为xml --script
指定脚本--script-args
指定脚本参数
1、端口扫描
扫描主机的「开放端口」,在nmap后面直接跟主机IP(默认扫描1000个常用端口)
nmap 192.168.31.180
从上图可以看到:它用1.58秒扫描了1000个端口,其中991个端口关闭,9个端口开放,并列出了开放端口对应的服务。
STATE栏显示「端口状态」:
- open:开放
- closed:关闭
- filterd:被过滤,未收到返回报文
- unfilterd:未被过滤,收到返回报文,但无法确认是否开放
- opend/unfilterd:开放或未被过滤
- closed/unfilterd:关闭或未被过滤
1.1、 指定端口
扫描「指定端口」,使用 -p
参数,可以一次扫描单个端口、多个端口、或扫描一个范围的端口
nmap 192.168.31.180 -p 80 # 单个端口
nmap 192.168.31.180 -p 1-80 # 多个端口
nmap 192.168.31.180 -p 80,3389,22,21 # 多个端口
nmap 192.168.31.180 -p 1-65535 # 全端口
nmap 192.168.31.180 -F # 扫描常见的100个端口
nmap 192.168.31.180 -p- # 全端口(-p- 等价于 -p 1-65535)
nmap 192.168.31.180 -p ssh # 扫描指定协议,非默认端口也能识别出来
nmap 192.168.31.180 -p s* # 扫描s开头的协议
nmap 192.168.31.180 -p $(tr "\n" "," < ports.txt) # 读取文本中的端口
实际渗透时,扫描全端口可能会对服务器造成压力,尽量扫描指定端口。
1.2、 指定扫描方式
- 「root身份」运行Nmap,默认使用SYN扫描。
- 「非root身份」运行Nmap,默认使用TCP全连接扫描。
我们通过kali中的「wireshark」抓包分析不同扫描方式的请求信息,从而判断这些方式的区别。
点开kali的左上角,输入 wireshark 单击打开,选择抓包的网卡(我这里是 eth0 )。
输入过滤条件ip.addr == 192.168.31.180 and tcp.port == 80
后,点击箭头应用。
这个过滤条件的意思是:过滤IP地址是 192.168.31.180 并且 端口是 TCP的80端口。
设置完过滤条件后,我们在命令行执行扫描命令,然后查看「wireshark」中的请求包。
1.2.1、 TCP全连接扫描
使用 -sT
参数对目标主机的80端口进行TCP全连接扫描。
「全连接扫描」使用完整的三次握手建立连接,能够建立连接就判定端口开放,否则判定端口关闭。
nmap 192.168.31.180 -p 80 -sT
1)如果端口开放,就会进行完整的三次握手,成功建立链接,扫描结果中,STATE字段显示为 open 。
2)如果端口关闭,就只能进行一次握手,无法建立连接,扫描结果中,STATE字段显示为 closed。
1.2.2、 SYN半链接扫描
使用 -sS
参数进行SYN半连接扫描,「半链接扫描」只进行两次握手,根据对方的返回信息判断端口状态。
- 返回确认帧
SYN + ACK
就表示端口开放。 - 返回Reset
RST + ACK
就表示端口关闭。 - 无响应就重新发送SYN,持续不响应,就表示被防火墙屏蔽了。
nmap 192.168.31.180 -p 80 -sS
1)如果端口开放,就会进行两次握手,扫描结果中,STATE字段为 open 。
2)如果端口关闭,就只有一次握手,扫描结果中,STATE字段为 closed。
1.2.3、 隐秘扫描
隐秘扫描,只适用于Linux系统。
「隐秘扫描」向目标主机的端口发送TCP FIN包 或 Xmas tree包 或 Null包,如果收到RST响应包,就判定端口关闭,否则就判定端口开放或被屏蔽(open/filtered)
nmap 127.0.0.1 -p 80 -sF # Fin扫描
nmap 127.0.0.1 -p 80 -sN # Null扫描(所有flags都为0的TCP包)
nmap 127.0.0.1 -p 80 -sX # Xmas扫描(flags的FIN、URG、PUSH都为1的包)
1.2.4、 扫描UDP端口
nmap默认发送TCP报文探测端口,也就是只能扫描TCP端口。
使用 -sU
参数扫描UDP端口,根据对方返回的信息,判断端口状态。
- 应用返回信息,表示端口开放。
- ICMP返回端口不可达,表示端口关闭。
- 无回应,表示端口被过滤。
1)如果端口开放,对应端口的应用就会返回报文,扫描结果中,STATE字段显示open。
2)如果端口关闭,ICMP就会返回不可达报文,扫描结果中STATE字段显示closed。
由于UDP是无状态协议,没有ACK或REST这种确认信息,只能等端口对应的服务响应信息,所以需要等待较长的时间,扫描速度比TCP慢很多,建议每次只扫描一个UDP端口。
2、主机发现
扫描网段中有哪些主机在线,使用 -sP
或 -sn
参数,不扫描端口,只扫描「存活主机」。
nmap -sP 192.168.31.0/24
从上图可以看到:它用2秒扫描了这个网段的256个IP,其中有3个存活主机。
2.1、指定主机
使用-sP
参数,扫描指定主机,可以扫描单个IP、多个IP、IP段。
nmap -sP 192.168.153.242 # 单个IP
nmap -sP 192.168.153.242 192.168.153.243 192.168.153.244 # 多个IP
nmap -sP 192.168.153.0/24 # IP段
nmap -sP -iL iplist.txt # 指定文件中的IP
2.2、Wireshark抓包分析主机发现原理
Nmap依次发送「四种不同的报文」,只要收到「其中一个」包的回复,就判断主机存活。
- ICMP Echo request
- TCP SYN 到443端口
- TCP ACK 到80端口
- ICMP Timestamp request
发送四个不同的包,是为了防止防火墙「丢包」。
如果是局域网的主机,则发送「ARP广播」,收到返回的ARP单播,就判断主机存活。
2.2.1、局域网外
1)ping www.baidu.com
,获取百度IP。
2)打开wireshark,开始抓包。
3)执行nmap -sP 百度IP
,探测主机是否存活。
从抓包结果可以看到,Nmap向目标主机依次发送了四个不同类型的包,百度给我们回复了三个。因此,Nmap判断目标主机存活,在终端打印 Host ip up。
2.2.2、局域网内
1)打开wireshark,开始抓包。
2)执行 nmap -sP 局域网IP
,探测主机是否存活。
从抓包结果可以发现,nmap广播了目标主机的ARP请求,收到ARP响应后,判断目标主机存活,在终端上输出 Host is up。ARP响应中携带了目标主机的MAC地址,这里也额外打印出来了。
3、服务识别
Nmap根据服务对应的「默认端口」进行匹配,比如mysql默认使用3306,扫描到3306端口时,就在后面标注服务是mysql,如果目标服务器把服务的默认端口改了,Nmap就测不准了。
扫描端口时,默认显示端口对应的服务,但不显示服务版本。
想要识别具体的「服务版本」,可以使用 -sV
参数。
nmap 192.168.31.180 -p 80 -sV
扫描结果中,VERSION字段显示服务的详细版本。
4、系统识别
想要识别「操作系统版本」,可以使用 -O
参数。
nmap 192.168.31.180 -p 80 -O
提示:
- Nmap扫描出的系统版本并完全准确,仅供参考。
- 当识别不出具体版本时,Nmap会以概率的形式列举出可能的操作系统,如上图所示。
5、扫描结果导出
Nmap的扫描结果可以保存到文件中,比如文本格式、XML格式。
1)将扫描结果导出为「文本格式」,结果原样保存。
nmap 192.168.31.180 -p 80 -oN result.txt
2)将扫描结果导出为「xml格式」,结果的保存格式会发生变化。
nmap 192.168.31.180 -p 80 -oX result.xml
6、NES脚本
NES(Nmap Script Engine)Nmap脚本引擎,内置了几百个 lua 编写的「扫描脚本」,脚本存放在 /usr/share/nmap/scripts/
目录下。
命令格式 : nmap --script 脚本名 110.242.68.4
比如:nmap --script http-headers 110.242.68.4
nmap --script http-headers # 使用单个脚本
nmap --script="version,discovery" # 使用多个脚本
nmap --script="not exploit”" # 除了exploit,其他脚本都使用
nmap --script"(http*) and not (http-slowlors and http-brute)" # 使用所有http*的脚本,除了这两个
nmap --script http-headers --script-args 参数 # 使用脚本时,传入脚本参数
脚本的使用方式,可以到官方文档 https://nmap.org/nsedoc/
查看