nmap端口扫描
端口扫描是Nmap最基本、最核心的功能。通过实施端口扫描可以确定目标主机中开放的端口,进而推断出目标主机上运行的应用程序,然后再对应用程序进行扫描,找出目标主机中可利用的漏洞。在Nmap中可以实施的端口扫描方式有TCP扫描、UDP扫描、SCTP扫描和IP扫描等。
指定扫描端口
- 手动指定 -p<port ranges>指定的端口可以是单个端口、连续端口、多个端口或不同协议类型的端口。
- 单个端口 ,例如指定扫描80端口 -p80
- 连续端口,用连字符连接 -p1-80
- 多个端口,用逗号分隔 -p1,3,8,11-20
- 不同协议类型,支持T(TCP)U(UDP)S(SCTP),协议和端口之间用冒号分隔,可以同时指定多个协议,多个端口。 -p T:22,80,355-400,U:400-500
- 预设端口
- 如果不使用 -p参数,则扫描nmap-services文件中的端口(2000多个);如果使用-p参数,但是不手动指定端口,则默认扫描1-1024和nmap-services文件中的端口。nmap-services文件共包括4个字段,分别是Service name(服务名)、portnum/protocol(端口号/协议)、open-frequency(开放频率)和optional comments(注释)。
- 较少的端口 -F
- 通用端口(根据常用频率)
- -top-ports<num> 最常用的num个端口,如果num为空则扫描最常用的1000个端口
- -port-radio<radio> radio在0-1之间,扫描使用频率为radio以上的端口
- 排除端口 -exclude-ports<ports ranges>
TCP扫描
TCP是一种常用的网络传输协议,该协议规定了每个包都具备一系列的标记位,用来说明数据包的作用。在扫描过程中,Nmap通过发送不同TCP标志位的报文来探测目标端口的状态。其中,最常见的TCP扫描方式有TCP SYN扫描、TCP连接扫描和TCP ACK扫描等。与主机发现的TCP类似,通过发送不同TCP标志位的数据包,根据响应的报文判断端口状态。不同处在于,可以指定端口,nmap会根据响应报文判断端口状态而不是主机是否在线
- TCP SYN扫描 -sS 向目标端口发送TCP-SYN(SYN标志位设置为1)的报文,如果目标响应SYN+ACK报文,则说明端口是开放的;如果目标响应RST报文,则说明端口是关闭的。如果收到ICMP不可达,表示端口状态为filtered(端口被防火墙过滤)
- TCP连接扫描 -sT ,通过系统connect()调用,尝试通过TCP三次握手与目标主机建立连接。如果与目标端口成功建立连接,则说明端口是开放的;否则判断端口是关闭的。这种扫描方式和其他扫描类型不同,不会直接发送原始报文。当TCP SYN扫描不能使用时,默认将会选择TCP连接扫描。TCP连接扫描是最稳定的扫描方式,但是该扫描方式需要更长的时间,而且连接请求还可能被目标主机记录下来。另外,如果长时间进行扫描,可能会对目标系统造成洪水攻击并导致其崩溃。
- TCP ACK扫描 -sA 向目标端口发送TCP-ACK(ACK标志位设置为1)的报文,这种扫描方式无法确定目标端口是开放状态还是开放/被过滤的状态。主要用于探测防火墙规则,确定它们是否具备状态封装检查功能,哪些端口是被过滤的。当目标端口是开放或关闭状态时,都会返回RST报文,此时,Nmap判断该端口是未被过滤的。如果没有收到目标端口的响应,或者收到目标主机响应的特定的ICMP错误消息端口,则Nmap判断该端口是被过滤的。
- TCP窗口扫描 -sW 和TCP ACK扫描完全一样,但是通过检查返回的RST报文的TCP窗口域来判断目标端口是开放还是关闭的。在某些系统中,开放的端口用正数表示窗口大小(包括RST报文),而关闭的端口窗口大小为0。
- TCP NULL扫描 -sN 向目标端口发送一个不包括任何标志位的数据包,Nmap根据服务器的响应情况判断端口状态。如果目标服务器没有响应,则说明端口为开放/被过滤状态;如果响应RST报文,则说明端口是关闭状态。使用这种方式可以判断操作系统的类型。在正常的数据通信中,至少要设置一个标志位。在RFC 793规定中,允许接收没有标志位的数据字包。因此,实施TCP NULL扫描,目标主机必须遵从RFC 793标准。但是Windows系统主机不遵从RFC 793标准,只要收到没有设置任何标志位的数据包时,不管端口是开放的还是关闭的都会响应一个RST数据包。而基于UNIX(如Linux)的系统则遵从RFC 793标准。因此,使用TCP NULL扫描方式可以判断目标主机的操作系统是Windows还是Linux。使用这种扫描方式更隐蔽,但精确度相对较低。
- TCP FIN扫描 -sF 向目标端口发送一个TCP-FIN(FIN标志位为1)的报文。如果收到RST响应报文,则表示端口是关闭状态;如果没有收到响应,则表示端口是开放/被过滤状态。这种方式比较适合UNIX系统。
- TCP Xmas扫描 -sX 向目标端口发送PSH、FIN、URG和TCP标志位被设为1的数据包。如果收到一个RST响应包,则说明目标端口是关闭状态;如果没有收到响应,则说明该端口是开放/被过滤状态。
- TCP maimon扫描 -sM 发送的探测报文是FIN/ACK。根据RFC 793规定,无论端口是开放还是关闭状态,都将对这些探测方式响应RST报文。但是,如果端口开放,许多基于BSD(是UNIX的衍生系统)的系统只是丢弃该探测包,不进行响应。因此,如果收到RST响应报文,则说明端口是关闭的;如果没有收到任何响应,则说明端口是开放的。
- 空闲扫描 -sI <idle host> -p<port> <target> 冒充一台空闲主机的IP地址对目标进行更为隐蔽的扫描。空闲主机是一台可用于欺骗目标IP地址且具有可预设的IP ID序列号的主机 。所以空闲扫描必须满足以下条件:
- 寻找一个很少发送和接收数据包的主机。用户可以借助Nmap脚本库中的ipidseq脚本来寻找空闲主机。
- 主机的IP ID必须是递增的,0和随机增加都不可以。然而,现在大部分主流操作系统的IP ID都是随机产生的
- 可以通过nmap -p80 --script ipidseq -iR <num hosts>,随机寻找一台空闲主机
- TCP定制扫描 -scanflags <flags> 自己指定TCP报文的标志位,可以是URG、ACK、RST、SYN和FIN的任何组合,而且不区分标志位顺序。
UDP扫描
UDP端口扫描 -sU 是通过发送空的(没有数据)UDP报头给目标主机,根据目标主机的响应来判断目标端口是否开放。如果目标主机返回ICMP不可达的错误(类型3,代码为1、2、9、10或13),则说明端口是关闭的,如果收到响应的UDP报文,则说明端口是开放状态,如果重试几次后还没有响应,则认为该端口是开放/被过滤状态。此时,用户可以使用版本扫描(-sV选项)来帮助区分端口状态。
SCTP扫描
- SCTP INIT扫描 -sY 向目标端口发送一个INIT(初始化)消息来判断端口的状态。如果收到目标主机的INIT ACK消息,则说明目标端口是开放的;如果没有收到响应,则表示目标端口是关闭的。SCTP INIT扫描方式和TCP SYN类似,可以在不受防火墙限制的网络中每秒扫描数千个端口,而且还比较隐蔽,因为它不会进行SCTP连接。
- SCTP COOKIE ECHO扫描 -sZ 这是一种更先进的SCTP扫描方式。SCTP默认将丢弃开放端口返回的包含COOKIE ECHO的数据包块。如果端口关闭,则终止发送。使用这种扫描方式的好处是可以绕过防火墙,但是策略配置得当的入侵检测系统(IDS)仍然能够探测到SCTP COOKIE ECHO扫描。另外,这种扫描方式的缺点是无法区分开放/被过滤的端口。
IP扫描
IP扫描 -p<protocol list> -sO IP扫描和UDP扫描类似,UDP扫描是在UDP报文的端口域上循环,IP扫描是在IP域的8位协议号上循环发送IP报文头。-p选项指定扫描的协议号。可以指定为TCP、ICMP和IGMP等(对应的协议号如图所示)。如果收到目标的响应,则说明端口是开放的;如果没有收到响应,则说明端口是关闭的。比如 nmap -sO -p6 targert,向目标主机的80端口发送TCP-ACK报文,等同于 -PA或者 -sA -p80 ,这个参数我感觉很鸡肋。
FTP转发扫描
FTP转发扫描是利用存在漏洞的FTP服务器(如HP JetDirect打印服务器),对目标主机端口实施扫描。由于FTP支持代理FTP连接,所以渗透测试者可以通过代理方式连接到FTP服务器,然后进行扫描。此时,渗透测试者发送和接收的数据包都将由FTP服务进行转发。渗透测试者通过使用这种扫描方式可以躲避防火墙。Nmap提供了一个-b选项用来实施FTP转发扫描,其语法格式如下:
nmap -b [username:password@server:port] -Pn -v [target]
以上语法中的选项及其含义如下:
-b:实施FTP转发扫描,其格式为username:password@server:port。其中,server是指FTP服务的名字或IP地址。如果FTP服务器允许匿名用户登录,则可以省略username:password。另外,当FTP服务使用默认的21端口时,也可以省略端口号(以及端口号前面的冒号)。FTP有一个特点就是支持代理FTP连接。它允许用户连接到一台FTP服务器上,然后要求将文件发送到第三方的服务器上(这个特性在很多场景中被滥用,因此许多服务器已经停止了对FTP的支持)。利用FTP服务器对其他主机端口实施扫描是绕过防火墙的好办法,因为FTP服务器常常被置于防火墙之后,可以访问防火墙之后的其他主机。FTP转发扫描示意图如图4-13所示。
-v:显示详细信息。
使用FTP转发扫描并不是任意的FTP服务器都可以实现,需要FTP服务器中存在FTP跳转攻击漏洞。如果FTP服务器中不存在该漏洞,则会响应错误信息
其他选项
- -r 顺序扫描,nmap默认会打乱扫描端口的顺序,使用-r进行顺序扫描(更容易被防火墙识别)