1.前言
Nmap是一款开源免费的网络发现(Network Discovery)和安全审计(Security Auditing)工具。软件名字Nmap是Network Mapper的简称。
nmap扫主要包括四个方面的扫描功能分别是主机发现(Host Discovery)、端口扫描(Port Scanning)、应用与版本侦测(Version Detection)、操作系统侦测(Operating System Detection)。这四项功能之间,又存在大致的依赖关系。通常情况下顺序关系,如下图所示。
2.主机发现
主机发现(Host Discovery),即用于发现目标主机是否在线(Alive,处于开启状态)。
主机发现发现的原理与Ping命令类似,发送探测包到目标主机,如果收到回复,那么说明目标主机是开启的。Nmap支持十多种不同的主机探测方式,比如发送ICMP ECHO/TIMESTAMP/NETMASK报文、发送TCPSYN/ACK包、发送SCTP INIT/COOKIE-ECHO包,用户可以在不同的条件下灵活选用不同的方式来探测目标机。
主机发现基本原理:(以ICMP echo方式为例)
Nmap的用户位于源端,IP地址192.168.0.5,向目标主机192.168.0.3发送ICMP Echo Request。如果该请求报文没有被防火墙拦截掉,那么目标机会回复ICMP Echo Reply包回来。以此来确定目标主机是否在线。
默认情况下,Nmap会发送四种不同类型的数据包来探测目标主机是否在线。
(1) ICMP echo request
(2) a TCP SYN packet to port 443
(3) a TCP ACK packet to port 80
(4) an ICMP timestamp request
依次发送四个报文探测目标机是否开启。只要收到其中一个包的回复,那就证明目标机开启。使用四种不同类型的数据包可以避免因防火墙或丢包造成的判断错误。
通常主机发现并不单独使用,而只是作为端口扫描、版本侦测、OS侦测先行步骤。而在某些特殊应用(例如确定大型局域网内活动主机的数量),可能会单独专门适用主机发现功能来完成。
不管是作为辅助用法还是专门用途,用户都可以使用Nmap提供的丰富的选项来定制主机发现的探测方式。
-sL: List Scan 列表扫描,仅将指定的目标的IP列举出来,不进行主机发现。
-sn: Ping Scan 只进行主机发现,不进行端口扫描。
-sP: Ping Scan 只进行主机发现,不进行端口扫描。
-Pn: 将所有指定的主机视作开启的,跳过主机发现的过程。
-PS[portlist]: 使用TCP SYN Ping扫描方式进行发现。
-PA[portlist]: 使用TCP ACK Ping扫描方式进行发现。
-PU[portlist]: 使用TCP UDP Ping扫描方式进行发现。
-PY[portlist]: 使用SCTP INIT Ping扫描方式进行发现。
-PR: ARP Ping Scan
-PE: 使用ICMP echo Ping扫描方式发现主机。
-PP: 使用ICMP timestamp Ping扫描方式发现主机。
-PM: 使用ICMP netmask Ping扫描方式发现主机。
-PO[protocollist]: 使用IP协议包探测对方主机是否开启(非ping扫)。
-n:表示不进行DNS反向解析(使用该选项的时候Nmap永远不对目标ip地址作反向域名解析)
-R:表示总是进行DNS解析(使用该选项的时候Nmap永远对目标ip地址作反向域名解析)。
-6: 扫描IPv6地址
—dns-servers : 指定DNS服务器。
—system-dns: 指定使用系统的DNS服务器
—traceroute: 路由跟踪(使用—traceroute选项即可进行路由追踪.)使用路由追踪功能可以帮助用户了解网络的同行情况,通过此选项可以轻松地查出从计算机到目标之间所经过的网络节点,并可以看到通过各个节点的时间.
其中,比较常用的使用的是-sn,表示只单独进行主机发现过程;-Pn表示直接跳过主机发现而进行端口扫描等高级操作(如果已经确知目标主机已经开启,可用该选项);-n,如果不想使用DNS或reverse DNS解析,那么可以使用该选项。
例如:
命令 nmap 192.168.20.16
该扫描方式没有给出具体主机发现的选项,主要是针对IP或者域名进行扫描,扫描方式迅速,可以方便的发现目标端口的开放情况以及主机在线情况。
如果出现如下图的情况
则先ping一下该IP地址,此处为ping 192.168.20.16来查看网络的连通性,网络通之后再执行nmap命令。
命令 nmap -sP 192.168.20.16/24
Ping扫描方式,只进行ping扫描,然后显示在线的主机。扫描时只需要加入 -sP ,Nmap进行ping扫描,然后回显出做出响应的主机,使用该选项扫描可以轻易的获取目标信息而又不被轻易发现。在默认的情况下Nmap回发送一个ICMP回声请求和一个TCP报文到目标端口。ping扫描的 优点是不会返回太多的信息造成对结果的分析,并且这是一种非常高效的扫描方式。
命令 nmap -Pn 192.168.20.16
加入 -Pn,将所有指定的主机视作开启的,跳过主机发现的过程。
命令 nmap -PS -v 192.168.20.16
TCP SYN Ping 扫描发送了一个设置了SYN标志的空TCP报文。默认目标的端口80 (也可以通过改变nmap.h)文件中的DeFault-TCP-PROBE-PORT值进行设置,也可以通过”-PS22,23,25,80,115,3306,3389 “进行设定,每个端口被并发的扫描。
通常情况下,nmap默认使用TCP ACK 和ICMP Echo请求对目标进行是否存活的响应,当目标主机的防火墙阻止这些请求时,可以使用 TCP SYN Ping扫描对目标主机是否存活进行判断。
Nmap是通过SYN/ACK和RST响应来对目标主机是否存活进行判断,但在特定的情况下防火墙会丢弃RST包,这种情况下扫描的结果会不准确,这时需要指定一个端口或者端口范围来避免这种情况。
例如输入命令:nmap -PS80,100-200 -v 192.168.20.16
命令 nmap -PA -v 192.168.20.16
TCP ACK Ping扫描,这种探测方式可以探测阻止SYN包或者ICMP Echo请求的主机。
可以同时使用 -PA -PS
nmap -PA -PS 192.168.20.16
命令 nmap -PU -v 192.168.20.16
UDP Ping 扫描是发送一个空的UDP报文到指定的端口,如果不指定端口则默认40125
使用UDP ping扫描时Nmap会发送一个空的UDP包到目标主机,如果目标主机响应则返回一个ICMP端口不可达错误,如果目标主机不是存活状态则会返回各种ICMP错误信息。