概述
Nmap定义了6中端口状态:
open, closed, filtered, unfiltered, open|filtered, or closed|filtered.
每种状态对应了特定的扫描类型。我们会在不同的扫描类型中进行解释。
虽然Nmap尝试生成准确的结果,但请记住,它的所有结果都是基于目标计算机(或其前面的防火墙)返回的数据包。主机前存在防火墙时,该主机返回结果可能不值得信任,并发送旨在混淆或误导Nmap的响应。更常见的是不兼容RFC的主机,它们不响应Nmap探测器。FIN,NULL和Xmas扫描特别容易受到此问题的影响。此类问题特定于某些扫描类型,因此将在各个扫描类型条目中进行讨论。
本节介绍Nmap支持的十几种端口扫描技术。除了UDP scan(-sU)和任何一种SCTP扫描类型(-sY,-sZ)可以与任何一种TCP扫描类型组合之外,一次只能使用一种方法。
非特权用户只能执行连接和FTP反弹扫描。
参数说明
-sS (TCP SYN scan)
SYN扫描是默认和最流行的扫描选项,原因很简单。快速(数千个端口/秒)且容易绕过防火墙,且足够隐秘(不会建立连接,又称:半开扫描)。所有兼容TCP协议栈的设备都适用,而不像FIN / NULL / Xmas,Maimon和空闲扫描那样依赖特定的平台。
注意:半开连接:nmap:SYN;被扫描IP:SYN-ACK;nmap所在OS:RST。
Repose SYN/ACK | SYN(附录:五次握手):open
Repose RST:closed
No-reposed| ICMP unreachable error (type 3, code 0, 1, 2, 3, 9, 10, or 13) is received:filteredIP地址和端口扫描攻击防范功能只对IP报文的首包生效。
当某个源的IP报文速率超过设定的阈值时,USG9000为发生了扫描攻击,将该IP地址加入黑名单,禁止其建立新的连接。
监控某个源地址发送的IP报文,当该报文中端口的变化速率超过设定的阈值时,则认为发生了扫描攻击,将该IP地址加入黑名单,禁止其建立新的连接。
-sT (TCP connect scan)
TCP连接扫描。当SYN不可用(非特权用户)时,该扫描为默认的TCP扫描类型。Nmap通过connect系统调用,与目标建立连接(全连接)。它是名为Berkeley Sockets API的编程接口的一部分。Nmap不是通过线路读取原始数据包响应,而是使用此API获取每次连接尝试的状态信息。
这个过程会导致性能降低、被扫描目标记录(不再隐秘),如果建立连接而不发送业务数据,有可能导致port对应的服务崩溃。
相比原始报文的处理,Nmap对更高层次的connect调用控制乏力。
-sN; -sF; -sX (TCP NULL, FIN, and Xmas scans)
扫描原理:Page 65 of RFC 793 says that “如果目标端口是closed,那么不包含RST标签的报文会触发RST响应”。据此,我们只要发送不包含RST & SYN & ACK的任何报文都可以探测端口的状态。
Null scan (-sN) :--scanflags NULL
FIN scan (-sF):--scanflags FIN
Xmas scan (-sX):--scanflags FINPSHURG除了探测包中设置的TCP标志外,这三种扫描类型的行为完全相同。
Repose RST:closed
Repose ICMP unreachable error (type 3, code 0, 1, 2, 3, 9, 10, or 13):filtered
No repose:open|filtered缺点:不推荐使用。
》》这类报文会被状态防火墙(主流防火墙都是状态防火墙,包括主机防火墙)拦截。非所有OS都遵循RFC793。这里就包括:Windows、大部分Cisco系统、IBM OS/400。
》》很难区分open和filtered端口
-sA (TCP ACK scan)
同--scanflags ACK
扫描原理:When using -sA to scan unfiltered systems, open and closed ports will both return a RST packet.
TCP ACK扫描,本扫描和其他扫均不同,因为它不会区分open、closed、open|filtered的状态的端口。在-sA扫描中,只有filtered和unfiltered两种状态。
作用:1、检测探测路径上是否有防火墙;2、映射防火墙规则集;3、判断防火墙是否状态防火墙;4、检测哪些端口被filtered。
Repose RST:unfiltered
No repose | ICMP error messages back (type 3, code 0, 1, 2, 3, 9, 10, or 13):filtered
如果扫描端口,并对open端口进一步探测,不建议使用。
-sW (TCP Window scan)
同--scanflags ACK
窗口扫描与ACK扫描完全相同,不同之处在于它利用某些系统的实现细节来区分open端口和closed端口,而不是在返回RST时始终标记为:unfiltered。
在某些系统上,开放端口使用正窗口大小(即使对于RST数据包),而关闭的窗口使用零窗口。
但是,大多数系统RST回包(closed port)使用零窗口。此时,-sW和-sA完全一样,只是前者标记为closed,后者标记为unfiltered。
不建议使用。
-sM (TCP Maimon scan)
同--scanflags FIN/ACK。
扫描原理:除了探测器是FIN/ACK之外,此技术与NULL,FIN和Xmas扫描完全相同。
此外,-sM扫描也无法区分open和filtered。虽然多数BSD派生系统当port is open,Drop FIN/ACK包文。
Repose RST:closed
Repose ICMP unreachable error (type 3, code 0, 1, 2, 3, 9, 10, or 13):filtered
No repose:open|filtered缺点:有防火墙,FIN/ACK会被丢弃,结果不准确,不建议使用。
--scanflags (Custom TCP scan)
我们完全可以通过本选项定义“预定义扫描类型”,也可以定义我们自己的扫描类型。从左至右每个标志各占1位。
倒序排列如下:
二进制 | 十进制 | *缩略 | 全称 | 简介 |
000001 | 1 | * F | FIN | 结束; 结束会话 |
000010 | 2 | * S | SYN | 同步; 表示开始会话请求 |
000100 | 4 | * R | RST | 复位;中断一个连接 |
001000 | 8 | * P | PSH | 推送; 数据包立即发送 |
010000 | 16 | * A | ACK | 应答 |
100000 | 32 | * U | URG | 紧急 |
* E : ECN- 显式拥塞提醒回应
* W : CWR - 拥塞窗口减少具体解释参见《TCP 标志位》
--scanflags 9 等于--scanflags PSHFIN
--scanflags 2 等于--scanflags SYN指定全部标记如下,显然这种格式更加易用。这些指定的顺序是无关紧要的。
--scanflags URGACKPSHRSTSYNFIN需要注意的是:
除了指定自定义的类型外,还可以指定基本扫描类型(仅限于TCP)。如果不指定基本扫描类型,其实按照-sS类型处理。指定基本扫描类型的作用:解释repose报文,如-sS处理RST是closed,-sA处理RST是unfiltered;-sS处理no-repose为filtered,-sF是open|filtered。
所以,--scanflags ACK 不等于 -sA,因为前者对于repose的处理是采用-sS的。
-sU (UDP scans)
最常见的UDP服务:DNS, SNMP, and DHCP (registered ports 53, 161/162, and 67/68),其实还有NTP(123)。UDP扫描通常比TCP更慢且更困难。
对于一些常见UDP端口, protocol-specific payload is sent。
载荷来自于share/nmap/nmap-payloads。其他不常见的发送UDP空报文,除非指定--data, --data-string, or --data-length这些参数,强制发送payload。
Repose ICMP port unreachable error (type 3, code 3):closed
ICMP unreachable errors (type 3, codes 0, 1, 2, 9, 10, or 13):filtered
Repose UDP packet:open
No-repose:open|filtered版本检测(-sV)可用于帮助区分真正开放的端口和过滤的端口。因为open|filtered端口会被进一步调用,发送若干服务探测Probes。
UDP扫描面临的一大挑战是快速完成。
Open|filtered端口很少发送任何响应,使Nmap超时,然后进行重新传输,以防探测或响应丢失。
Closed端口也很麻烦,因为很多主机默认限制ICMP unreachable的发送速度。Linux和Solaris就很严格:Linux 2.4.20 kernel限制每秒1个,65535个Port需要扫描18个小时。
所以,并发扫描+扫描知名端口,并使用--host-timeout to skip slow hosts。
-sY (SCTP INIT scan)
SCTP属于新的传输层协议,2000年10月份才成为RFC规范。目前应用并不广泛。SCTP作为一个传输层协议,SCTP兼有TCP及UDP两者的特点。SCTP可以称为是TCP的改进协议,但它们之间仍然存在着较大的差别。主要用于SS7 / SIGTRAN相关服务,但也有可能用于其他应用程序。
SCTP INIT扫描等于TCP SYN扫描,只不过-sS发送TCP SYN报文,-sY发送SCTP INIT chunk。
Repose INIT-ACK chunk:open
Repose ABORT chunk:closed
No repose | ICMP unreachable error (type 3, code 0, 1, 2, 3, 9, 10, or 13):filtered缺点:SCTP协议目前应用很较少,不建议使用。
-sZ (SCTP COOKIE ECHO scan)
扫描原理:在open端口上SCTP会静默丢弃包含 COOKIE ECHO chunks(块)的包文,而closed端口会响应ABORT chunks。
No repose:open|filtered
Repose ABORT chunk:closed
ICMP unreachable error (type 3, code 0, 1, 2, 3, 9, 10, or 13):filtered优点:1、比INIT更隐秘;2、可绕过blocking INIT包的firewall rulesets;
缺点:1、无法区分open和filtered状态端口;2、sctp协议应用不广泛。
不建议使用。
-sO (IP protocol scan)
IP协议扫描,总共256种(8位协议,2^8种)IP协议,如:ICMP:1,TCP:6,UDP:17。
这里通过-p指定的不再是Port而是IP协议号。多数情况下,发送标记protocol号的IP空包,只有ICMP、IGMP、TCP、UDP、SCTP会带有响应协议的包头。
Repose 对应协议的回包:open
Repose ICMP protocol unreachable error (type 3, code 2):closed
Repose ICMP port unreachable (type 3, code 3):open
Repose ICMP unreachable errors (type 3, code 0, 1, 9, 10, or 13):filtered
No repose:open|filtered
-b <FTP relay host> (FTP bounce scan)
扫描原理:FTP协议(RFC 959)的一个有趣特性是支持所谓的代理FTP连接。这允许用户连接到一个FTP服务器,然后要求将文件发送到第三方服务器。
此功能被滥用之一是导致FTP服务器端口扫描其他主机。
目前,大多数机器已经停止支持该功能。
-p <port ranges> (Only scan specified ports)
specify -p- to scan ports from 1 through 65535.
如果是-sO做IP协议扫描,则该参数指定的是0-255个协议号。
我们知道,TCP扫描类型、UDP扫描类型、SCTP扫描类型、IP扫描类型可以组合的,如果组合在一起,我们怎么指定端口和协议号呢?
nmap --disable-arp-ping -n -Pn -T4 --packet-trace -sSUZ -sO -p T:1-1000,U:123,S:80,P:6 192.168.11.109
这里-sO目前必须是单独扫描,所以就得改成:
nmap --disable-arp-ping -n -Pn -T4 --packet-trace -sSUZ -p T:1-1000,U:123,S:80 192.168.11.109
按照nmap-services中服务名指定,可以使用?和*通配符。---- 不推荐如此使用。
-p ftp,http*
-p [-1024] 等同于 -p1-1024
--exclude-ports <port ranges> (Exclude the specified ports from scanning)
指定扫描是希望nmap排除的端口,如果扫描类型是-sO,则为希望排除的IP协议号。
生效阶段:主机发现、端口扫描
端口扫描:指定后在所有类型的扫描中均会排除指定的端口。
-F (Fast (limited port) scan)
快速扫描。默认情况下nmap扫描1000个端口,这里只扫描100个。
根据Well Known Port List :nmap-services中的使用频率过滤出来的。
-r (Don't randomize ports)
Nmap默认随机扫描端口。这里指定nmap顺序扫描端口。
--port-ratio <ratio><decimal number between 0 and 1>
指定出现比率大于指定值的端口,取值范围0.0-1.0。
--top-ports <n>
除去--exclude-ports指定的端口后,扫描出现比率最高的前n个端口,这里n必须大于等于1。
--open (Show only open (or possibly open) ports)
只作用于端口扫描
--reason (Host and port state reasons)
作用于端口扫描和主机发现